From 4f470fd0230937166211230ec282e948afd3d802 Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 22 Sep 2022 20:02:21 -0300 Subject: [PATCH] open: handle O_CREAT flag --- src/sys/syscalls/open.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/sys/syscalls/open.c b/src/sys/syscalls/open.c index 3a8ddd3c..4235d29f 100644 --- a/src/sys/syscalls/open.c +++ b/src/sys/syscalls/open.c @@ -44,6 +44,8 @@ syscallret syscall_open(const char* pathname, int flags, mode_t mode){ fd->offset = 0; vnode_t* file = NULL; + + retry: size_t ret = vfs_open(&file, *name == '/' ? proc->root : proc->cwd, @@ -51,9 +53,19 @@ syscallret syscall_open(const char* pathname, int flags, mode_t mode){ ); if(ret == ENOENT && (flags & O_CREAT)){ - printf("O_CREAT NOT SUPPORTED YET!\n"); - retv.errno = ENOENT; - goto _fail; + ret = vfs_create( + *name == '/' ? proc->root : proc->cwd, + name, mode); + + if(ret){ + retv.errno = ret; + goto _fail; + } + + flags ^= O_CREAT; // remove O CREAT from flags + + goto retry; + } else if(ret){ retv.errno = ret;