From 9d90849359645ef14aff87a4bbef5e9639b0312e Mon Sep 17 00:00:00 2001 From: Laurent Ghigonis Date: Sat, 8 Jun 2013 16:57:38 +0200 Subject: libglouglou: traceroute report in lib --- libglouglou/examples/traceroute.c | 25 +++++++++---------------- libglouglou/libggnet_traceroute.c | 15 +++++++++++++++ libglouglou/libggnet_traceroute.h | 2 ++ 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/libglouglou/examples/traceroute.c b/libglouglou/examples/traceroute.c index a791b4d..5ee9a00 100644 --- a/libglouglou/examples/traceroute.c +++ b/libglouglou/examples/traceroute.c @@ -20,17 +20,15 @@ #include /* for get_iface() and droppriv() */ #include -static void _cb_traceroute(struct ggnet_traceroute_req *, void *); +static void _cb_done(struct ggnet_traceroute_req *, void *); struct event_base *_ev_base; -struct ggnet_traceroute_req *_route = NULL; -int _answer = 0; int main(int argc, char *argv[]) { struct ggnet_traceroute *ggtr; - struct ggnet_traceroute_hop *hop; + struct ggnet_traceroute_req *req; struct addr ip; struct timeval tv; @@ -47,26 +45,21 @@ main(int argc, char *argv[]) ggtr = ggnet_traceroute_new(_ev_base, get_iface(argv[1])); droppriv("nobody", 1, NULL); /* bad practise, use dedicated user */ - ggnet_traceroute_trace_tcp(ggtr, &ip, 80, _cb_traceroute, NULL, NULL); + req = ggnet_traceroute_trace_tcp(ggtr, &ip, 80, + _cb_done, NULL, NULL); event_base_loopexit(_ev_base, &tv); event_base_dispatch(_ev_base); - if (_answer) { - printf("%s:\n", addr_ntoa(&ip)); - TAILQ_FOREACH(hop, &_route->hops_list, entry) { - printf("%.2d: %s %s %.2f [XXX %p]\n", hop->ttl, addr_ntoa(&hop->ip), hop->answer, hop->delay, hop); - } - } else { - printf("no answer\n"); - } + printf("REPORT for %s:\n%s\n", addr_ntoa(&ip), + ggnet_traceroute_report(req)); + return 0; } static void -_cb_traceroute(struct ggnet_traceroute_req *route, void *data) +_cb_done(struct ggnet_traceroute_req *req, void *data) { - _route = route; - _answer = 1; + printf("traceroute: done !\n"); event_base_loopexit(_ev_base, NULL); } diff --git a/libglouglou/libggnet_traceroute.c b/libglouglou/libggnet_traceroute.c index bd5d76f..f3a04d0 100644 --- a/libglouglou/libggnet_traceroute.c +++ b/libglouglou/libggnet_traceroute.c @@ -228,6 +228,21 @@ ggnet_traceroute_cancel(struct ggnet_traceroute *ggtr, _req_free(req); } + +char * +ggnet_traceroute_report(struct ggnet_traceroute_req *req) { + struct ggnet_traceroute_hop *hop; + static char report[16384]; + static char *p; +#define left (sizeof(report) - (p - report)) + + p = report; + TAILQ_FOREACH(hop, &req->hops_list, entry) { + p += (u_char)snprintf(p, left, "%.2d: %s %s %.2f [XXX %p]\n", hop->ttl, addr_ntoa(&hop->ip), hop->answer, hop->delay, hop); + } + return report; +} + static void _req_free(struct ggnet_traceroute_req *req) { diff --git a/libglouglou/libggnet_traceroute.h b/libglouglou/libggnet_traceroute.h index 85af279..2507af8 100644 --- a/libglouglou/libggnet_traceroute.h +++ b/libglouglou/libggnet_traceroute.h @@ -102,3 +102,5 @@ struct ggnet_traceroute_req * void *); void ggnet_traceroute_cancel(struct ggnet_traceroute *, struct ggnet_traceroute_req *); +char *ggnet_traceroute_report(struct ggnet_traceroute_req *); + -- cgit v1.2.3-59-g8ed1b