diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..914ee49 --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ + Copyright (c) 2012-2015 Matthieu Herrb + + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/configure.ac b/configure.ac index 8f24152..f4e1c5d 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ -AC_PREREQ([2.65]) -AC_INIT([echoc], 0.5, [https://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/echoc], echoc) +AC_PREREQ([2.71]) +AC_INIT([echoc],[0.6.99],[https://gitlab.laas.fr/matthieu/echoc],[echoc]) AM_INIT_AUTOMAKE([foreign dist-bzip2]) AC_CONFIG_MACRO_DIR([m4]) AC_PROG_CC @@ -7,4 +7,5 @@ AC_PROG_CC AC_CHECK_HEADERS([bsd/stdlib.h]) AC_SEARCH_LIBS(strtonum, [bsd]) -AC_OUTPUT([Makefile]) +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/echoc.c b/echoc.c index a337cfe..269f4f6 100644 --- a/echoc.c +++ b/echoc.c @@ -37,6 +37,7 @@ int sock = -1; int verbose = 0; +int aborting = 0; struct sockaddr *server; socklen_t serverlen; unsigned int seq = 0; @@ -48,11 +49,16 @@ usage(void) errx(2, "usage: echoc [-c nbr][-d][-i ms][-l len][-p port][-t ms][-v] server"); } +static void +sigint_handler(int unused) +{ + aborting = 1; +} + static void send_packet(int unused) { - char *buf; - + char *buf; buf = malloc(len); if (buf == NULL) return; @@ -83,7 +89,7 @@ main(int argc, char *argv[]) struct tm *tm; struct pollfd pfd[1]; socklen_t addrlen; - long interval = 100; /* default interval (ms) */ + long interval = 100; /* default interval (ms) */ long timeout = 500; /* default timeout (ms) */ int ch; int nfds, received = 0; @@ -161,18 +167,6 @@ main(int argc, char *argv[]) disconnected = 0; memset(&client, 0, sizeof(client)); - /* timer values */ - itv.it_interval.tv_usec = interval*1000; - itv.it_interval.tv_sec = 0; - itv.it_value.tv_usec = interval*1000; - itv.it_value.tv_sec = 0; - if (setitimer(ITIMER_REAL, &itv, NULL) == -1) - err(2, "setitimer"); - - signal(SIGALRM, send_packet); - - gettimeofday(&last_ts, NULL); - recvbuf = malloc(len); if (recvbuf == NULL) err(2, "malloc receive buffer"); @@ -181,14 +175,30 @@ main(int argc, char *argv[]) /* set the DF flag ? */ if (nofragment) ch = IP_PMTUDISC_DO; - else + else ch = IP_PMTUDISC_DONT; if (setsockopt(sock, IPPROTO_IP, IP_MTU_DISCOVER, &ch, sizeof(ch)) < 0) - err(2, "setsockopt IP_MTU_DISCOVER"); + err(2, "setsockopt IP_MTU_DISCOVER"); #endif - while (1) { + signal(SIGALRM, send_packet); + signal(SIGINT, sigint_handler); + + /* timer values */ + itv.it_interval.tv_usec = interval*1000; + itv.it_interval.tv_sec = 0; + itv.it_value.tv_usec = interval*1000; + itv.it_value.tv_sec = 0; + if (setitimer(ITIMER_REAL, &itv, NULL) == -1) + err(2, "setitimer"); + + gettimeofday(&last_ts, NULL); + tm = localtime((time_t *)&last_ts.tv_sec); + strftime(date, sizeof(date), "%F %T", tm); + printf("%s.%06ld: starting\n", date, last_ts.tv_usec); + + while (!aborting) { /* poll() loop to handle interruptions by SIGALRM */ - while (1) { + while (!aborting) { pfd[0].fd = sock; pfd[0].events = POLLIN; nfds = poll(pfd, 1, timeout); @@ -204,6 +214,8 @@ main(int argc, char *argv[]) break; } } + if (aborting) + break; if ((nfds == 0)) { if (verbose) printf("%d packet(s) dropped in %ld.%06ld s\n", @@ -228,7 +240,7 @@ main(int argc, char *argv[]) if (verbose && (serverlen != addrlen || memcmp(&client, server, addrlen) != 0)) { if ((error = getnameinfo((struct sockaddr *)&client, - addrlen, name, sizeof(name), + addrlen, name, sizeof(name), NULL, 0, NI_DGRAM)) != 0) { warnx("%s", gai_strerror(error)); } else { @@ -259,6 +271,12 @@ main(int argc, char *argv[]) } } } + if (aborting) { + gettimeofday(&now, NULL); + tm = localtime((time_t *)&now.tv_sec); + strftime(date, sizeof(date), "%F %T", tm); + printf("%s.%06ld: aborting\n", date, now.tv_usec); + } close(sock); exit(0); }