hald_runner.c revision 61155e87dee1493b57ac0b8f9e0a0ba8345b052f
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CVSID: $Id$
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * hald_runner.c - Interface to the hal runner helper daemon
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright (C) 2006 Sjoerd Simons, <sjoerd@luon.net>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * This program is free software; you can redistribute it and/or modify
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * it under the terms of the GNU General Public License as published by
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the Free Software Foundation; either version 2 of the License, or
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * (at your option) any later version.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * This program is distributed in the hope that it will be useful,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * but WITHOUT ANY WARRANTY; without even the implied warranty of
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * GNU General Public License for more details.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * You should have received a copy of the GNU General Public License
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * along with this program; if not, write to the Free Software
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef HAVE_CONFIG_H
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# include <config.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/utsname.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <glib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <dbus/dbus.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <dbus/dbus-glib-lowlevel.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "hald.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "util.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "logger.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "hald_dbus.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "hald_runner.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemtypedef struct {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *d;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalRunTerminatedCB cb;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer data1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer data2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem} HelperData;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#define DBUS_SERVER_ADDRESS "unix:tmpdir=" HALD_SOCKET_DIR
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic DBusConnection *runner_connection = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemtypedef struct
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GPid pid;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *device;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalRunTerminatedCB cb;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer data1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer data2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem} RunningProcess;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* mapping from PID to RunningProcess */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic GHashTable *running_processes;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic gboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrprd_foreach (gpointer key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer value,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer user_data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean remove = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem RunningProcess *rp = value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *device = user_data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (rp->device == device) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem remove = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (rp);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return remove;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrunning_processes_remove_device (HalDevice *device)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_hash_table_foreach_remove (running_processes, rprd_foreach, device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrunner_device_finalized (HalDevice *device)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem running_processes_remove_device (device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic DBusHandlerResult
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrunner_server_message_handler (DBusConnection *connection,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessage *message,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem void *user_data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*HAL_INFO (("runner_server_message_handler: destination=%s obj_path=%s interface=%s method=%s",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_get_destination (message),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_get_path (message),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_get_interface (message),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_get_member (message)));*/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (dbus_message_is_signal (message,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "org.freedesktop.HalRunner",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "StartedProcessExited")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_uint64_t dpid;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (dbus_message_get_args (message, &error,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_INT64, &dpid,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_INVALID)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem RunningProcess *rp;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GPid pid;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem pid = (GPid) dpid;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*HAL_INFO (("Previously started process with pid %d exited", pid));*/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rp = g_hash_table_lookup (running_processes, (gpointer) pid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (rp != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rp->cb (rp->device, 0, 0, NULL, rp->data1, rp->data2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_hash_table_remove (running_processes, (gpointer) pid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (rp);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return DBUS_HANDLER_RESULT_HANDLED;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrunner_server_unregister_handler (DBusConnection *connection, void *user_data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("unregistered"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhandle_connection(DBusServer *server,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusConnection *new_connection,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem void *data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (runner_connection == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusObjectPathVTable vtable = { &runner_server_unregister_handler,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &runner_server_message_handler,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL, NULL, NULL, NULL};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem runner_connection = new_connection;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_connection_ref (new_connection);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_connection_setup_with_g_main (new_connection, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_connection_register_fallback (new_connection,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "/org/freedesktop",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &vtable,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* dbus_server_unref(server); */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrunner_died(GPid pid, gint status, gpointer data) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_spawn_close_pid (pid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DIE (("Runner died"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhald_runner_start_runner(void)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusServer *server = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError err;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GError *error = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GPid pid;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *argv[] = { NULL, NULL};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *env[] = { NULL, NULL, NULL, NULL};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *hald_runner_path;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *server_addr;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem running_processes = g_hash_table_new (g_direct_hash, g_direct_equal);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&err);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem server = dbus_server_listen(DBUS_SERVER_ADDRESS, &err);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (server == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Cannot create D-BUS server for the runner"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_server_setup_with_g_main(server, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_server_set_new_connection_function(server, handle_connection,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem argv[0] = "hald-runner";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem server_addr = dbus_server_get_address (server);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem env[0] = g_strdup_printf("HALD_RUNNER_DBUS_ADDRESS=%s", server_addr);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_free (server_addr);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hald_runner_path = g_getenv("HALD_RUNNER_PATH");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hald_runner_path != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem env[1] = g_strdup_printf ("PATH=%s:" PACKAGE_LIBEXEC_DIR ":" PACKAGE_SCRIPT_DIR ":" PACKAGE_BIN_DIR, hald_runner_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem env[1] = g_strdup_printf ("PATH=" PACKAGE_LIBEXEC_DIR ":" PACKAGE_SCRIPT_DIR ":" PACKAGE_BIN_DIR);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*env[2] = "DBUS_VERBOSE=1";*/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!g_spawn_async(NULL, argv, env, G_SPAWN_DO_NOT_REAP_CHILD|G_SPAWN_SEARCH_PATH,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL, NULL, &pid, &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Could not spawn runner : '%s'", error->message));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_error_free (error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free(env[0]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free(env[1]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("Runner has pid %d", pid));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_child_watch_add(pid, runner_died, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (runner_connection == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Wait for the runner */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_main_context_iteration(NULL, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemerror:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (server != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_server_unref(server);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic gboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemadd_property_to_msg (HalDevice *device, HalProperty *property,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer user_data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *prop_upper, *value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *c;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *env;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessageIter *iter = (DBusMessageIter *)user_data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop_upper = g_ascii_strup (hal_property_get_key (property), -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* periods aren't valid in the environment, so replace them with
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * underscores. */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (c = prop_upper; *c; c++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*c == '.')
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *c = '_';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem value = hal_property_to_string (property);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem env = g_strdup_printf ("HAL_PROP_%s=%s", prop_upper, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &env);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (env);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (prop_upper);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemadd_env(DBusMessageIter *iter, const gchar *key, const gchar *value) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *env;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem env = g_strdup_printf ("%s=%s", key, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &env);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free(env);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemadd_basic_env(DBusMessageIter *iter, const gchar *udi) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem struct utsname un;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *server_addr;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hald_is_verbose) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem add_env(iter, "HALD_VERBOSE", "1");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hald_is_initialising) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem add_env(iter, "HALD_STARTUP", "1");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hald_use_syslog) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem add_env(iter, "HALD_USE_SYSLOG", "1");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem add_env(iter, "UDI", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem server_addr = hald_dbus_local_server_addr();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem add_env(iter, "HALD_DIRECT_ADDR", server_addr);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_free (server_addr);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef HAVE_POLKIT
18c2aff776a775d34a4c9893a4c72e0434d68e36artem add_env(iter, "HAVE_POLKIT", "1");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (uname(&un) >= 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *sysname;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysname = g_ascii_strdown(un.sysname, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem add_env(iter, "HALD_UNAME_S", sysname);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free(sysname);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemadd_extra_env(DBusMessageIter *iter, gchar **env) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (env != NULL) for (i = 0; env[i] != NULL; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &env[i]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic gboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemadd_command(DBusMessageIter *iter, const gchar *command_line) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gint argc;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gint x;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **argv;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GError *err = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessageIter array_iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!g_shell_parse_argv(command_line, &argc, &argv, &err)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Error parsing commandline '%s': %s",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem command_line, err->message));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_error_free (err);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!dbus_message_iter_open_container(iter,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_ARRAY,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_STRING_AS_STRING,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &array_iter))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DIE (("No memory"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (x = 0 ; argv[x] != NULL; x++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &argv[x]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_close_container(iter, &array_iter);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_strfreev(argv);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic gboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemadd_first_part(DBusMessageIter *iter, HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *command_line, char **extra_env) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessageIter array_iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi = hal_device_get_udi(device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_open_container(iter,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_ARRAY,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_STRING_AS_STRING,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &array_iter);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_foreach (device, add_property_to_msg, &array_iter);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem add_basic_env(&array_iter, udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem add_extra_env(&array_iter, extra_env);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_close_container(iter, &array_iter);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!add_command(iter, command_line)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* Start a helper, returns true on a successfull start */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhald_runner_start (HalDevice *device, const gchar *command_line, char **extra_env,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalRunTerminatedCB cb, gpointer data1, gpointer data2)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessage *msg, *reply;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError err;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessageIter iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&err);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem msg = dbus_message_new_method_call("org.freedesktop.HalRunner",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "/org/freedesktop/HalRunner",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "org.freedesktop.HalRunner",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "Start");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (msg == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DIE(("No memory"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_init_append(msg, &iter);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!add_first_part(&iter, device, command_line, extra_env))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Wait for the reply, should be almost instantanious */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem reply =
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_connection_send_with_reply_and_block(runner_connection,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem msg, -1, &err);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (reply) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gboolean ret =
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_METHOD_RETURN);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (ret) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_int64_t pid_from_runner;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (dbus_message_get_args (reply, &err,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_INT64, &pid_from_runner,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_INVALID)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (cb != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem RunningProcess *rp;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rp = g_new0 (RunningProcess, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rp->pid = (GPid) pid_from_runner;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rp->cb = cb;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rp->device = device;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rp->data1 = data1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rp->data2 = data2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_hash_table_insert (running_processes, (gpointer) rp->pid, rp);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Error extracting out_pid from runner's Start()"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(reply);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(msg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemerror:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(msg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemcall_notify(DBusPendingCall *pending, void *user_data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HelperData *hb = (HelperData *)user_data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_uint32_t exitt = HALD_RUN_SUCCESS;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_int32_t return_code = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessage *m;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GArray *error = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessageIter iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem error = g_array_new(TRUE, FALSE, sizeof(char *));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem m = dbus_pending_call_steal_reply(pending);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (dbus_message_get_type(m) != DBUS_MESSAGE_TYPE_METHOD_RETURN)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto malformed;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!dbus_message_iter_init(m, &iter) ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT32)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto malformed;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_get_basic(&iter, &exitt);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!dbus_message_iter_next(&iter) ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto malformed;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_get_basic(&iter, &return_code);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (dbus_message_iter_next(&iter) &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_get_basic(&iter, &value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_array_append_vals(error, &value, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hb->cb(hb->d, exitt, return_code,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (gchar **)error->data, hb->data1, hb->data2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_object_unref (hb->d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(m);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_pending_call_unref (pending);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_array_free(error, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artemmalformed:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Send a Fail callback on malformed messages */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Malformed or unexpected reply message"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hb->cb(hb->d, HALD_RUN_FAILED, return_code, NULL, hb->data1, hb->data2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_object_unref (hb->d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(m);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_pending_call_unref (pending);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_array_free(error, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* Run a helper program using the commandline, with input as infomation on
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * stdin */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhald_runner_run_method(HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *command_line, char **extra_env,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *input, gboolean error_on_stderr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint32 timeout,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalRunTerminatedCB cb,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer data1, gpointer data2) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessage *msg;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessageIter iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusPendingCall *call;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HelperData *hd = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem msg = dbus_message_new_method_call("org.freedesktop.HalRunner",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "/org/freedesktop/HalRunner",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "org.freedesktop.HalRunner",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "Run");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (msg == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DIE(("No memory"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_init_append(msg, &iter);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!add_first_part(&iter, device, command_line, extra_env))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &input);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &error_on_stderr);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &timeout);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!dbus_connection_send_with_reply(runner_connection,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem msg, &call, INT_MAX))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DIE (("No memory"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
61155e87dee1493b57ac0b8f9e0a0ba8345b052fXiaolin Zhang - Sun Microsystems - Beijing China /* the connection was disconnected */
61155e87dee1493b57ac0b8f9e0a0ba8345b052fXiaolin Zhang - Sun Microsystems - Beijing China if (call == NULL)
61155e87dee1493b57ac0b8f9e0a0ba8345b052fXiaolin Zhang - Sun Microsystems - Beijing China goto error;
61155e87dee1493b57ac0b8f9e0a0ba8345b052fXiaolin Zhang - Sun Microsystems - Beijing China
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hd = malloc(sizeof(HelperData));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hd->d = device;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hd->cb = cb;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hd->data1 = data1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hd->data2 = data2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_object_ref (device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_pending_call_set_notify(call, call_notify, hd, free);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(msg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artemerror:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(msg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(hd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem cb(device, HALD_RUN_FAILED, 0, NULL, data1, data2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhald_runner_run(HalDevice *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *command_line, char **extra_env,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem guint timeout,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalRunTerminatedCB cb,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer data1, gpointer data2) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hald_runner_run_method(device, command_line, extra_env,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "", FALSE, timeout, cb, data1, data2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhald_runner_kill_device(HalDevice *device) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessage *msg, *reply;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError err;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessageIter iter;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem running_processes_remove_device (device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem msg = dbus_message_new_method_call("org.freedesktop.HalRunner",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "/org/freedesktop/HalRunner",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "org.freedesktop.HalRunner",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "Kill");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (msg == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DIE(("No memory"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_init_append(msg, &iter);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi = hal_device_get_udi(device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Wait for the reply, should be almost instantanious */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&err);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem reply =
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_connection_send_with_reply_and_block(runner_connection, msg, -1, &err);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (reply) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(reply);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(msg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhald_runner_kill_all(HalDevice *device) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessage *msg, *reply;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError err;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem running_processes_remove_device (device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem msg = dbus_message_new_method_call("org.freedesktop.HalRunner",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "/org/freedesktop/HalRunner",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "org.freedesktop.HalRunner",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "KillAll");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (msg == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DIE(("No memory"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Wait for the reply, should be almost instantanious */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&err);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem reply =
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_connection_send_with_reply_and_block(runner_connection,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem msg, -1, &err);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (reply) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(reply);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(msg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}