diff options
-rw-r--r-- | daemon/echo.c | 4 | ||||
-rw-r--r-- | daemon/service.c | 31 |
2 files changed, 32 insertions, 3 deletions
diff --git a/daemon/echo.c b/daemon/echo.c index 34b38737..91fd4ab3 100644 --- a/daemon/echo.c +++ b/daemon/echo.c @@ -51,10 +51,8 @@ static gboolean session_event(GIOChannel *chan, GIOCondition cond, gpointer data gsize len, written; GIOError err; - if (cond & (G_IO_HUP | G_IO_ERR)) { - g_io_channel_unref(chan); + if (cond & (G_IO_HUP | G_IO_ERR)) return FALSE; - } err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf), &len); if (err == G_IO_ERROR_AGAIN) diff --git a/daemon/service.c b/daemon/service.c index 830ca7dc..3d523a34 100644 --- a/daemon/service.c +++ b/daemon/service.c @@ -27,6 +27,9 @@ #include <stdlib.h> #include <string.h> +#include <signal.h> + +#include <glib.h> #include <dbus/dbus.h> @@ -42,6 +45,8 @@ static DBusConnection *connection = NULL; static char *test_conn_name = NULL; +static GPid test_service_pid = 0; +static guint test_watch_id = -1; DBusHandlerResult manager_list_services(DBusConnection *conn, DBusMessage *msg, void *data) @@ -139,10 +144,21 @@ static DBusHandlerResult service_get_description(DBusConnection *conn, return dbus_connection_send_and_unref(conn, reply); } +static void service_died(GPid pid, gint status, gpointer data) +{ + debug("Child with PID %d died with status %d", pid, status); + + g_spawn_close_pid(pid); + test_service_pid = 0; +} + static DBusHandlerResult service_start(DBusConnection *conn, DBusMessage *msg, void *data) { DBusMessage *reply; + GPid pid; + char **argv; + int argc; debug("Starting service"); @@ -161,6 +177,18 @@ static DBusHandlerResult service_start(DBusConnection *conn, return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; dbus_message_append_args(reply, DBUS_TYPE_INVALID); + + g_shell_parse_argv("/data/bluez/utils/daemon/bluetoothd_echo", &argc, &argv, NULL); + + g_spawn_async(NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, NULL); + + g_strfreev(argv); + + test_watch_id = g_child_watch_add(pid, service_died, NULL); + + debug("New process with PID %d executed", pid); + + test_service_pid = pid; } return dbus_connection_send_and_unref(conn, reply); @@ -181,6 +209,9 @@ static DBusHandlerResult service_stop(DBusConnection *conn, free(test_conn_name); test_conn_name = NULL; + kill(test_service_pid, SIGTERM); + test_service_pid = 0; + dbus_message_append_args(reply, DBUS_TYPE_INVALID); } else { reply = dbus_message_new_error(msg, ERROR_INTERFACE ".NotRunning", |