X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Foping.c;h=d88edbd9b59cf381088d7bc9f7e990da9a7b2c25;hb=a03647c685031c4e3ddadcced520524cf4699b58;hp=94515c2c2005fe7300ebd2e57cb920d5da7fec99;hpb=dbfc310d1305d1c6a6e3d6eaa9091ab7d4145c26;p=liboping.git diff --git a/src/oping.c b/src/oping.c index 94515c2..d88edbd 100644 --- a/src/oping.c +++ b/src/oping.c @@ -209,6 +209,7 @@ static int opt_show_graph = 1; static int opt_utf8 = 0; #endif static char *opt_outfile = NULL; +static int opt_bell = 0; static int host_num = 0; static FILE *outfile = NULL; @@ -292,6 +293,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); @@ -396,6 +402,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); @@ -408,9 +415,25 @@ static int ping_initialize_contexts (pingobj_t *ping) /* {{{ */ ping_context_t *context; size_t buffer_size; + 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 (int i = 0; ihistory_by_time[i] = -1; + } + buffer_size = sizeof (context->host); ping_iterator_get_info (iter, PING_INFO_HOSTNAME, context->host, &buffer_size); @@ -652,7 +675,7 @@ static int read_options (int argc, char **argv) /* {{{ */ while (1) { - optchar = getopt (argc, argv, "46c:hi:I:t:Q:f:D:Z:O:P:m:w:" + optchar = getopt (argc, argv, "46c:hi:I:t:Q:f:D:Z:O:P:m:w:b" #if USE_NCURSES "uUg:" #endif @@ -754,6 +777,7 @@ static int read_options (int argc, char **argv) /* {{{ */ free (opt_outfile); opt_outfile = strdup (optarg); } + break; case 'P': { @@ -790,6 +814,9 @@ static int read_options (int argc, char **argv) /* {{{ */ opt_utf8 = 1; break; #endif + case 'b': + opt_bell = 1; + break; case 'Z': { @@ -994,7 +1021,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; @@ -1041,6 +1068,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; @@ -1212,12 +1243,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); @@ -1253,7 +1278,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) @@ -1327,6 +1352,31 @@ static int check_resize (pingobj_t *ping) /* {{{ */ else if (opt_show_graph > 0) opt_show_graph++; } + else if (key == 'a') + { + char host[80]; + + 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_initialize_contexts(ping); + } + } } if (need_resize) @@ -1575,6 +1625,13 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */ #if USE_NCURSES } #endif + if (opt_bell) { +#if USE_NCURSES + beep(); +#else + HOST_PRINTF ("\a"); +#endif + } } else /* if (!(latency > 0.0)) */ { @@ -1606,12 +1663,12 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */ if (clock_gettime (CLOCK_REALTIME, &ts) == 0) { - double t = ((double) ts.tv_sec) + (((double) ts.tv_nsec) / 1000000.0); + double t = ((double) ts.tv_sec) + (((double) ts.tv_nsec) / 1000000000.0); if ((sequence % 32) == 0) fprintf (outfile, "#time,host,latency[ms]\n"); - fprintf (outfile, "%.3f \"%s\" %.2f\n", t, context->host, latency); + fprintf (outfile, "%.3f,\"%s\",%.2f\n", t, context->host, latency); } }