From e7849a9a333941be926d0ed03c545e988800fbd5 Mon Sep 17 00:00:00 2001 From: Laurent Ghigonis Date: Sun, 9 Jun 2013 23:29:36 +0200 Subject: libglouglou: add ggtrace, meant to be a complete commandline traceroute --- libglouglou/examples/ggtrace.c | 67 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 libglouglou/examples/ggtrace.c (limited to 'libglouglou') diff --git a/libglouglou/examples/ggtrace.c b/libglouglou/examples/ggtrace.c new file mode 100644 index 0000000..dd50fa9 --- /dev/null +++ b/libglouglou/examples/ggtrace.c @@ -0,0 +1,67 @@ +/* ggtrace - multifunction parallelized traceroute */ + +#include + +#if !defined(__OpenBSD__) +#define __USE_GNU +#define _GNU_SOURCE +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include /* for get_iface() and droppriv() */ +#include + +static void _cb_done(struct ggnet_traceroute_req *, void *); + +struct event_base *_ev_base; + +int +main(int argc, char *argv[]) +{ + struct ggnet_traceroute *ggtr; + struct ggnet_traceroute_req *req; + struct addr ip; + struct timeval tv; + + if (argc < 2) { + printf("usage: traceroute \n"); + exit(1); + } + addr_aton(argv[1], &ip); + + bzero(&tv, sizeof(struct timeval)); + tv.tv_sec = 10; + + _ev_base = event_base_new(); + + ggtr = ggnet_traceroute_new(_ev_base, get_iface(argv[1])); + droppriv("nobody", 1, NULL); /* bad practise, use dedicated user */ + req = ggnet_traceroute_trace_tcp_intrace(ggtr, &ip, 80, 1234, 0x8888, + _cb_done, NULL, NULL); + + event_base_loopexit(_ev_base, &tv); + event_base_dispatch(_ev_base); + + printf("REPORT for %s:\n%s\n", addr_ntoa(&ip), + ggnet_traceroute_report(req)); + + return 0; +} + +static void +_cb_done(struct ggnet_traceroute_req *req, void *data) +{ + printf("traceroute: done !\n"); + event_base_loopexit(_ev_base, NULL); +} -- cgit v1.2.3-59-g8ed1b