Fix selecting network device
authorMarcel Holtmann <marcel@holtmann.org>
Tue, 5 Aug 2008 00:38:14 +0000 (02:38 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 5 Aug 2008 00:38:14 +0000 (02:38 +0200)
src/connman.h
src/element.c
src/main.c

index 5f64286..df1aabb 100644 (file)
@@ -52,7 +52,7 @@ void __connman_plugin_cleanup(void);
 #include <connman/driver.h>
 #include <connman/element.h>
 
-int __connman_element_init(DBusConnection *conn);
+int __connman_element_init(DBusConnection *conn, const char *device);
 void __connman_element_cleanup(void);
 
 void __connman_element_list(enum connman_element_type type,
index 5537e41..7c892e6 100644 (file)
@@ -40,6 +40,8 @@ static GSList *driver_list = NULL;
 static GThreadPool *thread_register = NULL;
 static GThreadPool *thread_unregister = NULL;
 
+static gchar *device_filter = NULL;
+
 static const char *type2string(enum connman_element_type type)
 {
        switch (type) {
@@ -601,6 +603,11 @@ int connman_element_register(struct connman_element *element,
 {
        DBG("element %p name %s parent %p", element, element->name, parent);
 
+       if (device_filter && element->type == CONNMAN_ELEMENT_TYPE_DEVICE) {
+               if (g_str_equal(device_filter, element->netdev.name) == FALSE)
+                       return -EINVAL;
+       }
+
        if (connman_element_ref(element) == NULL)
                return -EINVAL;
 
@@ -788,7 +795,7 @@ static void unregister_element(gpointer data, gpointer user_data)
        connman_element_unref(element);
 }
 
-int __connman_element_init(DBusConnection *conn)
+int __connman_element_init(DBusConnection *conn, const char *device)
 {
        struct connman_element *element;
 
@@ -798,6 +805,8 @@ int __connman_element_init(DBusConnection *conn)
        if (connection == NULL)
                return -EIO;
 
+       device_filter = g_strdup(device);
+
        g_static_rw_lock_writer_lock(&element_lock);
 
        element = connman_element_create();
@@ -873,5 +882,7 @@ void __connman_element_cleanup(void)
        element_root = NULL;
        g_static_rw_lock_writer_unlock(&element_lock);
 
+       g_free(device_filter);
+
        dbus_connection_unref(connection);
 }
index 1c63f1e..3a5990b 100644 (file)
@@ -50,14 +50,14 @@ static void disconnect_callback(void *user_data)
        g_main_loop_quit(main_loop);
 }
 
-static gchar *option_interface = NULL;
+static gchar *option_device = NULL;
 static gboolean option_detach = TRUE;
 static gboolean option_compat = FALSE;
 static gboolean option_debug = FALSE;
 
 static GOptionEntry options[] = {
-       { "interface", 'i', 0, G_OPTION_ARG_STRING, &option_interface,
-                               "Specify network interface", "IFACE" },
+       { "device", 'i', 0, G_OPTION_ARG_STRING, &option_device,
+                               "Specify network device/interface", "DEV" },
        { "nodaemon", 'n', G_OPTION_FLAG_REVERSE,
                                G_OPTION_ARG_NONE, &option_detach,
                                "Don't fork daemon to background" },
@@ -138,7 +138,7 @@ int main(int argc, char *argv[])
 
        __connman_storage_init();
 
-       __connman_element_init(conn);
+       __connman_element_init(conn, option_device);
 
        __connman_agent_init(conn);
 
@@ -146,7 +146,7 @@ int main(int argc, char *argv[])
 
        __connman_plugin_init();
 
-       g_free(option_interface);
+       g_free(option_device);
 
        memset(&sa, 0, sizeof(sa));
        sa.sa_handler = sig_term;