X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/1eeed1150149b63d6e49e033697454bc12b533b9..5f4f16c074be65639b5c3333441d48b1d418104c:/lunaix-os/kernel/fs/twifs/twifs.c diff --git a/lunaix-os/kernel/fs/twifs/twifs.c b/lunaix-os/kernel/fs/twifs/twifs.c index 6aa5f6a..3679ee1 100644 --- a/lunaix-os/kernel/fs/twifs/twifs.c +++ b/lunaix-os/kernel/fs/twifs/twifs.c @@ -11,14 +11,14 @@ #include #include #include -#include +#include #include #include #include #include #include -#include +#include static struct twifs_node* fs_root; @@ -58,6 +58,13 @@ __twifs_init_inode(struct v_superblock* vsb, struct v_inode* inode) { inode->ops = (struct v_inode_ops*)&twifs_inode_ops; inode->default_fops = (struct v_file_ops*)&twifs_file_ops; + + + // we set default access right to be 0660. + // TODO need a way to allow this to be changed + + fsapi_inode_setaccess(inode, FSACL_u(R, W, _) | FSACL_g(R, W, _)); + fsapi_inode_setowner(inode, 0, 0); } int @@ -79,6 +86,12 @@ __twifs_mount(struct v_superblock* vsb, struct v_dnode* mount_point) return 0; } +int +__twifs_unmount(struct v_superblock* vsb) +{ + return 0; +} + int __twifs_fwrite(struct v_inode* inode, void* buffer, size_t len, size_t fpos) { @@ -92,7 +105,7 @@ __twifs_fwrite(struct v_inode* inode, void* buffer, size_t len, size_t fpos) int __twifs_fwrite_pg(struct v_inode* inode, void* buffer, size_t fpos) { - return __twifs_fwrite(inode, buffer, MEM_PAGE, fpos); + return __twifs_fwrite(inode, buffer, PAGE_SIZE, fpos); } int @@ -108,7 +121,7 @@ __twifs_fread(struct v_inode* inode, void* buffer, size_t len, size_t fpos) int __twifs_fread_pg(struct v_inode* inode, void* buffer, size_t fpos) { - return __twifs_fread(inode, buffer, MEM_PAGE, fpos); + return __twifs_fread(inode, buffer, PAGE_SIZE, fpos); } struct twifs_node* @@ -132,7 +145,7 @@ __twifs_dirlookup(struct v_inode* inode, struct v_dnode* dnode) { struct twifs_node* twi_node = (struct twifs_node*)inode->data; - if ((twi_node->itype & F_FILE)) { + if (!check_directory_node(inode)) { return ENOTDIR; } @@ -165,14 +178,17 @@ int __twifs_iterate_dir(struct v_file* file, struct dir_context* dctx) { struct twifs_node* twi_node = (struct twifs_node*)(file->inode->data); - int counter = 0; + unsigned int counter = 2; struct twifs_node *pos, *n; + if (fsapi_handle_pseudo_dirent(file, dctx)) { + return 1; + } + llist_for_each(pos, n, &twi_node->children, siblings) { - if (counter++ >= dctx->index) { - dctx->index = counter; - dctx->read_complete_callback( + if (counter++ >= file->f_pos) { + fsapi_dir_report( dctx, pos->name.value, pos->name.len, vfs_get_dtype(pos->itype)); return 1; } @@ -194,7 +210,7 @@ __twifs_openfile(struct v_inode* inode, struct v_file* file) int twifs_rm_node(struct twifs_node* node) { - if (!(node->itype & F_FILE) && !llist_empty(&node->children)) { + if (check_itype(node->itype, VFS_IFDIR) && !llist_empty(&node->children)) { return ENOTEMPTY; } llist_delete(&node->siblings); @@ -243,16 +259,13 @@ twifs_dir_node(struct twifs_node* parent, const char* fmt, ...) void twifs_init() { - twi_pile = cake_new_pile("twifs_node", sizeof(struct twifs_node), 1, 0); - - struct filesystem* twifs = vzalloc(sizeof(struct filesystem)); - twifs->fs_name = HSTR("twifs", 5); - twifs->mount = __twifs_mount; - twifs->types = FSTYPE_ROFS; - twifs->fs_id = 0; - - fsm_register(twifs); + struct filesystem* fs; + fs = fsapi_fs_declare("twifs", FSTYPE_PSEUDO | FSTYPE_ROFS); + + fsapi_fs_set_mntops(fs, __twifs_mount, __twifs_unmount); + fsapi_fs_finalise(fs); + twi_pile = cake_new_pile("twifs_node", sizeof(struct twifs_node), 1, 0); fs_root = twifs_dir_node(NULL, NULL, 0, 0); } EXPORT_FILE_SYSTEM(twifs, twifs_init);