main.lc 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "trace.h"## 1 ##src/traceroute/main.c##
  2. struct proto proto_v4 = { icmpcode_v4, recv_v4, NULL, NULL, NULL, NULL, 0,## 2 ##src/traceroute/main.c##
  3. IPPROTO_ICMP, IPPROTO_IP, IP_TTL## 3 ##src/traceroute/main.c##
  4. };## 4 ##src/traceroute/main.c##
  5. #ifdef IPV6## 5 ##src/traceroute/main.c##
  6. struct proto proto_v6 = { icmpcode_v6, recv_v6, NULL, NULL, NULL, NULL, 0,## 6 ##src/traceroute/main.c##
  7. IPPROTO_ICMPV6, IPPROTO_IPV6, IPV6_UNICAST_HOPS## 7 ##src/traceroute/main.c##
  8. };## 8 ##src/traceroute/main.c##
  9. #endif## 9 ##src/traceroute/main.c##
  10. int datalen = sizeof(struct rec); /* defaults */## 10 ##src/traceroute/main.c##
  11. int max_ttl = 30;## 11 ##src/traceroute/main.c##
  12. int nprobes = 3;## 12 ##src/traceroute/main.c##
  13. u_short dport = 32768 + 666;## 13 ##src/traceroute/main.c##
  14. int## 14 ##src/traceroute/main.c##
  15. main(int argc, char **argv)## 15 ##src/traceroute/main.c##
  16. {## 16 ##src/traceroute/main.c##
  17. int c;## 17 ##src/traceroute/main.c##
  18. struct addrinfo *ai;## 18 ##src/traceroute/main.c##
  19. opterr = 0; /* don't want getopt() writing to stderr */## 19 ##src/traceroute/main.c##
  20. while ((c = getopt(argc, argv, "m:v")) != -1) {## 20 ##src/traceroute/main.c##
  21. switch (c) {## 21 ##src/traceroute/main.c##
  22. case 'm':## 22 ##src/traceroute/main.c##
  23. if ((max_ttl = atoi(optarg)) <= 1)## 23 ##src/traceroute/main.c##
  24. err_quit("invalid -m value");## 24 ##src/traceroute/main.c##
  25. break;## 25 ##src/traceroute/main.c##
  26. case 'v':## 26 ##src/traceroute/main.c##
  27. verbose++;## 27 ##src/traceroute/main.c##
  28. break;## 28 ##src/traceroute/main.c##
  29. case '?':## 29 ##src/traceroute/main.c##
  30. err_quit("unrecognized option: %c", c);## 30 ##src/traceroute/main.c##
  31. }## 31 ##src/traceroute/main.c##
  32. }## 32 ##src/traceroute/main.c##
  33. if (optind != argc - 1)## 33 ##src/traceroute/main.c##
  34. err_quit("usage: traceroute [ -m <maxttl> -v ] <hostname>");## 34 ##src/traceroute/main.c##
  35. host = argv[optind];## 35 ##src/traceroute/main.c##
  36. pid = getpid();## 36 ##src/traceroute/main.c##
  37. Signal(SIGALRM, sig_alrm);## 37 ##src/traceroute/main.c##
  38. ai = Host_serv(host, NULL, 0, 0);## 38 ##src/traceroute/main.c##
  39. printf("traceroute to %s (%s): %d hops max, %d data bytes\n",## 39 ##src/traceroute/main.c##
  40. ai->ai_canonname,## 40 ##src/traceroute/main.c##
  41. Sock_ntop_host(ai->ai_addr, ai->ai_addrlen), max_ttl, datalen);## 41 ##src/traceroute/main.c##
  42. /* initialize according to protocol */## 42 ##src/traceroute/main.c##
  43. if (ai->ai_family == AF_INET) {## 43 ##src/traceroute/main.c##
  44. pr = &proto_v4;## 44 ##src/traceroute/main.c##
  45. #ifdef IPV6## 45 ##src/traceroute/main.c##
  46. } else if (ai->ai_family == AF_INET6) {## 46 ##src/traceroute/main.c##
  47. pr = &proto_v6;## 47 ##src/traceroute/main.c##
  48. if (IN6_IS_ADDR_V4MAPPED## 48 ##src/traceroute/main.c##
  49. (&(((struct sockaddr_in6 *) ai->ai_addr)->sin6_addr)))## 49 ##src/traceroute/main.c##
  50. err_quit("cannot traceroute IPv4-mapped IPv6 address");## 50 ##src/traceroute/main.c##
  51. #endif## 51 ##src/traceroute/main.c##
  52. } else## 52 ##src/traceroute/main.c##
  53. err_quit("unknown address family %d", ai->ai_family);## 53 ##src/traceroute/main.c##
  54. pr->sasend = ai->ai_addr; /* contains destination address */## 54 ##src/traceroute/main.c##
  55. pr->sarecv = Calloc(1, ai->ai_addrlen);## 55 ##src/traceroute/main.c##
  56. pr->salast = Calloc(1, ai->ai_addrlen);## 56 ##src/traceroute/main.c##
  57. pr->sabind = Calloc(1, ai->ai_addrlen);## 57 ##src/traceroute/main.c##
  58. pr->salen = ai->ai_addrlen;## 58 ##src/traceroute/main.c##
  59. traceloop();## 59 ##src/traceroute/main.c##
  60. exit(0);## 60 ##src/traceroute/main.c##
  61. }## 61 ##src/traceroute/main.c##