Repository : ssh://git@open-mesh.org/batctl
On branch : master
commit 9aab73fe209aa9c5fcfbb1ed029d7dd5bbed4325 Author: Sven Eckelmann sven@narfation.org Date: Sun Jan 22 13:07:47 2017 +0100
batctl: tcpdump: Free resources on SIG(TERM|INT)
The cleanup code for dump interfaces and bathosts is only called on errors during the initialization of the dump interfaces. But it should also be used when the program exits normally.
Signed-off-by: Sven Eckelmann sven@narfation.org Signed-off-by: Simon Wunderlich sw@simonwunderlich.de
9aab73fe209aa9c5fcfbb1ed029d7dd5bbed4325 tcpdump.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/tcpdump.c b/tcpdump.c index 586a2ca..92171a3 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -39,6 +39,7 @@ #include <netinet/icmp6.h> #include <netinet/if_ether.h> #include <net/ethernet.h> +#include <signal.h> #include <stddef.h> #include <stdint.h> #include <sys/select.h> @@ -1189,6 +1190,20 @@ free_dumpif: return NULL; }
+static volatile sig_atomic_t is_aborted = 0; + +static void sig_handler(int sig) +{ + switch (sig) { + case SIGINT: + case SIGTERM: + is_aborted = 1; + break; + default: + break; + } +} + int tcpdump(int argc, char **argv) { struct timeval tv; @@ -1242,6 +1257,9 @@ int tcpdump(int argc, char **argv)
bat_hosts_init(read_opt);
+ signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + /* init interfaces list */ INIT_LIST_HEAD(&dump_if_list); FD_ZERO(&wait_sockets); @@ -1259,7 +1277,7 @@ int tcpdump(int argc, char **argv) found_args++; }
- while (1) { + while (!is_aborted) {
memcpy(&tmp_wait_sockets, &wait_sockets, sizeof(fd_set));