X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=iface.c;fp=iface.c;h=61d7b51f401bc0877cf0706f5006a0756a6b3aa8;hb=4de18a7015ed77eac277bee669d4c8d9dae60b89;hp=01f063702aba4fe5265e3b6fc011e40acc822f70;hpb=c77f4231ed850b90b9b6f337727e19b63418426f;p=catta diff --git a/iface.c b/iface.c index 01f0637..61d7b51 100644 --- a/iface.c +++ b/iface.c @@ -57,6 +57,11 @@ static void free_address(flxInterfaceMonitor *m, flxInterfaceAddress *a) { g_assert(a); g_assert(a->interface); + if (a->address.family == AF_INET) + a->interface->n_ipv4_addrs --; + else if (a->address.family == AF_INET6) + a->interface->n_ipv6_addrs --; + if (a->prev) a->prev->next = a->next; else @@ -75,6 +80,9 @@ static void free_interface(flxInterfaceMonitor *m, flxInterface *i) { while (i->addresses) free_address(m, i->addresses); + g_assert(i->n_ipv6_addrs == 0); + g_assert(i->n_ipv4_addrs == 0); + if (i->prev) i->prev->next = i->next; else @@ -143,9 +151,11 @@ static void callback(flxNetlink *nl, struct nlmsghdr *n, gpointer userdata) { if ((i = (flxInterface*) flx_interface_monitor_get_interface(m, ifinfomsg->ifi_index))) changed = 1; else { - i = g_new0(flxInterface, 1); + i = g_new(flxInterface, 1); + i->name = NULL; i->index = ifinfomsg->ifi_index; i->addresses = NULL; + i->n_ipv4_addrs = i->n_ipv6_addrs = 0; if ((i->next = m->interfaces)) i->next->prev = i; m->interfaces = i; @@ -223,6 +233,7 @@ static void callback(flxNetlink *nl, struct nlmsghdr *n, gpointer userdata) { memcpy(raddr.data, RTA_DATA(a), RTA_PAYLOAD(a)); raddr_valid = 1; + break; default: @@ -232,6 +243,7 @@ static void callback(flxNetlink *nl, struct nlmsghdr *n, gpointer userdata) { a = RTA_NEXT(a, l); } + if (!raddr_valid) return; @@ -241,8 +253,14 @@ static void callback(flxNetlink *nl, struct nlmsghdr *n, gpointer userdata) { if ((addr = get_address(m, i, &raddr))) changed = 1; else { - addr = g_new0(flxInterfaceAddress, 1); + addr = g_new(flxInterfaceAddress, 1); addr->address = raddr; + + if (raddr.family == AF_INET) + i->n_ipv4_addrs++; + else if (raddr.family == AF_INET6) + i->n_ipv6_addrs++; + addr->interface = i; if ((addr->next = i->addresses)) addr->next->prev = addr;