[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