1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 20:17:44 +00:00

Kernel: Support F_DUPFD_CLOEXEC command to fcntl(2)

Specified by POSIX:
https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html
This commit is contained in:
Peter Elliott 2023-02-11 14:17:41 -07:00 committed by Linus Groh
parent 22c0e6b60e
commit 2808b03764
2 changed files with 3 additions and 1 deletions

View file

@ -21,6 +21,7 @@ extern "C" {
#define F_GETLK 6 #define F_GETLK 6
#define F_SETLK 7 #define F_SETLK 7
#define F_SETLKW 8 #define F_SETLKW 8
#define F_DUPFD_CLOEXEC 9
#define FD_CLOEXEC 1 #define FD_CLOEXEC 1

View file

@ -19,13 +19,14 @@ ErrorOr<FlatPtr> Process::sys$fcntl(int fd, int cmd, uintptr_t arg)
// NOTE: The FD flags are not shared between OpenFileDescription objects. // NOTE: The FD flags are not shared between OpenFileDescription objects.
// This means that dup() doesn't copy the FD_CLOEXEC flag! // This means that dup() doesn't copy the FD_CLOEXEC flag!
switch (cmd) { switch (cmd) {
case F_DUPFD_CLOEXEC:
case F_DUPFD: { case F_DUPFD: {
int arg_fd = (int)arg; int arg_fd = (int)arg;
if (arg_fd < 0) if (arg_fd < 0)
return EINVAL; return EINVAL;
return m_fds.with_exclusive([&](auto& fds) -> ErrorOr<FlatPtr> { return m_fds.with_exclusive([&](auto& fds) -> ErrorOr<FlatPtr> {
auto fd_allocation = TRY(fds.allocate(arg_fd)); 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; return fd_allocation.fd;
}); });
} }