diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2010-10-30 23:02:32 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2010-10-30 23:02:32 +0000 |
commit | b3cded65e92ba4d9b5e5a33fb95c4d551bda9c1b (patch) | |
tree | 69d40fbef2c0c4ee32fe97b7a28b510f2e3c2dbc /libiberty/pex-unix.c | |
parent | 7a815afd9b5121ee0f65dc1e1de1c0de6de97679 (diff) |
Notes
Diffstat (limited to 'libiberty/pex-unix.c')
-rw-r--r-- | libiberty/pex-unix.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/libiberty/pex-unix.c b/libiberty/pex-unix.c index c92a42979712..a7760415e012 100644 --- a/libiberty/pex-unix.c +++ b/libiberty/pex-unix.c @@ -270,7 +270,8 @@ static void pex_child_error (struct pex_obj *, const char *, const char *, int) static int pex_unix_open_read (struct pex_obj *, const char *, int); static int pex_unix_open_write (struct pex_obj *, const char *, int); static long pex_unix_exec_child (struct pex_obj *, int, const char *, - char * const *, int, int, int, + char * const *, char * const *, + int, int, int, int, const char **, int *); static int pex_unix_close (struct pex_obj *, int); static int pex_unix_wait (struct pex_obj *, long, int *, struct pex_time *, @@ -338,7 +339,7 @@ static void pex_child_error (struct pex_obj *obj, const char *executable, const char *errmsg, int err) { -#define writeerr(s) write (STDERR_FILE_NO, s, strlen (s)) +#define writeerr(s) (void) write (STDERR_FILE_NO, s, strlen (s)) writeerr (obj->pname); writeerr (": error trying to exec '"); writeerr (executable); @@ -352,12 +353,16 @@ pex_child_error (struct pex_obj *obj, const char *executable, /* Execute a child. */ +extern char **environ; + static long pex_unix_exec_child (struct pex_obj *obj, int flags, const char *executable, - char * const * argv, int in, int out, int errdes, - const char **errmsg, int *err) + char * const * argv, char * const * env, + int in, int out, int errdes, + int toclose, const char **errmsg, int *err) { pid_t pid; + /* We declare these to be volatile to avoid warnings from gcc about them being clobbered by vfork. */ volatile int sleep_interval; @@ -404,11 +409,20 @@ pex_unix_exec_child (struct pex_obj *obj, int flags, const char *executable, if (close (errdes) < 0) pex_child_error (obj, executable, "close", errno); } + if (toclose >= 0) + { + if (close (toclose) < 0) + pex_child_error (obj, executable, "close", errno); + } if ((flags & PEX_STDERR_TO_STDOUT) != 0) { if (dup2 (STDOUT_FILE_NO, STDERR_FILE_NO) < 0) pex_child_error (obj, executable, "dup2", errno); } + + if (env) + environ = (char**) env; + if ((flags & PEX_SEARCH) != 0) { execvp (executable, argv); |