int __connman_wpad_start(struct connman_service *service) { struct connman_wpad *wpad; const char *domainname; char **nameservers; int index; int i; DBG("service %p", service); if (!wpad_list) return -EINVAL; index = __connman_service_get_index(service); if (index < 0) return -EINVAL; domainname = connman_service_get_domainname(service); if (!domainname) return -EINVAL; nameservers = connman_service_get_nameservers(service); if (!nameservers) return -EINVAL; wpad = g_try_new0(struct connman_wpad, 1); if (!wpad) { g_strfreev(nameservers); return -ENOMEM; } wpad->service = service; wpad->resolv = g_resolv_new(index); if (!wpad->resolv) { g_strfreev(nameservers); g_free(wpad); return -ENOMEM; } if (getenv("CONNMAN_RESOLV_DEBUG")) g_resolv_set_debug(wpad->resolv, resolv_debug, "RESOLV"); for (i = 0; nameservers[i]; i++) g_resolv_add_nameserver(wpad->resolv, nameservers[i], 53, 0); g_strfreev(nameservers); wpad->hostname = g_strdup_printf("wpad.%s", domainname); DBG("hostname %s", wpad->hostname); g_resolv_lookup_hostname(wpad->resolv, wpad->hostname, wpad_result, wpad); connman_service_ref(service); g_hash_table_replace(wpad_list, GINT_TO_POINTER(index), wpad); return 0; }
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 == NULL) return; DBG(""); msg = dbus_message_new_method_call(PACRUNNER_SERVICE, PACRUNNER_PATH, PACRUNNER_INTERFACE, "CreateProxyConfiguration"); if (msg == NULL) 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: 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 == NULL) 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 == NULL) 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 == NULL) { str = connman_service_get_proxy_autoconfig( default_service); if (str == NULL) 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 != NULL) { connman_dbus_dict_append_basic(&dict, "Interface", DBUS_TYPE_STRING, &interface); g_free(interface); } str = connman_service_get_domainname(default_service); if (str != NULL) connman_dbus_dict_append_array(&dict, "Domains", DBUS_TYPE_STRING, append_string, &str); str_list = connman_service_get_nameservers(default_service); if (str_list != NULL) connman_dbus_dict_append_array(&dict, "Nameservers", DBUS_TYPE_STRING, append_string_list, str_list); connman_dbus_dict_close(&iter, &dict); result = dbus_connection_send_with_reply(connection, msg, &call, DBUS_TIMEOUT); if (result == FALSE || call == NULL) goto done; dbus_pending_call_set_notify(call, create_config_reply, NULL, NULL); dbus_pending_call_unref(call); done: dbus_message_unref(msg); }