]> Zhao Yanbai Git Server - minix.git/commitdiff
VFS: support close-on-exec flag for copyfd(2) 22/3422/1
authorDavid van Moolenbroek <david@minix3.org>
Wed, 20 Jul 2016 13:03:03 +0000 (13:03 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Thu, 9 Mar 2017 23:39:51 +0000 (23:39 +0000)
The flag is supported only when copying out file descriptors (i.e.
COPYFD_TO).  It will be used by UDS to support MSG_CMSG_CLOEXEC.

Change-Id: I46bfd04b5f28e22ec48938e43e42f78d3931220d

minix/include/minix/syslib.h
minix/servers/vfs/filedes.c

index b5f5738632e2e72068b48aa7c5f5d424a9a09282..1d0611f7066e9ff7653f748d218cebb745033d54 100644 (file)
@@ -274,6 +274,8 @@ int copyfd(endpoint_t endpt, int fd, int what);
 #define COPYFD_FROM    0       /* copy file descriptor from remote process */
 #define COPYFD_TO      1       /* copy file descriptor to remote process */
 #define COPYFD_CLOSE   2       /* close file descriptor in remote process */
+#define COPYFD_CLOEXEC 0x8000  /* with COPYFD_TO: set close-on-exec flag */
+#define COPYFD_FLAGS   0xF000  /* flags mask */
 int closenb(int fd);
 
 /*
index ea7ee4a4e17d1d8ac7ab19e48fbde9c49ce48d09..7ddb51b42be44f1538ac64f3e7b1dc0e88e5378e 100644 (file)
@@ -532,7 +532,7 @@ int do_copyfd(void)
   struct vnode *vp;
   struct smap *sp;
   endpoint_t endpt;
-  int r, fd, what, slot;
+  int r, fd, what, flags, slot;
 
   /* This should be replaced with an ACL check. */
   if (!super_user) return(EPERM);
@@ -541,6 +541,9 @@ int do_copyfd(void)
   fd = job_m_in.m_lsys_vfs_copyfd.fd;
   what = job_m_in.m_lsys_vfs_copyfd.what;
 
+  flags = what & COPYFD_FLAGS;
+  what &= ~COPYFD_FLAGS;
+
   if (isokendpt(endpt, &slot) != OK) return(EINVAL);
   rfp = &fproc[slot];
 
@@ -608,6 +611,7 @@ int do_copyfd(void)
        }
 
        rfp = fp;
+       flags &= ~COPYFD_CLOEXEC;
 
        /* FALLTHROUGH */
   case COPYFD_TO:
@@ -619,6 +623,8 @@ int do_copyfd(void)
        /* If found, fill the slot and return the slot number. */
        if (fd < OPEN_MAX) {
                rfp->fp_filp[fd] = rfilp;
+               if (flags & COPYFD_CLOEXEC)
+                       FD_SET(fd, &rfp->fp_cloexec_set);
                rfilp->filp_count++;
                r = fd;
        } else