From: Florian Forster Date: Thu, 25 Sep 2014 00:10:54 +0000 (-0700) Subject: Merge branch 'bp/exit' X-Git-Tag: liboping-1.7.0~4 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=8557f59b71eb64324dcbb0e470bad9ca5958b2f0;hp=4710e5477bfa3902b5f5600475ea21c44fabf446;p=liboping.git Merge branch 'bp/exit' Conflicts: src/mans/oping.pod src/oping.c --- diff --git a/src/mans/oping.pod b/src/mans/oping.pod index aedb728..b6ce0b2 100644 --- a/src/mans/oping.pod +++ b/src/mans/oping.pod @@ -171,6 +171,18 @@ packets. I B<-u> forces UTF-8 output, B<-U> disables UTF-8 output. If neither is given, the codeset is automatically determined from the locale. +=item B<-Z> I + +If any hosts have a drop rate higher than I, where I is a +number between zero and 100 inclusively, exit with a non-zero exit status. +Since it is not possible to have a higher drop rate than 100%, passing this +limit will effectively disable the feature (the default). Setting the option to +zero means that the exit status will only be zero if I replies for I +hosts have been received. + +The exit status will indicate the number of hosts with more than I +packets lost, up to a number of 255 failing hosts. + =back =head1 COLORS diff --git a/src/oping.c b/src/oping.c index b3beeb0..6a82c59 100644 --- a/src/oping.c +++ b/src/oping.c @@ -164,6 +164,7 @@ static char *opt_filename = NULL; static int opt_count = -1; static int opt_send_ttl = 64; static uint8_t opt_send_qos = 0; +static double opt_exit_status_threshold = 1.0; #if USE_NCURSES static int opt_utf8 = 0; #endif @@ -314,6 +315,8 @@ static void usage_exit (const char *name, int status) /* {{{ */ #if USE_NCURSES " -u / -U force / disable UTF-8 output\n" #endif + " -Z percent Exit with non-zero exit status if more than this percentage of\n" + " probes timed out. (default: never)\n" "\noping "PACKAGE_VERSION", http://verplant.org/liboping/\n" "by Florian octo Forster \n" @@ -516,7 +519,7 @@ static int read_options (int argc, char **argv) /* {{{ */ while (1) { - optchar = getopt (argc, argv, "46c:hi:I:t:Q:f:D:" + optchar = getopt (argc, argv, "46c:hi:I:t:Q:f:D:Z:" #if USE_NCURSES "uU" #endif @@ -600,6 +603,24 @@ static int read_options (int argc, char **argv) /* {{{ */ break; #endif + case 'Z': + { + char *endptr = NULL; + double tmp; + + errno = 0; + tmp = strtod (optarg, &endptr); + if ((errno != 0) || (endptr == NULL) || (*endptr != 0) || (tmp < 0.0) || (tmp > 100.0)) + { + fprintf (stderr, "Ignoring invalid -Z argument: %s\n", optarg); + fprintf (stderr, "The \"-Z\" option requires a numeric argument between 0 and 100.\n"); + } + else + opt_exit_status_threshold = tmp / 100.0; + + break; + } + case 'h': usage_exit (argv[0], 0); break; @@ -793,7 +814,7 @@ static int update_stats_from_context (ping_context_t *ctx, pingobj_iter_t *iter) average = context_get_average (ctx); deviation = context_get_stddev (ctx); - + mvwprintw (ctx->window, /* y = */ 2, /* x = */ 2, "rtt min/avg/max/sdev = %.3f/%.3f/%.3f/%.3f ms", ctx->latency_min, @@ -1126,9 +1147,13 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */ #endif } /* }}} void update_host_hook */ +/* Prints statistics for each host, cleans up the contexts and returns the + * number of hosts which failed to return more than the fraction + * opt_exit_status_threshold of pings. */ static int post_loop_hook (pingobj_t *ping) /* {{{ */ { pingobj_iter_t *iter; + int failure_count = 0; #if USE_NCURSES endwin (); @@ -1148,6 +1173,13 @@ static int post_loop_hook (pingobj_t *ping) /* {{{ */ context_get_packet_loss (context), context->latency_total); + { + double pct_failed = 1.0 - (((double) context->req_rcvd) + / ((double) context->req_sent)); + if (pct_failed > opt_exit_status_threshold) + failure_count++; + } + if (context->req_rcvd != 0) { double average; @@ -1167,7 +1199,7 @@ static int post_loop_hook (pingobj_t *ping) /* {{{ */ context_destroy (context); } - return (0); + return (failure_count); } /* }}} int post_loop_hook */ int main (int argc, char **argv) /* {{{ */ @@ -1461,11 +1493,19 @@ int main (int argc, char **argv) /* {{{ */ opt_count--; } /* while (opt_count != 0) */ - post_loop_hook (ping); + /* Returns the number of failed hosts according to -Z. */ + status = post_loop_hook (ping); ping_destroy (ping); - return (0); + if (status == 0) + exit (EXIT_SUCCESS); + else + { + if (status > 255) + status = 255; + exit (status); + } } /* }}} int main */ /* vim: set fdm=marker : */