diff options
author | Mohamed Abbas <mohamed.abbas@intel.com> | 2009-12-08 11:53:08 -0800 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-12-09 00:18:35 +0100 |
commit | b03f80e6d7a9248a80eb3ea6a555a336ae582027 (patch) | |
tree | 477b9b4dfee06bb8be53f511f79ce554ffdd12d9 | |
parent | 70b2b67cdbd30a63ac016e1314095342ab9f60b9 (diff) | |
download | connman-b03f80e6d7a9248a80eb3ea6a555a336ae582027.tar.gz connman-b03f80e6d7a9248a80eb3ea6a555a336ae582027.tar.bz2 connman-b03f80e6d7a9248a80eb3ea6a555a336ae582027.zip |
Add an option to allow processes spawn with pipes
-rw-r--r-- | include/task.h | 3 | ||||
-rw-r--r-- | plugins/dhclient.c | 3 | ||||
-rw-r--r-- | src/task.c | 18 |
3 files changed, 19 insertions, 5 deletions
diff --git a/include/task.h b/include/task.h index 76639d40..2239188d 100644 --- a/include/task.h +++ b/include/task.h @@ -56,7 +56,8 @@ int connman_task_set_notify(struct connman_task *task, const char *member, connman_task_notify_t function, void *user_data); int connman_task_run(struct connman_task *task, - connman_task_exit_t function, void *user_data); + connman_task_exit_t function, void *user_data, + int *fd, int *standard_output, int *standard_error); int connman_task_stop(struct connman_task *task); #ifdef __cplusplus diff --git a/plugins/dhclient.c b/plugins/dhclient.c index fc42024a..fa0a8c36 100644 --- a/plugins/dhclient.c +++ b/plugins/dhclient.c @@ -207,7 +207,8 @@ static int dhclient_request(struct connman_dhcp *dhcp) connman_task_set_notify(dhclient->task, "Notify", dhclient_notify, dhcp); - connman_task_run(dhclient->task, dhclient_died, dhclient); + connman_task_run(dhclient->task, dhclient_died, dhclient, + NULL, NULL, NULL); return 0; } @@ -267,12 +267,15 @@ static void task_setup(gpointer user_data) * @task: task structure * @function: exit callback * @user_data: optional exit user data + * @fd: optional spawn with pipe * * Execute program specified by #task */ int connman_task_run(struct connman_task *task, - connman_task_exit_t function, void *user_data) + connman_task_exit_t function, void *user_data, + int *fd, int *standard_output, int *standard_error) { + gboolean result; GSpawnFlags flags = G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_STDOUT_TO_DEV_NULL; char **argv, **envp; @@ -282,6 +285,11 @@ int connman_task_run(struct connman_task *task, if (task->pid > 0) return -EALREADY; + if (standard_output == NULL) + flags |= G_SPAWN_STDOUT_TO_DEV_NULL; + if (standard_error == NULL) + flags |= G_SPAWN_STDERR_TO_DEV_NULL; + task->exit_func = function; task->exit_data = user_data; @@ -312,8 +320,12 @@ int connman_task_run(struct connman_task *task, argv = (char **) task->argv->pdata; envp = (char **) task->envp->pdata; - if (g_spawn_async(NULL, argv, envp, flags, - task_setup, task, &task->pid, NULL) == FALSE) { + result = g_spawn_async_with_pipes(NULL, argv, envp, + G_SPAWN_DO_NOT_REAP_CHILD, + task_setup, task, &task->pid, + fd, standard_output, + standard_output, NULL); + if (result == FALSE) { connman_error("Failed to spawn %s", argv[0]); return -EIO; } |