summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_descrip.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2012-07-19 10:22:54 +0000
committerkib <kib@FreeBSD.org>2012-07-19 10:22:54 +0000
commitfb0ee769bd9aa180616ea0ffdb18d9c7bd7a7dfa (patch)
tree4e8cf53490b792520f6380caf057e1c5a1f293e4 /sys/kern/kern_descrip.c
parent97b9555773b8be7411fcf9ffaf0d3f72986eb4d9 (diff)
downloadFreeBSD-src-fb0ee769bd9aa180616ea0ffdb18d9c7bd7a7dfa.zip
FreeBSD-src-fb0ee769bd9aa180616ea0ffdb18d9c7bd7a7dfa.tar.gz
Implement F_DUPFD_CLOEXEC command for fcntl(2), specified by SUSv4.
PR: standards/169962 Submitted by: Jukka A. Ukkonen <jau iki fi> MFC after: 1 week
Diffstat (limited to 'sys/kern/kern_descrip.c')
-rw-r--r--sys/kern/kern_descrip.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index f8e3f3d..5c8433b 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -113,6 +113,7 @@ static uma_zone_t file_zone;
/* Flags for do_dup() */
#define DUP_FIXED 0x1 /* Force fixed allocation */
#define DUP_FCNTL 0x2 /* fcntl()-style errors */
+#define DUP_CLOEXEC 0x4 /* Atomically set FD_CLOEXEC. */
static int closefp(struct filedesc *fdp, int fd, struct file *fp,
struct thread *td, int holdleaders);
@@ -479,6 +480,12 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg)
error = do_dup(td, DUP_FCNTL, fd, tmp, td->td_retval);
break;
+ case F_DUPFD_CLOEXEC:
+ tmp = arg;
+ error = do_dup(td, DUP_FCNTL | DUP_CLOEXEC, fd, tmp,
+ td->td_retval);
+ break;
+
case F_DUP2FD:
tmp = arg;
error = do_dup(td, DUP_FIXED, fd, tmp, td->td_retval);
@@ -895,6 +902,10 @@ do_dup(struct thread *td, int flags, int old, int new,
* Duplicate the source descriptor.
*/
fdp->fd_ofiles[new] = fp;
+ if ((flags & DUP_CLOEXEC) != 0)
+ fdp->fd_ofileflags[new] = fdp->fd_ofileflags[old] | UF_EXCLOSE;
+ else
+ fdp->fd_ofileflags[new] = fdp->fd_ofileflags[old] & ~UF_EXCLOSE;
fdp->fd_ofileflags[new] = fdp->fd_ofileflags[old] &~ UF_EXCLOSE;
if (new > fdp->fd_lastfile)
fdp->fd_lastfile = new;
OpenPOWER on IntegriCloud