aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2013-06-09 23:29:36 +0200
committerLaurent Ghigonis <laurent@p1sec.com>2013-06-09 23:29:36 +0200
commite7849a9a333941be926d0ed03c545e988800fbd5 (patch)
treec6bf74e33770d9893d5bf1f6cf78c94b8241d076
parentlibglouglou: traceroute TCP intrace mode (diff)
downloadglouglou-e7849a9a333941be926d0ed03c545e988800fbd5.tar.xz
glouglou-e7849a9a333941be926d0ed03c545e988800fbd5.zip
libglouglou: add ggtrace, meant to be a complete commandline traceroute
-rw-r--r--libglouglou/examples/ggtrace.c67
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);
+}