Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2006-08-23 00:30:37 +0400
committerJeff Johnston <jjohnstn@redhat.com>2006-08-23 00:30:37 +0400
commit380d8ec45da6be92c6d384de6eaf3eec0965ebf1 (patch)
tree9ab84f00201e932cda12bf0386a8c5a024652c09 /newlib/libc/posix
parentcb5e3d1df79b8dc533b3a85f35d914716bfa5845 (diff)
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.
Diffstat (limited to 'newlib/libc/posix')
-rw-r--r--newlib/libc/posix/popen.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/newlib/libc/posix/popen.c b/newlib/libc/posix/popen.c
index 0f25a3ed0..2d3777133 100644
--- a/newlib/libc/posix/popen.c
+++ b/newlib/libc/posix/popen.c
@@ -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;