diff options
author | Roland McGrath <roland@gnu.org> | 2007-10-17 22:32:35 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2007-10-17 22:32:35 +0000 |
commit | bd92328d5eb04b1d0dd24a4bdbfcfd1e607a6163 (patch) | |
tree | e1dfb3f26d2ea64557ec90f7410cb3d32ff6955f /sysdeps/mach | |
parent | f71cda6a38e5f116041c08399b62c6dd4f210306 (diff) | |
download | glibc-bd92328d5eb04b1d0dd24a4bdbfcfd1e607a6163.zip glibc-bd92328d5eb04b1d0dd24a4bdbfcfd1e607a6163.tar.gz glibc-bd92328d5eb04b1d0dd24a4bdbfcfd1e607a6163.tar.bz2 |
2007-10-17 Roland McGrath <roland@frob.com>
* sysdeps/mach/hurd/bits/fcntl.h [__USE_GNU__] (F_DUPFD_CLOEXEC): New.
* sysdeps/mach/hurd/fcntl.c (__libc_fcntl): Implement it.
Diffstat (limited to 'sysdeps/mach')
-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 34e6baa..8ed786d 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 d4e4aa5..470614b 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. */ } |