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