From 9958bdacfa51b5d8eee386b863cdcc2d76f44f4a Mon Sep 17 00:00:00 2001 From: dzwdz Date: Tue, 24 Aug 2021 16:39:35 +0200 Subject: implement FD_SPECIAL_TTY, an stdout equalivent --- src/kernel/fd.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'src/kernel/fd.c') diff --git a/src/kernel/fd.c b/src/kernel/fd.c index 7d448eb..e99fb7d 100644 --- a/src/kernel/fd.c +++ b/src/kernel/fd.c @@ -1,12 +1,39 @@ #include +#include #include #include +static int fdop_special_tty(enum fdop fdop, struct fd *fd, void *ptr, size_t len); + int fdop_dispatch(enum fdop fdop, struct fd *fd, void *ptr, size_t len) { switch(fd->type) { case FD_EMPTY: return -1; + case FD_SPECIAL_TTY: + return fdop_special_tty(fdop, fd, ptr, len); default: panic(); } } + +static int fdop_special_tty(enum fdop fdop, struct fd *fd, void *ptr, size_t len) { + switch(fdop) { + case FDOP_READ: + return -1; // input not implemented yet + + case FDOP_WRITE: { + struct virt_iter iter; + virt_iter_new(&iter, (void*)ptr, len, + process_current->pages, true, false); + while (virt_iter_next(&iter)) + tty_write(iter.frag, iter.frag_len); + return iter.prior; + } + + case FDOP_CLOSE: + fd->type = FD_EMPTY; + return 0; + + default: panic(); + } +} -- cgit v1.2.3