diff --git a/src/fs/devfs.c b/src/fs/devfs.c new file mode 100644 index 00000000..d1e20012 --- /dev/null +++ b/src/fs/devfs.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include + +#include + +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; +} diff --git a/src/fs/tmpfs.c b/src/fs/tmpfs.c index fbc2e7f0..41ed3010 100644 --- a/src/fs/tmpfs.c +++ b/src/fs/tmpfs.c @@ -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; } diff --git a/src/fs/vfs.c b/src/fs/vfs.c index 337fb4bd..38904424 100644 --- a/src/fs/vfs.c +++ b/src/fs/vfs.c @@ -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 +#include 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()); } diff --git a/src/include/errno.h b/src/include/errno.h index 6ccd045b..71b07b63 100644 --- a/src/include/errno.h +++ b/src/include/errno.h @@ -7,5 +7,7 @@ #define EINVAL 4 #define ENOSYS 5 #define EEXIST 6 +#define ENOENT 7 + #endif diff --git a/src/include/kernel/devfs.h b/src/include/kernel/devfs.h new file mode 100644 index 00000000..12eeeb73 --- /dev/null +++ b/src/include/kernel/devfs.h @@ -0,0 +1,10 @@ +#ifndef _DEVFS_H_INCLUDE +#define _DEVFS_H_INCLUDE + +#include + +void devfs_init(); +int devfs_newdevice(char* name, int type, dev_t dev, mode_t mode); +fscalls_t* devfs_getfuncs(); + +#endif diff --git a/src/include/sys/sysmacros.h b/src/include/sys/sysmacros.h new file mode 100644 index 00000000..ad41debc --- /dev/null +++ b/src/include/sys/sysmacros.h @@ -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