Fix bridge and WiMAX device detection
[connman] / plugins / dhclient.c
index 6bffa8f..3d6f189 100644 (file)
@@ -31,6 +31,8 @@
 #include <connman/dbus.h>
 #include <connman/log.h>
 
+#include "inet.h"
+
 #define DHCLIENT_INTF "org.isc.dhclient"
 #define DHCLIENT_PATH "/org/isc/dhclient"
 
@@ -41,10 +43,8 @@ struct dhclient_task {
        int ifindex;
        gchar *ifname;
        struct connman_element *element;
-       struct connman_element *child;
 };
 
-static GStaticMutex task_mutex = G_STATIC_MUTEX_INIT;
 static GSList *task_list = NULL;
 
 static struct dhclient_task *find_task_by_pid(GPid pid)
@@ -112,9 +112,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);
 
@@ -141,10 +139,9 @@ static int dhclient_probe(struct connman_element *element)
        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;
-       task->child = NULL;
 
        if (task->ifname == NULL) {
                g_free(task);
@@ -186,9 +183,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);
 
@@ -203,25 +198,15 @@ 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);
-       g_static_mutex_unlock(&task_mutex);
+       task = find_task_by_index(element->index);
+       if (task != NULL)
+               task_list = g_slist_remove(task_list, task);
 
        if (task == NULL)
                return;
 
        DBG("release %s", task->ifname);
 
-       g_static_mutex_lock(&task_mutex);
-       task_list = g_slist_remove(task_list, task);
-       g_static_mutex_unlock(&task_mutex);
-
-       if (task->child != NULL) {
-               connman_element_unregister(task->child);
-               connman_element_unref(task->child);
-               task->child = NULL;
-       }
-
        kill_task(task);
 }
 
@@ -253,9 +238,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;
@@ -308,16 +291,15 @@ static DBusHandlerResult dhclient_filter(DBusConnection *conn,
        if (g_ascii_strcasecmp(text, "PREINIT") == 0) {
        } else if (g_ascii_strcasecmp(text, "BOUND") == 0 ||
                                g_ascii_strcasecmp(text, "REBOOT") == 0) {
-               task->child = connman_element_create();
-               task->child->type = CONNMAN_ELEMENT_TYPE_IPV4;
-               task->child->netdev.index = task->ifindex;
-               task->child->netdev.name = g_strdup(task->ifname);
+               struct connman_element *element;
+               element = connman_element_create(NULL);
+               element->type = CONNMAN_ELEMENT_TYPE_IPV4;
+               element->index = task->ifindex;
                connman_element_update(task->element);
-               connman_element_register(task->child, task->element);
+               connman_element_register(element, task->element);
        } else if (g_ascii_strcasecmp(text, "RENEW") == 0 ||
                                g_ascii_strcasecmp(text, "REBIND") == 0) {
                connman_element_update(task->element);
-               connman_element_update(task->child);
        } else {
        }
 
@@ -358,25 +340,15 @@ 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;
 
-               if (task->child) {
-                       connman_element_unregister(task->child);
-                       connman_element_unref(task->child);
-                       task->child = NULL;
-               }
-
                DBG("killing process %d", task->pid);
 
                kill_task(task);
                unlink_task(task);
        }
 
-       g_static_mutex_unlock(&task_mutex);
-
        g_slist_free(task_list);
 
        connman_driver_unregister(&dhclient_driver);
@@ -384,5 +356,5 @@ static void dhclient_exit(void)
        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)