/* simple TCP traceroute example, using libglouglou */ #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; int verbose = 0; 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]), verbose); droppriv("nobody", 1, NULL); /* bad practise, use dedicated user */ req = ggnet_traceroute_trace_tcp(ggtr, &ip, 80, _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); }