still working on a more robust vfs
This commit is contained in:
36
kernel/vfs.c
36
kernel/vfs.c
@@ -16,7 +16,7 @@ vfs_node_t* vfs_create_root() {
|
||||
|
||||
root->flags |= VFS_DIRECTORY;
|
||||
root->size = 0;
|
||||
root->finddir = NULL;
|
||||
root->find = NULL;
|
||||
|
||||
return root;
|
||||
}
|
||||
@@ -27,10 +27,9 @@ void vfs_mount(vfs_node_t* _mnt, vfs_node_t* _fs) {
|
||||
}
|
||||
|
||||
vfs_node_t* vfs_find(const char* path) {
|
||||
if (path[0] != '/') return NULL;
|
||||
vfs_node_t* current = root;
|
||||
|
||||
char* sav;
|
||||
char* sav = NULL;
|
||||
|
||||
size_t path_sz = strlen(path) + 1;
|
||||
char* path_cpy = kalloc(path_sz);
|
||||
@@ -38,25 +37,36 @@ vfs_node_t* vfs_find(const char* path) {
|
||||
memcpy(path, path_cpy, path_sz);
|
||||
|
||||
char* tkn = strtok_r(path_cpy, "/", &sav);
|
||||
|
||||
while (tkn != NULL) {
|
||||
kprintf("Found tkn: %s\n");
|
||||
if (!current || !current->find) {
|
||||
current = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
current = current->find(current, tkn);
|
||||
|
||||
if (current == NULL) {
|
||||
break;
|
||||
}
|
||||
|
||||
tkn = strtok_r(NULL, "/", &sav);
|
||||
}
|
||||
|
||||
kfree(path_cpy);
|
||||
|
||||
const char* cmp = path + 1;
|
||||
if (*cmp == '\0') return current;
|
||||
|
||||
if (current->finddir) {
|
||||
return current->finddir(current, cmp);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
vfs_node_t* vfs_mkdir(vfs_node_t* parent, const char* name) {
|
||||
vfs_node_t* node = kalloc(sizeof(vfs_node_t));
|
||||
if (!parent || !name) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (strlen(name) == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return parent->mkdir(parent, name);
|
||||
}
|
||||
|
||||
int vfs_open(const char* _path, int flags) {
|
||||
|
||||
Reference in New Issue
Block a user