mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 06:58: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();
|
desc->calls = tmpfs_getfuncs();
|
||||||
mountpoint->mount = root;
|
mountpoint->mount = root;
|
||||||
|
root->vnode.parent = mountpoint->vnode.parent;
|
||||||
|
|
||||||
return 0;
|
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;
|
vnode_t* dev = NULL;
|
||||||
dirnode_t* mountdir = ref;
|
dirnode_t* mountdir = ref;
|
||||||
dirnode_t* parent;
|
dirnode_t* parent = NULL;
|
||||||
|
|
||||||
if(device){
|
if(device){
|
||||||
dev = ref;
|
dev = ref;
|
||||||
@@ -341,6 +341,7 @@ void vfs_releasenode(vnode_t* node){
|
|||||||
}
|
}
|
||||||
|
|
||||||
#include <kernel/tmpfs.h>
|
#include <kernel/tmpfs.h>
|
||||||
|
#include <kernel/devfs.h>
|
||||||
|
|
||||||
void vfs_init(){
|
void vfs_init(){
|
||||||
printf("Creating a fake root for the VFS\n");
|
printf("Creating a fake root for the VFS\n");
|
||||||
@@ -350,6 +351,6 @@ void vfs_init(){
|
|||||||
hashtable_init(&fsfuncs, 10);
|
hashtable_init(&fsfuncs, 10);
|
||||||
|
|
||||||
hashtable_insert(&fsfuncs, "tmpfs", (void*)tmpfs_getfuncs());
|
hashtable_insert(&fsfuncs, "tmpfs", (void*)tmpfs_getfuncs());
|
||||||
|
hashtable_insert(&fsfuncs, "devfs", (void*)devfs_getfuncs());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,5 +7,7 @@
|
|||||||
#define EINVAL 4
|
#define EINVAL 4
|
||||||
#define ENOSYS 5
|
#define ENOSYS 5
|
||||||
#define EEXIST 6
|
#define EEXIST 6
|
||||||
|
#define ENOENT 7
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#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