From 2808b0376406a40e31293bb3bcb9170374e90506 Mon Sep 17 00:00:00 2001 From: Peter Elliott Date: Sat, 11 Feb 2023 14:17:41 -0700 Subject: [PATCH] Kernel: Support F_DUPFD_CLOEXEC command to fcntl(2) Specified by POSIX: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html --- Kernel/API/POSIX/fcntl.h | 1 + Kernel/Syscalls/fcntl.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Kernel/API/POSIX/fcntl.h b/Kernel/API/POSIX/fcntl.h index 1aa225a789e..cea7461ebc2 100644 --- a/Kernel/API/POSIX/fcntl.h +++ b/Kernel/API/POSIX/fcntl.h @@ -21,6 +21,7 @@ extern "C" { #define F_GETLK 6 #define F_SETLK 7 #define F_SETLKW 8 +#define F_DUPFD_CLOEXEC 9 #define FD_CLOEXEC 1 diff --git a/Kernel/Syscalls/fcntl.cpp b/Kernel/Syscalls/fcntl.cpp index 1fb961116a1..4523f969cba 100644 --- a/Kernel/Syscalls/fcntl.cpp +++ b/Kernel/Syscalls/fcntl.cpp @@ -19,13 +19,14 @@ ErrorOr Process::sys$fcntl(int fd, int cmd, uintptr_t arg) // NOTE: The FD flags are not shared between OpenFileDescription objects. // This means that dup() doesn't copy the FD_CLOEXEC flag! switch (cmd) { + case F_DUPFD_CLOEXEC: case F_DUPFD: { int arg_fd = (int)arg; if (arg_fd < 0) return EINVAL; return m_fds.with_exclusive([&](auto& fds) -> ErrorOr { auto fd_allocation = TRY(fds.allocate(arg_fd)); - fds[fd_allocation.fd].set(*description); + fds[fd_allocation.fd].set(*description, (cmd == F_DUPFD_CLOEXEC) ? FD_CLOEXEC : 0); return fd_allocation.fd; }); }