diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ext2.c | 4 | ||||
-rw-r--r-- | fs/shm.c | 2 | ||||
-rw-r--r-- | fs/tmpfs.c | 5 | ||||
-rw-r--r-- | fs/vfs.c | 29 | ||||
-rw-r--r-- | fs/vfs.h | 7 |
5 files changed, 41 insertions, 6 deletions
@@ -504,7 +504,8 @@ vfs_inode_t *ext2_open(const char *path) { return vfs_create_inode(inode_num, type, 1 /*has_data*/, 1 /*can_write*/, 1 /*is_open*/, NULL /*internal_object*/, file_size, ext2_open, ext2_create_file, ext2_read, ext2_write, - ext2_close, NULL /*get_vm_object*/); + ext2_close, ext2_create_directory, + NULL /*get_vm_object*/); } uint64_t end_of_last_entry_position(int dir_inode, uint64_t *entry_offset, @@ -697,6 +698,7 @@ vfs_inode_t *ext2_mount(void) { root->write = ext2_write; root->close = ext2_close; root->create_file = ext2_create_file; + root->create_directory = ext2_create_directory; parse_superblock(); return root; } @@ -64,7 +64,7 @@ int shm_open(const char *name, int oflag, mode_t mode) { vfs_create_inode(0 /*inode_num*/, 0 /*type*/, 1 /*has_data*/, 1 /*can_write*/, 1 /*is_open*/, internal_object, 0 /*file_size*/, NULL /*open*/, NULL /*create_file*/, - shm_read, shm_write, NULL /*close*/, shm_get_vm_object); + shm_read, shm_write, NULL /*close*/, NULL/*create_directory*/, shm_get_vm_object); vfs_fd_t *fd_ptr; int fd = vfs_create_fd(oflag, mode, inode, &fd_ptr); @@ -47,7 +47,8 @@ void dual_pipe(int fd[2]) { vfs_inode_t *inode = vfs_create_inode( 0 /*inode_num*/, 0 /*type*/, has_data, can_write, is_open, internal_object, 0 /*file_size*/, NULL /*open*/, NULL /*create_file*/, - tmp_read, tmp_write, tmp_close, NULL /*get_vm_object*/); + tmp_read, tmp_write, tmp_close, NULL /*create_directory*/, + NULL /*get_vm_object*/); assert(inode); vfs_fd_t *fd_ptr; @@ -76,7 +77,7 @@ void pipe(int fd[2]) { vfs_inode_t *inode = vfs_create_inode( 0 /*inode_num*/, 0 /*type*/, has_data, can_write, is_open, internal_object, 0 /*file_size*/, NULL /*open*/, NULL /*create_file*/, - tmp_read, tmp_write, tmp_close, NULL /*get_vm_object*/); + tmp_read, tmp_write, tmp_close, NULL/*create_directory*/, NULL /*get_vm_object*/); assert(inode); vfs_fd_t *fd_ptr; @@ -30,6 +30,7 @@ vfs_inode_t *vfs_create_inode( int (*read)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd), int (*write)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd), void (*close)(vfs_fd_t *fd), + int (*create_directory)(const char *path, int mode), vfs_vm_object_t *(*get_vm_object)(uint64_t length, uint64_t offset, vfs_fd_t *fd)) { vfs_inode_t *r = kmalloc(sizeof(inode_t)); @@ -45,6 +46,7 @@ vfs_inode_t *vfs_create_inode( r->read = read; r->write = write; r->close = close; + r->create_directory = create_directory; r->get_vm_object = get_vm_object; return r; } @@ -155,6 +157,33 @@ char *vfs_resolve_path(const char *file, char *resolved_path) { return final; } +int vfs_mkdir(const char *path, int mode) { + vfs_mounts_t *file_mount = 0; + int length = 0; + for (int i = 0; i < num_mounts; i++) { + int path_len = strlen(mounts[i].path); + if (path_len <= length) + continue; + + if (isequal_n(mounts[i].path, path, path_len)) { + length = path_len; + file_mount = &mounts[i]; + } + } + if (1 != length) + path += length; + + if (!file_mount) { + kprintf("vfs_internal_open could not find mounted path for file : %s\n", + path); + return 0; + } + assert(file_mount->local_root->create_directory); + // TODO: Error checking, don't just assume it is fine + file_mount->local_root->create_directory(path, mode); + return 0; +} + int vfs_open(const char *file, int flags, int mode) { char resolved_path[256] = {0}; vfs_resolve_path(file, resolved_path); @@ -47,8 +47,8 @@ struct vfs_fd { int flags; int mode; int reference_count; // Number of usages of this file descriptor, - // once it reaches zero then the contents can - // be freed. + // once it reaches zero then the contents can + // be freed. vfs_inode_t *inode; }; @@ -65,6 +65,7 @@ struct vfs_inode { int (*read)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd); int (*write)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd); void (*close)(vfs_fd_t *fd); + int (*create_directory)(const char *path, int mode); vfs_vm_object_t *(*get_vm_object)(uint64_t length, uint64_t offset, vfs_fd_t *fd); }; @@ -80,6 +81,7 @@ int vfs_pread(int fd, void *buf, uint64_t count, uint64_t offset); vfs_vm_object_t *vfs_get_vm_object(int fd, uint64_t length, uint64_t offset); int vfs_dup2(int org_fd, int new_fd); vfs_inode_t *vfs_internal_open(const char *file); +int vfs_mkdir(const char *path, int mode); int vfs_create_fd(int flags, int mode, vfs_inode_t *inode, vfs_fd_t **fd); vfs_inode_t *vfs_create_inode( int inode_num, int type, uint8_t has_data, uint8_t can_write, @@ -89,6 +91,7 @@ vfs_inode_t *vfs_create_inode( int (*read)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd), int (*write)(uint8_t *buffer, uint64_t offset, uint64_t len, vfs_fd_t *fd), void (*close)(vfs_fd_t *fd), + int (*create_directory)(const char *path, int mode), vfs_vm_object_t *(*get_vm_object)(uint64_t length, uint64_t offset, vfs_fd_t *fd)); #endif |