Add option for interface limitation
authorMarcel Holtmann <marcel@holtmann.org>
Wed, 12 Mar 2008 13:48:31 +0000 (14:48 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 12 Mar 2008 13:48:31 +0000 (14:48 +0100)
src/connman.h
src/iface.c
src/main.c

index 76bffe5..c253a8e 100644 (file)
@@ -59,7 +59,7 @@ void __connman_plugin_cleanup(void);
 
 #include <connman/iface.h>
 
-int __connman_iface_init(DBusConnection *conn);
+int __connman_iface_init(DBusConnection *conn, const char *interface);
 void __connman_iface_cleanup(void);
 
 struct connman_iface *__connman_iface_find(int index);
index 65e4cdd..18c44f6 100644 (file)
@@ -47,6 +47,8 @@
 
 static DBusConnection *connection = NULL;
 
+static gchar *ifname_filter = NULL;
+
 static GSList *drivers = NULL;
 
 int connman_iface_register(struct connman_iface_driver *driver)
@@ -1095,7 +1097,7 @@ static int probe_device(LibHalContext *ctx,
 {
        DBusConnection *conn;
        struct connman_iface *iface;
-       char *temp, *sysfs;
+       char *temp, *sysfs, *ifname;
        int err;
 
        DBG("ctx %p driver %p udi %s", ctx, driver, udi);
@@ -1124,10 +1126,20 @@ static int probe_device(LibHalContext *ctx,
 
        iface->index = -1;
 
-       if (g_str_has_prefix(driver->capability, "net") == TRUE)
+       if (g_str_has_prefix(driver->capability, "net") == TRUE) {
                iface->index = libhal_device_get_property_int(ctx, udi,
                                                "net.linux.ifindex", NULL);
 
+               ifname = libhal_device_get_property_string(ctx, udi,
+                                               "net.interface", NULL);
+               if (ifname != NULL && ifname_filter != NULL &&
+                                               *ifname_filter != '\0' &&
+                               g_str_equal(ifname, ifname_filter) == FALSE) {
+                       device_free(iface);
+                       return -1;
+               }
+       }
+
        iface->type = CONNMAN_IFACE_TYPE_UNKNOWN;
        iface->flags = 0;
        iface->state = CONNMAN_IFACE_STATE_UNKNOWN;
@@ -1340,7 +1352,7 @@ static void hal_cleanup(void *data)
 
 static guint hal_watch = 0;
 
-int __connman_iface_init(DBusConnection *conn)
+int __connman_iface_init(DBusConnection *conn, const char *interface)
 {
        DBG("conn %p", conn);
 
@@ -1348,6 +1360,9 @@ int __connman_iface_init(DBusConnection *conn)
        if (connection == NULL)
                return -1;
 
+       if (interface != NULL)
+               ifname_filter = g_strdup(interface);
+
        hal_init(connection);
 
        hal_watch = g_dbus_add_watch(connection, "org.freedesktop.Hal",
@@ -1364,5 +1379,7 @@ void __connman_iface_cleanup(void)
 
        hal_cleanup(connection);
 
+       g_free(ifname_filter);
+
        dbus_connection_unref(connection);
 }
index a4962b2..e917440 100644 (file)
@@ -30,6 +30,7 @@
 #include <signal.h>
 #include <getopt.h>
 #include <sys/stat.h>
+#include <net/if.h>
 
 #include <gdbus.h>
 
@@ -47,7 +48,7 @@ static void usage(void)
        printf("Connection Manager version %s\n\n", VERSION);
 
        printf("Usage:\n"
-               "\tconnmand [options]\n"
+               "\tconnmand [-i <interface>] [options]\n"
                "\n");
 
        printf("Options:\n"
@@ -58,10 +59,11 @@ static void usage(void)
 }
 
 static struct option options[] = {
-       { "nodaemon", 0, 0, 'n' },
-       { "compat",   0, 0, 'c' },
-       { "debug",    0, 0, 'd' },
-       { "help",     0, 0, 'h' },
+       { "interface", 1, 0, 'i' },
+       { "nodaemon",  0, 0, 'n' },
+       { "compat",    0, 0, 'c' },
+       { "debug",     0, 0, 'd' },
+       { "help",      0, 0, 'h' },
        { }
 };
 
@@ -70,10 +72,16 @@ int main(int argc, char *argv[])
        DBusConnection *conn;
        DBusError err;
        struct sigaction sa;
+       char interface[IFNAMSIZ];
        int opt, detach = 1, compat = 0, debug = 0;
 
-       while ((opt = getopt_long(argc, argv, "+ncdh", options, NULL)) != EOF) {
+       memset(interface, 0, IFNAMSIZ);
+
+       while ((opt = getopt_long(argc, argv, "+i:ncdh", options, NULL)) != EOF) {
                switch (opt) {
+               case 'i':
+                       snprintf(interface, IFNAMSIZ, "%s", optarg);
+                       break;
                case 'n':
                        detach = 0;
                        break;
@@ -136,7 +144,7 @@ int main(int argc, char *argv[])
 
        __connman_rtnl_init();
 
-       __connman_iface_init(conn);
+       __connman_iface_init(conn, interface);
 
        memset(&sa, 0, sizeof(sa));
        sa.sa_handler = sig_term;