- DBG("Type %s name %s", type, name);
-
- if (type == NULL || name == NULL)
- return -EOPNOTSUPP;
-
- ident = g_strdup_printf("%s_%s", host, domain);
- provider_dbus_ident(ident);
-
- DBG("ident %s", ident);
-
- provider = connman_provider_lookup(ident);
- if (provider == NULL) {
- provider = connman_provider_get(ident);
- if (provider == NULL) {
- DBG("can not create provider");
- g_free(ident);
- return -EOPNOTSUPP;
- }
-
- provider->host = g_strdup(host);
- provider->domain = g_strdup(domain);
- provider->name = g_strdup(name);
- provider->type = g_strdup(type);
-
- if (provider_register(provider) == 0)
- connman_provider_load(provider);
- }
-
- dbus_message_iter_init(msg, &iter);
- dbus_message_iter_recurse(&iter, &array);
-
- while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
- DBusMessageIter entry, value;
- const char *key, *str;
-
- dbus_message_iter_recurse(&array, &entry);
- dbus_message_iter_get_basic(&entry, &key);
-
- dbus_message_iter_next(&entry);
- dbus_message_iter_recurse(&entry, &value);
-
- switch (dbus_message_iter_get_arg_type(&value)) {
- case DBUS_TYPE_STRING:
- dbus_message_iter_get_basic(&value, &str);
- connman_provider_set_string(provider, key, str);
- break;
- }
-
- dbus_message_iter_next(&array);
- }
-
- g_free(ident);
-
- err = provider_create_service(provider);
- if (err == -EALREADY) {
- DBG("provider already connected");
- } else {
- if (err == -EOPNOTSUPP) {
- goto unref;
- } else {
- err = __connman_service_connect(provider->vpn_service);
-
- if (err < 0 && err != -EINPROGRESS)
- goto failed;
- }
- }
-
- connman_provider_save(provider);
- service_path = __connman_service_get_path(provider->vpn_service);
- g_dbus_send_reply(connection, msg,
- DBUS_TYPE_OBJECT_PATH, &service_path,
- DBUS_TYPE_INVALID);
- return 0;
-
-failed:
- connman_service_unref(provider->vpn_service);
- provider->vpn_service = NULL;
-
-unref:
- DBG("can not connect, delete provider");