From: Florian Forster Date: Tue, 14 Jan 2014 12:36:33 +0000 (+0100) Subject: ping_receive_all(): Return immediately when select(2) is interrupted. X-Git-Tag: liboping-1.7.0~6 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=7387822550ef3fc7ce41be58b858b2379f5b94dd;p=liboping.git ping_receive_all(): Return immediately when select(2) is interrupted. Previously the function would continue and only return when all hosts were received or a timeout occurred. This meant that hitting ^C would only stop "oping" after half a second or so. This this, oping also exits immediately. --- diff --git a/src/liboping.c b/src/liboping.c index 74122a8..40a0ba2 100644 --- a/src/liboping.c +++ b/src/liboping.c @@ -637,6 +637,9 @@ static int ping_receive_one (pingobj_t *obj, const pinghost_t *ph, return (0); } +/* Blocks until a packet was received from all hosts or the timeout is reached. + * When interrupted, (-EINTR) is returned. On error, -1 is returned. On + * success, returns zero. */ static int ping_receive_all (pingobj_t *obj) { fd_set read_fds; @@ -726,7 +729,8 @@ static int ping_receive_all (pingobj_t *obj) if ((status == -1) && (errno == EINTR)) { dprintf ("select was interrupted by signal..\n"); - continue; + ping_set_errno (obj, EINTR); + return (-EINTR); } else if (status < 0) { @@ -764,7 +768,7 @@ static int ping_receive_all (pingobj_t *obj) } /* while (1) */ return (ret); -} +} /* int ping_receive_all */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Sending functions: * @@ -1328,18 +1332,13 @@ int ping_setopt (pingobj_t *obj, int option, void *value) int ping_send (pingobj_t *obj) { - int ret; - if (obj == NULL) return (-1); if (ping_send_all (obj) < 0) return (-1); - if ((ret = ping_receive_all (obj)) < 0) - return (-2); - - return (ret); + return (ping_receive_all (obj)); } static pinghost_t *ping_host_search (pinghost_t *ph, const char *host) diff --git a/src/oping.c b/src/oping.c index 3cfe6d8..caf655f 100644 --- a/src/oping.c +++ b/src/oping.c @@ -1234,7 +1234,12 @@ int main (int argc, char **argv) /* {{{ */ return (1); } - if (ping_send (ping) < 0) + status = ping_send (ping); + if (status == -EINTR) + { + continue; + } + else if (status < 0) { fprintf (stderr, "ping_send failed: %s\n", ping_get_error (ping)); @@ -1267,14 +1272,13 @@ int main (int argc, char **argv) /* {{{ */ /* printf ("Sleeping for %i.%09li seconds\n", (int) ts_wait.tv_sec, ts_wait.tv_nsec); */ while ((status = nanosleep (&ts_wait, &ts_wait)) != 0) { - if (errno != EINTR) + if (errno == EINTR) { - perror ("nanosleep"); - break; + continue; } - else if (opt_count == 0) + else { - /* sigint */ + perror ("nanosleep"); break; } }