dup3 syscall - atomic set O_CLOEXEC with dup2
Eitan Adler
lists at eitanadler.com
Fri Jan 20 23:26:16 UTC 2012
I figure this isn't wanted?
On Thu, Jan 12, 2012 at 10:07 PM, Eitan Adler <lists at eitanadler.com> wrote:
> Okay - here is version 2 (compile and run tested)
>
> Index: sys/kern/kern_descrip.c
> ===================================================================
> --- sys/kern/kern_descrip.c (revision 229830)
> +++ sys/kern/kern_descrip.c (working copy)
> @@ -110,6 +110,7 @@
> /* Flags for do_dup() */
> #define DUP_FIXED 0x1 /* Force fixed allocation */
> #define DUP_FCNTL 0x2 /* fcntl()-style errors */
> +#define DUP_CLOEXEC 0x4 /* Enable O_CLOEXEC on the new fd */
>
> static int do_dup(struct thread *td, int flags, int old, int new,
> register_t *retval);
> @@ -307,7 +308,36 @@
> return (0);
> }
>
> +struct dup3_args {
> + u_int from;
> + u_int to;
> + int flags;
> +};
> +
> /*
> + * Duplicate a file descriptor and allow for O_CLOEXEC
> + */
> +
> +int
> +sys_dup3(struct thread * td, struct dup3_args * uap) {
> + int dupflags;
> +
> + if (uap->from == uap->to)
> + return (EINVAL);
> +
> + if (uap->flags & ~O_CLOEXEC)
> + return (EINVAL);
> +
> + dupflags = DUP_FIXED;
> + if (uap->flags & O_CLOEXEC)
> + dupflags |= DUP_CLOEXEC;
> +
> + return (do_dup(td, dupflags, (int)uap->from, (int)uap->to,
> + td->td_retval));
> + return (0);
> +}
> +
> +/*
> * Duplicate a file descriptor to a particular value.
> *
> * Note: keep in mind that a potential race condition exists when closing
> @@ -912,6 +942,9 @@
> fdp->fd_lastfile = new;
> *retval = new;
>
> + if (flags & DUP_CLOEXEC)
> + fdp->fd_ofileflags[new] |= UF_EXCLOSE;
> +
> /*
> * If we dup'd over a valid file, we now own the reference to it
> * and must dispose of it using closef() semantics (as if a
> Index: sys/kern/syscalls.master
> ===================================================================
> --- sys/kern/syscalls.master (revision 229830)
> +++ sys/kern/syscalls.master (working copy)
> @@ -951,5 +951,6 @@
> off_t offset, off_t len); }
> 531 AUE_NULL STD { int posix_fadvise(int fd, off_t offset, \
> off_t len, int advice); }
> +532 AUE_NULL STD { int dup3(u_int from, u_int to, int flags); }
> ; Please copy any additions and changes to the following compatability tables:
> ; sys/compat/freebsd32/syscalls.master
> Index: sys/compat/freebsd32/syscalls.master
> ===================================================================
> --- sys/compat/freebsd32/syscalls.master (revision 229830)
> +++ sys/compat/freebsd32/syscalls.master (working copy)
> @@ -997,3 +997,4 @@
> uint32_t offset1, uint32_t offset2,\
> uint32_t len1, uint32_t len2, \
> int advice); }
> +532 AUE_NULL STD { int dup3(u_int from, u_int to, int flags); }
>
> Index: lib/libc/sys/Symbol.map
> ===================================================================
> --- lib/libc/sys/Symbol.map (revision 229830)
> +++ lib/libc/sys/Symbol.map (working copy)
> @@ -383,6 +383,7 @@
>
> FBSD_1.3 {
> posix_fadvise;
> + dup3;
> };
>
> FBSDprivate_1.0 {
>
>
> --
> Eitan Adler
--
Eitan Adler
More information about the freebsd-hackers
mailing list