redesign of fs_open to support creating files and O_TRUNK

This commit is contained in:
Marian Ohligs 2011-06-21 17:51:52 +02:00
parent aafb9d2cbb
commit 6027bb2d15
3 changed files with 36 additions and 6 deletions

33
fs/fs.c
View file

@ -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;

View file

@ -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);

View file

@ -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);