#include "gtestutils.h"
#include "gutils.h"
#include "glibintl.h"
-#include "glib-unix.h"
+
/**
* SECTION:spawn
gboolean search_path,
gboolean search_path_from_envp);
+static gboolean make_pipe (gint p[2],
+ GError **error);
static gboolean fork_exec_with_pipes (gboolean intermediate_child,
const gchar *working_directory,
gchar **argv,
gboolean stderr_to_null,
gboolean child_inherits_stdin,
gboolean file_and_argv_zero,
- gboolean cloexec_pipes,
GSpawnChildSetupFunc child_setup,
gpointer user_data,
GPid *child_pid,
(flags & G_SPAWN_STDERR_TO_DEV_NULL) != 0,
(flags & G_SPAWN_CHILD_INHERITS_STDIN) != 0,
(flags & G_SPAWN_FILE_AND_ARGV_ZERO) != 0,
- (flags & G_SPAWN_CLOEXEC_PIPES) != 0,
child_setup,
user_data,
&pid,
(flags & G_SPAWN_STDERR_TO_DEV_NULL) != 0,
(flags & G_SPAWN_CHILD_INHERITS_STDIN) != 0,
(flags & G_SPAWN_FILE_AND_ARGV_ZERO) != 0,
- (flags & G_SPAWN_CLOEXEC_PIPES) != 0,
child_setup,
user_data,
child_pid,
gboolean stderr_to_null,
gboolean child_inherits_stdin,
gboolean file_and_argv_zero,
- gboolean cloexec_pipes,
GSpawnChildSetupFunc child_setup,
gpointer user_data,
GPid *child_pid,
gint stderr_pipe[2] = { -1, -1 };
gint child_err_report_pipe[2] = { -1, -1 };
gint child_pid_report_pipe[2] = { -1, -1 };
- guint pipe_flags = cloexec_pipes ? FD_CLOEXEC : 0;
gint status;
- if (!g_unix_open_pipe (child_err_report_pipe, pipe_flags, error))
+ if (!make_pipe (child_err_report_pipe, error))
return FALSE;
- if (intermediate_child && !g_unix_open_pipe (child_pid_report_pipe, pipe_flags, error))
+ if (intermediate_child && !make_pipe (child_pid_report_pipe, error))
goto cleanup_and_fail;
- if (standard_input && !g_unix_open_pipe (stdin_pipe, pipe_flags, error))
+ if (standard_input && !make_pipe (stdin_pipe, error))
goto cleanup_and_fail;
- if (standard_output && !g_unix_open_pipe (stdout_pipe, pipe_flags, error))
+ if (standard_output && !make_pipe (stdout_pipe, error))
goto cleanup_and_fail;
- if (standard_error && !g_unix_open_pipe (stderr_pipe, FD_CLOEXEC, error))
+ if (standard_error && !make_pipe (stderr_pipe, error))
goto cleanup_and_fail;
pid = fork ();
return FALSE;
}
+static gboolean
+make_pipe (gint p[2],
+ GError **error)
+{
+ if (pipe (p) < 0)
+ {
+ gint errsv = errno;
+ g_set_error (error,
+ G_SPAWN_ERROR,
+ G_SPAWN_ERROR_FAILED,
+ _("Failed to create pipe for communicating with child process (%s)"),
+ g_strerror (errsv));
+ return FALSE;
+ }
+ else
+ return TRUE;
+}
+
/* Based on execvp from GNU C Library */
static void
* @G_SPAWN_SEARCH_PATH_FROM_ENVP: if <literal>argv[0]</literal> is not an abolute path,
* it will be looked for in the <envar>PATH</envar> from the passed child
* environment. Since: 2.34
- * @G_SPAWN_CLOEXEC_PIPES: On UNIX, returned pipe file descriptors will have the
- * close-on-exec flag set. Since: 2.36
*
* Flags passed to g_spawn_sync(), g_spawn_async() and g_spawn_async_with_pipes().
*/
G_SPAWN_STDERR_TO_DEV_NULL = 1 << 4,
G_SPAWN_CHILD_INHERITS_STDIN = 1 << 5,
G_SPAWN_FILE_AND_ARGV_ZERO = 1 << 6,
- G_SPAWN_SEARCH_PATH_FROM_ENVP = 1 << 7,
- G_SPAWN_CLOEXEC_PIPES = 1 << 8
+ G_SPAWN_SEARCH_PATH_FROM_ENVP = 1 << 7
} GSpawnFlags;
GQuark g_spawn_error_quark (void);