Merge branch 'bp/exit'
authorFlorian Forster <ff@octo.it>
Thu, 25 Sep 2014 00:10:54 +0000 (17:10 -0700)
committerFlorian Forster <ff@octo.it>
Thu, 25 Sep 2014 00:10:54 +0000 (17:10 -0700)
Conflicts:
src/mans/oping.pod
src/oping.c

1  2 
src/mans/oping.pod
src/oping.c

@@@ -166,11 -166,18 +166,23 @@@ I<Explicit Congestion Notification> (EC
  I<Type of Service> (ToS) aliases were used to specify the bits of outgoing
  packets.
  
 +=item B<-u>|B<-U>
 +
 +I<noping only> 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<percent>
+ If any hosts have a drop rate higher than I<percent>, where I<percent> 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<all> replies for I<all>
+ hosts have been received.
+ The exit status will indicate the number of hosts with more than I<percent>
+ packets lost, up to a number of 255 failing hosts.
  =back
  
  =head1 COLORS
diff --cc src/oping.c
@@@ -164,9 -121,7 +164,10 @@@ 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
  
  static int host_num = 0;
  
@@@ -311,9 -266,8 +312,11 @@@ static void usage_exit (const char *nam
                        "  -I srcaddr   source address\n"
                        "  -D device    outgoing interface name\n"
                        "  -f filename  filename to read hosts from\n"
 +#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 <octo@verplant.org>\n"
@@@ -516,11 -470,7 +519,11 @@@ static int read_options (int argc, cha
  
        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:");
++              optchar = getopt (argc, argv, "46c:hi:I:t:Q:f:D:Z:"
 +#if USE_NCURSES
 +                              "uU"
 +#endif
 +                              );
  
                if (optchar == -1)
                        break;
                                set_opt_send_qos (optarg);
                                break;
  
 +#if USE_NCURSES
 +                      case 'u':
 +                              opt_utf8 = 2;
 +                              break;
 +                      case 'U':
 +                              opt_utf8 = 1;
 +                              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;