CeDOS - Commit 64c3ae42

Implemented file offset for FAT
Celina Sophie Kalus
Sat, 29 Apr 2023 14:45:46 +0200
6 files changed, 38 insertions(+), 4 deletions(-)
M include/cedos/fat.hinclude/cedos/fat.h

@@ -9,6 +9,7 @@ void FAT_init();

int FAT_dir_next(file_t *file, int index, char *fname_buffer); int FAT_openat(file_t *root, file_t *handle, const char *fname, int flags); uint32_t FAT_read(file_t *file, uint8_t *buffer, uint32_t count); +off_t FAT_lseek(file_t *file, off_t offset, int whence); extern file_operations_t FAT_fops;
M include/cedos/file.hinclude/cedos/file.h

@@ -6,6 +6,11 @@

#include "cedos/mm/paging.h" typedef uint32_t fpos_t; +typedef int32_t off_t; + +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 struct file; struct file_operations;

@@ -26,12 +31,14 @@ int (*openat)(file_t *root, file_t *handle, const char *fname, int flags);

int (*read)(file_t *file, char *buffer, uint32_t size); int (*write)(file_t *file, char *buffer, uint32_t size); int (*dir_next)(file_t *file, int index, char *fname_buffer); + off_t (*lseek)(file_t *file, off_t offset, int whence); }; int file_init(); int file_open(const char *pathname, int flags); int file_openat(int fd, const char *fname, int flags); int file_read(int fd, char *buffer, uint32_t size); +off_t file_lseek(int fd, off_t offset, int whence); int file_write(int fd, char *buffer, uint32_t size); int file_dir_next(int fd, int index, char *fname_buffer);
M src/kernel/drivers/tty.csrc/kernel/drivers/tty.c

@@ -9,7 +9,8 @@ tty_open, /* open */

tty_openat, /* openat */ tty_read, /* read */ tty_write, /* write */ - NULL /* dir_next */ + NULL, /* dir_next */ + NULL /* lseek */ }; int tty_open(const char *pathname, int flags) {
M src/kernel/fat.csrc/kernel/fat.c

@@ -12,7 +12,8 @@ NULL, /* open */

FAT_openat, /* openat */ FAT_read, /* read */ NULL, /* write */ - FAT_dir_next /* dir_next */ + FAT_dir_next, /* dir_next */ + FAT_lseek /* lseek */ }; typedef struct {

@@ -220,6 +221,7 @@ if (i <= 0) { return -1; }

if (strcmp(buffer, fname) == 0) { // file found + handle->pos = 0; handle->fops = &FAT_fops; handle->fat_cluster = first_cluster; return 0;

@@ -229,7 +231,7 @@ }

uint32_t FAT_read(file_t *file, uint8_t *buffer, uint32_t count) { uint16_t cluster = file->fat_cluster; - fpos_t offset = 0; //file->pos; + fpos_t offset = file->pos; uint32_t size = 0; uint32_t cluster_size = boot_sect->bytes_per_sect * boot_sect->sect_per_cluster;

@@ -263,5 +265,19 @@ buffer += memcpy_size;

size += memcpy_size; } + file->pos += size; + return size; +} + +off_t FAT_lseek(file_t *file, off_t offset, int whence) { + if (whence == SEEK_SET) { + file->pos = offset; + } else if (whence == SEEK_CUR) { + file->pos += offset; + } else if (whence == SEEK_END) { + // to be implemented + } else { + kpanic("Wrong whence!"); + } }
M src/kernel/file.csrc/kernel/file.c

@@ -109,3 +109,11 @@ if (file->fops->dir_next == NULL) { return -1; }

file->fops->dir_next(file, index, fname_buffer); } + +off_t file_lseek(int fd, off_t offset, int whence) { + file_t *file = get_process_local_file(fd); + + if (file->fops->lseek == NULL) { return -1; } + + return file->fops->lseek(file, offset, whence); +}
M src/kernel/pipe.csrc/kernel/pipe.c

@@ -7,7 +7,8 @@ NULL, /* open */

NULL, /* openat */ pipe_read, /* read */ pipe_write, /* write */ - NULL /* dir_next */ + NULL, /* dir_next */ + NULL /* lseek */ }; #define PIPE_BUFFER_SIZE 512