redesign of fs_open to support creating files and O_TRUNK
This commit is contained in:
parent
aafb9d2cbb
commit
6027bb2d15
3 changed files with 36 additions and 6 deletions
33
fs/fs.c
33
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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue