diff options
author | sotech117 <michael_foiani@brown.edu> | 2024-04-25 02:58:09 +0000 |
---|---|---|
committer | sotech117 <michael_foiani@brown.edu> | 2024-04-25 02:58:09 +0000 |
commit | a3e64ef2bf31dda9a94db011a96651de918ea968 (patch) | |
tree | 67c1d65ccc219c223d261dfd4cb024201220dcff /kernel/fs/vnode_specials.c | |
parent | d970aa2698d831645986effded059eb344a77486 (diff) |
old vfs fixes
Diffstat (limited to 'kernel/fs/vnode_specials.c')
-rw-r--r-- | kernel/fs/vnode_specials.c | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/kernel/fs/vnode_specials.c b/kernel/fs/vnode_specials.c index cd21549..3e55830 100644 --- a/kernel/fs/vnode_specials.c +++ b/kernel/fs/vnode_specials.c @@ -110,7 +110,21 @@ static long special_file_stat(vnode_t *file, stat_t *ss) static ssize_t chardev_file_read(vnode_t *file, size_t pos, void *buf, size_t count) { - NOT_YET_IMPLEMENTED("VFS: chardev_file_read"); + // NOT_YET_IMPLEMENTED("VFS: chardev_file_read"); + + // check if the vnode represetns a chardev + if (file->vn_dev.chardev == NULL) + { + return -ENXIO; + } + + // Unlock the file and call read + vunlock(file); + ssize_t ret = file->vn_dev.chardev->cd_ops->read(file->vn_dev.chardev, pos, buf, count); + vlock(file); + + return ret; + return 0; } @@ -125,8 +139,20 @@ static ssize_t chardev_file_read(vnode_t *file, size_t pos, void *buf, static long chardev_file_write(vnode_t *file, size_t pos, const void *buf, size_t count) { - NOT_YET_IMPLEMENTED("VFS: chardev_file_write"); - return 0; + // NOT_YET_IMPLEMENTED("VFS: chardev_file_write"); + + // check if the vnode represents a chardev + if (file->vn_dev.chardev == NULL) + { + return -ENXIO; + } + + // Unlock the file and call write + vunlock(file); + long ret = file->vn_dev.chardev->cd_ops->write(file->vn_dev.chardev, pos, buf, count); + vlock(file); + + return ret; } /* |