gspawn: support creating pipes with O_CLOEXEC
[platform/upstream/glib.git] / glib / gspawn.c
1 /* gspawn.c - Process launching
2  *
3  *  Copyright 2000 Red Hat, Inc.
4  *  g_execvpe implementation based on GNU libc execvp:
5  *   Copyright 1991, 92, 95, 96, 97, 98, 99 Free Software Foundation, Inc.
6  *
7  * GLib is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public License as
9  * published by the Free Software Foundation; either version 2 of the
10  * License, or (at your option) any later version.
11  *
12  * GLib is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with GLib; see the file COPYING.LIB.  If not, write
19  * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22
23 #include "config.h"
24
25 #include <sys/time.h>
26 #include <sys/types.h>
27 #include <sys/wait.h>
28 #include <unistd.h>
29 #include <errno.h>
30 #include <fcntl.h>
31 #include <signal.h>
32 #include <string.h>
33 #include <stdlib.h>   /* for fdwalk */
34 #include <dirent.h>
35
36 #ifdef HAVE_SYS_SELECT_H
37 #include <sys/select.h>
38 #endif /* HAVE_SYS_SELECT_H */
39
40 #ifdef HAVE_SYS_RESOURCE_H
41 #include <sys/resource.h>
42 #endif /* HAVE_SYS_RESOURCE_H */
43
44 #include "gspawn.h"
45 #include "gthread.h"
46 #include "glib/gstdio.h"
47
48 #include "genviron.h"
49 #include "gmem.h"
50 #include "gshell.h"
51 #include "gstring.h"
52 #include "gstrfuncs.h"
53 #include "gtestutils.h"
54 #include "gutils.h"
55 #include "glibintl.h"
56 #include "glib-unix.h"
57
58 /**
59  * SECTION:spawn
60  * @Short_description: process launching
61  * @Title: Spawning Processes
62  */
63
64
65
66 static gint g_execute (const gchar  *file,
67                        gchar **argv,
68                        gchar **envp,
69                        gboolean search_path,
70                        gboolean search_path_from_envp);
71
72 static gboolean fork_exec_with_pipes (gboolean              intermediate_child,
73                                       const gchar          *working_directory,
74                                       gchar               **argv,
75                                       gchar               **envp,
76                                       gboolean              close_descriptors,
77                                       gboolean              search_path,
78                                       gboolean              search_path_from_envp,
79                                       gboolean              stdout_to_null,
80                                       gboolean              stderr_to_null,
81                                       gboolean              child_inherits_stdin,
82                                       gboolean              file_and_argv_zero,
83                                       gboolean              cloexec_pipes,
84                                       GSpawnChildSetupFunc  child_setup,
85                                       gpointer              user_data,
86                                       GPid                 *child_pid,
87                                       gint                 *standard_input,
88                                       gint                 *standard_output,
89                                       gint                 *standard_error,
90                                       GError              **error);
91
92 G_DEFINE_QUARK (g-exec-error-quark, g_spawn_error)
93 G_DEFINE_QUARK (g-spawn-exit-error-quark, g_spawn_exit_error)
94
95 /**
96  * g_spawn_async:
97  * @working_directory: (allow-none): child's current working directory, or %NULL to inherit parent's
98  * @argv: (array zero-terminated=1): child's argument vector
99  * @envp: (array zero-terminated=1) (allow-none): child's environment, or %NULL to inherit parent's
100  * @flags: flags from #GSpawnFlags
101  * @child_setup: (scope async) (allow-none): function to run in the child just before exec()
102  * @user_data: (closure): user data for @child_setup
103  * @child_pid: (out) (allow-none): return location for child process reference, or %NULL
104  * @error: return location for error
105  * 
106  * See g_spawn_async_with_pipes() for a full description; this function
107  * simply calls the g_spawn_async_with_pipes() without any pipes.
108  *
109  * You should call g_spawn_close_pid() on the returned child process
110  * reference when you don't need it any more.
111  * 
112  * <note><para>
113  * If you are writing a GTK+ application, and the program you 
114  * are spawning is a graphical application, too, then you may
115  * want to use gdk_spawn_on_screen() instead to ensure that
116  * the spawned program opens its windows on the right screen.
117  * </para></note>
118  *
119  * <note><para> Note that the returned @child_pid on Windows is a
120  * handle to the child process and not its identifier. Process handles
121  * and process identifiers are different concepts on Windows.
122  * </para></note>
123  *
124  * Return value: %TRUE on success, %FALSE if error is set
125  **/
126 gboolean
127 g_spawn_async (const gchar          *working_directory,
128                gchar               **argv,
129                gchar               **envp,
130                GSpawnFlags           flags,
131                GSpawnChildSetupFunc  child_setup,
132                gpointer              user_data,
133                GPid                 *child_pid,
134                GError              **error)
135 {
136   g_return_val_if_fail (argv != NULL, FALSE);
137   
138   return g_spawn_async_with_pipes (working_directory,
139                                    argv, envp,
140                                    flags,
141                                    child_setup,
142                                    user_data,
143                                    child_pid,
144                                    NULL, NULL, NULL,
145                                    error);
146 }
147
148 /* Avoids a danger in threaded situations (calling close()
149  * on a file descriptor twice, and another thread has
150  * re-opened it since the first close)
151  */
152 static void
153 close_and_invalidate (gint *fd)
154 {
155   if (*fd < 0)
156     return;
157   else
158     {
159       (void) g_close (*fd, NULL);
160       *fd = -1;
161     }
162 }
163
164 /* Some versions of OS X define READ_OK in public headers */
165 #undef READ_OK
166
167 typedef enum
168 {
169   READ_FAILED = 0, /* FALSE */
170   READ_OK,
171   READ_EOF
172 } ReadResult;
173
174 static ReadResult
175 read_data (GString *str,
176            gint     fd,
177            GError **error)
178 {
179   gssize bytes;
180   gchar buf[4096];
181
182  again:
183   bytes = read (fd, buf, 4096);
184
185   if (bytes == 0)
186     return READ_EOF;
187   else if (bytes > 0)
188     {
189       g_string_append_len (str, buf, bytes);
190       return READ_OK;
191     }
192   else if (errno == EINTR)
193     goto again;
194   else
195     {
196       int errsv = errno;
197
198       g_set_error (error,
199                    G_SPAWN_ERROR,
200                    G_SPAWN_ERROR_READ,
201                    _("Failed to read data from child process (%s)"),
202                    g_strerror (errsv));
203
204       return READ_FAILED;
205     }
206 }
207
208 /**
209  * g_spawn_sync:
210  * @working_directory: (allow-none): child's current working directory, or %NULL to inherit parent's
211  * @argv: (array zero-terminated=1): child's argument vector
212  * @envp: (array zero-terminated=1) (allow-none): child's environment, or %NULL to inherit parent's
213  * @flags: flags from #GSpawnFlags
214  * @child_setup: (scope async) (allow-none): function to run in the child just before exec()
215  * @user_data: (closure): user data for @child_setup
216  * @standard_output: (out) (array zero-terminated=1) (element-type guint8) (allow-none): return location for child output, or %NULL
217  * @standard_error: (out) (array zero-terminated=1) (element-type guint8) (allow-none): return location for child error messages, or %NULL
218  * @exit_status: (out) (allow-none): return location for child exit status, as returned by waitpid(), or %NULL
219  * @error: return location for error, or %NULL
220  *
221  * Executes a child synchronously (waits for the child to exit before returning).
222  * All output from the child is stored in @standard_output and @standard_error,
223  * if those parameters are non-%NULL. Note that you must set the  
224  * %G_SPAWN_STDOUT_TO_DEV_NULL and %G_SPAWN_STDERR_TO_DEV_NULL flags when
225  * passing %NULL for @standard_output and @standard_error.
226  *
227  * If @exit_status is non-%NULL, the platform-specific exit status of
228  * the child is stored there; see the documentation of
229  * g_spawn_check_exit_status() for how to use and interpret this.
230  * Note that it is invalid to pass %G_SPAWN_DO_NOT_REAP_CHILD in
231  * @flags.
232  *
233  * If an error occurs, no data is returned in @standard_output,
234  * @standard_error, or @exit_status.
235  *
236  * This function calls g_spawn_async_with_pipes() internally; see that
237  * function for full details on the other parameters and details on
238  * how these functions work on Windows.
239  * 
240  * Return value: %TRUE on success, %FALSE if an error was set.
241  **/
242 gboolean
243 g_spawn_sync (const gchar          *working_directory,
244               gchar               **argv,
245               gchar               **envp,
246               GSpawnFlags           flags,
247               GSpawnChildSetupFunc  child_setup,
248               gpointer              user_data,
249               gchar               **standard_output,
250               gchar               **standard_error,
251               gint                 *exit_status,
252               GError              **error)     
253 {
254   gint outpipe = -1;
255   gint errpipe = -1;
256   GPid pid;
257   fd_set fds;
258   gint ret;
259   GString *outstr = NULL;
260   GString *errstr = NULL;
261   gboolean failed;
262   gint status;
263   
264   g_return_val_if_fail (argv != NULL, FALSE);
265   g_return_val_if_fail (!(flags & G_SPAWN_DO_NOT_REAP_CHILD), FALSE);
266   g_return_val_if_fail (standard_output == NULL ||
267                         !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE);
268   g_return_val_if_fail (standard_error == NULL ||
269                         !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE);
270   
271   /* Just to ensure segfaults if callers try to use
272    * these when an error is reported.
273    */
274   if (standard_output)
275     *standard_output = NULL;
276
277   if (standard_error)
278     *standard_error = NULL;
279   
280   if (!fork_exec_with_pipes (FALSE,
281                              working_directory,
282                              argv,
283                              envp,
284                              !(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN),
285                              (flags & G_SPAWN_SEARCH_PATH) != 0,
286                              (flags & G_SPAWN_SEARCH_PATH_FROM_ENVP) != 0,
287                              (flags & G_SPAWN_STDOUT_TO_DEV_NULL) != 0,
288                              (flags & G_SPAWN_STDERR_TO_DEV_NULL) != 0,
289                              (flags & G_SPAWN_CHILD_INHERITS_STDIN) != 0,
290                              (flags & G_SPAWN_FILE_AND_ARGV_ZERO) != 0,
291                              (flags & G_SPAWN_CLOEXEC_PIPES) != 0,
292                              child_setup,
293                              user_data,
294                              &pid,
295                              NULL,
296                              standard_output ? &outpipe : NULL,
297                              standard_error ? &errpipe : NULL,
298                              error))
299     return FALSE;
300
301   /* Read data from child. */
302   
303   failed = FALSE;
304
305   if (outpipe >= 0)
306     {
307       outstr = g_string_new (NULL);
308     }
309       
310   if (errpipe >= 0)
311     {
312       errstr = g_string_new (NULL);
313     }
314
315   /* Read data until we get EOF on both pipes. */
316   while (!failed &&
317          (outpipe >= 0 ||
318           errpipe >= 0))
319     {
320       ret = 0;
321           
322       FD_ZERO (&fds);
323       if (outpipe >= 0)
324         FD_SET (outpipe, &fds);
325       if (errpipe >= 0)
326         FD_SET (errpipe, &fds);
327           
328       ret = select (MAX (outpipe, errpipe) + 1,
329                     &fds,
330                     NULL, NULL,
331                     NULL /* no timeout */);
332
333       if (ret < 0)
334         {
335           int errsv = errno;
336
337           if (errno == EINTR)
338             continue;
339
340           failed = TRUE;
341
342           g_set_error (error,
343                        G_SPAWN_ERROR,
344                        G_SPAWN_ERROR_READ,
345                        _("Unexpected error in select() reading data from a child process (%s)"),
346                        g_strerror (errsv));
347               
348           break;
349         }
350
351       if (outpipe >= 0 && FD_ISSET (outpipe, &fds))
352         {
353           switch (read_data (outstr, outpipe, error))
354             {
355             case READ_FAILED:
356               failed = TRUE;
357               break;
358             case READ_EOF:
359               close_and_invalidate (&outpipe);
360               outpipe = -1;
361               break;
362             default:
363               break;
364             }
365
366           if (failed)
367             break;
368         }
369
370       if (errpipe >= 0 && FD_ISSET (errpipe, &fds))
371         {
372           switch (read_data (errstr, errpipe, error))
373             {
374             case READ_FAILED:
375               failed = TRUE;
376               break;
377             case READ_EOF:
378               close_and_invalidate (&errpipe);
379               errpipe = -1;
380               break;
381             default:
382               break;
383             }
384
385           if (failed)
386             break;
387         }
388     }
389
390   /* These should only be open still if we had an error.  */
391   
392   if (outpipe >= 0)
393     close_and_invalidate (&outpipe);
394   if (errpipe >= 0)
395     close_and_invalidate (&errpipe);
396   
397   /* Wait for child to exit, even if we have
398    * an error pending.
399    */
400  again:
401       
402   ret = waitpid (pid, &status, 0);
403
404   if (ret < 0)
405     {
406       if (errno == EINTR)
407         goto again;
408       else if (errno == ECHILD)
409         {
410           if (exit_status)
411             {
412               g_warning ("In call to g_spawn_sync(), exit status of a child process was requested but ECHILD was received by waitpid(). Most likely the process is ignoring SIGCHLD, or some other thread is invoking waitpid() with a nonpositive first argument; either behavior can break applications that use g_spawn_sync either directly or indirectly.");
413             }
414           else
415             {
416               /* We don't need the exit status. */
417             }
418         }
419       else
420         {
421           if (!failed) /* avoid error pileups */
422             {
423               int errsv = errno;
424
425               failed = TRUE;
426                   
427               g_set_error (error,
428                            G_SPAWN_ERROR,
429                            G_SPAWN_ERROR_READ,
430                            _("Unexpected error in waitpid() (%s)"),
431                            g_strerror (errsv));
432             }
433         }
434     }
435   
436   if (failed)
437     {
438       if (outstr)
439         g_string_free (outstr, TRUE);
440       if (errstr)
441         g_string_free (errstr, TRUE);
442
443       return FALSE;
444     }
445   else
446     {
447       if (exit_status)
448         *exit_status = status;
449       
450       if (standard_output)        
451         *standard_output = g_string_free (outstr, FALSE);
452
453       if (standard_error)
454         *standard_error = g_string_free (errstr, FALSE);
455
456       return TRUE;
457     }
458 }
459
460 /**
461  * g_spawn_async_with_pipes:
462  * @working_directory: (allow-none): child's current working directory, or %NULL to inherit parent's, in the GLib file name encoding
463  * @argv: (array zero-terminated=1): child's argument vector, in the GLib file name encoding
464  * @envp: (array zero-terminated=1) (allow-none): child's environment, or %NULL to inherit parent's, in the GLib file name encoding
465  * @flags: flags from #GSpawnFlags
466  * @child_setup: (scope async) (allow-none): function to run in the child just before exec()
467  * @user_data: (closure): user data for @child_setup
468  * @child_pid: (out) (allow-none): return location for child process ID, or %NULL
469  * @standard_input: (out) (allow-none): return location for file descriptor to write to child's stdin, or %NULL
470  * @standard_output: (out) (allow-none): return location for file descriptor to read child's stdout, or %NULL
471  * @standard_error: (out) (allow-none): return location for file descriptor to read child's stderr, or %NULL
472  * @error: return location for error
473  *
474  * Executes a child program asynchronously (your program will not
475  * block waiting for the child to exit). The child program is
476  * specified by the only argument that must be provided, @argv. @argv
477  * should be a %NULL-terminated array of strings, to be passed as the
478  * argument vector for the child. The first string in @argv is of
479  * course the name of the program to execute. By default, the name of
480  * the program must be a full path. If @flags contains the 
481  * %G_SPAWN_SEARCH_PATH flag, the <envar>PATH</envar> environment variable 
482  * is used to search for the executable. If @flags contains the
483  * %G_SPAWN_SEARCH_PATH_FROM_ENVP flag, the <envar>PATH</envar> variable from 
484  * @envp is used to search for the executable.
485  * If both the %G_SPAWN_SEARCH_PATH and %G_SPAWN_SEARCH_PATH_FROM_ENVP
486  * flags are set, the <envar>PATH</envar> variable from @envp takes precedence 
487  * over the environment variable.
488  *
489  * If the program name is not a full path and %G_SPAWN_SEARCH_PATH flag is not
490  * used, then the program will be run from the current directory (or
491  * @working_directory, if specified); this might be unexpected or even
492  * dangerous in some cases when the current directory is world-writable.
493  *
494  * On Windows, note that all the string or string vector arguments to
495  * this function and the other g_spawn*() functions are in UTF-8, the
496  * GLib file name encoding. Unicode characters that are not part of
497  * the system codepage passed in these arguments will be correctly
498  * available in the spawned program only if it uses wide character API
499  * to retrieve its command line. For C programs built with Microsoft's
500  * tools it is enough to make the program have a wmain() instead of
501  * main(). wmain() has a wide character argument vector as parameter.
502  *
503  * At least currently, mingw doesn't support wmain(), so if you use
504  * mingw to develop the spawned program, it will have to call the
505  * undocumented function __wgetmainargs() to get the wide character
506  * argument vector and environment. See gspawn-win32-helper.c in the
507  * GLib sources or init.c in the mingw runtime sources for a prototype
508  * for that function. Alternatively, you can retrieve the Win32 system
509  * level wide character command line passed to the spawned program
510  * using the GetCommandLineW() function.
511  *
512  * On Windows the low-level child process creation API
513  * <function>CreateProcess()</function> doesn't use argument vectors,
514  * but a command line. The C runtime library's
515  * <function>spawn*()</function> family of functions (which
516  * g_spawn_async_with_pipes() eventually calls) paste the argument
517  * vector elements together into a command line, and the C runtime startup code
518  * does a corresponding reconstruction of an argument vector from the
519  * command line, to be passed to main(). Complications arise when you have
520  * argument vector elements that contain spaces of double quotes. The
521  * <function>spawn*()</function> functions don't do any quoting or
522  * escaping, but on the other hand the startup code does do unquoting
523  * and unescaping in order to enable receiving arguments with embedded
524  * spaces or double quotes. To work around this asymmetry,
525  * g_spawn_async_with_pipes() will do quoting and escaping on argument
526  * vector elements that need it before calling the C runtime
527  * spawn() function.
528  *
529  * The returned @child_pid on Windows is a handle to the child
530  * process, not its identifier. Process handles and process
531  * identifiers are different concepts on Windows.
532  *
533  * @envp is a %NULL-terminated array of strings, where each string
534  * has the form <literal>KEY=VALUE</literal>. This will become
535  * the child's environment. If @envp is %NULL, the child inherits its
536  * parent's environment.
537  *
538  * @flags should be the bitwise OR of any flags you want to affect the
539  * function's behaviour. The %G_SPAWN_DO_NOT_REAP_CHILD means that the
540  * child will not automatically be reaped; you must use a child watch to
541  * be notified about the death of the child process. Eventually you must
542  * call g_spawn_close_pid() on the @child_pid, in order to free
543  * resources which may be associated with the child process. (On Unix,
544  * using a child watch is equivalent to calling waitpid() or handling
545  * the <literal>SIGCHLD</literal> signal manually. On Windows, calling g_spawn_close_pid()
546  * is equivalent to calling CloseHandle() on the process handle returned
547  * in @child_pid).  See g_child_watch_add().
548  *
549  * %G_SPAWN_LEAVE_DESCRIPTORS_OPEN means that the parent's open file
550  * descriptors will be inherited by the child; otherwise all
551  * descriptors except stdin/stdout/stderr will be closed before
552  * calling exec() in the child. %G_SPAWN_SEARCH_PATH 
553  * means that <literal>argv[0]</literal> need not be an absolute path, it
554  * will be looked for in the <envar>PATH</envar> environment variable.
555  * %G_SPAWN_SEARCH_PATH_FROM_ENVP means need not be an absolute path, it
556  * will be looked for in the <envar>PATH</envar> variable from @envp. If
557  * both %G_SPAWN_SEARCH_PATH and %G_SPAWN_SEARCH_PATH_FROM_ENVP are used,
558  * the value from @envp takes precedence over the environment.
559  * %G_SPAWN_STDOUT_TO_DEV_NULL means that the child's standard output will 
560  * be discarded, instead of going to the same location as the parent's 
561  * standard output. If you use this flag, @standard_output must be %NULL.
562  * %G_SPAWN_STDERR_TO_DEV_NULL means that the child's standard error
563  * will be discarded, instead of going to the same location as the parent's
564  * standard error. If you use this flag, @standard_error must be %NULL.
565  * %G_SPAWN_CHILD_INHERITS_STDIN means that the child will inherit the parent's
566  * standard input (by default, the child's standard input is attached to
567  * /dev/null). If you use this flag, @standard_input must be %NULL.
568  * %G_SPAWN_FILE_AND_ARGV_ZERO means that the first element of @argv is
569  * the file to execute, while the remaining elements are the
570  * actual argument vector to pass to the file. Normally
571  * g_spawn_async_with_pipes() uses @argv[0] as the file to execute, and
572  * passes all of @argv to the child.
573  *
574  * @child_setup and @user_data are a function and user data. On POSIX
575  * platforms, the function is called in the child after GLib has
576  * performed all the setup it plans to perform (including creating
577  * pipes, closing file descriptors, etc.) but before calling
578  * exec(). That is, @child_setup is called just
579  * before calling exec() in the child. Obviously
580  * actions taken in this function will only affect the child, not the
581  * parent.
582  *
583  * On Windows, there is no separate fork() and exec()
584  * functionality. Child processes are created and run with a single
585  * API call, CreateProcess(). There is no sensible thing @child_setup
586  * could be used for on Windows so it is ignored and not called.
587  *
588  * If non-%NULL, @child_pid will on Unix be filled with the child's
589  * process ID. You can use the process ID to send signals to the
590  * child, or to use g_child_watch_add() (or waitpid()) if you specified the
591  * %G_SPAWN_DO_NOT_REAP_CHILD flag. On Windows, @child_pid will be
592  * filled with a handle to the child process only if you specified the
593  * %G_SPAWN_DO_NOT_REAP_CHILD flag. You can then access the child
594  * process using the Win32 API, for example wait for its termination
595  * with the <function>WaitFor*()</function> functions, or examine its
596  * exit code with GetExitCodeProcess(). You should close the handle 
597  * with CloseHandle() or g_spawn_close_pid() when you no longer need it.
598  *
599  * If non-%NULL, the @standard_input, @standard_output, @standard_error
600  * locations will be filled with file descriptors for writing to the child's
601  * standard input or reading from its standard output or standard error.
602  * The caller of g_spawn_async_with_pipes() must close these file descriptors
603  * when they are no longer in use. If these parameters are %NULL, the corresponding
604  * pipe won't be created.
605  *
606  * If @standard_input is NULL, the child's standard input is attached to 
607  * /dev/null unless %G_SPAWN_CHILD_INHERITS_STDIN is set.
608  *
609  * If @standard_error is NULL, the child's standard error goes to the same 
610  * location as the parent's standard error unless %G_SPAWN_STDERR_TO_DEV_NULL 
611  * is set.
612  *
613  * If @standard_output is NULL, the child's standard output goes to the same 
614  * location as the parent's standard output unless %G_SPAWN_STDOUT_TO_DEV_NULL 
615  * is set.
616  *
617  * @error can be %NULL to ignore errors, or non-%NULL to report errors.
618  * If an error is set, the function returns %FALSE. Errors
619  * are reported even if they occur in the child (for example if the
620  * executable in <literal>argv[0]</literal> is not found). Typically
621  * the <literal>message</literal> field of returned errors should be displayed
622  * to users. Possible errors are those from the #G_SPAWN_ERROR domain.
623  *
624  * If an error occurs, @child_pid, @standard_input, @standard_output,
625  * and @standard_error will not be filled with valid values.
626  *
627  * If @child_pid is not %NULL and an error does not occur then the returned
628  * process reference must be closed using g_spawn_close_pid().
629  *
630  * <note><para>
631  * If you are writing a GTK+ application, and the program you 
632  * are spawning is a graphical application, too, then you may
633  * want to use gdk_spawn_on_screen_with_pipes() instead to ensure that
634  * the spawned program opens its windows on the right screen.
635  * </para></note>
636  * 
637  * Return value: %TRUE on success, %FALSE if an error was set
638  **/
639 gboolean
640 g_spawn_async_with_pipes (const gchar          *working_directory,
641                           gchar               **argv,
642                           gchar               **envp,
643                           GSpawnFlags           flags,
644                           GSpawnChildSetupFunc  child_setup,
645                           gpointer              user_data,
646                           GPid                 *child_pid,
647                           gint                 *standard_input,
648                           gint                 *standard_output,
649                           gint                 *standard_error,
650                           GError              **error)
651 {
652   g_return_val_if_fail (argv != NULL, FALSE);
653   g_return_val_if_fail (standard_output == NULL ||
654                         !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE);
655   g_return_val_if_fail (standard_error == NULL ||
656                         !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE);
657   /* can't inherit stdin if we have an input pipe. */
658   g_return_val_if_fail (standard_input == NULL ||
659                         !(flags & G_SPAWN_CHILD_INHERITS_STDIN), FALSE);
660   
661   return fork_exec_with_pipes (!(flags & G_SPAWN_DO_NOT_REAP_CHILD),
662                                working_directory,
663                                argv,
664                                envp,
665                                !(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN),
666                                (flags & G_SPAWN_SEARCH_PATH) != 0,
667                                (flags & G_SPAWN_SEARCH_PATH_FROM_ENVP) != 0,
668                                (flags & G_SPAWN_STDOUT_TO_DEV_NULL) != 0,
669                                (flags & G_SPAWN_STDERR_TO_DEV_NULL) != 0,
670                                (flags & G_SPAWN_CHILD_INHERITS_STDIN) != 0,
671                                (flags & G_SPAWN_FILE_AND_ARGV_ZERO) != 0,
672                                (flags & G_SPAWN_CLOEXEC_PIPES) != 0,
673                                child_setup,
674                                user_data,
675                                child_pid,
676                                standard_input,
677                                standard_output,
678                                standard_error,
679                                error);
680 }
681
682 /**
683  * g_spawn_command_line_sync:
684  * @command_line: a command line 
685  * @standard_output: (out) (array zero-terminated=1) (element-type guint8) (allow-none): return location for child output
686  * @standard_error: (out) (array zero-terminated=1) (element-type guint8) (allow-none): return location for child errors
687  * @exit_status: (out) (allow-none): return location for child exit status, as returned by waitpid()
688  * @error: return location for errors
689  *
690  * A simple version of g_spawn_sync() with little-used parameters
691  * removed, taking a command line instead of an argument vector.  See
692  * g_spawn_sync() for full details. @command_line will be parsed by
693  * g_shell_parse_argv(). Unlike g_spawn_sync(), the %G_SPAWN_SEARCH_PATH flag
694  * is enabled. Note that %G_SPAWN_SEARCH_PATH can have security
695  * implications, so consider using g_spawn_sync() directly if
696  * appropriate. Possible errors are those from g_spawn_sync() and those
697  * from g_shell_parse_argv().
698  *
699  * If @exit_status is non-%NULL, the platform-specific exit status of
700  * the child is stored there; see the documentation of
701  * g_spawn_check_exit_status() for how to use and interpret this.
702  * 
703  * On Windows, please note the implications of g_shell_parse_argv()
704  * parsing @command_line. Parsing is done according to Unix shell rules, not 
705  * Windows command interpreter rules.
706  * Space is a separator, and backslashes are
707  * special. Thus you cannot simply pass a @command_line containing
708  * canonical Windows paths, like "c:\\program files\\app\\app.exe", as
709  * the backslashes will be eaten, and the space will act as a
710  * separator. You need to enclose such paths with single quotes, like
711  * "'c:\\program files\\app\\app.exe' 'e:\\folder\\argument.txt'".
712  *
713  * Return value: %TRUE on success, %FALSE if an error was set
714  **/
715 gboolean
716 g_spawn_command_line_sync (const gchar  *command_line,
717                            gchar       **standard_output,
718                            gchar       **standard_error,
719                            gint         *exit_status,
720                            GError      **error)
721 {
722   gboolean retval;
723   gchar **argv = NULL;
724
725   g_return_val_if_fail (command_line != NULL, FALSE);
726   
727   if (!g_shell_parse_argv (command_line,
728                            NULL, &argv,
729                            error))
730     return FALSE;
731   
732   retval = g_spawn_sync (NULL,
733                          argv,
734                          NULL,
735                          G_SPAWN_SEARCH_PATH,
736                          NULL,
737                          NULL,
738                          standard_output,
739                          standard_error,
740                          exit_status,
741                          error);
742   g_strfreev (argv);
743
744   return retval;
745 }
746
747 /**
748  * g_spawn_command_line_async:
749  * @command_line: a command line
750  * @error: return location for errors
751  * 
752  * A simple version of g_spawn_async() that parses a command line with
753  * g_shell_parse_argv() and passes it to g_spawn_async(). Runs a
754  * command line in the background. Unlike g_spawn_async(), the
755  * %G_SPAWN_SEARCH_PATH flag is enabled, other flags are not. Note
756  * that %G_SPAWN_SEARCH_PATH can have security implications, so
757  * consider using g_spawn_async() directly if appropriate. Possible
758  * errors are those from g_shell_parse_argv() and g_spawn_async().
759  * 
760  * The same concerns on Windows apply as for g_spawn_command_line_sync().
761  *
762  * Return value: %TRUE on success, %FALSE if error is set.
763  **/
764 gboolean
765 g_spawn_command_line_async (const gchar *command_line,
766                             GError     **error)
767 {
768   gboolean retval;
769   gchar **argv = NULL;
770
771   g_return_val_if_fail (command_line != NULL, FALSE);
772
773   if (!g_shell_parse_argv (command_line,
774                            NULL, &argv,
775                            error))
776     return FALSE;
777   
778   retval = g_spawn_async (NULL,
779                           argv,
780                           NULL,
781                           G_SPAWN_SEARCH_PATH,
782                           NULL,
783                           NULL,
784                           NULL,
785                           error);
786   g_strfreev (argv);
787
788   return retval;
789 }
790
791 /**
792  * g_spawn_check_exit_status:
793  * @exit_status: An exit code as returned from g_spawn_sync()
794  * @error: a #GError
795  *
796  * Set @error if @exit_status indicates the child exited abnormally
797  * (e.g. with a nonzero exit code, or via a fatal signal).
798  *
799  * The g_spawn_sync() and g_child_watch_add() family of APIs return an
800  * exit status for subprocesses encoded in a platform-specific way.
801  * On Unix, this is guaranteed to be in the same format
802  * <literal>waitpid(2)</literal> returns, and on Windows it is
803  * guaranteed to be the result of
804  * <literal>GetExitCodeProcess()</literal>.  Prior to the introduction
805  * of this function in GLib 2.34, interpreting @exit_status required
806  * use of platform-specific APIs, which is problematic for software
807  * using GLib as a cross-platform layer.
808  *
809  * Additionally, many programs simply want to determine whether or not
810  * the child exited successfully, and either propagate a #GError or
811  * print a message to standard error.  In that common case, this
812  * function can be used.  Note that the error message in @error will
813  * contain human-readable information about the exit status.
814  *
815  * The <literal>domain</literal> and <literal>code</literal> of @error
816  * have special semantics in the case where the process has an "exit
817  * code", as opposed to being killed by a signal.  On Unix, this
818  * happens if <literal>WIFEXITED</literal> would be true of
819  * @exit_status.  On Windows, it is always the case.
820  *
821  * The special semantics are that the actual exit code will be the
822  * code set in @error, and the domain will be %G_SPAWN_EXIT_ERROR.
823  * This allows you to differentiate between different exit codes.
824  *
825  * If the process was terminated by some means other than an exit
826  * status, the domain will be %G_SPAWN_ERROR, and the code will be
827  * %G_SPAWN_ERROR_FAILED.
828  *
829  * This function just offers convenience; you can of course also check
830  * the available platform via a macro such as %G_OS_UNIX, and use
831  * <literal>WIFEXITED()</literal> and <literal>WEXITSTATUS()</literal>
832  * on @exit_status directly.  Do not attempt to scan or parse the
833  * error message string; it may be translated and/or change in future
834  * versions of GLib.
835  *
836  * Returns: %TRUE if child exited successfully, %FALSE otherwise (and @error will be set)
837  * Since: 2.34
838  */
839 gboolean
840 g_spawn_check_exit_status (gint      exit_status,
841                            GError  **error)
842 {
843   gboolean ret = FALSE;
844
845   if (WIFEXITED (exit_status))
846     {
847       if (WEXITSTATUS (exit_status) != 0)
848         {
849           g_set_error (error, G_SPAWN_EXIT_ERROR, WEXITSTATUS (exit_status),
850                        _("Child process exited with code %ld"),
851                        (long) WEXITSTATUS (exit_status));
852           goto out;
853         }
854     }
855   else if (WIFSIGNALED (exit_status))
856     {
857       g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
858                    _("Child process killed by signal %ld"),
859                    (long) WTERMSIG (exit_status));
860       goto out;
861     }
862   else if (WIFSTOPPED (exit_status))
863     {
864       g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
865                    _("Child process stopped by signal %ld"),
866                    (long) WSTOPSIG (exit_status));
867       goto out;
868     }
869   else
870     {
871       g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
872                    _("Child process exited abnormally"));
873       goto out;
874     }
875
876   ret = TRUE;
877  out:
878   return ret;
879 }
880
881 static gint
882 exec_err_to_g_error (gint en)
883 {
884   switch (en)
885     {
886 #ifdef EACCES
887     case EACCES:
888       return G_SPAWN_ERROR_ACCES;
889       break;
890 #endif
891
892 #ifdef EPERM
893     case EPERM:
894       return G_SPAWN_ERROR_PERM;
895       break;
896 #endif
897
898 #ifdef E2BIG
899     case E2BIG:
900       return G_SPAWN_ERROR_TOO_BIG;
901       break;
902 #endif
903
904 #ifdef ENOEXEC
905     case ENOEXEC:
906       return G_SPAWN_ERROR_NOEXEC;
907       break;
908 #endif
909
910 #ifdef ENAMETOOLONG
911     case ENAMETOOLONG:
912       return G_SPAWN_ERROR_NAMETOOLONG;
913       break;
914 #endif
915
916 #ifdef ENOENT
917     case ENOENT:
918       return G_SPAWN_ERROR_NOENT;
919       break;
920 #endif
921
922 #ifdef ENOMEM
923     case ENOMEM:
924       return G_SPAWN_ERROR_NOMEM;
925       break;
926 #endif
927
928 #ifdef ENOTDIR
929     case ENOTDIR:
930       return G_SPAWN_ERROR_NOTDIR;
931       break;
932 #endif
933
934 #ifdef ELOOP
935     case ELOOP:
936       return G_SPAWN_ERROR_LOOP;
937       break;
938 #endif
939       
940 #ifdef ETXTBUSY
941     case ETXTBUSY:
942       return G_SPAWN_ERROR_TXTBUSY;
943       break;
944 #endif
945
946 #ifdef EIO
947     case EIO:
948       return G_SPAWN_ERROR_IO;
949       break;
950 #endif
951
952 #ifdef ENFILE
953     case ENFILE:
954       return G_SPAWN_ERROR_NFILE;
955       break;
956 #endif
957
958 #ifdef EMFILE
959     case EMFILE:
960       return G_SPAWN_ERROR_MFILE;
961       break;
962 #endif
963
964 #ifdef EINVAL
965     case EINVAL:
966       return G_SPAWN_ERROR_INVAL;
967       break;
968 #endif
969
970 #ifdef EISDIR
971     case EISDIR:
972       return G_SPAWN_ERROR_ISDIR;
973       break;
974 #endif
975
976 #ifdef ELIBBAD
977     case ELIBBAD:
978       return G_SPAWN_ERROR_LIBBAD;
979       break;
980 #endif
981       
982     default:
983       return G_SPAWN_ERROR_FAILED;
984       break;
985     }
986 }
987
988 static gssize
989 write_all (gint fd, gconstpointer vbuf, gsize to_write)
990 {
991   gchar *buf = (gchar *) vbuf;
992   
993   while (to_write > 0)
994     {
995       gssize count = write (fd, buf, to_write);
996       if (count < 0)
997         {
998           if (errno != EINTR)
999             return FALSE;
1000         }
1001       else
1002         {
1003           to_write -= count;
1004           buf += count;
1005         }
1006     }
1007   
1008   return TRUE;
1009 }
1010
1011 G_GNUC_NORETURN
1012 static void
1013 write_err_and_exit (gint fd, gint msg)
1014 {
1015   gint en = errno;
1016   
1017   write_all (fd, &msg, sizeof(msg));
1018   write_all (fd, &en, sizeof(en));
1019   
1020   _exit (1);
1021 }
1022
1023 static int
1024 set_cloexec (void *data, gint fd)
1025 {
1026   if (fd >= GPOINTER_TO_INT (data))
1027     fcntl (fd, F_SETFD, FD_CLOEXEC);
1028
1029   return 0;
1030 }
1031
1032 #ifndef HAVE_FDWALK
1033 static int
1034 fdwalk (int (*cb)(void *data, int fd), void *data)
1035 {
1036   gint open_max;
1037   gint fd;
1038   gint res = 0;
1039   
1040 #ifdef HAVE_SYS_RESOURCE_H
1041   struct rlimit rl;
1042 #endif
1043
1044 #ifdef __linux__  
1045   DIR *d;
1046
1047   if ((d = opendir("/proc/self/fd"))) {
1048       struct dirent *de;
1049
1050       while ((de = readdir(d))) {
1051           glong l;
1052           gchar *e = NULL;
1053
1054           if (de->d_name[0] == '.')
1055               continue;
1056             
1057           errno = 0;
1058           l = strtol(de->d_name, &e, 10);
1059           if (errno != 0 || !e || *e)
1060               continue;
1061
1062           fd = (gint) l;
1063
1064           if ((glong) fd != l)
1065               continue;
1066
1067           if (fd == dirfd(d))
1068               continue;
1069
1070           if ((res = cb (data, fd)) != 0)
1071               break;
1072         }
1073       
1074       closedir(d);
1075       return res;
1076   }
1077
1078   /* If /proc is not mounted or not accessible we fall back to the old
1079    * rlimit trick */
1080
1081 #endif
1082   
1083 #ifdef HAVE_SYS_RESOURCE_H
1084       
1085   if (getrlimit(RLIMIT_NOFILE, &rl) == 0 && rl.rlim_max != RLIM_INFINITY)
1086       open_max = rl.rlim_max;
1087   else
1088 #endif
1089       open_max = sysconf (_SC_OPEN_MAX);
1090
1091   for (fd = 0; fd < open_max; fd++)
1092       if ((res = cb (data, fd)) != 0)
1093           break;
1094
1095   return res;
1096 }
1097 #endif
1098
1099 static gint
1100 sane_dup2 (gint fd1, gint fd2)
1101 {
1102   gint ret;
1103
1104  retry:
1105   ret = dup2 (fd1, fd2);
1106   if (ret < 0 && errno == EINTR)
1107     goto retry;
1108
1109   return ret;
1110 }
1111
1112 static gint
1113 sane_open (const char *path, gint mode)
1114 {
1115   gint ret;
1116
1117  retry:
1118   ret = open (path, mode);
1119   if (ret < 0 && errno == EINTR)
1120     goto retry;
1121
1122   return ret;
1123 }
1124
1125 enum
1126 {
1127   CHILD_CHDIR_FAILED,
1128   CHILD_EXEC_FAILED,
1129   CHILD_DUP2_FAILED,
1130   CHILD_FORK_FAILED
1131 };
1132
1133 static void
1134 do_exec (gint                  child_err_report_fd,
1135          gint                  stdin_fd,
1136          gint                  stdout_fd,
1137          gint                  stderr_fd,
1138          const gchar          *working_directory,
1139          gchar               **argv,
1140          gchar               **envp,
1141          gboolean              close_descriptors,
1142          gboolean              search_path,
1143          gboolean              search_path_from_envp,
1144          gboolean              stdout_to_null,
1145          gboolean              stderr_to_null,
1146          gboolean              child_inherits_stdin,
1147          gboolean              file_and_argv_zero,
1148          GSpawnChildSetupFunc  child_setup,
1149          gpointer              user_data)
1150 {
1151   if (working_directory && chdir (working_directory) < 0)
1152     write_err_and_exit (child_err_report_fd,
1153                         CHILD_CHDIR_FAILED);
1154
1155   /* Close all file descriptors but stdin stdout and stderr as
1156    * soon as we exec. Note that this includes
1157    * child_err_report_fd, which keeps the parent from blocking
1158    * forever on the other end of that pipe.
1159    */
1160   if (close_descriptors)
1161     {
1162       fdwalk (set_cloexec, GINT_TO_POINTER(3));
1163     }
1164   else
1165     {
1166       /* We need to do child_err_report_fd anyway */
1167       set_cloexec (GINT_TO_POINTER(0), child_err_report_fd);
1168     }
1169   
1170   /* Redirect pipes as required */
1171   
1172   if (stdin_fd >= 0)
1173     {
1174       /* dup2 can't actually fail here I don't think */
1175           
1176       if (sane_dup2 (stdin_fd, 0) < 0)
1177         write_err_and_exit (child_err_report_fd,
1178                             CHILD_DUP2_FAILED);
1179
1180       /* ignore this if it doesn't work */
1181       close_and_invalidate (&stdin_fd);
1182     }
1183   else if (!child_inherits_stdin)
1184     {
1185       /* Keep process from blocking on a read of stdin */
1186       gint read_null = open ("/dev/null", O_RDONLY);
1187       g_assert (read_null != -1);
1188       sane_dup2 (read_null, 0);
1189       close_and_invalidate (&read_null);
1190     }
1191
1192   if (stdout_fd >= 0)
1193     {
1194       /* dup2 can't actually fail here I don't think */
1195           
1196       if (sane_dup2 (stdout_fd, 1) < 0)
1197         write_err_and_exit (child_err_report_fd,
1198                             CHILD_DUP2_FAILED);
1199
1200       /* ignore this if it doesn't work */
1201       close_and_invalidate (&stdout_fd);
1202     }
1203   else if (stdout_to_null)
1204     {
1205       gint write_null = sane_open ("/dev/null", O_WRONLY);
1206       g_assert (write_null != -1);
1207       sane_dup2 (write_null, 1);
1208       close_and_invalidate (&write_null);
1209     }
1210
1211   if (stderr_fd >= 0)
1212     {
1213       /* dup2 can't actually fail here I don't think */
1214           
1215       if (sane_dup2 (stderr_fd, 2) < 0)
1216         write_err_and_exit (child_err_report_fd,
1217                             CHILD_DUP2_FAILED);
1218
1219       /* ignore this if it doesn't work */
1220       close_and_invalidate (&stderr_fd);
1221     }
1222   else if (stderr_to_null)
1223     {
1224       gint write_null = sane_open ("/dev/null", O_WRONLY);
1225       sane_dup2 (write_null, 2);
1226       close_and_invalidate (&write_null);
1227     }
1228   
1229   /* Call user function just before we exec */
1230   if (child_setup)
1231     {
1232       (* child_setup) (user_data);
1233     }
1234
1235   g_execute (argv[0],
1236              file_and_argv_zero ? argv + 1 : argv,
1237              envp, search_path, search_path_from_envp);
1238
1239   /* Exec failed */
1240   write_err_and_exit (child_err_report_fd,
1241                       CHILD_EXEC_FAILED);
1242 }
1243
1244 static gboolean
1245 read_ints (int      fd,
1246            gint*    buf,
1247            gint     n_ints_in_buf,    
1248            gint    *n_ints_read,      
1249            GError **error)
1250 {
1251   gsize bytes = 0;    
1252   
1253   while (TRUE)
1254     {
1255       gssize chunk;    
1256
1257       if (bytes >= sizeof(gint)*2)
1258         break; /* give up, who knows what happened, should not be
1259                 * possible.
1260                 */
1261           
1262     again:
1263       chunk = read (fd,
1264                     ((gchar*)buf) + bytes,
1265                     sizeof(gint) * n_ints_in_buf - bytes);
1266       if (chunk < 0 && errno == EINTR)
1267         goto again;
1268           
1269       if (chunk < 0)
1270         {
1271           int errsv = errno;
1272
1273           /* Some weird shit happened, bail out */
1274           g_set_error (error,
1275                        G_SPAWN_ERROR,
1276                        G_SPAWN_ERROR_FAILED,
1277                        _("Failed to read from child pipe (%s)"),
1278                        g_strerror (errsv));
1279
1280           return FALSE;
1281         }
1282       else if (chunk == 0)
1283         break; /* EOF */
1284       else /* chunk > 0 */
1285         bytes += chunk;
1286     }
1287
1288   *n_ints_read = (gint)(bytes / sizeof(gint));
1289
1290   return TRUE;
1291 }
1292
1293 static gboolean
1294 fork_exec_with_pipes (gboolean              intermediate_child,
1295                       const gchar          *working_directory,
1296                       gchar               **argv,
1297                       gchar               **envp,
1298                       gboolean              close_descriptors,
1299                       gboolean              search_path,
1300                       gboolean              search_path_from_envp,
1301                       gboolean              stdout_to_null,
1302                       gboolean              stderr_to_null,
1303                       gboolean              child_inherits_stdin,
1304                       gboolean              file_and_argv_zero,
1305                       gboolean              cloexec_pipes,
1306                       GSpawnChildSetupFunc  child_setup,
1307                       gpointer              user_data,
1308                       GPid                 *child_pid,
1309                       gint                 *standard_input,
1310                       gint                 *standard_output,
1311                       gint                 *standard_error,
1312                       GError              **error)     
1313 {
1314   GPid pid = -1;
1315   gint stdin_pipe[2] = { -1, -1 };
1316   gint stdout_pipe[2] = { -1, -1 };
1317   gint stderr_pipe[2] = { -1, -1 };
1318   gint child_err_report_pipe[2] = { -1, -1 };
1319   gint child_pid_report_pipe[2] = { -1, -1 };
1320   guint pipe_flags = cloexec_pipes ? FD_CLOEXEC : 0;
1321   gint status;
1322   
1323   if (!g_unix_open_pipe (child_err_report_pipe, pipe_flags, error))
1324     return FALSE;
1325
1326   if (intermediate_child && !g_unix_open_pipe (child_pid_report_pipe, pipe_flags, error))
1327     goto cleanup_and_fail;
1328   
1329   if (standard_input && !g_unix_open_pipe (stdin_pipe, pipe_flags, error))
1330     goto cleanup_and_fail;
1331   
1332   if (standard_output && !g_unix_open_pipe (stdout_pipe, pipe_flags, error))
1333     goto cleanup_and_fail;
1334
1335   if (standard_error && !g_unix_open_pipe (stderr_pipe, FD_CLOEXEC, error))
1336     goto cleanup_and_fail;
1337
1338   pid = fork ();
1339
1340   if (pid < 0)
1341     {
1342       int errsv = errno;
1343
1344       g_set_error (error,
1345                    G_SPAWN_ERROR,
1346                    G_SPAWN_ERROR_FORK,
1347                    _("Failed to fork (%s)"),
1348                    g_strerror (errsv));
1349
1350       goto cleanup_and_fail;
1351     }
1352   else if (pid == 0)
1353     {
1354       /* Immediate child. This may or may not be the child that
1355        * actually execs the new process.
1356        */
1357
1358       /* Reset some signal handlers that we may use */
1359       signal (SIGCHLD, SIG_DFL);
1360       signal (SIGINT, SIG_DFL);
1361       signal (SIGTERM, SIG_DFL);
1362       signal (SIGHUP, SIG_DFL);
1363       
1364       /* Be sure we crash if the parent exits
1365        * and we write to the err_report_pipe
1366        */
1367       signal (SIGPIPE, SIG_DFL);
1368
1369       /* Close the parent's end of the pipes;
1370        * not needed in the close_descriptors case,
1371        * though
1372        */
1373       close_and_invalidate (&child_err_report_pipe[0]);
1374       close_and_invalidate (&child_pid_report_pipe[0]);
1375       close_and_invalidate (&stdin_pipe[1]);
1376       close_and_invalidate (&stdout_pipe[0]);
1377       close_and_invalidate (&stderr_pipe[0]);
1378       
1379       if (intermediate_child)
1380         {
1381           /* We need to fork an intermediate child that launches the
1382            * final child. The purpose of the intermediate child
1383            * is to exit, so we can waitpid() it immediately.
1384            * Then the grandchild will not become a zombie.
1385            */
1386           GPid grandchild_pid;
1387
1388           grandchild_pid = fork ();
1389
1390           if (grandchild_pid < 0)
1391             {
1392               /* report -1 as child PID */
1393               write_all (child_pid_report_pipe[1], &grandchild_pid,
1394                          sizeof(grandchild_pid));
1395               
1396               write_err_and_exit (child_err_report_pipe[1],
1397                                   CHILD_FORK_FAILED);              
1398             }
1399           else if (grandchild_pid == 0)
1400             {
1401               close_and_invalidate (&child_pid_report_pipe[1]);
1402               do_exec (child_err_report_pipe[1],
1403                        stdin_pipe[0],
1404                        stdout_pipe[1],
1405                        stderr_pipe[1],
1406                        working_directory,
1407                        argv,
1408                        envp,
1409                        close_descriptors,
1410                        search_path,
1411                        search_path_from_envp,
1412                        stdout_to_null,
1413                        stderr_to_null,
1414                        child_inherits_stdin,
1415                        file_and_argv_zero,
1416                        child_setup,
1417                        user_data);
1418             }
1419           else
1420             {
1421               write_all (child_pid_report_pipe[1], &grandchild_pid, sizeof(grandchild_pid));
1422               close_and_invalidate (&child_pid_report_pipe[1]);
1423               
1424               _exit (0);
1425             }
1426         }
1427       else
1428         {
1429           /* Just run the child.
1430            */
1431
1432           do_exec (child_err_report_pipe[1],
1433                    stdin_pipe[0],
1434                    stdout_pipe[1],
1435                    stderr_pipe[1],
1436                    working_directory,
1437                    argv,
1438                    envp,
1439                    close_descriptors,
1440                    search_path,
1441                    search_path_from_envp,
1442                    stdout_to_null,
1443                    stderr_to_null,
1444                    child_inherits_stdin,
1445                    file_and_argv_zero,
1446                    child_setup,
1447                    user_data);
1448         }
1449     }
1450   else
1451     {
1452       /* Parent */
1453       
1454       gint buf[2];
1455       gint n_ints = 0;    
1456
1457       /* Close the uncared-about ends of the pipes */
1458       close_and_invalidate (&child_err_report_pipe[1]);
1459       close_and_invalidate (&child_pid_report_pipe[1]);
1460       close_and_invalidate (&stdin_pipe[0]);
1461       close_and_invalidate (&stdout_pipe[1]);
1462       close_and_invalidate (&stderr_pipe[1]);
1463
1464       /* If we had an intermediate child, reap it */
1465       if (intermediate_child)
1466         {
1467         wait_again:
1468           if (waitpid (pid, &status, 0) < 0)
1469             {
1470               if (errno == EINTR)
1471                 goto wait_again;
1472               else if (errno == ECHILD)
1473                 ; /* do nothing, child already reaped */
1474               else
1475                 g_warning ("waitpid() should not fail in "
1476                            "'fork_exec_with_pipes'");
1477             }
1478         }
1479       
1480
1481       if (!read_ints (child_err_report_pipe[0],
1482                       buf, 2, &n_ints,
1483                       error))
1484         goto cleanup_and_fail;
1485         
1486       if (n_ints >= 2)
1487         {
1488           /* Error from the child. */
1489
1490           switch (buf[0])
1491             {
1492             case CHILD_CHDIR_FAILED:
1493               g_set_error (error,
1494                            G_SPAWN_ERROR,
1495                            G_SPAWN_ERROR_CHDIR,
1496                            _("Failed to change to directory '%s' (%s)"),
1497                            working_directory,
1498                            g_strerror (buf[1]));
1499
1500               break;
1501               
1502             case CHILD_EXEC_FAILED:
1503               g_set_error (error,
1504                            G_SPAWN_ERROR,
1505                            exec_err_to_g_error (buf[1]),
1506                            _("Failed to execute child process \"%s\" (%s)"),
1507                            argv[0],
1508                            g_strerror (buf[1]));
1509
1510               break;
1511               
1512             case CHILD_DUP2_FAILED:
1513               g_set_error (error,
1514                            G_SPAWN_ERROR,
1515                            G_SPAWN_ERROR_FAILED,
1516                            _("Failed to redirect output or input of child process (%s)"),
1517                            g_strerror (buf[1]));
1518
1519               break;
1520
1521             case CHILD_FORK_FAILED:
1522               g_set_error (error,
1523                            G_SPAWN_ERROR,
1524                            G_SPAWN_ERROR_FORK,
1525                            _("Failed to fork child process (%s)"),
1526                            g_strerror (buf[1]));
1527               break;
1528               
1529             default:
1530               g_set_error (error,
1531                            G_SPAWN_ERROR,
1532                            G_SPAWN_ERROR_FAILED,
1533                            _("Unknown error executing child process \"%s\""),
1534                            argv[0]);
1535               break;
1536             }
1537
1538           goto cleanup_and_fail;
1539         }
1540
1541       /* Get child pid from intermediate child pipe. */
1542       if (intermediate_child)
1543         {
1544           n_ints = 0;
1545           
1546           if (!read_ints (child_pid_report_pipe[0],
1547                           buf, 1, &n_ints, error))
1548             goto cleanup_and_fail;
1549
1550           if (n_ints < 1)
1551             {
1552               int errsv = errno;
1553
1554               g_set_error (error,
1555                            G_SPAWN_ERROR,
1556                            G_SPAWN_ERROR_FAILED,
1557                            _("Failed to read enough data from child pid pipe (%s)"),
1558                            g_strerror (errsv));
1559               goto cleanup_and_fail;
1560             }
1561           else
1562             {
1563               /* we have the child pid */
1564               pid = buf[0];
1565             }
1566         }
1567       
1568       /* Success against all odds! return the information */
1569       close_and_invalidate (&child_err_report_pipe[0]);
1570       close_and_invalidate (&child_pid_report_pipe[0]);
1571  
1572       if (child_pid)
1573         *child_pid = pid;
1574
1575       if (standard_input)
1576         *standard_input = stdin_pipe[1];
1577       if (standard_output)
1578         *standard_output = stdout_pipe[0];
1579       if (standard_error)
1580         *standard_error = stderr_pipe[0];
1581       
1582       return TRUE;
1583     }
1584
1585  cleanup_and_fail:
1586
1587   /* There was an error from the Child, reap the child to avoid it being
1588      a zombie.
1589    */
1590
1591   if (pid > 0)
1592   {
1593     wait_failed:
1594      if (waitpid (pid, NULL, 0) < 0)
1595        {
1596           if (errno == EINTR)
1597             goto wait_failed;
1598           else if (errno == ECHILD)
1599             ; /* do nothing, child already reaped */
1600           else
1601             g_warning ("waitpid() should not fail in "
1602                        "'fork_exec_with_pipes'");
1603        }
1604    }
1605
1606   close_and_invalidate (&child_err_report_pipe[0]);
1607   close_and_invalidate (&child_err_report_pipe[1]);
1608   close_and_invalidate (&child_pid_report_pipe[0]);
1609   close_and_invalidate (&child_pid_report_pipe[1]);
1610   close_and_invalidate (&stdin_pipe[0]);
1611   close_and_invalidate (&stdin_pipe[1]);
1612   close_and_invalidate (&stdout_pipe[0]);
1613   close_and_invalidate (&stdout_pipe[1]);
1614   close_and_invalidate (&stderr_pipe[0]);
1615   close_and_invalidate (&stderr_pipe[1]);
1616
1617   return FALSE;
1618 }
1619
1620 /* Based on execvp from GNU C Library */
1621
1622 static void
1623 script_execute (const gchar *file,
1624                 gchar      **argv,
1625                 gchar      **envp)
1626 {
1627   /* Count the arguments.  */
1628   int argc = 0;
1629   while (argv[argc])
1630     ++argc;
1631   
1632   /* Construct an argument list for the shell.  */
1633   {
1634     gchar **new_argv;
1635
1636     new_argv = g_new0 (gchar*, argc + 2); /* /bin/sh and NULL */
1637     
1638     new_argv[0] = (char *) "/bin/sh";
1639     new_argv[1] = (char *) file;
1640     while (argc > 0)
1641       {
1642         new_argv[argc + 1] = argv[argc];
1643         --argc;
1644       }
1645
1646     /* Execute the shell. */
1647     if (envp)
1648       execve (new_argv[0], new_argv, envp);
1649     else
1650       execv (new_argv[0], new_argv);
1651     
1652     g_free (new_argv);
1653   }
1654 }
1655
1656 static gchar*
1657 my_strchrnul (const gchar *str, gchar c)
1658 {
1659   gchar *p = (gchar*) str;
1660   while (*p && (*p != c))
1661     ++p;
1662
1663   return p;
1664 }
1665
1666 static gint
1667 g_execute (const gchar *file,
1668            gchar      **argv,
1669            gchar      **envp,
1670            gboolean     search_path,
1671            gboolean     search_path_from_envp)
1672 {
1673   if (*file == '\0')
1674     {
1675       /* We check the simple case first. */
1676       errno = ENOENT;
1677       return -1;
1678     }
1679
1680   if (!(search_path || search_path_from_envp) || strchr (file, '/') != NULL)
1681     {
1682       /* Don't search when it contains a slash. */
1683       if (envp)
1684         execve (file, argv, envp);
1685       else
1686         execv (file, argv);
1687       
1688       if (errno == ENOEXEC)
1689         script_execute (file, argv, envp);
1690     }
1691   else
1692     {
1693       gboolean got_eacces = 0;
1694       const gchar *path, *p;
1695       gchar *name, *freeme;
1696       gsize len;
1697       gsize pathlen;
1698
1699       path = NULL;
1700       if (search_path_from_envp)
1701         path = g_environ_getenv (envp, "PATH");
1702       if (search_path && path == NULL)
1703         path = g_getenv ("PATH");
1704
1705       if (path == NULL)
1706         {
1707           /* There is no 'PATH' in the environment.  The default
1708            * search path in libc is the current directory followed by
1709            * the path 'confstr' returns for '_CS_PATH'.
1710            */
1711
1712           /* In GLib we put . last, for security, and don't use the
1713            * unportable confstr(); UNIX98 does not actually specify
1714            * what to search if PATH is unset. POSIX may, dunno.
1715            */
1716           
1717           path = "/bin:/usr/bin:.";
1718         }
1719
1720       len = strlen (file) + 1;
1721       pathlen = strlen (path);
1722       freeme = name = g_malloc (pathlen + len + 1);
1723       
1724       /* Copy the file name at the top, including '\0'  */
1725       memcpy (name + pathlen + 1, file, len);
1726       name = name + pathlen;
1727       /* And add the slash before the filename  */
1728       *name = '/';
1729
1730       p = path;
1731       do
1732         {
1733           char *startp;
1734
1735           path = p;
1736           p = my_strchrnul (path, ':');
1737
1738           if (p == path)
1739             /* Two adjacent colons, or a colon at the beginning or the end
1740              * of 'PATH' means to search the current directory.
1741              */
1742             startp = name + 1;
1743           else
1744             startp = memcpy (name - (p - path), path, p - path);
1745
1746           /* Try to execute this name.  If it works, execv will not return.  */
1747           if (envp)
1748             execve (startp, argv, envp);
1749           else
1750             execv (startp, argv);
1751           
1752           if (errno == ENOEXEC)
1753             script_execute (startp, argv, envp);
1754
1755           switch (errno)
1756             {
1757             case EACCES:
1758               /* Record the we got a 'Permission denied' error.  If we end
1759                * up finding no executable we can use, we want to diagnose
1760                * that we did find one but were denied access.
1761                */
1762               got_eacces = TRUE;
1763
1764               /* FALL THRU */
1765               
1766             case ENOENT:
1767 #ifdef ESTALE
1768             case ESTALE:
1769 #endif
1770 #ifdef ENOTDIR
1771             case ENOTDIR:
1772 #endif
1773               /* Those errors indicate the file is missing or not executable
1774                * by us, in which case we want to just try the next path
1775                * directory.
1776                */
1777               break;
1778
1779             case ENODEV:
1780             case ETIMEDOUT:
1781               /* Some strange filesystems like AFS return even
1782                * stranger error numbers.  They cannot reasonably mean anything
1783                * else so ignore those, too.
1784                */
1785               break;
1786
1787             default:
1788               /* Some other error means we found an executable file, but
1789                * something went wrong executing it; return the error to our
1790                * caller.
1791                */
1792               g_free (freeme);
1793               return -1;
1794             }
1795         }
1796       while (*p++ != '\0');
1797
1798       /* We tried every element and none of them worked.  */
1799       if (got_eacces)
1800         /* At least one failure was due to permissions, so report that
1801          * error.
1802          */
1803         errno = EACCES;
1804
1805       g_free (freeme);
1806     }
1807
1808   /* Return the error from the last attempt (probably ENOENT).  */
1809   return -1;
1810 }
1811
1812 /**
1813  * g_spawn_close_pid:
1814  * @pid: The process reference to close
1815  *
1816  * On some platforms, notably Windows, the #GPid type represents a resource
1817  * which must be closed to prevent resource leaking. g_spawn_close_pid()
1818  * is provided for this purpose. It should be used on all platforms, even
1819  * though it doesn't do anything under UNIX.
1820  **/
1821 void
1822 g_spawn_close_pid (GPid pid)
1823 {
1824 }