-static void set_user_networks(struct connman_provider *provider,
- char **networks)
-{
- int i = 0;
-
- while (networks[i] != NULL) {
- char **elems = g_strsplit(networks[i], "/", 0);
- char *network, *netmask;
- int family = PF_UNSPEC, ret;
-
- if (elems == NULL)
- break;
-
- network = elems[0];
- if (network == NULL || *network == '\0') {
- DBG("no network/netmask set");
- g_strfreev(elems);
- break;
- }
-
- netmask = elems[1];
- if (netmask != NULL && *netmask == '\0') {
- DBG("no netmask set");
- g_strfreev(elems);
- break;
- }
-
- if (g_strrstr(network, ":") != NULL)
- family = AF_INET6;
- else if (g_strrstr(network, ".") != NULL) {
- family = AF_INET;
-
- if (g_strrstr(netmask, ".") == NULL) {
- /* We have netmask length */
- in_addr_t addr;
- struct in_addr netmask_in;
- unsigned char prefix_len = 32;
-
- if (netmask != NULL)
- prefix_len = atoi(netmask);
-
- addr = 0xffffffff << (32 - prefix_len);
- netmask_in.s_addr = htonl(addr);
- netmask = inet_ntoa(netmask_in);
-
- DBG("network %s netmask %s", network, netmask);
- }
- }
-
- ret = __connman_provider_append_user_route(provider,
- family, network, netmask);
- g_strfreev(elems);
-
- if (ret != 0)
- break;
-
- i++;
- }
-}
-
-static int provider_load_from_keyfile(struct connman_provider *provider,
- GKeyFile *keyfile)
-{
- gsize idx = 0;
- gchar **settings;
- gchar *key, *value;
- gsize length;
-
- settings = g_key_file_get_keys(keyfile, provider->identifier, &length,
- NULL);
- if (settings == NULL) {
- g_key_file_free(keyfile);
- return -ENOENT;
- }
-
- while (idx < length) {
- key = settings[idx];
- if (key != NULL) {
- if (g_str_equal(key, "Networks") == TRUE) {
- g_strfreev(provider->user_networks);
- provider->user_networks =
- g_key_file_get_string_list(keyfile,
- provider->identifier,
- key,
- &provider->num_user_networks,
- NULL);
- } else {
- value = g_key_file_get_string(keyfile,
- provider->identifier,
- key, NULL);
- connman_provider_set_string(provider, key,
- value);
- g_free(value);
- }
- }
- idx += 1;
- }
- g_strfreev(settings);
-
- if (provider->user_networks != NULL)
- set_user_networks(provider, provider->user_networks);
-
- return 0;
-}
-
-static int connman_provider_load(struct connman_provider *provider)
-{
- GKeyFile *keyfile;
-
- DBG("provider %p", provider);
-
- keyfile = __connman_storage_load_provider(provider->identifier);
- if (keyfile == NULL)
- return -ENOENT;
-
- provider_load_from_keyfile(provider, keyfile);
-
- g_key_file_free(keyfile);
- return 0;
-}
-
-static int connman_provider_save(struct connman_provider *provider)
-{
- GKeyFile *keyfile;
-
- DBG("provider %p", provider);
-
- keyfile = g_key_file_new();
- if (keyfile == NULL)
- return -ENOMEM;
-
- g_key_file_set_string(keyfile, provider->identifier,
- "Name", provider->name);
- g_key_file_set_string(keyfile, provider->identifier,
- "Type", provider->type);
- g_key_file_set_string(keyfile, provider->identifier,
- "Host", provider->host);
- g_key_file_set_string(keyfile, provider->identifier,
- "VPN.Domain", provider->domain);
- if (provider->user_networks != NULL)
- g_key_file_set_string_list(keyfile, provider->identifier,
- "Networks",
- (const gchar **)provider->user_networks,
- provider->num_user_networks);
-
- if (provider->driver != NULL && provider->driver->save != NULL)
- provider->driver->save(provider, keyfile);
-
- __connman_storage_save_provider(keyfile, provider->identifier);
- g_key_file_free(keyfile);
-
- return 0;
-}
-
-static struct connman_provider *connman_provider_lookup(const char *identifier)