Commit dee0200f authored by Nick Schermer's avatar Nick Schermer
Browse files

Use the async spawn function of glib.

parent 37b8785f
......@@ -864,6 +864,7 @@ xfsm_startup_start_properties (XfsmProperties *properties,
gint n;
const gchar *current_directory;
GPid pid;
GError *error = NULL;
/* release any possible old resources related to a previous startup */
xfsm_properties_set_default_child_watch (properties);
......@@ -878,44 +879,28 @@ xfsm_startup_start_properties (XfsmProperties *properties,
current_directory = xfsm_properties_get_string (properties, SmCurrentDirectory);
/* fork a new process for the application */
/* vfork() doesn't allow you to do anything but call exec*() or _exit(),
* so if we need to set the working directory, we can't use vfork() */
if (current_directory == NULL)
pid = vfork ();
pid = fork ();
/* handle the child process */
if (pid == 0)
if (!g_spawn_async (current_directory,
argv, NULL,
&pid, &error))
/* execute the application here */
if (current_directory)
if (chdir (current_directory))
g_warning ("Unable to chdir to \"%s\": %s", current_directory, strerror (errno));
execvp (argv[0], argv);
_exit (127);
/* cleanup */
g_warning ("Unable to launch \"%s\": %s",
*argv, error->message);
g_error_free (error);
g_strfreev (argv);
/* check if we failed to fork */
if (G_UNLIKELY (pid < 0))
/* tell the user that we failed to fork */
perror ("Failed to fork new process");
return FALSE;
xfsm_verbose ("Launched command \"%s\" with PID %dn", *argv, (gint) pid);
g_strfreev (argv);
properties->pid = pid;
/* set a watch to make sure the child doesn't quit before registering */
child_watch_data = g_new (XfsmStartupData, 1);
child_watch_data = g_new0 (XfsmStartupData, 1);
child_watch_data->manager = g_object_ref (manager);
child_watch_data->properties = properties;
g_child_watch_add_full (G_PRIORITY_LOW, properties->pid,
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment