Merge remote-tracking branch 'github/pr/11'
authorFlorian Forster <ff@octo.it>
Tue, 9 May 2017 06:19:57 +0000 (08:19 +0200)
committerFlorian Forster <ff@octo.it>
Tue, 9 May 2017 06:19:57 +0000 (08:19 +0200)
.travis.yml [new file with mode: 0644]
bindings/perl/Oping.xs
configure.ac
src/liboping.c
src/mans/liboping.pod
src/mans/oping.pod
src/mans/ping_iterator_count.pod [new file with mode: 0644]
src/oping.c
src/oping.h

diff --git a/.travis.yml b/.travis.yml
new file mode 100644 (file)
index 0000000..755a873
--- /dev/null
@@ -0,0 +1,11 @@
+dist: trusty
+sudo: false
+
+language: c
+compiler:
+  - clang
+  - gcc
+script:
+  - autoreconf -fi
+  - ./configure
+  - make all
index c88e3dc..5d8fa40 100644 (file)
@@ -134,6 +134,14 @@ _ping_iterator_next (iter)
        OUTPUT:
                RETVAL
 
+int
+_ping_iterator_count (obj)
+       pingobj_t *obj
+       CODE:
+               RETVAL = ping_iterator_count (obj);
+       OUTPUT:
+               RETVAL
+
 double
 _ping_iterator_get_latency (iter)
        pingobj_iter_t *iter
index 60138fc..872e89e 100644 (file)
@@ -23,9 +23,9 @@ AC_SUBST(LIBOPING_MINOR)
 AC_SUBST(LIBOPING_PATCH)
 
 # ABI version
-LIBOPING_CURRENT=2
-LIBOPING_REVISION=11
-LIBOPING_AGE=2
+LIBOPING_CURRENT=3
+LIBOPING_REVISION=0
+LIBOPING_AGE=3
 AC_SUBST(LIBOPING_CURRENT)
 AC_SUBST(LIBOPING_REVISION)
 AC_SUBST(LIBOPING_AGE)
@@ -50,7 +50,8 @@ AC_ARG_VAR(PERL, [Perl interpreter command])
 LT_INIT([dlopen])
 
 # pkg-config interface
-PKG_INSTALLDIR
+# PKG_INSTALLDIR is only available for pkg-config >= 0.27
+m4_ifdef([PKG_INSTALLDIR], [PKG_INSTALLDIR], [])
 
 AC_ARG_WITH(pkgconfigdir,
            AC_HELP_STRING([--with-pkgconfigdir], [Use the specified pkgconfig dir (default is libdir/pkgconfig)]),
index f4cf614..b6c80f2 100644 (file)
@@ -1801,6 +1801,20 @@ pingobj_iter_t *ping_iterator_next (pingobj_iter_t *iter)
        return ((pingobj_iter_t *) iter->next);
 }
 
