diff options
Diffstat (limited to 'sysdeps/mach/hurd')
-rw-r--r-- | sysdeps/mach/hurd/bits/fcntl.h | 5 | ||||
-rw-r--r-- | sysdeps/mach/hurd/fcntl.c | 12 |
2 files changed, 14 insertions, 3 deletions
diff --git a/sysdeps/mach/hurd/bits/fcntl.h b/sysdeps/mach/hurd/bits/fcntl.h index 34e6baa049..8ed786d256 100644 --- a/sysdeps/mach/hurd/bits/fcntl.h +++ b/sysdeps/mach/hurd/bits/fcntl.h @@ -163,6 +163,11 @@ #define F_SETLK 8 /* Set record locking info (non-blocking). */ #define F_SETLKW 9 /* Set record locking info (blocking). */ +#ifdef __USE_GNU +# define F_DUPFD_CLOEXEC 1030 /* Duplicate, set FD_CLOEXEC on new one. */ +#endif + + /* File descriptor flags used with F_GETFD and F_SETFD. */ #define FD_CLOEXEC 1 /* Close on exec. */ diff --git a/sysdeps/mach/hurd/fcntl.c b/sysdeps/mach/hurd/fcntl.c index d4e4aa5da1..470614b360 100644 --- a/sysdeps/mach/hurd/fcntl.c +++ b/sysdeps/mach/hurd/fcntl.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992-1997,1999,2000,2002 Free Software Foundation, Inc. +/* Copyright (C) 1992-1997,1999,2000,2002,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -50,6 +50,7 @@ __libc_fcntl (int fd, int cmd, ...) /* First the descriptor-based commands, which do no RPCs. */ case F_DUPFD: /* Duplicate the file descriptor. */ + case F_DUPFD_CLOEXEC: { struct hurd_fd *new; io_t port, ctty; @@ -64,6 +65,12 @@ __libc_fcntl (int fd, int cmd, ...) ctty = _hurd_port_get (&d->ctty, &ctty_ulink); port = _hurd_port_locked_get (&d->port, &ulink); /* Unlocks D. */ + if (cmd == F_DUPFD_CLOEXEC) + flags |= FD_CLOEXEC; + else + /* Duplication clears the FD_CLOEXEC flag. */ + flags &= ~FD_CLOEXEC; + /* Get a new file descriptor. The third argument to __fcntl is the minimum file descriptor number for it. */ new = _hurd_alloc_fd (&result, va_arg (ap, int)); @@ -82,8 +89,7 @@ __libc_fcntl (int fd, int cmd, ...) /* Install the ports and flags in the new descriptor. */ if (ctty != MACH_PORT_NULL) _hurd_port_set (&new->ctty, ctty); - /* Duplication clears the FD_CLOEXEC flag. */ - new->flags = flags & ~FD_CLOEXEC; + new->flags = flags; _hurd_port_locked_set (&new->port, port); /* Unlocks NEW. */ } |