From 380d8ec45da6be92c6d384de6eaf3eec0965ebf1 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Tue, 22 Aug 2006 20:30:37 +0000 Subject: 2006-08-22 Eric Blake * 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/libc/posix/popen.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'newlib/libc/posix') 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 #include #include +#include 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; -- cgit v1.2.3