From 60a3ae19c5eb180df30a7d259c092c63ddae52ea Mon Sep 17 00:00:00 2001 From: Petr Mensik Date: Tue, 9 Jul 2019 14:05:59 +0200 Subject: [PATCH] Cleanup interfaces no longer available Clean addresses and interfaces not found after enumerate. Free unused records to speed up checking active interfaces and reduce used memory. --- src/network.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/network.c b/src/network.c index 62d32c9..90fb3ae 100644 --- a/src/network.c +++ b/src/network.c @@ -533,7 +533,30 @@ static int iface_allowed_v4(struct in_addr local, int if_index, char *label, return iface_allowed((struct iface_param *)vparam, if_index, label, &addr, netmask, prefix, 0); } - + +/* + * Clean old interfaces no longer found. + */ +static void clean_interfaces() +{ + struct irec *iface; + struct irec **up = &daemon->interfaces; + + for (iface = *up; iface; iface = *up) + { + if (!iface->found && !iface->done) + { + *up = iface->next; + free(iface->name); + free(iface); + } + else + { + up = &iface->next; + } + } +} + int enumerate_interfaces(int reset) { static struct addrlist *spare = NULL; @@ -631,6 +654,7 @@ int enumerate_interfaces(int reset) in OPT_CLEVERBIND mode, that at listener will just disappear after a call to enumerate_interfaces, this is checked OK on all calls. */ struct listener *l, *tmp, **up; + int freed = 0; for (up = &daemon->listeners, l = daemon->listeners; l; l = tmp) { @@ -660,10 +684,14 @@ int enumerate_interfaces(int reset) close(l->tftpfd); free(l); + freed = 1; } } + + if (freed) + clean_interfaces(); } - + errno = errsave; spare = param.spare;