summaryrefslogtreecommitdiff
path: root/libiberty/pex-win32.c
diff options
context:
space:
mode:
authorJulian Brown <julian@codesourcery.com>2009-04-29 11:52:41 +0000
committerJulian Brown <julian@codesourcery.com>2009-04-29 11:52:41 +0000
commit59cdf8427011bbf8a562fbb419923a5af28d52b4 (patch)
tree8e6713716d677ba7bea57d47de6d7ed53ba7d035 /libiberty/pex-win32.c
parent484086b7e06069d8bc3dce0dd428d3b9fcf9053b (diff)
downloadbinutils-gdb-59cdf8427011bbf8a562fbb419923a5af28d52b4.tar.gz
libiberty/
* pex-win32.c (pex_win32_pipe): Add _O_NOINHERIT. (pex_win32_exec_child): Ensure each process has only one handle open on pipe endpoints. Close standard input after creating child for symmetry with standard output/standard error.
Diffstat (limited to 'libiberty/pex-win32.c')
-rw-r--r--libiberty/pex-win32.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/libiberty/pex-win32.c b/libiberty/pex-win32.c
index 3f377519366..30ef4359200 100644
--- a/libiberty/pex-win32.c
+++ b/libiberty/pex-win32.c
@@ -746,6 +746,25 @@ pex_win32_exec_child (struct pex_obj *obj ATTRIBUTE_UNUSED, int flags,
OSVERSIONINFO version_info;
STARTUPINFO si;
PROCESS_INFORMATION pi;
+ int orig_out, orig_in, orig_err;
+ BOOL separate_stderr = !(flags & PEX_STDERR_TO_STDOUT);
+
+ /* Ensure we have inheritable descriptors to pass to the child, and close the
+ original descriptors. */
+ orig_in = in;
+ in = _dup (orig_in);
+ _close (orig_in);
+
+ orig_out = out;
+ out = _dup (orig_out);
+ _close (orig_out);
+
+ if (separate_stderr)
+ {
+ orig_err = errdes;
+ errdes = _dup (orig_err);
+ _close (orig_err);
+ }
stdin_handle = INVALID_HANDLE_VALUE;
stdout_handle = INVALID_HANDLE_VALUE;
@@ -753,7 +772,7 @@ pex_win32_exec_child (struct pex_obj *obj ATTRIBUTE_UNUSED, int flags,
stdin_handle = (HANDLE) _get_osfhandle (in);
stdout_handle = (HANDLE) _get_osfhandle (out);
- if (!(flags & PEX_STDERR_TO_STDOUT))
+ if (separate_stderr)
stderr_handle = (HANDLE) _get_osfhandle (errdes);
else
stderr_handle = stdout_handle;
@@ -822,12 +841,15 @@ pex_win32_exec_child (struct pex_obj *obj ATTRIBUTE_UNUSED, int flags,
*errmsg = "CreateProcess";
}
- /* Close the standard output and standard error handles in the
- parent. */
+ /* Close the standard input, standard output and standard error handles
+ in the parent. */
+
+ if (in != STDIN_FILENO)
+ _close (in);
if (out != STDOUT_FILENO)
- obj->funcs->close (obj, out);
+ _close (out);
if (errdes != STDERR_FILENO)
- obj->funcs->close (obj, errdes);
+ _close (errdes);
return pid;
}
@@ -883,7 +905,7 @@ static int
pex_win32_pipe (struct pex_obj *obj ATTRIBUTE_UNUSED, int *p,
int binary)
{
- return _pipe (p, 256, binary ? _O_BINARY : _O_TEXT);
+ return _pipe (p, 256, (binary ? _O_BINARY : _O_TEXT) | _O_NOINHERIT);
}
/* Get a FILE pointer to read from a file descriptor. */