X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/f044ca812256b421e793c4335ce1ffed74710a70..0fd474df7001837bde53da0e42e83081827c9641:/lunaix-os/kernel/fs/ramfs/ramfs.c diff --git a/lunaix-os/kernel/fs/ramfs/ramfs.c b/lunaix-os/kernel/fs/ramfs/ramfs.c index e2d1263..0944088 100644 --- a/lunaix-os/kernel/fs/ramfs/ramfs.c +++ b/lunaix-os/kernel/fs/ramfs/ramfs.c @@ -9,7 +9,7 @@ * */ #include -#include +#include #include #include #include @@ -64,11 +64,10 @@ __ramfs_mknod(struct v_dnode* dnode, struct v_inode** nod_out, u32_t flags) rinode->flags = flags; inode->data = rinode; + inode->itype = VFS_IFFILE; if ((flags & RAMF_DIR)) { - inode->itype = VFS_IFDIR; - } else { - inode->itype = VFS_IFFILE; + inode->itype |= VFS_IFDIR; } if ((flags & RAMF_SYMLINK)) { @@ -88,11 +87,16 @@ __ramfs_mknod(struct v_dnode* dnode, struct v_inode** nod_out, u32_t flags) int ramfs_readdir(struct v_file* file, struct dir_context* dctx) { - int i = 0; + unsigned int i = 2; struct v_dnode *pos, *n; + + if (fsapi_handle_pseudo_dirent(file, dctx)) { + return 1; + } + llist_for_each(pos, n, &file->dnode->children, siblings) { - if (i++ >= dctx->index) { + if (i++ >= file->f_pos) { dctx->read_complete_callback(dctx, pos->name.value, pos->name.len, @@ -110,7 +114,7 @@ ramfs_mkdir(struct v_inode* this, struct v_dnode* dnode) } int -ramfs_create(struct v_inode* this, struct v_dnode* dnode) +ramfs_create(struct v_inode* this, struct v_dnode* dnode, unsigned int itype) { return __ramfs_mknod(dnode, NULL, RAMF_FILE); } @@ -128,7 +132,13 @@ ramfs_mount(struct v_superblock* vsb, struct v_dnode* mount_point) { vsb->ops.init_inode = ramfs_inode_init; - return __ramfs_mknod(mount_point, NULL, RAMF_DIR); + int errno = __ramfs_mknod(mount_point, NULL, RAMF_DIR); + + if (!errno) { + fsapi_inode_setaccess(mount_point->inode, FSACL_DEFAULT); + } + + return errno; } int @@ -137,17 +147,6 @@ ramfs_unmount(struct v_superblock* vsb) return 0; } -void -ramfs_init() -{ - struct filesystem* ramfs = fsm_new_fs("ramfs", -1); - ramfs->mount = ramfs_mount; - ramfs->unmount = ramfs_unmount; - - fsm_register(ramfs); -} -EXPORT_FILE_SYSTEM(ramfs, ramfs_init); - int ramfs_mksymlink(struct v_inode* this, const char* target) { @@ -155,7 +154,7 @@ ramfs_mksymlink(struct v_inode* this, const char* target) assert(!(rinode->flags & RAMF_SYMLINK)); - size_t len = strlen(target); + size_t len = strlen(target) + 1; char* symlink = valloc(len); if (!symlink) { @@ -164,9 +163,10 @@ ramfs_mksymlink(struct v_inode* this, const char* target) memcpy(symlink, target, len); - this->itype |= VFS_IFSYMLINK; + this->itype = VFS_IFSYMLINK; rinode->flags |= RAMF_SYMLINK; rinode->symlink = symlink; + rinode->size = len; return 0; } @@ -182,17 +182,17 @@ ramfs_read_symlink(struct v_inode* this, const char** path_out) *path_out = rinode->symlink; - return 0; + return rinode->size; } int -ramfs_unlink(struct v_inode* this) +ramfs_unlink(struct v_inode* this, struct v_dnode* name) { struct ram_inode* rinode = RAM_INODE(this->data); if ((rinode->flags & RAMF_SYMLINK)) { rinode->flags &= ~RAMF_SYMLINK; - this->itype &= ~VFS_IFSYMLINK; + this->itype &= ~F_SYMLINK; vfree(rinode->symlink); @@ -204,6 +204,17 @@ ramfs_unlink(struct v_inode* this) return 0; } +static void +ramfs_init() +{ + struct filesystem* fs; + fs = fsapi_fs_declare("ramfs", FSTYPE_PSEUDO); + + fsapi_fs_set_mntops(fs, ramfs_mount, ramfs_unmount); + fsapi_fs_finalise(fs); +} +EXPORT_FILE_SYSTEM(ramfs, ramfs_init); + const struct v_inode_ops ramfs_inode_ops = { .mkdir = ramfs_mkdir, .rmdir = default_inode_rmdir, .dir_lookup = @@ -218,7 +229,8 @@ const struct v_inode_ops ramfs_inode_ops = { .mkdir = ramfs_mkdir, const struct v_file_ops ramfs_file_ops = { .readdir = ramfs_readdir, .close = default_file_close, .read = default_file_read, - .read_page = default_file_read, + .read_page = default_file_read_page, .write = default_file_write, - .write_page = default_file_write, + .write_page = + default_file_write_page, .seek = default_file_seek }; \ No newline at end of file