diff --git a/fs/fs.c b/fs/fs.c index 49465a16..63e4878b 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -57,17 +57,42 @@ ssize_t write_fs(vfs_node_t* node, uint8_t* buffer, size_t size, off_t offset) return ret; } -int open_fs(vfs_node_t* node, uint8_t read, uint8_t write) +vfs_node_t* open_fs(const char* name, int flags) { - int ret = -EINVAL; + uint32_t i, j = 1; + vfs_node_t* ret = NULL; + vfs_node_t* fnode = NULL; /* file node */ + vfs_node_t* node = NULL; + char fname[MAX_FNAME]; - if (BUILTIN_EXPECT(!node, 0)) + if (BUILTIN_EXPECT(!name, 0)) return ret; + if (name[0] == '/') + ret = fs_root; + + while((name[j] != '\0') && ret) { + i = 0; + while((name[j] != '/') && (name[j] != '\0')) { + fname[i] = name[j]; + i++; j++; + } + fname[i] = '\0'; + node = fnode; + fnode = finddir_fs(fnode, fname); + if (name[j] == '/') + j++; + } + + if(fnode) { + node = fnode; + name = NULL; + } + spinlock_lock(&node->lock); // Has the node got an open callback? if (node->open != 0) - ret = node->open(node); + ret = node->open(node, (uint8_t*) fname, flags); spinlock_unlock(&node->lock); return ret; diff --git a/fs/initrd.c b/fs/initrd.c index ca9bf773..38f63ea2 100644 --- a/fs/initrd.c +++ b/fs/initrd.c @@ -147,6 +147,10 @@ static ssize_t initrd_write(vfs_node_t* node, uint8_t* buffer, size_t size, off_ return size; } +static vfs_node_t* initrd_open(vfs_node_t* node, uint8_t* name, int flags) +{ + return 0; +} static dirent_t* initrd_readdir(vfs_node_t* node, uint32_t index) @@ -368,6 +372,7 @@ int initrd_init(void) new_node->type = FS_FILE; new_node->read = initrd_read; new_node->write = initrd_write; + new_node->open = initrd_open; new_node->block_size = file_desc->length; new_node->block_list.data[0] = ((char*) header) + file_desc->offset; spinlock_init(&new_node->lock); diff --git a/include/metalsvm/fs.h b/include/metalsvm/fs.h index 6f0dc887..e1cc3b4e 100644 --- a/include/metalsvm/fs.h +++ b/include/metalsvm/fs.h @@ -79,7 +79,7 @@ typedef ssize_t (*read_type_t) (struct vfs_node *, uint8_t*, size_t, off_t); /** @brief Write function pointer */ typedef ssize_t (*write_type_t) (struct vfs_node *, uint8_t*, size_t, off_t); /** @brief Open function pointer */ -typedef int (*open_type_t) (struct vfs_node *); +typedef int (*open_type_t) (struct vfs_node *, uint8_t, int); /** @brief Close function pointer */ typedef int (*close_type_t) (struct vfs_node *); /** @brief Read directory function pointer */ @@ -188,7 +188,7 @@ ssize_t read_fs(vfs_node_t * node, uint8_t* buffer, size_t size, off_t offset); ssize_t write_fs(vfs_node_t * node, uint8_t* buffer, size_t size, off_t offset); /** @brief Yet to be documented */ -int open_fs(vfs_node_t * node, uint8_t read, uint8_t write); +vfs_node_t* open_fs(const char* name, int flags); /** @brief Yet to be documented */ int close_fs(vfs_node_t * node);