X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=plugins%2Fdhclient.c;h=cb0e8753d4c85c00ac1aa6fd4aa91d34ce8b137a;hb=bd8061321a42dc36b4f7550bf2d094d0ff00d4d4;hp=ee8a3a5242c315abb12630536c879da51cace13f;hpb=c3cdbfae11de2fbc126528955d4330794c590424;p=connman diff --git a/plugins/dhclient.c b/plugins/dhclient.c index ee8a3a5..cb0e875 100644 --- a/plugins/dhclient.c +++ b/plugins/dhclient.c @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. + * Copyright (C) 2007-2009 Intel Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -23,14 +23,18 @@ #include #endif +#include #include #include +#define CONNMAN_API_SUBJECT_TO_CHANGE #include #include #include #include +#include "inet.h" + #define DHCLIENT_INTF "org.isc.dhclient" #define DHCLIENT_PATH "/org/isc/dhclient" @@ -43,7 +47,6 @@ struct dhclient_task { struct connman_element *element; }; -static GStaticMutex task_mutex = G_STATIC_MUTEX_INIT; static GSList *task_list = NULL; static struct dhclient_task *find_task_by_pid(GPid pid) @@ -111,9 +114,7 @@ static void task_died(GPid pid, gint status, gpointer data) g_spawn_close_pid(pid); task->pid = 0; - g_static_mutex_lock(&task_mutex); task_list = g_slist_remove(task_list, task); - g_static_mutex_unlock(&task_mutex); unlink_task(task); @@ -136,12 +137,15 @@ static int dhclient_probe(struct connman_element *element) DBG("element %p name %s", element, element->name); + if (access(DHCLIENT, X_OK) < 0) + return -errno; + task = g_try_new0(struct dhclient_task, 1); if (task == NULL) return -ENOMEM; - task->ifindex = element->netdev.index; - task->ifname = g_strdup(element->netdev.name); + task->ifindex = element->index; + task->ifname = inet_index2name(element->index); task->element = element; if (task->ifname == NULL) { @@ -184,9 +188,7 @@ static int dhclient_probe(struct connman_element *element) return -1; } - g_static_mutex_lock(&task_mutex); task_list = g_slist_append(task_list, task); - g_static_mutex_unlock(&task_mutex); g_child_watch_add(task->pid, task_died, task); @@ -201,14 +203,10 @@ static void dhclient_remove(struct connman_element *element) DBG("element %p name %s", element, element->name); - g_static_mutex_lock(&task_mutex); - - task = find_task_by_index(element->netdev.index); + task = find_task_by_index(element->index); if (task != NULL) task_list = g_slist_remove(task_list, task); - g_static_mutex_unlock(&task_mutex); - if (task == NULL) return; @@ -245,9 +243,7 @@ static DBusHandlerResult dhclient_filter(DBusConnection *conn, DBG("change %d to %s", pid, text); - g_static_mutex_lock(&task_mutex); task = find_task_by_pid(pid); - g_static_mutex_unlock(&task_mutex); if (task == NULL) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; @@ -301,12 +297,12 @@ static DBusHandlerResult dhclient_filter(DBusConnection *conn, } else if (g_ascii_strcasecmp(text, "BOUND") == 0 || g_ascii_strcasecmp(text, "REBOOT") == 0) { struct connman_element *element; - element = connman_element_create(); + element = connman_element_create(NULL); element->type = CONNMAN_ELEMENT_TYPE_IPV4; - element->netdev.index = task->ifindex; - element->netdev.name = g_strdup(task->ifname); + element->index = task->ifindex; connman_element_update(task->element); - connman_element_register(element, task->element); + if (connman_element_register(element, task->element) < 0) + connman_element_unref(element); } else if (g_ascii_strcasecmp(text, "RENEW") == 0 || g_ascii_strcasecmp(text, "REBIND") == 0) { connman_element_update(task->element); @@ -318,24 +314,21 @@ static DBusHandlerResult dhclient_filter(DBusConnection *conn, static DBusConnection *connection; +static const char *dhclient_rule = "path=" DHCLIENT_PATH + ",interface=" DHCLIENT_INTF; + static int dhclient_init(void) { - gchar *filter; int err; - connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL); + connection = connman_dbus_get_connection(); busname = dbus_bus_get_unique_name(connection); busname = CONNMAN_SERVICE; dbus_connection_add_filter(connection, dhclient_filter, NULL, NULL); - filter = g_strdup_printf("interface=%s,path=%s", - DHCLIENT_INTF, DHCLIENT_PATH); - - dbus_bus_add_match(connection, filter, NULL); - - g_free(filter); + dbus_bus_add_match(connection, dhclient_rule, NULL); err = connman_driver_register(&dhclient_driver); if (err < 0) { @@ -350,8 +343,6 @@ static void dhclient_exit(void) { GSList *list; - g_static_mutex_lock(&task_mutex); - for (list = task_list; list; list = list->next) { struct dhclient_task *task = list->data; @@ -361,14 +352,16 @@ static void dhclient_exit(void) unlink_task(task); } - g_static_mutex_unlock(&task_mutex); - g_slist_free(task_list); connman_driver_unregister(&dhclient_driver); + dbus_bus_remove_match(connection, dhclient_rule, NULL); + + dbus_connection_remove_filter(connection, dhclient_filter, NULL); + dbus_connection_unref(connection); } -CONNMAN_PLUGIN_DEFINE("dhclient", "ISC DHCP client plugin", VERSION, +CONNMAN_PLUGIN_DEFINE(dhclient, "ISC DHCP client plugin", VERSION, dhclient_init, dhclient_exit)