static int wispr_portal_detect(struct connman_wispr_portal_context *wp_context) { enum connman_service_proxy_method proxy_method; enum connman_service_type service_type; char *interface = NULL; char **nameservers = NULL; int if_index; int err = 0; int i; DBG("wispr/portal context %p service %p", wp_context, wp_context->service); service_type = connman_service_get_type(wp_context->service); switch (service_type) { case CONNMAN_SERVICE_TYPE_ETHERNET: case CONNMAN_SERVICE_TYPE_WIFI: case CONNMAN_SERVICE_TYPE_BLUETOOTH: case CONNMAN_SERVICE_TYPE_CELLULAR: case CONNMAN_SERVICE_TYPE_GADGET: break; case CONNMAN_SERVICE_TYPE_UNKNOWN: case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_VPN: case CONNMAN_SERVICE_TYPE_P2P: return -EOPNOTSUPP; } interface = connman_service_get_interface(wp_context->service); if (!interface) return -EINVAL; DBG("interface %s", interface); if_index = connman_inet_ifindex(interface); if (if_index < 0) { DBG("Could not get ifindex"); err = -EINVAL; goto done; } nameservers = connman_service_get_nameservers(wp_context->service); if (!nameservers) { DBG("Could not get nameservers"); err = -EINVAL; goto done; } wp_context->web = g_web_new(if_index); if (!wp_context->web) { DBG("Could not set up GWeb"); err = -ENOMEM; goto done; } if (getenv("CONNMAN_WEB_DEBUG")) g_web_set_debug(wp_context->web, web_debug, "WEB"); if (wp_context->type == CONNMAN_IPCONFIG_TYPE_IPV4) { g_web_set_address_family(wp_context->web, AF_INET); wp_context->status_url = STATUS_URL_IPV4; } else { g_web_set_address_family(wp_context->web, AF_INET6); wp_context->status_url = STATUS_URL_IPV6; } for (i = 0; nameservers[i]; i++) g_web_add_nameserver(wp_context->web, nameservers[i]); proxy_method = connman_service_get_proxy_method(wp_context->service); if (proxy_method != CONNMAN_SERVICE_PROXY_METHOD_DIRECT) { wp_context->token = connman_proxy_lookup(interface, wp_context->status_url, wp_context->service, proxy_callback, wp_context); if (wp_context->token == 0) { err = -EINVAL; free_connman_wispr_portal_context(wp_context); } } else if (wp_context->timeout == 0) { wp_context->timeout = g_idle_add(no_proxy_callback, wp_context); } done: g_strfreev(nameservers); g_free(interface); return err; }
static void create_proxy_configuration(void) { DBusMessage *msg; DBusMessageIter iter, dict; DBusPendingCall *call; dbus_bool_t result; char *interface; const char *method; const char *str; char **str_list; if (!default_service) return; DBG(""); msg = dbus_message_new_method_call(PACRUNNER_SERVICE, PACRUNNER_PATH, PACRUNNER_INTERFACE, "CreateProxyConfiguration"); if (!msg) return; dbus_message_set_auto_start(msg, FALSE); dbus_message_iter_init_append(msg, &iter); connman_dbus_dict_open(&iter, &dict); switch(connman_service_get_proxy_method(default_service)) { case CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN: connman_dbus_dict_close(&iter, &dict); goto done; case CONNMAN_SERVICE_PROXY_METHOD_DIRECT: method= "direct"; break; case CONNMAN_SERVICE_PROXY_METHOD_MANUAL: method = "manual"; str_list = connman_service_get_proxy_servers(default_service); if (!str_list) { connman_dbus_dict_close(&iter, &dict); goto done; } connman_dbus_dict_append_array(&dict, "Servers", DBUS_TYPE_STRING, append_string_list, str_list); g_strfreev(str_list); str_list = connman_service_get_proxy_excludes(default_service); if (!str_list) break; connman_dbus_dict_append_array(&dict, "Excludes", DBUS_TYPE_STRING, append_string_list, str_list); g_strfreev(str_list); break; case CONNMAN_SERVICE_PROXY_METHOD_AUTO: method = "auto"; str = connman_service_get_proxy_url(default_service); if (!str) { str = connman_service_get_proxy_autoconfig( default_service); if (!str) { connman_dbus_dict_close(&iter, &dict); goto done; } } connman_dbus_dict_append_basic(&dict, "URL", DBUS_TYPE_STRING, &str); break; } connman_dbus_dict_append_basic(&dict, "Method", DBUS_TYPE_STRING, &method); interface = connman_service_get_interface(default_service); if (interface) { connman_dbus_dict_append_basic(&dict, "Interface", DBUS_TYPE_STRING, &interface); g_free(interface); } str = connman_service_get_domainname(default_service); if (str) connman_dbus_dict_append_array(&dict, "Domains", DBUS_TYPE_STRING, append_string, &str); str_list = connman_service_get_nameservers(default_service); if (str_list) connman_dbus_dict_append_array(&dict, "Nameservers", DBUS_TYPE_STRING, append_string_list, str_list); g_strfreev(str_list); connman_dbus_dict_close(&iter, &dict); result = dbus_connection_send_with_reply(connection, msg, &call, DBUS_TIMEOUT); if (!result || !call) goto done; dbus_pending_call_set_notify(call, create_config_reply, NULL, NULL); dbus_pending_call_unref(call); done: dbus_message_unref(msg); }