+int ping_iterator_count (pingobj_t *obj)
+{
+       if (obj == NULL)
+               return 0;
+
+       int count = 0;
+       pingobj_iter_t *iter = obj->head;
+       while (iter) {
+               count++;
+               iter = iter->next;
+       }
+       return count;
+}
+
 int ping_iterator_get_info (pingobj_iter_t *iter, int info,
                void *buffer, size_t *buffer_len)
 {
index c36a89c..7eb987e 100644 (file)
@@ -69,6 +69,7 @@ L<ping_setopt(3)>,
 L<ping_host_add(3)>,
 L<ping_send(3)>,
 L<ping_get_error(3)>,
+L<ping_iterator_count(3)>,
 L<ping_iterator_get(3)>,
 L<ping_iterator_get_info(3)>,
 L<ping_iterator_get_context(3)>
index f1e0807..b73d2b8 100644 (file)
@@ -318,6 +318,12 @@ RTTs within the 95th percentile are considered "moderately unusual" and are
 printed in yellow. RTTs above that are considered to be "unusual" and are
 printed in red.
 
+=head1 INTERACTIVE KEYBOARD CONTROLS
+
+When running I<noping>, the type of graph being displayed can be
+changed by using the B<g> key.  A new host can be added at any time
+with the B<a> key.
+
 =head1 SEE ALSO
 
 L<ping(8)>, L<http://fping.org/>, L<liboping(3)>
diff --git a/src/mans/ping_iterator_count.pod b/src/mans/ping_iterator_count.pod
new file mode 100644 (file)
index 0000000..ab6e3a1
--- /dev/null
@@ -0,0 +1,33 @@
+=head1 NAME
+
+ping_iterator_count - Count the number of hosts in a liboping object
+
+=head1 SYNOPSIS
+
+  #include <oping.h>
+
+  int ping_iterator_count (pingobj_t *obj);
+
+=head1 DESCRIPTION
+
+This functions is used to count the number of hosts currently associated
+with a liboping object.
+
+=head1 RETURN VALUE
+
+The B<ping_iterator_count> returns an integer number or zero if no host is
+associated with I<obj>.
+
+=head1 SEE ALSO
+
+L<ping_host_add(3)>,
+L<ping_iterator_get(3)>,
+L<ping_iterator_next(3)>,
+L<liboping(3)>
+
+=head1 AUTHOR
+
+liboping is written by Florian "octo" Forster E<lt>ff at octo.itE<gt>.
+Its homepage can be found at L<http://noping.cc/>.
+
+Copyright (c) 2005-2016 by Florian "octo" Forster.
index 528c90d..0b5c44e 100644 (file)
@@ -294,6 +294,11 @@ static void clean_history (ping_context_t *ctx) /* {{{ */
        memcpy (ctx->history_by_value, ctx->history_by_time,
                        sizeof (ctx->history_by_time));
 
+       /* Remove impossible values caused by adding a new host */
+       for (i = 0; i < ctx->history_size; i++)
+               if (ctx->history_by_value[i] < 0)
+                       ctx->history_by_value[i] = NAN;
+
        /* Sort all RTTs. */
        qsort (ctx->history_by_value, ctx->history_size, sizeof
                        (ctx->history_by_value[0]), compare_double);
@@ -398,6 +403,7 @@ static int ping_initialize_contexts (pingobj_t *ping) /* {{{ */
 {
        pingobj_iter_t *iter;
        int index;
+       size_t history_size = 0;
 
        if (ping == NULL)
                return (EINVAL);
@@ -409,10 +415,27 @@ static int ping_initialize_contexts (pingobj_t *ping) /* {{{ */
        {
                ping_context_t *context;
                size_t buffer_size;
+               int i;
+
+               context = ping_iterator_get_context(iter);
+
+               /* if this is a previously existing host, do not recreate it */
+               if (context != NULL)
+               {
+                       history_size = context->history_size;
+                       context->index = index++;
+                       continue;
+               }
 
                context = context_create ();
                context->index = index;
 
+               /* start new hosts at the same graph point as old hosts */
+               context->history_size = history_size;
+               context->history_index = history_size;
+               for (i = 0; i < history_size; i++)
+                       context->history_by_time[i] = -1;
+
                buffer_size = sizeof (context->host);
                ping_iterator_get_info (iter, PING_INFO_HOSTNAME, context->host, &buffer_size);
 
@@ -1000,7 +1023,7 @@ static int update_graph_boxplot (ping_context_t *ctx) /* {{{ */
 } /* }}} int update_graph_boxplot */
 
 static int update_graph_prettyping (ping_context_t *ctx, /* {{{ */
-               double latency, unsigned int sequence)
+               double latency)
 {
        size_t x;
        size_t x_max;
@@ -1047,6 +1070,10 @@ static int update_graph_prettyping (ping_context_t *ctx, /* {{{ */
                index = (history_offset + x) % ctx->history_size;
                latency = ctx->history_by_time[index];
 
+               if (latency < 0) {
+                       continue;
+               }
+
                if (latency >= 0.0)
                {
                        double ratio;
@@ -1218,12 +1245,6 @@ static int update_stats_from_context (ping_context_t *ctx, pingobj_iter_t *iter)
        ping_iterator_get_info (iter, PING_INFO_LATENCY,
                        &latency, &buffer_len);
 
-       unsigned int sequence = 0;
-       buffer_len = sizeof (sequence);
-       ping_iterator_get_info (iter, PING_INFO_SEQUENCE,
-                       &sequence, &buffer_len);
-
-
        if ((ctx == NULL) || (ctx->window == NULL))
                return (EINVAL);
 
@@ -1259,7 +1280,7 @@ static int update_stats_from_context (ping_context_t *ctx, pingobj_iter_t *iter)
        }
 
        if (opt_show_graph == 1)
-               update_graph_prettyping (ctx, latency, sequence);
+               update_graph_prettyping (ctx, latency);
        else if (opt_show_graph == 2)
                update_graph_histogram (ctx);
        else if (opt_show_graph == 3)
@@ -1303,6 +1324,8 @@ static int on_resize (pingobj_t *ping) /* {{{ */
 
                if (context->window != NULL)
                {
+                       werase (context->window);
+                       wrefresh (context->window);
                        delwin (context->window);
                        context->window = NULL;
                }
@@ -1333,6 +1356,30 @@ static int check_resize (pingobj_t *ping) /* {{{ */
                        else if (opt_show_graph > 0)
                                opt_show_graph++;
                }
+               else if (key == 'a')
+               {
+                       char host[NI_MAXHOST];
+
+                       wprintw (main_win, "New Host: ");
+                       echo ();
+                       wgetnstr (main_win, host, sizeof (host));
+                       noecho ();
+
+                       if (ping_host_add(ping, host) < 0)
+                       {
+                               const char *errmsg = ping_get_error (ping);
+
+                               wprintw (main_win, "Adding host `%s' failed: %s\n", host, errmsg);
+                       }
+                       else
+                       {
+                               /* FIXME - scroll main_win correctly so that old
+                                * data is still visible */
+                               need_resize = 1;
+                               host_num = ping_iterator_count(ping);
+                               ping_initialize_contexts(ping);
+                       }
+               }
        }
 
        if (need_resize)
index 1970ef2..50d11fb 100644 (file)
@@ -75,6 +75,7 @@ int ping_host_remove (pingobj_t *obj, const char *host);
 
 pingobj_iter_t *ping_iterator_get (pingobj_t *obj);
 pingobj_iter_t *ping_iterator_next (pingobj_iter_t *iter);
+int ping_iterator_count (pingobj_t *obj);
 
 #define PING_INFO_HOSTNAME  1
 #define PING_INFO_ADDRESS   2