X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fwpad.c;h=4e5834e548862b5a2a5baac93d85d831a2cf459f;hb=2aa593bceff2698fe3ca714152064e4758cf5593;hp=f3a1ab54a0668b67c409ecc01d6bb1eb6b9ac284;hpb=ba9d60a47cd97a966e7b3c93636f20d005033afb;p=framework%2Fconnectivity%2Fconnman.git diff --git a/src/wpad.c b/src/wpad.c index f3a1ab5..4e5834e 100644 --- a/src/wpad.c +++ b/src/wpad.c @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2007-2010 Intel Corporation. All rights reserved. + * Copyright (C) 2007-2012 Intel Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -23,9 +23,11 @@ #include #endif +#include #include +#include -#include +#include #include "connman.h" @@ -33,6 +35,7 @@ struct connman_wpad { struct connman_service *service; GResolv *resolv; char *hostname; + char **addrlist; }; static GHashTable *wpad_list = NULL; @@ -48,71 +51,134 @@ static void free_wpad(gpointer data) g_resolv_unref(wpad->resolv); + g_strfreev(wpad->addrlist); g_free(wpad->hostname); g_free(wpad); } +static void download_pac(struct connman_wpad *wpad, const char *target) +{ +} + static void wpad_result(GResolvResultStatus status, char **results, gpointer user_data) { struct connman_wpad *wpad = user_data; + const char *ptr; + char *hostname; DBG("status %d", status); if (status == G_RESOLV_RESULT_STATUS_SUCCESS) { char *url; + if (results == NULL || g_strv_length(results) == 0) + goto failed; + url = g_strdup_printf("http://%s/wpad.dat", wpad->hostname); + __connman_service_set_proxy_autoconfig(wpad->service, url); + + wpad->addrlist = g_strdupv(results); + if (wpad->addrlist != NULL) + download_pac(wpad, "wpad.dat"); + g_free(url); + + __connman_wispr_start(wpad->service, + CONNMAN_IPCONFIG_TYPE_IPV4); + + return; } + + hostname = wpad->hostname; + + if (strlen(hostname) < 6) + goto failed; + + ptr = strchr(hostname + 5, '.'); + if (ptr == NULL || strlen(ptr) < 2) + goto failed; + + if (strchr(ptr + 1, '.') == NULL) + goto failed; + + wpad->hostname = g_strdup_printf("wpad.%s", ptr + 1); + g_free(hostname); + + DBG("hostname %s", wpad->hostname); + + g_resolv_lookup_hostname(wpad->resolv, wpad->hostname, + wpad_result, wpad); + + return; + +failed: + connman_service_set_proxy_method(wpad->service, + CONNMAN_SERVICE_PROXY_METHOD_DIRECT); + + __connman_wispr_start(wpad->service, + CONNMAN_IPCONFIG_TYPE_IPV4); } -void __connman_wpad_start(struct connman_service *service) +int __connman_wpad_start(struct connman_service *service) { struct connman_wpad *wpad; - const char *domainname, *nameserver; + const char *domainname; + char **nameservers; int index; + int i; DBG("service %p", service); if (wpad_list == NULL) - return; + return -EINVAL; index = __connman_service_get_index(service); if (index < 0) - return; + return -EINVAL; - domainname = __connman_service_get_domainname(service); + domainname = connman_service_get_domainname(service); if (domainname == NULL) - return; + return -EINVAL; - nameserver = __connman_service_get_nameserver(service); - if (nameserver == NULL) - return; + nameservers = connman_service_get_nameservers(service); + if (nameservers == NULL) + return -EINVAL; wpad = g_try_new0(struct connman_wpad, 1); - if (wpad == NULL) - return; + if (wpad == NULL) { + g_strfreev(nameservers); + return -ENOMEM; + } wpad->service = service; wpad->resolv = g_resolv_new(index); if (wpad->resolv == NULL) { + g_strfreev(nameservers); g_free(wpad); - return; + return -ENOMEM; } if (getenv("CONNMAN_RESOLV_DEBUG")) g_resolv_set_debug(wpad->resolv, resolv_debug, "RESOLV"); - g_resolv_add_nameserver(wpad->resolv, nameserver, 53, 0); + for (i = 0; nameservers[i] != NULL; 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); - g_hash_table_insert(wpad_list, GINT_TO_POINTER(index), wpad); + connman_service_ref(service); + g_hash_table_replace(wpad_list, GINT_TO_POINTER(index), wpad); + + return 0; } void __connman_wpad_stop(struct connman_service *service) @@ -128,7 +194,8 @@ void __connman_wpad_stop(struct connman_service *service) if (index < 0) return; - g_hash_table_remove(wpad_list, GINT_TO_POINTER(index)); + if (g_hash_table_remove(wpad_list, GINT_TO_POINTER(index)) == TRUE) + connman_service_unref(service); } int __connman_wpad_init(void)