From a02c7cb731144f36e1b3bcd24c2f15a858af2c57 Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 13 May 2026 18:25:51 -0300 Subject: [PATCH] open: fix flags bug --- kernel-src/include/kernel/file.h | 1 + kernel-src/sys/syscalls/open.c | 26 ++++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/kernel-src/include/kernel/file.h b/kernel-src/include/kernel/file.h index 6b1869e3..d8e64063 100644 --- a/kernel-src/include/kernel/file.h +++ b/kernel-src/include/kernel/file.h @@ -42,6 +42,7 @@ int fd_insert(file_t *file, int *fdp, int flags); #define O_RDONLY 0 #define O_WRONLY 1 #define O_RDWR 2 +#define O_ACCMODE 3 #define AT_FDCWD -100 #define O_CREAT 0100 diff --git a/kernel-src/sys/syscalls/open.c b/kernel-src/sys/syscalls/open.c index 57f01e09..119cab47 100644 --- a/kernel-src/sys/syscalls/open.c +++ b/kernel-src/sys/syscalls/open.c @@ -6,14 +6,36 @@ #include #include +static int open_flags_to_file_flags(int *file_flags) { + int access = *file_flags & O_ACCMODE; + + *file_flags &= ~O_ACCMODE; + switch (access) { + case O_RDONLY: + *file_flags |= FILE_READ; + break; + case O_WRONLY: + *file_flags |= FILE_WRITE; + break; + case O_RDWR: + *file_flags |= FILE_READ | FILE_WRITE; + break; + default: + return EINVAL; + } + + return 0; +} + syscallret_t syscall_openat(context_t *context, int dirfd, char *path, int flags, mode_t mode) { syscallret_t ret = { .ret = -1, .errno = -1 }; - // transform O_RDONLY, O_WRONLY, O_RDWR into FILE_READ and FILE_WRITE - ++flags; + ret.errno = open_flags_to_file_flags(&flags); + if (ret.errno) + return ret; vnode_t *dirnode = NULL; file_t *dirfile = NULL;