1 /* Utilities to execute a program in a subprocess (possibly linked by pipes
2 with other subprocesses), and wait for it. Generic Unix version
3 (also used for UWIN and VMS).
4 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2009
5 Free Software Foundation, Inc.
7 This file is part of the libiberty library.
8 Libiberty is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Library General Public
10 License as published by the Free Software Foundation; either
11 version 2 of the License, or (at your option) any later version.
13 Libiberty is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Library General Public License for more details.
18 You should have received a copy of the GNU Library General Public
19 License along with libiberty; see the file COPYING.LIB. If not,
20 write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
21 Boston, MA 02110-1301, USA. */
24 #include "libiberty.h"
25 #include "pex-common.h"
30 #ifdef NEED_DECLARATION_ERRNO
43 #include <sys/types.h>
48 #ifdef HAVE_SYS_WAIT_H
53 #include <sys/resource.h>
55 #ifdef HAVE_SYS_STAT_H
60 #ifdef vfork /* Autoconf may define this to fork for us. */
61 # define VFORK_STRING "fork"
63 # define VFORK_STRING "vfork"
68 #if defined(VMS) && defined (__LONG_POINTERS)
70 typedef char * __char_ptr32
71 __attribute__ ((mode (SI)));
74 typedef __char_ptr32 *__char_ptr_char_ptr32
75 __attribute__ ((mode (SI)));
77 /* Return a 32 bit pointer to an array of 32 bit pointers
78 given a 64 bit pointer to an array of 64 bit pointers. */
80 static __char_ptr_char_ptr32
81 to_ptr32 (char **ptr64)
84 __char_ptr_char_ptr32 short_argv;
86 for (argc=0; ptr64[argc]; argc++);
88 /* Reallocate argv with 32 bit pointers. */
89 short_argv = (__char_ptr_char_ptr32) decc$malloc
90 (sizeof (__char_ptr32) * (argc + 1));
92 for (argc=0; ptr64[argc]; argc++)
93 short_argv[argc] = (__char_ptr32) decc$strdup (ptr64[argc]);
95 short_argv[argc] = (__char_ptr32) 0;
100 #define to_ptr32(argv) argv
103 /* File mode to use for private and world-readable files. */
105 #if defined (S_IRUSR) && defined (S_IWUSR) && defined (S_IRGRP) && defined (S_IWGRP) && defined (S_IROTH) && defined (S_IWOTH)
106 #define PUBLIC_MODE \
107 (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
109 #define PUBLIC_MODE 0666
112 /* Get the exit status of a particular process, and optionally get the
113 time that it took. This is simple if we have wait4, slightly
114 harder if we have waitpid, and is a pain if we only have wait. */
116 static pid_t pex_wait (struct pex_obj *, pid_t, int *, struct pex_time *);
121 pex_wait (struct pex_obj *obj ATTRIBUTE_UNUSED, pid_t pid, int *status,
122 struct pex_time *time)
129 return waitpid (pid, status, 0);
132 ret = wait4 (pid, status, 0, &r);
136 time->user_seconds = r.ru_utime.tv_sec;
137 time->user_microseconds= r.ru_utime.tv_usec;
138 time->system_seconds = r.ru_stime.tv_sec;
139 time->system_microseconds= r.ru_stime.tv_usec;
145 #else /* ! defined (HAVE_WAIT4) */
149 #ifndef HAVE_GETRUSAGE
152 pex_wait (struct pex_obj *obj ATTRIBUTE_UNUSED, pid_t pid, int *status,
153 struct pex_time *time)
156 memset (time, 0, sizeof (struct pex_time));
157 return waitpid (pid, status, 0);
160 #else /* defined (HAVE_GETRUSAGE) */
163 pex_wait (struct pex_obj *obj ATTRIBUTE_UNUSED, pid_t pid, int *status,
164 struct pex_time *time)
166 struct rusage r1, r2;
170 return waitpid (pid, status, 0);
172 getrusage (RUSAGE_CHILDREN, &r1);
174 ret = waitpid (pid, status, 0);
178 getrusage (RUSAGE_CHILDREN, &r2);
180 time->user_seconds = r2.ru_utime.tv_sec - r1.ru_utime.tv_sec;
181 time->user_microseconds = r2.ru_utime.tv_usec - r1.ru_utime.tv_usec;
182 if (r2.ru_utime.tv_usec < r1.ru_utime.tv_usec)
184 --time->user_seconds;
185 time->user_microseconds += 1000000;
188 time->system_seconds = r2.ru_stime.tv_sec - r1.ru_stime.tv_sec;
189 time->system_microseconds = r2.ru_stime.tv_usec - r1.ru_stime.tv_usec;
190 if (r2.ru_stime.tv_usec < r1.ru_stime.tv_usec)
192 --time->system_seconds;
193 time->system_microseconds += 1000000;
199 #endif /* defined (HAVE_GETRUSAGE) */
201 #else /* ! defined (HAVE_WAITPID) */
205 struct status_list *next;
208 struct pex_time time;
212 pex_wait (struct pex_obj *obj, pid_t pid, int *status, struct pex_time *time)
214 struct status_list **pp;
216 for (pp = (struct status_list **) &obj->sysdep;
220 if ((*pp)->pid == pid)
222 struct status_list *p;
237 struct status_list *psl;
239 #ifdef HAVE_GETRUSAGE
240 struct rusage r1, r2;
245 #ifdef HAVE_GETRUSAGE
246 getrusage (RUSAGE_CHILDREN, &r1);
248 memset (&pt, 0, sizeof (struct pex_time));
252 cpid = wait (status);
254 #ifdef HAVE_GETRUSAGE
255 if (time != NULL && cpid >= 0)
257 getrusage (RUSAGE_CHILDREN, &r2);
259 pt.user_seconds = r2.ru_utime.tv_sec - r1.ru_utime.tv_sec;
260 pt.user_microseconds = r2.ru_utime.tv_usec - r1.ru_utime.tv_usec;
261 if (pt.user_microseconds < 0)
264 pt.user_microseconds += 1000000;
267 pt.system_seconds = r2.ru_stime.tv_sec - r1.ru_stime.tv_sec;
268 pt.system_microseconds = r2.ru_stime.tv_usec - r1.ru_stime.tv_usec;
269 if (pt.system_microseconds < 0)
272 pt.system_microseconds += 1000000;
277 if (cpid < 0 || cpid == pid)
284 psl = XNEW (struct status_list);
286 psl->status = *status;
289 psl->next = (struct status_list *) obj->sysdep;
290 obj->sysdep = (void *) psl;
294 #endif /* ! defined (HAVE_WAITPID) */
295 #endif /* ! defined (HAVE_WAIT4) */
297 static void pex_child_error (struct pex_obj *, const char *, const char *, int)
299 static int pex_unix_open_read (struct pex_obj *, const char *, int);
300 static int pex_unix_open_write (struct pex_obj *, const char *, int);
301 static pid_t pex_unix_exec_child (struct pex_obj *, int, const char *,
302 char * const *, char * const *,
304 const char **, int *);
305 static int pex_unix_close (struct pex_obj *, int);
306 static int pex_unix_wait (struct pex_obj *, pid_t, int *, struct pex_time *,
307 int, const char **, int *);
308 static int pex_unix_pipe (struct pex_obj *, int *, int);
309 static FILE *pex_unix_fdopenr (struct pex_obj *, int, int);
310 static FILE *pex_unix_fdopenw (struct pex_obj *, int, int);
311 static void pex_unix_cleanup (struct pex_obj *);
313 /* The list of functions we pass to the common routines. */
315 const struct pex_funcs funcs =
328 /* Return a newly initialized pex_obj structure. */
331 pex_init (int flags, const char *pname, const char *tempbase)
333 return pex_init_common (flags, pname, tempbase, &funcs);
336 /* Open a file for reading. */
339 pex_unix_open_read (struct pex_obj *obj ATTRIBUTE_UNUSED, const char *name,
340 int binary ATTRIBUTE_UNUSED)
342 return open (name, O_RDONLY);
345 /* Open a file for writing. */
348 pex_unix_open_write (struct pex_obj *obj ATTRIBUTE_UNUSED, const char *name,
349 int binary ATTRIBUTE_UNUSED)
351 /* Note that we can't use O_EXCL here because gcc may have already
352 created the temporary file via make_temp_file. */
353 return open (name, O_WRONLY | O_CREAT | O_TRUNC, PUBLIC_MODE);
359 pex_unix_close (struct pex_obj *obj ATTRIBUTE_UNUSED, int fd)
364 /* Report an error from a child process. We don't use stdio routines,
365 because we might be here due to a vfork call. */
368 pex_child_error (struct pex_obj *obj, const char *executable,
369 const char *errmsg, int err)
372 #define writeerr(s) retval |= (write (STDERR_FILE_NO, s, strlen (s)) < 0)
373 writeerr (obj->pname);
374 writeerr (": error trying to exec '");
375 writeerr (executable);
379 writeerr (xstrerror (err));
382 /* Exit with -2 if the error output failed, too. */
383 _exit (retval == 0 ? -1 : -2);
386 /* Execute a child. */
388 extern char **environ;
391 pex_unix_exec_child (struct pex_obj *obj, int flags, const char *executable,
392 char * const * argv, char * const * env,
393 int in, int out, int errdes,
394 int toclose, const char **errmsg, int *err)
398 /* We declare these to be volatile to avoid warnings from gcc about
399 them being clobbered by vfork. */
400 volatile int sleep_interval;
401 volatile int retries;
403 /* We vfork and then set environ in the child before calling execvp.
404 This clobbers the parent's environ so we need to restore it.
405 It would be nice to use one of the exec* functions that takes an
406 environment as a parameter, but that may have portability issues. */
407 char **save_environ = environ;
411 for (retries = 0; retries < 4; ++retries)
416 sleep (sleep_interval);
424 *errmsg = VFORK_STRING;
429 if (in != STDIN_FILE_NO)
431 if (dup2 (in, STDIN_FILE_NO) < 0)
432 pex_child_error (obj, executable, "dup2", errno);
434 pex_child_error (obj, executable, "close", errno);
436 if (out != STDOUT_FILE_NO)
438 if (dup2 (out, STDOUT_FILE_NO) < 0)
439 pex_child_error (obj, executable, "dup2", errno);
441 pex_child_error (obj, executable, "close", errno);
443 if (errdes != STDERR_FILE_NO)
445 if (dup2 (errdes, STDERR_FILE_NO) < 0)
446 pex_child_error (obj, executable, "dup2", errno);
447 if (close (errdes) < 0)
448 pex_child_error (obj, executable, "close", errno);
452 if (close (toclose) < 0)
453 pex_child_error (obj, executable, "close", errno);
455 if ((flags & PEX_STDERR_TO_STDOUT) != 0)
457 if (dup2 (STDOUT_FILE_NO, STDERR_FILE_NO) < 0)
458 pex_child_error (obj, executable, "dup2", errno);
463 /* NOTE: In a standard vfork implementation this clobbers the
464 parent's copy of environ "too" (in reality there's only one copy).
465 This is ok as we restore it below. */
466 environ = (char**) env;
469 if ((flags & PEX_SEARCH) != 0)
471 execvp (executable, to_ptr32 (argv));
472 pex_child_error (obj, executable, "execvp", errno);
476 execv (executable, to_ptr32 (argv));
477 pex_child_error (obj, executable, "execv", errno);
484 /* Parent process. */
487 Note that the parent either doesn't run until the child execs/exits
488 (standard vfork behaviour), or if it does run then vfork is behaving
489 more like fork. In either case we needn't worry about clobbering
490 the child's copy of environ. */
491 environ = save_environ;
493 if (in != STDIN_FILE_NO)
502 if (out != STDOUT_FILE_NO)
511 if (errdes != STDERR_FILE_NO)
513 if (close (errdes) < 0)
525 /* Wait for a child process to complete. */
528 pex_unix_wait (struct pex_obj *obj, pid_t pid, int *status,
529 struct pex_time *time, int done, const char **errmsg,
532 /* If we are cleaning up when the caller didn't retrieve process
533 status for some reason, encourage the process to go away. */
537 if (pex_wait (obj, pid, status, time) < 0)
550 pex_unix_pipe (struct pex_obj *obj ATTRIBUTE_UNUSED, int *p,
551 int binary ATTRIBUTE_UNUSED)
556 /* Get a FILE pointer to read from a file descriptor. */
559 pex_unix_fdopenr (struct pex_obj *obj ATTRIBUTE_UNUSED, int fd,
560 int binary ATTRIBUTE_UNUSED)
562 return fdopen (fd, "r");
566 pex_unix_fdopenw (struct pex_obj *obj ATTRIBUTE_UNUSED, int fd,
567 int binary ATTRIBUTE_UNUSED)
569 if (fcntl (fd, F_SETFD, FD_CLOEXEC) < 0)
571 return fdopen (fd, "w");
575 pex_unix_cleanup (struct pex_obj *obj ATTRIBUTE_UNUSED)
577 #if !defined (HAVE_WAIT4) && !defined (HAVE_WAITPID)
578 while (obj->sysdep != NULL)
580 struct status_list *this;
581 struct status_list *next;
583 this = (struct status_list *) obj->sysdep;
586 obj->sysdep = (void *) next;