From c0fdd5700e405bab7ed5460d4c340bf42998682e Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 5 Jul 2023 00:03:13 -0300 Subject: [PATCH] syscalls: misc fixes --- kernel-src/sys/syscalls/execve.c | 5 +++-- kernel-src/sys/syscalls/exit.c | 3 --- kernel-src/sys/syscalls/pipe2.c | 11 +++++------ kernel-src/sys/syscalls/seek.c | 9 ++++----- kernel-src/sys/syscalls/stat.c | 5 ++++- 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/kernel-src/sys/syscalls/execve.c b/kernel-src/sys/syscalls/execve.c index da7df458..158cf32b 100644 --- a/kernel-src/sys/syscalls/execve.c +++ b/kernel-src/sys/syscalls/execve.c @@ -91,8 +91,9 @@ syscallret_t syscall_execve(context_t *context, char *upath, char *uargv[], char goto error; if (interp) { - vnode_t *interpnode; - ret.errno = vfs_lookup(&interpnode, refnode, interp, NULL, 0); + vnode_t *interpnode = NULL; + vnode_t *interprefnode = *interp == '/' ? sched_getroot() : sched_getcwd(); + ret.errno = vfs_lookup(&interpnode, interprefnode, interp, NULL, 0); if (ret.errno) goto error; diff --git a/kernel-src/sys/syscalls/exit.c b/kernel-src/sys/syscalls/exit.c index b163a7ac..749c5981 100644 --- a/kernel-src/sys/syscalls/exit.c +++ b/kernel-src/sys/syscalls/exit.c @@ -37,9 +37,6 @@ __attribute__((noreturn)) void syscall_exit(context_t *context, int status) { } if (lastchild) { - if (lastchild->sibling->state == SCHED_PROC_STATE_ZOMBIE) - haszombie = true; - lastchild->sibling = sched_initproc->child; sched_initproc->child = proc->child; } diff --git a/kernel-src/sys/syscalls/pipe2.c b/kernel-src/sys/syscalls/pipe2.c index 519cc07b..ac3a0206 100644 --- a/kernel-src/sys/syscalls/pipe2.c +++ b/kernel-src/sys/syscalls/pipe2.c @@ -15,8 +15,7 @@ static void open(file_t *file, vnode_t *node, int flags) { } syscallret_t syscall_pipe2(context_t *, int flags) { - // TODO support them - __assert(flags == 0); + __assert((flags & ~(O_CLOEXEC | O_NONBLOCK)) == 0); syscallret_t ret = { .ret = -1 }; @@ -33,17 +32,17 @@ syscallret_t syscall_pipe2(context_t *, int flags) { // node held again because two files will point to the same node VOP_HOLD(node); - ret.errno = fd_new(0, &readfile, &readfd); + ret.errno = fd_new(flags & O_CLOEXEC, &readfile, &readfd); if (ret.errno) goto error; - open(readfile, node, FILE_READ); + open(readfile, node, FILE_READ | (flags & O_NONBLOCK)); - ret.errno = fd_new(0, &writefile, &writefd); + ret.errno = fd_new(flags & O_CLOEXEC, &writefile, &writefd); if (ret.errno) goto error; - open(writefile, node, FILE_WRITE); + open(writefile, node, FILE_WRITE | (flags & O_NONBLOCK)); ret.errno = 0; ret.ret = (uint64_t)readfd | ((uint64_t)writefd << 32); diff --git a/kernel-src/sys/syscalls/seek.c b/kernel-src/sys/syscalls/seek.c index 4a8359c5..bfcf15e5 100644 --- a/kernel-src/sys/syscalls/seek.c +++ b/kernel-src/sys/syscalls/seek.c @@ -37,8 +37,8 @@ syscallret_t syscall_seek(context_t *context, int fd, off_t offset, int whence) case SEEK_SET: newoffset = offset; break; - case SEEK_CUR: { - uintmax_t newoffset = curroffset + offset; + case SEEK_CUR: + newoffset = curroffset + offset; if (offset > 0 && newoffset < curroffset) { ret.errno = EOVERFLOW; goto cleanup; @@ -47,9 +47,7 @@ syscallret_t syscall_seek(context_t *context, int fd, off_t offset, int whence) ret.errno = EINVAL; goto cleanup; } - newoffset = newoffset; break; - } case SEEK_END: { vattr_t attr; ret.errno = VOP_GETATTR(file->vnode, &attr, &_cpu()->thread->proc->cred); @@ -60,8 +58,9 @@ syscallret_t syscall_seek(context_t *context, int fd, off_t offset, int whence) } } + printf("ret: new %lu old %lu whence %d\n", newoffset, file->offset, whence); file->offset = newoffset; - ret.ret = file->offset; + ret.ret = newoffset; ret.errno = 0; cleanup: diff --git a/kernel-src/sys/syscalls/stat.c b/kernel-src/sys/syscalls/stat.c index bfa2fc87..70657c5b 100644 --- a/kernel-src/sys/syscalls/stat.c +++ b/kernel-src/sys/syscalls/stat.c @@ -88,7 +88,7 @@ syscallret_t syscall_fstatat(context_t *ctx, int dirfd, char *upath, stat_t *ust } vnode_t *node = NULL; - ret.errno = vfs_lookup(&node, dirnode, upath, NULL, flags & AT_SYMLINK_NOFOLLOW ? VFS_LOOKUP_NOLINK : 0); + ret.errno = vfs_lookup(&node, dirnode, path, NULL, flags & AT_SYMLINK_NOFOLLOW ? VFS_LOOKUP_NOLINK : 0); if (ret.errno) goto cleanup; @@ -109,5 +109,8 @@ syscallret_t syscall_fstatat(context_t *ctx, int dirfd, char *upath, stat_t *ust fd_release(file); else VOP_RELEASE(dirnode); + + free(path); + return ret; }