diff --git a/src/fs/devfs.c b/src/fs/devfs.c index 47293d61..56780654 100644 --- a/src/fs/devfs.c +++ b/src/fs/devfs.c @@ -45,10 +45,6 @@ static int devfs_open(dirnode_t* parent, char* name){ } static int devfs_close(){return 0;} -static int devfs_mkdir() UNIMPLEMENTED -static int devfs_create() UNIMPLEMENTED -static int devfs_write() UNIMPLEMENTED -static int devfs_read() UNIMPLEMENTED static int devfs_getdirent(dirnode_t* node, dent_t* buff, size_t count, uintmax_t offset, size_t* readcount){ @@ -84,7 +80,7 @@ static int devfs_chmod(vnode_t* node, mode_t mode){ } static fscalls_t devfscalls = { - devfs_mount, devfs_unmount, devfs_open, devfs_close, devfs_mkdir, devfs_create, devfs_write, devfs_read, devfs_getdirent, devfs_chmod + devfs_mount, devfs_unmount, devfs_open, devfs_close, NULL, NULL, NULL, NULL, devfs_getdirent, devfs_chmod }; void devfs_init(){ diff --git a/src/fs/vfs.c b/src/fs/vfs.c index 389882c9..a922ce60 100644 --- a/src/fs/vfs.c +++ b/src/fs/vfs.c @@ -87,7 +87,9 @@ int vfs_write(int* error, vnode_t* node, void* buff, size_t count, size_t offset return writecount; } - + + if(!node->fs->calls->write) + return ENOSYS; spinlock_acquire(&lock); @@ -156,7 +158,6 @@ int vfs_read(int* error, vnode_t* node, void* buff, size_t count, size_t offset, if(!fd) fd = &tmpfd; - int type = GETTYPE(node->st.st_mode); if(type == TYPE_SOCKET) @@ -175,6 +176,9 @@ int vfs_read(int* error, vnode_t* node, void* buff, size_t count, size_t offset, int readcount = devman_read(error, node->st.st_rdev, buff, count, offset); return readcount; } + + if(!node->fs->calls->read) + return ENOSYS; spinlock_acquire(&lock); @@ -187,6 +191,9 @@ int vfs_read(int* error, vnode_t* node, void* buff, size_t count, size_t offset, } int vfs_close(vnode_t* node){ + + if(!node->fs->calls->close) + return ENOSYS; spinlock_acquire(&lock); @@ -207,6 +214,9 @@ int vfs_close(vnode_t* node){ int vfs_getdirent(dirnode_t* node, dent_t* buff, size_t count, uintmax_t offset, size_t* readcount){ int err = 0; + + if(!node->vnode.fs->calls->getdirent) + return ENOSYS; spinlock_acquire(&lock); @@ -295,6 +305,11 @@ int vfs_create(dirnode_t* ref, char* path, mode_t mode){ spinlock_release(&lock); return result; } + + if(!parent->vnode.fs->calls->create){ + spinlock_release(&lock); + return ENOSYS; + } result = parent->vnode.fs->calls->create(parent, name, mode); diff --git a/src/sys/devman.c b/src/sys/devman.c index 422dcead..699e4f4c 100644 --- a/src/sys/devman.c +++ b/src/sys/devman.c @@ -31,6 +31,10 @@ int devman_write(int *error, int dev, void* buff, size_t count, size_t offset){ if(major(dev) > highestmajor) return ENODEV; + + if(!majorcalls[major(dev)]->write) + return ENOTTY; + return majorcalls[major(dev)]->write(error, minor(dev), buff, count, offset); @@ -40,6 +44,9 @@ int devman_read(int *error, int dev, void* buff, size_t count, size_t offset){ if(major(dev) > highestmajor) return ENODEV; + + if(!majorcalls[major(dev)]->read) + return ENOTTY; return majorcalls[major(dev)]->read(error, minor(dev), buff, count, offset); @@ -51,6 +58,9 @@ int devman_isatty(int dev){ if(major(dev) > highestmajor) return ENOTTY; + + if(!majorcalls[major(dev)]->isatty) + return ENOTTY; return majorcalls[major(dev)]->isatty(minor(dev)); @@ -61,6 +71,10 @@ int devman_isseekable(int dev, size_t* max){ if(major(dev) > highestmajor) return ENOTTY; + if(!majorcalls[major(dev)]->isseekable) + return 0; + + return majorcalls[major(dev)]->isseekable(minor(dev), max); } diff --git a/src/sys/keyboard.c b/src/sys/keyboard.c index 48c2224a..4ec16e72 100644 --- a/src/sys/keyboard.c +++ b/src/sys/keyboard.c @@ -127,7 +127,6 @@ int keyboard_getnew(){ } -static int write(int *error, int minor, void* buff, size_t count){*error = EINVAL; return -1;} static int read(int *error, int minor, void* buff, size_t count, size_t offset){ count /= sizeof(kbpacket_t); if(count == 0){ @@ -146,16 +145,8 @@ static int read(int *error, int minor, void* buff, size_t count, size_t offset){ } -static int isatty(){ - return ENOTTY; -} - -static int seekable(){ - return 0; -} - static devcalls calls = { - read, write, isatty, seekable + read }; void keyboard_init(){ diff --git a/src/sys/pseudodevs/full.c b/src/sys/pseudodevs/full.c index d9b25457..5991a079 100644 --- a/src/sys/pseudodevs/full.c +++ b/src/sys/pseudodevs/full.c @@ -13,17 +13,13 @@ static int write(int* error, int minor, void* buff, size_t count, size_t offset) return -1; } -static int isatty(int minor){ - return ENOTTY; -} - static int isseekable(int minor, size_t* max){ *max = ~(size_t)0; return 0; } static devcalls calls = { - read, write, isatty, isseekable + read, write, NULL, isseekable }; void fulldev_init(){ diff --git a/src/sys/pseudodevs/null.c b/src/sys/pseudodevs/null.c index ecdac6ef..d9f288e3 100644 --- a/src/sys/pseudodevs/null.c +++ b/src/sys/pseudodevs/null.c @@ -12,17 +12,13 @@ static int write(int* error, int minor, void* buff, size_t count, size_t offset) return count; } -static int isatty(int minor){ - return ENOTTY; -} - static int isseekable(int minor, size_t* max){ *max = ~(size_t)0; return 0; } static devcalls calls = { - read, write, isatty, isseekable + read, write, NULL, isseekable }; void nulldev_init(){ diff --git a/src/sys/pseudodevs/zero.c b/src/sys/pseudodevs/zero.c index a842004b..488423fc 100644 --- a/src/sys/pseudodevs/zero.c +++ b/src/sys/pseudodevs/zero.c @@ -13,17 +13,13 @@ static int write(int* error, int minor, void* buff, size_t count, size_t offset) return count; } -static int isatty(int minor){ - return ENOTTY; -} - static int isseekable(int minor, size_t* max){ *max = ~(size_t)0; return 0; } static devcalls calls = { - read, write, isatty, isseekable + read, write, NULL, isseekable }; void zerodev_init(){ diff --git a/src/video/framebuffer.c b/src/video/framebuffer.c index 655f08e6..2e04a545 100644 --- a/src/video/framebuffer.c +++ b/src/video/framebuffer.c @@ -121,10 +121,6 @@ int write(int* error, int minor, void* buff, size_t count, size_t offset){ return count; } -int isatty(int minor){ - return ENOTTY; -} - static int isseekable(int minor, size_t* max){ if(minor >= fbcount) @@ -201,7 +197,7 @@ static map(int minor, void* addr, size_t len, size_t offset, size_t mmuflags){ } static devcalls calls = { - read, write, isatty, isseekable, ioctl, NULL, map + read, write, NULL, isseekable, ioctl, NULL, map };