diff options
author | Laurent Ghigonis <laurent@p1sec.com> | 2013-06-09 23:29:36 +0200 |
---|---|---|
committer | Laurent Ghigonis <laurent@p1sec.com> | 2013-06-09 23:29:36 +0200 |
commit | e7849a9a333941be926d0ed03c545e988800fbd5 (patch) | |
tree | c6bf74e33770d9893d5bf1f6cf78c94b8241d076 | |
parent | libglouglou: traceroute TCP intrace mode (diff) | |
download | glouglou-e7849a9a333941be926d0ed03c545e988800fbd5.tar.xz glouglou-e7849a9a333941be926d0ed03c545e988800fbd5.zip |
libglouglou: add ggtrace, meant to be a complete commandline traceroute
-rw-r--r-- | libglouglou/examples/ggtrace.c | 67 |
1 files changed, 67 insertions, 0 deletions
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 <sys/types.h> + +#if !defined(__OpenBSD__) +#define __USE_GNU +#define _GNU_SOURCE +#endif + +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> + +#include <pwd.h> +#include <grp.h> +#include <string.h> +#include <err.h> + +#include <libglouglou.h> /* for get_iface() and droppriv() */ +#include <libggnet_traceroute.h> + +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 <ip>\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); +} |