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.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/kernel/fs/vnode_specials.c b/kernel/fs/vnode_specials.c
index fb6df0b..d8c79bd 100644
--- a/kernel/fs/vnode_specials.c
+++ b/kernel/fs/vnode_specials.c
@@ -159,20 +159,47 @@ static long chardev_file_write(vnode_t *file, size_t pos, const void *buf,
*/
static long chardev_file_mmap(vnode_t *file, mobj_t **ret)
{
- NOT_YET_IMPLEMENTED("VM: chardev_file_mmap");
- return 0;
+ // NOT_YET_IMPLEMENTED("VM: chardev_file_mmap");
+
+ // check if the vnode represents a chardev
+ chardev_t *dev = file->vn_dev.chardev;
+ if (dev == NULL)
+ {
+ return -ENXIO;
+ }
+
+ // call the chardev's mmap operation
+ return dev->cd_ops->mmap(file, ret);
}
static long chardev_file_fill_pframe(vnode_t *file, pframe_t *pf)
{
- NOT_YET_IMPLEMENTED("VM: chardev_file_fill_pframe");
- return 0;
+ // NOT_YET_IMPLEMENTED("VM: chardev_file_fill_pframe");
+
+ // check if the vnode represents a chardev
+ chardev_t *dev = file->vn_dev.chardev;
+ if (dev == NULL)
+ {
+ return -ENXIO;
+ }
+
+ // call the chardev's fill_pframe operation
+ return dev->cd_ops->fill_pframe(file, pf);
}
static long chardev_file_flush_pframe(vnode_t *file, pframe_t *pf)
{
- NOT_YET_IMPLEMENTED("VM: chardev_file_flush_pframe");
- return 0;
+ // NOT_YET_IMPLEMENTED("VM: chardev_file_flush_pframe");
+
+ // check if the vnode represents a chardev
+ chardev_t *dev = file->vn_dev.chardev;
+ if (dev == NULL)
+ {
+ return -ENXIO;
+ }
+
+ // call the chardev's flush_pframe operation
+ return dev->cd_ops->flush_pframe(file, pf);
}
static ssize_t blockdev_file_read(vnode_t *file, size_t pos, void *buf,