diff --git a/fs/dev.c b/fs/dev.c index e82c46b7..71790571 100644 --- a/fs/dev.c +++ b/fs/dev.c @@ -8,14 +8,37 @@ struct dev_ops *block_devs[] = { }; struct dev_ops *char_devs[] = { [0 ... 255] = NULL, + [1] = &null_dev, [4] = &tty_dev, }; int dev_open(int major, int minor, int type, struct fd *fd) { struct dev_ops *dev = (type == DEV_BLOCK ? block_devs : char_devs)[major]; if (dev == NULL) - return _ENODEV; + return _ENXIO; fd->ops = &dev->fd; + if (!dev->open) + return 0; return dev->open(major, minor, type, fd); } +// this device seemed so simple it was hardly worth making a new file for it + +static int null_open(int major, int minor, int type, struct fd *fd) { + if (minor != 3) + return _ENXIO; + return 0; +} +static ssize_t null_read(struct fd *fd, void *buf, size_t bufsize) { + return 0; +} +static ssize_t null_write(struct fd *fd, const void *buf, size_t bufsize) { + return bufsize; +} +struct dev_ops null_dev = { + .open = null_open, + .fd = { + .read = null_read, + .write = null_write, + }, +}; diff --git a/fs/dev.h b/fs/dev.h index 1581194b..db42bf46 100644 --- a/fs/dev.h +++ b/fs/dev.h @@ -43,4 +43,6 @@ extern struct dev_ops *char_devs[]; int dev_open(int major, int minor, int type, struct fd *fd); +extern struct dev_ops null_dev; + #endif diff --git a/fs/generic.c b/fs/generic.c index 254608ba..90a21c45 100644 --- a/fs/generic.c +++ b/fs/generic.c @@ -54,7 +54,7 @@ struct fd *generic_openat(struct fd *at, const char *path_raw, int flags, int mo assert(!S_ISLNK(stat.mode)); if (S_ISBLK(stat.mode) || S_ISCHR(stat.mode)) { int type; - if (stat.mode & S_IFBLK) + if (S_ISBLK(stat.mode)) type = DEV_BLOCK; else type = DEV_CHAR; diff --git a/kernel/fs.c b/kernel/fs.c index b07899e7..bc73180d 100644 --- a/kernel/fs.c +++ b/kernel/fs.c @@ -123,9 +123,11 @@ dword_t sys_close(fd_t f) { if (fd == NULL) return _EBADF; if (--fd->refcount == 0) { - int err = fd->ops->close(fd); - if (err < 0) - return err; + if (fd->ops->close) { + int err = fd->ops->close(fd); + if (err < 0) + return err; + } free(fd); } current->files[f] = NULL;