diff options
-rw-r--r-- | src/connman.h | 2 | ||||
-rw-r--r-- | src/iface.c | 23 | ||||
-rw-r--r-- | src/main.c | 22 |
3 files changed, 36 insertions, 11 deletions
diff --git a/src/connman.h b/src/connman.h index 76bffe55..c253a8e3 100644 --- a/src/connman.h +++ b/src/connman.h @@ -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); diff --git a/src/iface.c b/src/iface.c index 65e4cdd0..18c44f66 100644 --- a/src/iface.c +++ b/src/iface.c @@ -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); } @@ -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; |