diff options
author | Jukka Rissanen <jukka.rissanen@linux.intel.com> | 2012-04-05 12:00:46 +0300 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2012-04-05 14:17:28 +0300 |
commit | 212ad2f520bb2fb9cdc830142f65cfb7d0bd68fe (patch) | |
tree | f9929cdd4eeb65efa6775fa36c21d288a72b8b92 /src/provider.c | |
parent | 365e6da07c2088ac198d2b450eabda4b61f35586 (diff) | |
download | connman-212ad2f520bb2fb9cdc830142f65cfb7d0bd68fe.tar.gz connman-212ad2f520bb2fb9cdc830142f65cfb7d0bd68fe.tar.bz2 connman-212ad2f520bb2fb9cdc830142f65cfb7d0bd68fe.zip |
provider: Allow user to set routes when creating provider
Diffstat (limited to 'src/provider.c')
-rw-r--r-- | src/provider.c | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/src/provider.c b/src/provider.c index 0a1e9ad6..b893e20d 100644 --- a/src/provider.c +++ b/src/provider.c @@ -746,14 +746,52 @@ static void provider_create_all_from_type(const char *provider_type) g_strfreev(providers); } +static char **get_user_networks(DBusMessageIter *array, int *count) +{ + DBusMessageIter entry; + char **networks = NULL; + GSList *list = NULL, *l; + int len; + + dbus_message_iter_recurse(array, &entry); + + while (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_STRING) { + const char *val; + dbus_message_iter_get_basic(&entry, &val); + + list = g_slist_prepend(list, g_strdup(val)); + dbus_message_iter_next(&entry); + } + + len = g_slist_length(list); + if (len == 0) + goto out; + + networks = g_try_new(char *, len + 1); + if (networks == NULL) + goto out; + + *count = len; + networks[len] = 0; + + for (l = list; l != NULL; l = g_slist_next(l)) + networks[--len] = l->data; + +out: + g_slist_free(list); + + return networks; +} + int __connman_provider_create_and_connect(DBusMessage *msg) { struct connman_provider *provider; DBusMessageIter iter, array; const char *type = NULL, *name = NULL, *service_path; const char *host = NULL, *domain = NULL; + char **networks = NULL; char *ident; - int err; + int err, count = 0; dbus_message_iter_init(msg, &iter); dbus_message_iter_recurse(&iter, &array); @@ -779,6 +817,10 @@ int __connman_provider_create_and_connect(DBusMessage *msg) else if (g_str_equal(key, "VPN.Domain") == TRUE) dbus_message_iter_get_basic(&value, &domain); break; + case DBUS_TYPE_ARRAY: + if (g_str_equal(key, "Networks") == TRUE) + networks = get_user_networks(&value, &count); + break; } dbus_message_iter_next(&array); @@ -787,7 +829,7 @@ int __connman_provider_create_and_connect(DBusMessage *msg) if (host == NULL || domain == NULL) return -EINVAL; - DBG("Type %s name %s", type, name); + DBG("Type %s name %s networks %p", type, name, networks); if (type == NULL || name == NULL) return -EOPNOTSUPP; @@ -815,6 +857,13 @@ int __connman_provider_create_and_connect(DBusMessage *msg) connman_provider_load(provider); } + if (networks != NULL) { + g_strfreev(provider->user_networks); + provider->user_networks = networks; + provider->num_user_networks = count; + set_user_networks(provider, provider->user_networks); + } + dbus_message_iter_init(msg, &iter); dbus_message_iter_recurse(&iter, &array); |