mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
devfs initial implementation
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
#include <kernel/devfs.h>
|
||||
#include <kernel/vfs.h>
|
||||
#include <kernel/alloc.h>
|
||||
#include <hashtable.h>
|
||||
|
||||
#include <sys/sysmacros.h>
|
||||
|
||||
static hashtable devnodes;
|
||||
static fs_t* fs;
|
||||
|
||||
static int devfs_mount(dirnode_t* mountpoint, vnode_t* device, int mountflags, void* fsinfo){
|
||||
|
||||
dirnode_t* node = vfs_newdirnode(mountpoint->vnode.name, fs, 0);
|
||||
|
||||
if(!node)
|
||||
return ENOMEM;
|
||||
|
||||
mountpoint->mount = node;
|
||||
node->vnode.parent = mountpoint->vnode.parent;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int devfs_unmount() UNIMPLEMENTED
|
||||
static int devfs_open(dirnode_t* parent, char* name){
|
||||
|
||||
vnode_t* devnode = hashtable_get(&devnodes, name);
|
||||
|
||||
if(!devnode)
|
||||
return ENOENT;
|
||||
|
||||
vnode_t* node = vfs_newnode(name, fs, devnode);
|
||||
|
||||
if(!node)
|
||||
return ENOMEM;
|
||||
|
||||
if(!hashtable_insert(&parent->children, name, node)){
|
||||
vfs_destroynode(node);
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int devfs_close() UNIMPLEMENTED
|
||||
static int devfs_mkdir() UNIMPLEMENTED
|
||||
static int devfs_create() UNIMPLEMENTED
|
||||
static int devfs_write() UNIMPLEMENTED
|
||||
static int devfs_read() UNIMPLEMENTED
|
||||
|
||||
|
||||
static fscalls_t devfscalls = {
|
||||
devfs_mount, devfs_unmount, devfs_open, devfs_close, devfs_mkdir, devfs_create, devfs_write, devfs_read
|
||||
};
|
||||
|
||||
void devfs_init(){
|
||||
|
||||
fs = alloc(sizeof(fs_t));
|
||||
fs->calls = &devfscalls;
|
||||
|
||||
hashtable_init(&devnodes, 10);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
int devfs_newdevice(char* name, int type, dev_t dev, mode_t mode){
|
||||
|
||||
vnode_t* node = vfs_newnode(name, fs, 0);
|
||||
if(!node)
|
||||
return ENOMEM;
|
||||
|
||||
if(!hashtable_insert(&devnodes, name, node)){
|
||||
vfs_destroynode(node);
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
node->st.st_rdev = dev;
|
||||
node->st.st_mode = MAKETYPE(type) | mode;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
fscalls_t* devfs_getfuncs(){
|
||||
return &devfscalls;
|
||||
}
|
||||
@@ -21,6 +21,7 @@ static int tmpfs_mount(dirnode_t* mountpoint, vnode_t* device, int mountflags, v
|
||||
|
||||
desc->calls = tmpfs_getfuncs();
|
||||
mountpoint->mount = root;
|
||||
root->vnode.parent = mountpoint->vnode.parent;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+3
-2
@@ -178,7 +178,7 @@ int vfs_mount(dirnode_t* ref, char* device, char* mountpoint, char* fs, int moun
|
||||
|
||||
vnode_t* dev = NULL;
|
||||
dirnode_t* mountdir = ref;
|
||||
dirnode_t* parent;
|
||||
dirnode_t* parent = NULL;
|
||||
|
||||
if(device){
|
||||
dev = ref;
|
||||
@@ -341,6 +341,7 @@ void vfs_releasenode(vnode_t* node){
|
||||
}
|
||||
|
||||
#include <kernel/tmpfs.h>
|
||||
#include <kernel/devfs.h>
|
||||
|
||||
void vfs_init(){
|
||||
printf("Creating a fake root for the VFS\n");
|
||||
@@ -350,6 +351,6 @@ void vfs_init(){
|
||||
hashtable_init(&fsfuncs, 10);
|
||||
|
||||
hashtable_insert(&fsfuncs, "tmpfs", (void*)tmpfs_getfuncs());
|
||||
|
||||
hashtable_insert(&fsfuncs, "devfs", (void*)devfs_getfuncs());
|
||||
|
||||
}
|
||||
|
||||
@@ -7,5 +7,7 @@
|
||||
#define EINVAL 4
|
||||
#define ENOSYS 5
|
||||
#define EEXIST 6
|
||||
#define ENOENT 7
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
#ifndef _DEVFS_H_INCLUDE
|
||||
#define _DEVFS_H_INCLUDE
|
||||
|
||||
#include <kernel/vfs.h>
|
||||
|
||||
void devfs_init();
|
||||
int devfs_newdevice(char* name, int type, dev_t dev, mode_t mode);
|
||||
fscalls_t* devfs_getfuncs();
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,8 @@
|
||||
#ifndef _SYSMACROS_H_INCLUDE
|
||||
#define _SYSMACROS_H_INCLUDE
|
||||
|
||||
#define makedev(major,minor) (((major & 0xFFF) << 8) + (minor & 0xFF))
|
||||
#define major(dev) ((dev >> 8) & 0xFFF)
|
||||
#define minor(dev) (dev & 0xFF)
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user