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, 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;
}
/*