aboutsummaryrefslogtreecommitdiff
path: root/kernel/fs/vnode_specials.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/fs/vnode_specials.c')
-rw-r--r--kernel/fs/vnode_specials.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/kernel/fs/vnode_specials.c b/kernel/fs/vnode_specials.c
index cd21549..fb6df0b 100644
--- a/kernel/fs/vnode_specials.c
+++ b/kernel/fs/vnode_specials.c
@@ -110,8 +110,20 @@ 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");
- return 0;
+ // 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;
}
/*
@@ -125,8 +137,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;
}
/*