#include <connman/dbus.h>
#include <connman/log.h>
+#include "inet.h"
+
#define DHCLIENT_INTF "org.isc.dhclient"
#define DHCLIENT_PATH "/org/isc/dhclient"
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)
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);
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);
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);
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);
}
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;
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 {
}
{
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);
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)