From: Marcel Holtmann Date: Sun, 9 Aug 2009 02:16:59 +0000 (-0700) Subject: Attach IP addresses to configuration X-Git-Tag: 0.39~44 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=10b6ada1337f719b1a0a4232c63f098da218bc2b;p=platform%2Fupstream%2Fconnman.git Attach IP addresses to configuration --- diff --git a/src/ipconfig.c b/src/ipconfig.c index 70131ad..2d5c5ee 100644 --- a/src/ipconfig.c +++ b/src/ipconfig.c @@ -33,6 +33,11 @@ #include "connman.h" +struct connman_ipaddress { + unsigned char prefixlen; + char *address; +}; + struct connman_ipconfig { gint refcount; int index; @@ -40,8 +45,40 @@ struct connman_ipconfig { unsigned short type; unsigned int flags; enum connman_ipconfig_method method; + GSList *address_list; }; +static void free_address_list(struct connman_ipconfig *ipconfig) +{ + GSList *list; + + for (list = ipconfig->address_list; list; list = list->next) { + struct connman_ipaddress *ipaddress = list->data; + + g_free(ipaddress->address); + g_free(ipaddress); + } + + g_slist_free(ipconfig->address_list); + ipconfig->address_list = NULL; +} + +static struct connman_ipaddress *find_ipaddress(struct connman_ipconfig *ipconfig, + unsigned char prefixlen, const char *address) +{ + GSList *list; + + for (list = ipconfig->address_list; list; list = list->next) { + struct connman_ipaddress *ipaddress = list->data; + + if (g_strcmp0(ipaddress->address, address) == 0 && + ipaddress->prefixlen == prefixlen) + return ipaddress; + } + + return NULL; +} + /** * connman_ipconfig_create: * @@ -97,6 +134,8 @@ void connman_ipconfig_unref(struct connman_ipconfig *ipconfig) connman_info("%s {remove} index %d", ipconfig->interface, ipconfig->index); + free_address_list(ipconfig); + g_free(ipconfig->interface); g_free(ipconfig); } @@ -167,6 +206,18 @@ void __connman_ipconfig_add_address(struct connman_ipconfig *ipconfig, const char *label, unsigned char prefixlen, const char *address, const char *broadcast) { + struct connman_ipaddress *ipaddress; + + ipaddress = g_try_new0(struct connman_ipaddress, 1); + if (ipaddress == NULL) + return; + + ipaddress->prefixlen = prefixlen; + ipaddress->address = g_strdup(address); + + ipconfig->address_list = g_slist_append(ipconfig->address_list, + ipaddress); + connman_info("%s {add} address %s/%u label %s", ipconfig->interface, address, prefixlen, label); } @@ -175,6 +226,18 @@ void __connman_ipconfig_del_address(struct connman_ipconfig *ipconfig, const char *label, unsigned char prefixlen, const char *address, const char *broadcast) { + struct connman_ipaddress *ipaddress; + + ipaddress = find_ipaddress(ipconfig, prefixlen, address); + if (ipaddress == NULL) + return; + + ipconfig->address_list = g_slist_remove(ipconfig->address_list, + ipaddress); + + g_free(ipaddress->address); + g_free(ipaddress); + connman_info("%s {del} address %s/%u label %s", ipconfig->interface, address, prefixlen, label); }