src/oping.c: Implement the "-O" option.
authorFlorian Forster <ff@octo.it>
Mon, 27 Jun 2016 06:42:12 +0000 (08:42 +0200)
committerFlorian Forster <ff@octo.it>
Mon, 27 Jun 2016 06:42:12 +0000 (08:42 +0200)
This new option allows to write RTT measurements to a CSV file for later
reporting.

src/mans/oping.pod
src/oping.c
src/oping.h

index b609414..425bdca 100644 (file)
@@ -31,7 +31,7 @@ supports colors.
 
 =item B<-4>
 
-Force the use of IPv4. 
+Force the use of IPv4.
 
 =item B<-6>
 
@@ -85,6 +85,12 @@ real user ID (as returned by L<getuid(2)>) and the effective user ID (as
 returned by L<geteuid(2)>) differ, the only argument allowed for this option is
 "-" (i.e. standard input).
 
+=item B<-O> I<filename>
+
+Write measurements in I<Comma Separated Values> (CSV) format to I<filename>.
+This option writes three columns per row: wall clock time in (fractional)
+seconds since epoch, hostname and the round trip time in milliseconds.
+
 =item B<-Q> I<qos>
 
 Specify the I<Quality of Service> (QoS) for outgoing packets. This is a
index 53602d3..94515c2 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * Object oriented C module to send ICMP and ICMPv6 `echo's.
- * Copyright (C) 2006-2014  Florian octo Forster <ff at octo.it>
+ * Copyright (C) 2006-2016  Florian octo Forster <ff at octo.it>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -208,8 +208,10 @@ static double  opt_exit_status_threshold = 1.0;
 static int     opt_show_graph = 1;
 static int     opt_utf8       = 0;
 #endif
+static char   *opt_outfile    = NULL;
 
-static int host_num = 0;
+static int host_num  = 0;
+static FILE *outfile = NULL;
 
 #if USE_NCURSES
 static WINDOW *main_win = NULL;
@@ -439,7 +441,8 @@ static void usage_exit (const char *name, int status) /* {{{ */
                        "  -I srcaddr   source address\n"
                        "  -D device    outgoing interface name\n"
                        "  -m mark      mark to set on outgoing packets\n"
-                       "  -f filename  filename to read hosts from\n"
+                       "  -f filename  read hosts from <filename>\n"
+                       "  -O filename  write RTT measurements to <filename>\n"
 #if USE_NCURSES
                        "  -u / -U      force / disable UTF-8 output\n"
                        "  -g graph     graph type to draw\n"
@@ -649,7 +652,7 @@ static int read_options (int argc, char **argv) /* {{{ */
 
        while (1)
        {
-               optchar = getopt (argc, argv, "46c:hi:I:t:Q:f:D:Z:P:m:w:"
+               optchar = getopt (argc, argv, "46c:hi:I:t:Q:f:D:Z:O:P:m:w:"
 #if USE_NCURSES
                                "uUg:"
 #endif
@@ -746,6 +749,12 @@ static int read_options (int argc, char **argv) /* {{{ */
                                set_opt_send_qos (optarg);
                                break;
 
+                       case 'O':
+                               {
+                                       free (opt_outfile);
+                                       opt_outfile = strdup (optarg);
+                               }
+
                        case 'P':
                                {
                                        double new_percentile;
@@ -1591,6 +1600,21 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */
 #endif
        }
 
+       if (outfile != NULL)
+       {
+               struct timespec ts = { 0, 0 };
+
+               if (clock_gettime (CLOCK_REALTIME, &ts) == 0)
+               {
+                       double t = ((double) ts.tv_sec) + (((double) ts.tv_nsec) / 1000000.0);
+
+                       if ((sequence % 32) == 0)
+                               fprintf (outfile, "#time,host,latency[ms]\n");
+
+                       fprintf (outfile, "%.3f \"%s\" %.2f\n", t, context->host, latency);
+               }
+       }
+
 #if USE_NCURSES
        update_stats_from_context (context, iter);
        wrefresh (main_win);
@@ -1890,6 +1914,17 @@ int main (int argc, char **argv) /* {{{ */
        saved_set_uid = (uid_t) -1;
 #endif
 
+       if (opt_outfile != NULL)
+       {
+               outfile = fopen (opt_outfile, "a");
+               if (outfile == NULL)
+               {
+                       fprintf (stderr, "opening \"%s\" failed: %s\n",
+                                opt_outfile, strerror (errno));
+                       exit (EXIT_FAILURE);
+               }
+       }
+
        ping_initialize_contexts (ping);
 
        if (i == 0)
@@ -1976,6 +2011,12 @@ int main (int argc, char **argv) /* {{{ */
 
        ping_destroy (ping);
 
+       if (outfile != NULL)
+       {
+               fclose (outfile);
+               outfile = NULL;
+       }
+
        if (status == 0)
                exit (EXIT_SUCCESS);
        else
index e5bc5fa..1976782 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * Object oriented C module to send ICMP and ICMPv6 `echo's.
- * Copyright (C) 2006-2011  Florian octo Forster <ff at octo.it>
+ * Copyright (C) 2006-2016  Florian octo Forster <ff at octo.it>
  *
  * This library is free software; you can redistribute it and/or modify it
  * under the terms of the GNU Lesser General Public License as published by the