summaryrefslogtreecommitdiff
path: root/src/provider.c
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@linux.intel.com>2012-04-05 12:00:46 +0300
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-04-05 14:17:28 +0300
commit212ad2f520bb2fb9cdc830142f65cfb7d0bd68fe (patch)
treef9929cdd4eeb65efa6775fa36c21d288a72b8b92 /src/provider.c
parent365e6da07c2088ac198d2b450eabda4b61f35586 (diff)
downloadconnman-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.c53
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);