dup3 syscall - atomic set O_CLOEXEC with dup2

Kostik Belousov kostikbel at gmail.com
Fri Jan 20 23:56:52 UTC 2012


On Fri, Jan 20, 2012 at 06:25:42PM -0500, Eitan Adler wrote:
> I figure this isn't wanted?
You silently ignored part of the notes that were provided, and keep
complete silence on the primary question about non-standard and fractional
nature of the patch.

I see no reason to retype my previous response.
> 
> 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20120120/7d31a8e2/attachment.pgp


More information about the freebsd-hackers mailing list