diff --git a/include/fs/mufs.h b/include/fs/mufs.h index ae3f147..3bd697a 100644 --- a/include/fs/mufs.h +++ b/include/fs/mufs.h @@ -42,5 +42,6 @@ int mufs_mkdir(struct mufs *fs, const char *path); int mufs_create(struct mufs *fs, const char *path); struct mufs_file *mufs_open(struct mufs *fs, const char *path, int mode); void mufs_close(struct mufs_file *file); +long mufs_seek(struct mufs_file *file, long offset, int whence); size_t mufs_read(struct mufs_file *file, void *data, size_t len); size_t mufs_write(struct mufs_file *file, const void *data, size_t len); diff --git a/source/fs/mufs/file.c b/source/fs/mufs/file.c index a08beaf..0097e60 100644 --- a/source/fs/mufs/file.c +++ b/source/fs/mufs/file.c @@ -54,6 +54,26 @@ void mufs_close(struct mufs_file *file) free(file); } +long mufs_seek(struct mufs_file *file, long offset, int whence) +{ + if (!file) + return -1; + + switch (whence) { + case SEEK_SET: break; + case SEEK_CUR: offset = file->va + offset; break; + case SEEK_END: offset = file->tree->file_size; break; + default: return -1; + } + + if (offset > file->tree->file_size || offset >= UINT32_MAX) + return -1; + + file->va = offset; + + return offset; +} + size_t mufs_read(struct mufs_file *file, void *data, size_t len) { size_t ret;