X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fprovider.c;h=3f4bb1ccc84cfc5ec038d0cd618b0a7c39452220;hb=0bfab55f1a737afedaffeff652fc3e75ee80f2b4;hp=42fd112f03af520bd5f34b6262dd5bdb0c69183f;hpb=4e1d663c9c31890af9869b2d8c9faf41acf7ef91;p=framework%2Fconnectivity%2Fconnman.git diff --git a/src/provider.c b/src/provider.c index 42fd112..3f4bb1c 100644 --- a/src/provider.c +++ b/src/provider.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 @@ -113,15 +113,25 @@ static void set_user_networks(struct connman_provider *provider, while (networks[i] != NULL) { char **elems = g_strsplit(networks[i], "/", 0); - char *network, *netmask = NULL; + char *network, *netmask; int family = PF_UNSPEC, ret; if (elems == NULL) break; network = elems[0]; - if (elems[1] != NULL) - netmask = elems[1]; + 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; @@ -132,7 +142,10 @@ static void set_user_networks(struct connman_provider *provider, /* We have netmask length */ in_addr_t addr; struct in_addr netmask_in; - unsigned char prefix_len = atoi(netmask); + unsigned char prefix_len = 32; + + if (netmask != NULL) + prefix_len = atoi(netmask); addr = 0xffffffff << (32 - prefix_len); netmask_in.s_addr = htonl(addr); @@ -1281,9 +1294,71 @@ static void provider_offline_mode(connman_bool_t enabled) } +static struct connman_provider *provider_get(int index) +{ + GHashTableIter iter; + gpointer value, key; + + g_hash_table_iter_init(&iter, provider_hash); + + while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) { + struct connman_provider *provider = value; + + if (provider->index == index) + return provider; + } + + return NULL; +} + +static void provider_service_changed(struct connman_service *service, + enum connman_service_state state) +{ + struct connman_provider *provider; + int vpn_index, service_index; + + if (service == NULL) + return; + + switch (state) { + case CONNMAN_SERVICE_STATE_UNKNOWN: + case CONNMAN_SERVICE_STATE_IDLE: + case CONNMAN_SERVICE_STATE_ASSOCIATION: + case CONNMAN_SERVICE_STATE_CONFIGURATION: + case CONNMAN_SERVICE_STATE_READY: + case CONNMAN_SERVICE_STATE_ONLINE: + return; + case CONNMAN_SERVICE_STATE_DISCONNECT: + case CONNMAN_SERVICE_STATE_FAILURE: + break; + } + + service_index = __connman_service_get_index(service); + + vpn_index = __connman_connection_get_vpn_index(service_index); + + DBG("service %p %s state %d index %d/%d", service, + __connman_service_get_ident(service), + state, service_index, vpn_index); + + if (vpn_index < 0) + return; + + provider = provider_get(vpn_index); + if (provider == NULL) + return; + + DBG("disconnect %p index %d", provider, vpn_index); + + __connman_provider_disconnect(provider); + + return; +} + static struct connman_notifier provider_notifier = { .name = "provider", .offline_mode = provider_offline_mode, + .service_state_changed = provider_service_changed, }; int __connman_provider_init(void)