diff options
author | dzwdz | 2021-09-04 15:25:40 +0200 |
---|---|---|
committer | dzwdz | 2021-09-04 15:25:40 +0200 |
commit | 57ce367309de9ac1b1938202156eac554420bb2a (patch) | |
tree | 7be24257975d47a7db6e4c5a999b6e1951142ff3 /src/kernel/handle.c | |
parent | a5bd09d5a995400c4f4ec1270e1ad380d238783c (diff) |
rename file descriptors to handles
Diffstat (limited to 'src/kernel/handle.c')
-rw-r--r-- | src/kernel/handle.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/kernel/handle.c b/src/kernel/handle.c new file mode 100644 index 0000000..6e25b74 --- /dev/null +++ b/src/kernel/handle.c @@ -0,0 +1,55 @@ +#include <kernel/handle.h> +#include <kernel/mem.h> +#include <kernel/panic.h> +#include <kernel/proc.h> + +static int handleop_special_tty(struct handleop_args *args); + +int handleop_dispatch(struct handleop_args args) { + switch(args.handle->type) { + case HANDLE_EMPTY: { + if (args.type == HANDLEOP_MOUNT) // mounting an empty handle is allowed + return 0; + return -1; + } + case HANDLE_SPECIAL_TTY: + return handleop_special_tty(&args); + default: + panic(); + } +} + +static int handleop_special_tty(struct handleop_args *args) { + switch(args->type) { + case HANDLEOP_MOUNT: + return 0; // no special action needed + + case HANDLEOP_OPEN: + /* don't allow anything after the mount point + * this is a file, not a directory + * for example: open("/tty") is allowed. open("/tty/smth") isn't */ + if (args->open.len == 0) { + args->open.target->type = HANDLE_SPECIAL_TTY; + return 0; + } + return -1; + + case HANDLEOP_READ: + return -1; // input not implemented yet + + case HANDLEOP_WRITE: { + struct virt_iter iter; + virt_iter_new(&iter, args->rw.ptr, args->rw.len, + process_current->pages, true, false); + while (virt_iter_next(&iter)) + tty_write(iter.frag, iter.frag_len); + return iter.prior; + } + + case HANDLEOP_CLOSE: + args->handle->type = HANDLE_EMPTY; + return 0; + + default: panic(); + } +} |