#include #include #include #include #include #include #include "source_lsfs/lsfs_disk_controller.h" int lsfs_getattr( const char *, struct stat * ); int lsfs_mkdir(const char *path, mode_t mode); int lsfs_mknod(const char *path, mode_t mode, dev_t device); int lsfs_open( const char *, struct fuse_file_info * ); int lsfs_read( const char *, char *, size_t, off_t, struct fuse_file_info * ); int lsfs_readdir( const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info * ); int lsfs_release(const char *path, struct fuse_file_info *fi); int lsfs_rename(const char *from, const char *to); int lsfs_rmdir(const char *path); int lsfs_truncate(const char *path, off_t offset); int lsfs_unlink(const char *); int lsfs_write(const char *, const char *, size_t, off_t, struct fuse_file_info *); static inline int lsfs_utime_STUB(const char *path, struct utimbuf *buf) { (void)path; (void)buf; return 0; } static struct fuse_operations lsfs_oper = { .getattr = lsfs_getattr, .readdir = lsfs_readdir, .mknod = lsfs_mknod, .mkdir = lsfs_mkdir, .link = NULL, .unlink = lsfs_unlink, .rmdir = lsfs_rmdir, .truncate = lsfs_truncate, .open = lsfs_open, .read = lsfs_read, .release = lsfs_release, .write = lsfs_write, .rename = lsfs_rename, .utime = lsfs_utime_STUB, }; int lsfs_readdir( const char *path, void *buf, fuse_fill_dir_t filler, off_t offset_to_next_entry, struct fuse_file_info *fi ) { //(void) offset; (void) fi; //printf("readdir: (path=%s)\n", path); filler(buf, ".", NULL, 0); filler(buf, "..", NULL, 0); Directory_Table *directory_table; directory_table = lsfs_find_directory(path, false); if (directory_table != NULL) { for (int i = 0; i < DEFAULT_TABLE_SIZE; ++i) { if (strcmp( "", directory_table->entries[i].filename ) != 0) { filler(buf, directory_table->entries[i].filename, NULL, 0); } } } if (strcmp(path, "/") != 0) { //free(directory_table); } return 0; } int lsfs_getattr( const char *path, struct stat *stbuf ) { int res = 0; lsfs_file *found_file = calloc(1, sizeof(lsfs_file)); //printf("getattr: (path=%s)\n", path); memset(stbuf, 0, sizeof(struct stat)); if( strcmp( path, "/" ) == 0 ) { stbuf->st_mode = S_IFDIR | 0755; stbuf->st_nlink = 2; } else { if(lsfs_disk_getattr(found_file, path)) { if (found_file->entry_kind == ENTRY_FILE) { stbuf->st_mode = S_IFREG | 0777; } else if (found_file->entry_kind == ENTRY_DIRECTORY) { stbuf->st_mode = S_IFDIR | 0755; stbuf->st_nlink = 2; } else { res = -ENOENT; } stbuf->st_nlink = 1; // @Hardcode stbuf->st_size = found_file->size; stbuf->st_uid = found_file->owner_id; stbuf->st_gid = found_file->owner_id; stbuf->st_atime = found_file->access_time; stbuf->st_mtime = found_file->modification_time; //free(found_file); } else { res = -ENOENT; } } return res; } int lsfs_mkdir(const char *path, mode_t mode) { (void)mode; return lsfs_disk_create_entry(path, ENTRY_DIRECTORY); } int lsfs_rmdir(const char *path) { // call to the disk controller to remove a dir if (lsfs_disk_delete_directory(path)) { // error case: // directory is not empty return -EINVAL; } return 0; } int lsfs_unlink(const char *path) { lsfs_file *found_file = calloc(1, sizeof(lsfs_file)); lsfs_disk_getattr(found_file, path); lsfs_disk_delete_entry(found_file); free(found_file); return 0; } int lsfs_truncate(const char *path, off_t offset) { (void)offset; // Truncate to this byte? lsfs_file *found_file = calloc(1, sizeof(lsfs_file)); lsfs_disk_getattr(found_file, path); lsfs_disk_truncate_file(found_file, offset); free(found_file); return 0; } int lsfs_rename(const char *path, const char *to) { return lsfs_disk_rename_file(path, to); } int lsfs_write(const char *path, const char *content, size_t content_length, off_t offset_to_next_entry, struct fuse_file_info *file_info) { int res = lsfs_disk_write_data_to_file( ((lsfs_file*) file_info->fh), content_length, (void*) content, offset_to_next_entry); return res; } //Permission int lsfs_open( const char *path, struct fuse_file_info *fi ) { // printf("open: (path=%s)\n", path); // We can store a pinter in the *fi, this pointer can be used in both read and write. // https://libfuse.github.io/doxygen/structfuse__operations.html // printf("read: (path=%s)\n", path); lsfs_file *found_file = calloc(1, sizeof(lsfs_file)); if (lsfs_disk_getattr(found_file, path)) { fi->fh = (uint64_t) found_file; } return 0; } int lsfs_read( const char *path, char *buf, size_t size, off_t offset_to_next_entry, struct fuse_file_info *fi ) { // printf("read: (path=%s)\n", path); int res = lsfs_disk_read_data_from_file( ((lsfs_file*) fi->fh), size, buf, offset_to_next_entry); return res; } int lsfs_release(const char *path, struct fuse_file_info *fi) { return 0; } int lsfs_mknod(const char *path, mode_t mode, dev_t device) { return lsfs_disk_create_entry(path, ENTRY_FILE); } int main( int argc, char *argv[] ) { if (argc != 3) { printf("Wrong number of arguments, format should be ./lsfs_fuse mountpoint diskname\n"); } if (lsfs_disk_load_disk(argv[2])) { return fuse_main( argc - 1 , argv, &lsfs_oper ); } else { printf("[ERROR] - Correct file format not found \n"); return 0; } }