*
* 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
#include <config.h>
#endif
+#include <unistd.h>
#include <sys/wait.h>
#include <glib/gstdio.h>
+#define CONNMAN_API_SUBJECT_TO_CHANGE
#include <connman/plugin.h>
#include <connman/driver.h>
#include <connman/dbus.h>
#include <connman/log.h>
+#include "inet.h"
+
#define DHCLIENT_INTF "org.isc.dhclient"
#define DHCLIENT_PATH "/org/isc/dhclient"
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)
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);
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) {
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);
+ 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;
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;
} 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);
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) {
{
GSList *list;
- g_static_mutex_lock(&task_mutex);
-
for (list = task_list; list; list = list->next) {
struct dhclient_task *task = list->data;
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)