OSDN Git Service

2006-08-22 Eric Blake <ebb9@byu.net>
authorjjohnstn <jjohnstn>
Tue, 22 Aug 2006 20:30:37 +0000 (20:30 +0000)
committerjjohnstn <jjohnstn>
Tue, 22 Aug 2006 20:30:37 +0000 (20:30 +0000)
        * libc/posix/popen.c (popen): Don't close output end of pipe in
        child if stdout was closed on entry.
        [HAVE_FCNTL]: In parent, mark file as close-on-exec, per POSIX.

newlib/ChangeLog
newlib/libc/posix/popen.c

index 9e068c8..231d02d 100644 (file)
@@ -1,3 +1,9 @@
+2006-08-22  Eric Blake  <ebb9@byu.net>
+
+       * libc/posix/popen.c (popen): Don't close output end of pipe in
+       child if stdout was closed on entry.
+       [HAVE_FCNTL]: In parent, mark file as close-on-exec, per POSIX.
+
 2006-08-19  Ramana Radhakrishnan  <ramana.r@gmail.com>
 
        * sys/types.h: Correct syntax error caused by missing '\' on #ifdef
index 0f25a3e..2d37771 100644 (file)
@@ -1,7 +1,7 @@
 /*     $NetBSD: popen.c,v 1.11 1995/06/16 07:05:33 jtc Exp $   */
 
 /*
- * Copyright (c) 1988, 1993
+ * Copyright (c) 1988, 1993, 2006
  *     The Regents of the University of California.  All rights reserved.
  *
  * This code is derived from software written by Ken Arnold and
@@ -55,6 +55,7 @@ static char rcsid[] = "$NetBSD: popen.c,v 1.11 1995/06/16 07:05:33 jtc Exp $";
 #include <stdlib.h>
 #include <string.h>
 #include <paths.h>
+#include <fcntl.h>
 
 static struct pid {
        struct pid *next;
@@ -102,7 +103,9 @@ _DEFUN(popen, (program, type),
                                (void)dup2(pdes[1], STDOUT_FILENO);
                                (void)close(pdes[1]);
                        }
-                       (void) close(pdes[0]);
+                       if (pdes[0] != STDOUT_FILENO) {
+                               (void) close(pdes[0]);
+                       }
                } else {
                        if (pdes[0] != STDIN_FILENO) {
                                (void)dup2(pdes[0], STDIN_FILENO);
@@ -129,6 +132,12 @@ _DEFUN(popen, (program, type),
                (void)close(pdes[0]);
        }
 
+#ifdef HAVE_FCNTL
+       /* Hide pipe from future popens; assume fcntl can't fail.  */
+       fcntl (fileno (iop), F_SETFD,
+              fcntl (fileno (iop), F_GETFD, 0) | FD_CLOEXEC);
+#endif /* HAVE_FCNTL */
+
        /* Link into list of file descriptors. */
        cur->fp = iop;
        cur->pid =  pid;