diff options
-rw-r--r-- | libglouglou/examples/traceroute.c | 25 | ||||
-rw-r--r-- | libglouglou/libggnet_traceroute.c | 15 | ||||
-rw-r--r-- | 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 <libglouglou.h> /* for get_iface() and droppriv() */ #include <libggnet_traceroute.h> -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 *); + |