mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 23:18:21 +00:00
VFS: dot entries
This commit is contained in:
+1
-2
@@ -10,13 +10,12 @@ static fs_t* fs;
|
|||||||
|
|
||||||
static int devfs_mount(dirnode_t* mountpoint, vnode_t* device, int mountflags, void* fsinfo){
|
static int devfs_mount(dirnode_t* mountpoint, vnode_t* device, int mountflags, void* fsinfo){
|
||||||
|
|
||||||
dirnode_t* node = vfs_newdirnode(mountpoint->vnode.name, fs, 0);
|
dirnode_t* node = vfs_newdirnode(mountpoint->vnode.name, fs, NULL, mountpoint->vnode.parent);
|
||||||
|
|
||||||
if(!node)
|
if(!node)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
|
|
||||||
mountpoint->mount = node;
|
mountpoint->mount = node;
|
||||||
node->vnode.parent = mountpoint->vnode.parent;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-4
@@ -12,7 +12,7 @@ static int tmpfs_mount(dirnode_t* mountpoint, vnode_t* device, int mountflags, v
|
|||||||
if(!desc)
|
if(!desc)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
|
|
||||||
dirnode_t* root = vfs_newdirnode(mountpoint->vnode.name, desc, NULL);
|
dirnode_t* root = vfs_newdirnode(mountpoint->vnode.name, desc, NULL, mountpoint->vnode.parent);
|
||||||
|
|
||||||
if(!root){
|
if(!root){
|
||||||
free(desc);
|
free(desc);
|
||||||
@@ -21,7 +21,6 @@ static int tmpfs_mount(dirnode_t* mountpoint, vnode_t* device, int mountflags, v
|
|||||||
|
|
||||||
desc->calls = tmpfs_getfuncs();
|
desc->calls = tmpfs_getfuncs();
|
||||||
mountpoint->mount = root;
|
mountpoint->mount = root;
|
||||||
root->vnode.parent = mountpoint->vnode.parent;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -74,7 +73,7 @@ static int tmpfs_close(vnode_t* node){return 0;} // nothing to do really
|
|||||||
|
|
||||||
static int tmpfs_mkdir(dirnode_t* parent, char* name, mode_t mode){
|
static int tmpfs_mkdir(dirnode_t* parent, char* name, mode_t mode){
|
||||||
|
|
||||||
dirnode_t* node = vfs_newdirnode(name, parent->vnode.fs, NULL);
|
dirnode_t* node = vfs_newdirnode(name, parent->vnode.fs, NULL, parent);
|
||||||
|
|
||||||
if(!node)
|
if(!node)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
@@ -84,7 +83,6 @@ static int tmpfs_mkdir(dirnode_t* parent, char* name, mode_t mode){
|
|||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
node->vnode.parent = parent;
|
|
||||||
stat* st = &node->vnode.st;
|
stat* st = &node->vnode.st;
|
||||||
st->st_mode = MAKETYPE(TYPE_DIR) | GETMODE(mode);
|
st->st_mode = MAKETYPE(TYPE_DIR) | GETMODE(mode);
|
||||||
st->st_blksize = PAGE_SIZE;
|
st->st_blksize = PAGE_SIZE;
|
||||||
|
|||||||
+7
-4
@@ -276,7 +276,7 @@ vnode_t* vfs_newnode(char* name, fs_t* fs, void* fsdata){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
dirnode_t* vfs_newdirnode(char* name, fs_t* fs, void* fsdata){
|
dirnode_t* vfs_newdirnode(char* name, fs_t* fs, void* fsdata, dirnode_t* parent){
|
||||||
|
|
||||||
dirnode_t* node = alloc(sizeof(dirnode_t));
|
dirnode_t* node = alloc(sizeof(dirnode_t));
|
||||||
if(!node) return NULL;
|
if(!node) return NULL;
|
||||||
@@ -289,12 +289,15 @@ dirnode_t* vfs_newdirnode(char* name, fs_t* fs, void* fsdata){
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!hashtable_init(&node->children, 10)){ // add more here later
|
if(!hashtable_init(&node->children, 25)){ // add more here later
|
||||||
free(vnode->name);
|
free(vnode->name);
|
||||||
free(node);
|
free(node);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hashtable_insert(&node->children, ".", node);
|
||||||
|
hashtable_insert(&node->children, "..", parent);
|
||||||
|
|
||||||
vnode->st.st_mode = MAKETYPE(TYPE_DIR);
|
vnode->st.st_mode = MAKETYPE(TYPE_DIR);
|
||||||
vnode->fs = fs;
|
vnode->fs = fs;
|
||||||
vnode->fsdata = fsdata;
|
vnode->fsdata = fsdata;
|
||||||
@@ -401,7 +404,7 @@ void vfs_releasenode(vnode_t* node){
|
|||||||
void vfs_init(){
|
void vfs_init(){
|
||||||
printf("Creating a fake root for the VFS\n");
|
printf("Creating a fake root for the VFS\n");
|
||||||
|
|
||||||
vfsroot = vfs_newdirnode("/", NULL, NULL);
|
vfsroot = vfs_newdirnode("/", NULL, NULL, NULL);
|
||||||
|
|
||||||
hashtable_init(&fsfuncs, 10);
|
hashtable_init(&fsfuncs, 10);
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ dirnode_t* vfs_root();
|
|||||||
void vfs_acquirenode(vnode_t* node);
|
void vfs_acquirenode(vnode_t* node);
|
||||||
void vfs_releasenode(vnode_t* node);
|
void vfs_releasenode(vnode_t* node);
|
||||||
vnode_t* vfs_newnode(char* name, fs_t* fs, void* fsdata);
|
vnode_t* vfs_newnode(char* name, fs_t* fs, void* fsdata);
|
||||||
dirnode_t* vfs_newdirnode(char* name, fs_t* fs, void* fsdata);
|
dirnode_t* vfs_newdirnode(char* name, fs_t* fs, void* fsdata, dirnode_t* parent);
|
||||||
void vfs_destroynode(vnode_t* node);
|
void vfs_destroynode(vnode_t* node);
|
||||||
int vfs_resolvepath(vnode_t** result, dirnode_t** parent, dirnode_t* ref, char* path, char* name);
|
int vfs_resolvepath(vnode_t** result, dirnode_t** parent, dirnode_t* ref, char* path, char* name);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user