From a193516bbf3e6e306817ec7e04e3c34885bbc4e1 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 26 Jun 2023 23:19:01 -0300 Subject: [PATCH] syscalls: fcntl --- kernel-src/sys/syscalls/fcntl.c | 55 +++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 kernel-src/sys/syscalls/fcntl.c diff --git a/kernel-src/sys/syscalls/fcntl.c b/kernel-src/sys/syscalls/fcntl.c new file mode 100644 index 00000000..373d30b7 --- /dev/null +++ b/kernel-src/sys/syscalls/fcntl.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include + +#define F_DUPFD 0 +#define F_GETFD 1 +#define F_SETFD 2 +#define F_GETFL 3 +#define F_SETFL 4 + +syscallret_t syscall_fcntl(context_t *, int fd, int cmd, uint64_t arg) { + syscallret_t ret = { + .ret = -1 + }; + + file_t *file = fd_get(fd); + if (file == NULL) { + ret.errno = EBADF; + return ret; + } + + switch (cmd) { + case F_DUPFD: + { + int f; + ret.errno = fd_dup(fd, arg, false, 0, &f); + ret.ret = f; + } + break; + case F_GETFL: + ret.ret = file->flags; + break; + case F_SETFL: + arg &= ~(O_RDONLY | O_WRONLY | O_RDWR | O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC); + file->flags &= ~(O_APPEND | O_ASYNC | O_NOATIME | O_NONBLOCK); + file->flags |= arg; + ret.ret = 0; + break; + case F_SETFD: + case F_GETFD: // TODO implement this + ret.ret = 0; + break; + default: + ret.errno = EINVAL; + break; + } + + if (file) + fd_release(file); + + ret.errno = 0; + return ret; +}