chiark / gitweb /
@@ -10,6 +10,8 @@
authorian <ian>
Sun, 15 Jun 2003 18:17:24 +0000 (18:17 +0000)
committerian <ian>
Sun, 15 Jun 2003 18:17:24 +0000 (18:17 +0000)
+  * Use fcntl F_{GET,SET}FD with respect for as-yet-uninvented fd flags.
+    (small patch from Ben Harris.)

debian/changelog
servexec.c

index 5bf6e6ac2924bc6d29cad4dcc463720fd7c08f7e..248f46032275fcccf34a04ee42642775b888e123 100644 (file)
@@ -10,6 +10,8 @@ userv (1.0.2) unstable; urgency=low
   * We do ship m4 and flex output now, so say so.
   * install-sh updated to that from autoconf 2.53.
   * Look for gmd5sum.  (Thanks to Anton Altaparmakov for the report.)
   * We do ship m4 and flex output now, so say so.
   * install-sh updated to that from autoconf 2.53.
   * Look for gmd5sum.  (Thanks to Anton Altaparmakov for the report.)
+  * Use fcntl F_{GET,SET}FD with respect for as-yet-uninvented fd flags.
+    (small patch from Ben Harris.)
 
   Debian:
   * Priority changed to optional as per override file.
 
   Debian:
   * Priority changed to optional as per override file.
index a71b64f1e78bac9663f3c4f26c54ab357709b657..8c3494a6673705a76eae97c89ca9044251d437b6 100644 (file)
@@ -224,7 +224,7 @@ void execservice(const int synchsocket[], int clientfd) {
     "-",
     0
   };
     "-",
     0
   };
-  int fd, realfd, holdfd, newfd, r, envvarbufsize=0, targ, nargs, i, l;
+  int fd, realfd, holdfd, newfd, r, envvarbufsize=0, targ, nargs, i, l, fdflags;
   char *envvarbuf=0;
   const char **args, *const *cpp;
   char *const *pp;
   char *envvarbuf=0;
   const char **args, *const *cpp;
   char *const *pp;
@@ -286,7 +286,8 @@ void execservice(const int synchsocket[], int clientfd) {
     }
     if (dup2(fdarray[fd].realfd,fd)<0) serv_syscallfail("dup2 set up fd");
     if (close(fdarray[fd].realfd)) serv_syscallfail("close old fd");
     }
     if (dup2(fdarray[fd].realfd,fd)<0) serv_syscallfail("dup2 set up fd");
     if (close(fdarray[fd].realfd)) serv_syscallfail("close old fd");
-    if (fcntl(fd,F_SETFD,0)<0) serv_syscallfail("set no-close-on-exec on fd");
+    fdflags= fcntl(fd,F_GETFD); if (fdflags<0) serv_syscallfail("get fd flags");
+    if (fcntl(fd,F_SETFD,fdflags&~FD_CLOEXEC)==-1) serv_syscallfail("set no-close-on-exec on fd");
     fdarray[fd].realfd= fd;
   }
 
     fdarray[fd].realfd= fd;
   }