Commit dee0200f authored by Nick Schermer's avatar Nick Schermer

Use the async spawn function of glib.

parent 37b8785f
...@@ -864,6 +864,7 @@ xfsm_startup_start_properties (XfsmProperties *properties, ...@@ -864,6 +864,7 @@ xfsm_startup_start_properties (XfsmProperties *properties,
gint n; gint n;
const gchar *current_directory; const gchar *current_directory;
GPid pid; GPid pid;
GError *error = NULL;
/* release any possible old resources related to a previous startup */ /* release any possible old resources related to a previous startup */
xfsm_properties_set_default_child_watch (properties); xfsm_properties_set_default_child_watch (properties);
...@@ -878,44 +879,28 @@ xfsm_startup_start_properties (XfsmProperties *properties, ...@@ -878,44 +879,28 @@ xfsm_startup_start_properties (XfsmProperties *properties,
current_directory = xfsm_properties_get_string (properties, SmCurrentDirectory); current_directory = xfsm_properties_get_string (properties, SmCurrentDirectory);
/* fork a new process for the application */ if (!g_spawn_async (current_directory,
#ifdef HAVE_VFORK argv, NULL,
/* vfork() doesn't allow you to do anything but call exec*() or _exit(), G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH,
* so if we need to set the working directory, we can't use vfork() */ NULL, NULL,
if (current_directory == NULL) &pid, &error))
pid = vfork ();
else
#endif
pid = fork ();
/* handle the child process */
if (pid == 0)
{ {
/* execute the application here */ g_warning ("Unable to launch \"%s\": %s",
if (current_directory) *argv, error->message);
{ g_error_free (error);
if (chdir (current_directory)) g_strfreev (argv);
g_warning ("Unable to chdir to \"%s\": %s", current_directory, strerror (errno));
}
execvp (argv[0], argv);
_exit (127);
}
/* cleanup */
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; return FALSE;
} }
xfsm_verbose ("Launched command \"%s\" with PID %dn", *argv, (gint) pid);
g_strfreev (argv);
properties->pid = pid; properties->pid = pid;
/* set a watch to make sure the child doesn't quit before registering */ /* 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->manager = g_object_ref (manager);
child_watch_data->properties = properties; child_watch_data->properties = properties;
g_child_watch_add_full (G_PRIORITY_LOW, properties->pid, 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