aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2013-06-08 16:57:38 +0200
committerLaurent Ghigonis <laurent@p1sec.com>2013-06-08 16:57:38 +0200
commit9d90849359645ef14aff87a4bbef5e9639b0312e (patch)
tree6477bc606c69067214fb0af01d029d5df724a786
parentlibglouglou: traceroute delay (diff)
downloadglouglou-9d90849359645ef14aff87a4bbef5e9639b0312e.tar.xz
glouglou-9d90849359645ef14aff87a4bbef5e9639b0312e.zip
libglouglou: traceroute report in lib
-rw-r--r--libglouglou/examples/traceroute.c25
-rw-r--r--libglouglou/libggnet_traceroute.c15
-rw-r--r--libglouglou/libggnet_traceroute.h2
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 *);
+