From bd92328d5eb04b1d0dd24a4bdbfcfd1e607a6163 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 17 Oct 2007 22:32:35 +0000 Subject: 2007-10-17 Roland McGrath * sysdeps/mach/hurd/bits/fcntl.h [__USE_GNU__] (F_DUPFD_CLOEXEC): New. * sysdeps/mach/hurd/fcntl.c (__libc_fcntl): Implement it. --- sysdeps/mach/hurd/bits/fcntl.h | 5 +++++ sysdeps/mach/hurd/fcntl.c | 12 +++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) (limited to 'sysdeps/mach') 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. */ } -- cgit 1.4.1