mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 15:08:21 +00:00
devman and vfs: check if a function is not implemented before calling
This commit is contained in:
+1
-5
@@ -45,10 +45,6 @@ static int devfs_open(dirnode_t* parent, char* name){
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int devfs_close(){return 0;}
|
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){
|
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 = {
|
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(){
|
void devfs_init(){
|
||||||
|
|||||||
+17
-2
@@ -87,7 +87,9 @@ int vfs_write(int* error, vnode_t* node, void* buff, size_t count, size_t offset
|
|||||||
|
|
||||||
return writecount;
|
return writecount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!node->fs->calls->write)
|
||||||
|
return ENOSYS;
|
||||||
|
|
||||||
spinlock_acquire(&lock);
|
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)
|
if(!fd)
|
||||||
fd = &tmpfd;
|
fd = &tmpfd;
|
||||||
|
|
||||||
|
|
||||||
int type = GETTYPE(node->st.st_mode);
|
int type = GETTYPE(node->st.st_mode);
|
||||||
|
|
||||||
if(type == TYPE_SOCKET)
|
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);
|
int readcount = devman_read(error, node->st.st_rdev, buff, count, offset);
|
||||||
return readcount;
|
return readcount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!node->fs->calls->read)
|
||||||
|
return ENOSYS;
|
||||||
|
|
||||||
spinlock_acquire(&lock);
|
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){
|
int vfs_close(vnode_t* node){
|
||||||
|
|
||||||
|
if(!node->fs->calls->close)
|
||||||
|
return ENOSYS;
|
||||||
|
|
||||||
spinlock_acquire(&lock);
|
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 vfs_getdirent(dirnode_t* node, dent_t* buff, size_t count, uintmax_t offset, size_t* readcount){
|
||||||
|
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
if(!node->vnode.fs->calls->getdirent)
|
||||||
|
return ENOSYS;
|
||||||
|
|
||||||
spinlock_acquire(&lock);
|
spinlock_acquire(&lock);
|
||||||
|
|
||||||
@@ -295,6 +305,11 @@ int vfs_create(dirnode_t* ref, char* path, mode_t mode){
|
|||||||
spinlock_release(&lock);
|
spinlock_release(&lock);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!parent->vnode.fs->calls->create){
|
||||||
|
spinlock_release(&lock);
|
||||||
|
return ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
result = parent->vnode.fs->calls->create(parent, name, mode);
|
result = parent->vnode.fs->calls->create(parent, name, mode);
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ int devman_write(int *error, int dev, void* buff, size_t count, size_t offset){
|
|||||||
if(major(dev) > highestmajor)
|
if(major(dev) > highestmajor)
|
||||||
return ENODEV;
|
return ENODEV;
|
||||||
|
|
||||||
|
|
||||||
|
if(!majorcalls[major(dev)]->write)
|
||||||
|
return ENOTTY;
|
||||||
|
|
||||||
return majorcalls[major(dev)]->write(error, minor(dev), buff, count, offset);
|
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)
|
if(major(dev) > highestmajor)
|
||||||
return ENODEV;
|
return ENODEV;
|
||||||
|
|
||||||
|
if(!majorcalls[major(dev)]->read)
|
||||||
|
return ENOTTY;
|
||||||
|
|
||||||
|
|
||||||
return majorcalls[major(dev)]->read(error, minor(dev), buff, count, offset);
|
return majorcalls[major(dev)]->read(error, minor(dev), buff, count, offset);
|
||||||
@@ -51,6 +58,9 @@ int devman_isatty(int dev){
|
|||||||
|
|
||||||
if(major(dev) > highestmajor)
|
if(major(dev) > highestmajor)
|
||||||
return ENOTTY;
|
return ENOTTY;
|
||||||
|
|
||||||
|
if(!majorcalls[major(dev)]->isatty)
|
||||||
|
return ENOTTY;
|
||||||
|
|
||||||
return majorcalls[major(dev)]->isatty(minor(dev));
|
return majorcalls[major(dev)]->isatty(minor(dev));
|
||||||
|
|
||||||
@@ -61,6 +71,10 @@ int devman_isseekable(int dev, size_t* max){
|
|||||||
if(major(dev) > highestmajor)
|
if(major(dev) > highestmajor)
|
||||||
return ENOTTY;
|
return ENOTTY;
|
||||||
|
|
||||||
|
if(!majorcalls[major(dev)]->isseekable)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
|
||||||
return majorcalls[major(dev)]->isseekable(minor(dev), max);
|
return majorcalls[major(dev)]->isseekable(minor(dev), max);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-10
@@ -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){
|
static int read(int *error, int minor, void* buff, size_t count, size_t offset){
|
||||||
count /= sizeof(kbpacket_t);
|
count /= sizeof(kbpacket_t);
|
||||||
if(count == 0){
|
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 = {
|
static devcalls calls = {
|
||||||
read, write, isatty, seekable
|
read
|
||||||
};
|
};
|
||||||
|
|
||||||
void keyboard_init(){
|
void keyboard_init(){
|
||||||
|
|||||||
@@ -13,17 +13,13 @@ static int write(int* error, int minor, void* buff, size_t count, size_t offset)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int isatty(int minor){
|
|
||||||
return ENOTTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int isseekable(int minor, size_t* max){
|
static int isseekable(int minor, size_t* max){
|
||||||
*max = ~(size_t)0;
|
*max = ~(size_t)0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static devcalls calls = {
|
static devcalls calls = {
|
||||||
read, write, isatty, isseekable
|
read, write, NULL, isseekable
|
||||||
};
|
};
|
||||||
|
|
||||||
void fulldev_init(){
|
void fulldev_init(){
|
||||||
|
|||||||
@@ -12,17 +12,13 @@ static int write(int* error, int minor, void* buff, size_t count, size_t offset)
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int isatty(int minor){
|
|
||||||
return ENOTTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int isseekable(int minor, size_t* max){
|
static int isseekable(int minor, size_t* max){
|
||||||
*max = ~(size_t)0;
|
*max = ~(size_t)0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static devcalls calls = {
|
static devcalls calls = {
|
||||||
read, write, isatty, isseekable
|
read, write, NULL, isseekable
|
||||||
};
|
};
|
||||||
|
|
||||||
void nulldev_init(){
|
void nulldev_init(){
|
||||||
|
|||||||
@@ -13,17 +13,13 @@ static int write(int* error, int minor, void* buff, size_t count, size_t offset)
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int isatty(int minor){
|
|
||||||
return ENOTTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int isseekable(int minor, size_t* max){
|
static int isseekable(int minor, size_t* max){
|
||||||
*max = ~(size_t)0;
|
*max = ~(size_t)0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static devcalls calls = {
|
static devcalls calls = {
|
||||||
read, write, isatty, isseekable
|
read, write, NULL, isseekable
|
||||||
};
|
};
|
||||||
|
|
||||||
void zerodev_init(){
|
void zerodev_init(){
|
||||||
|
|||||||
@@ -121,10 +121,6 @@ int write(int* error, int minor, void* buff, size_t count, size_t offset){
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
int isatty(int minor){
|
|
||||||
return ENOTTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int isseekable(int minor, size_t* max){
|
static int isseekable(int minor, size_t* max){
|
||||||
|
|
||||||
if(minor >= fbcount)
|
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 = {
|
static devcalls calls = {
|
||||||
read, write, isatty, isseekable, ioctl, NULL, map
|
read, write, NULL, isseekable, ioctl, NULL, map
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user