[Commit] nickle file.c,1.51,1.52

Bart Massey commit at keithp.com
Sat Oct 11 03:50:08 PDT 2003


Committed by: bart

Update of /local/src/CVS/nickle
In directory home.keithp.com:/tmp/cvs-serv19831

Modified Files:
	file.c 
Log Message:
Use close-on-exec to make Popen fail in parent
if exec fails in child (thanks Keith)



Index: file.c
===================================================================
RCS file: /local/src/CVS/nickle/file.c,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -d -r1.51 -r1.52
--- file.c	21 Jul 2003 22:22:10 -0000	1.51
+++ file.c	11 Oct 2003 09:50:05 -0000	1.52
@@ -751,10 +751,11 @@
 FilePopen (char *program, char *argv[], char *mode, int *errp)
 {
     ENTER ();
-    int	    fd, fds[2];
+    int	    fd, fds[2], errfds[2];
     int	    pid;
     Value   file;
     int	    flags = 0;
+    int     errcode, nread;
 
     switch (mode[0]) {
     case 'r':
@@ -774,10 +775,16 @@
 	*errp = errno;
 	RETURN(0);
     }
+    if (pipe(errfds) < 0) {
+	*errp = errno;
+	RETURN(0);
+    }
     switch ((pid = fork ())) {
     case -1:
 	close (fds[0]);
 	close (fds[1]);
+	close (errfds[0]);
+	close (errfds[1]);
 	*errp = errno;
 	fd = -1;
 	break;
@@ -792,10 +799,23 @@
 	    shutdown (fds[1], SHUT_RD);
 	close (fds[0]);
 	close (fds[1]);
+	close (errfds[0]);
+	fcntl (errfds[1], F_SETFD, FD_CLOEXEC);
 	execvp (program, argv);
+	errcode = errno & 0xff;
+	write(errfds[1], &errcode, 1);
+	close(errfds[1]);
 	exit (1);
     default:
-	fd = fds[0];
+	close(errfds[1]);
+	nread = read(errfds[0], &errcode, 1);
+	if (nread != 0) {
+	    if (nread == 1)
+		*errp = errcode;
+	    close(errfds[0]);
+	    RETURN(0);
+	}
+	close(errfds[0]);
         if (!(flags & FileReadable))
 	    shutdown (fds[0], SHUT_RD);
 	if (!(flags & FileWritable))




More information about the Commit mailing list