main.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /* include main1 */
  2. #include "udpcksum.h"
  3. /* DefinE global variables */
  4. struct sockaddr *dest, *local;
  5. struct sockaddr_in locallookup;
  6. socklen_t destlen, locallen;
  7. int datalink; /* from pcap_datalink(), in <net/bpf.h> */
  8. char *device; /* pcap device */
  9. pcap_t *pd; /* packet capture struct pointer */
  10. int rawfd; /* raw socket to write on */
  11. int snaplen = 200; /* amount of data to capture */
  12. int verbose;
  13. int zerosum; /* send UDP query with no checksum */
  14. static void usage(const char *);
  15. int
  16. main(int argc, char *argv[])
  17. {
  18. int c, lopt=0;
  19. char *ptr, localname[1024], *localport;
  20. struct addrinfo *aip;
  21. /* end main1 */
  22. /* include main2 */
  23. opterr = 0; /* don't want getopt() writing to stderr */
  24. while ( (c = getopt(argc, argv, "0i:l:v")) != -1) {
  25. switch (c) {
  26. case '0':
  27. zerosum = 1;
  28. break;
  29. case 'i':
  30. device = optarg; /* pcap device */
  31. break;
  32. case 'l': /* local IP address and port #: a.b.c.d.p */
  33. if ( (ptr = strrchr(optarg, '.')) == NULL)
  34. usage("invalid -l option");
  35. *ptr++ = 0; /* null replaces final period */
  36. localport = ptr; /* service name or port number */
  37. strncpy(localname, optarg, sizeof(localname));
  38. lopt = 1;
  39. break;
  40. case 'v':
  41. verbose = 1;
  42. break;
  43. case '?':
  44. usage("unrecognized option");
  45. }
  46. }
  47. /* end main2 */
  48. /* include main3 */
  49. if (optind != argc-2)
  50. usage("missing <host> and/or <serv>");
  51. /* 4convert destination name and service */
  52. aip = Host_serv(argv[optind], argv[optind+1], AF_INET, SOCK_DGRAM);
  53. dest = aip->ai_addr; /* don't freeaddrinfo() */
  54. destlen = aip->ai_addrlen;
  55. /*
  56. * Need local IP address for source IP address for UDP datagrams.
  57. * Can't specify 0 and let IP choose, as we need to know it for
  58. * the pseudoheader to calculate the UDP checksum.
  59. * If -l option supplied, then use those values; otherwise,
  60. * connect a UDP socket to the destination to determine the right
  61. * source address.
  62. */
  63. if (lopt) {
  64. /* 4convert local name and service */
  65. aip = Host_serv(localname, localport, AF_INET, SOCK_DGRAM);
  66. local = aip->ai_addr; /* don't freeaddrinfo() */
  67. locallen = aip->ai_addrlen;
  68. } else {
  69. int s;
  70. s = Socket(AF_INET, SOCK_DGRAM, 0);
  71. Connect(s, dest, destlen);
  72. /* kernel chooses correct local address for dest */
  73. locallen = sizeof(locallookup);
  74. local = (struct sockaddr *)&locallookup;
  75. Getsockname(s, local, &locallen);
  76. if (locallookup.sin_addr.s_addr == htonl(INADDR_ANY))
  77. err_quit("Can't determine local address - use -l\n");
  78. close(s);
  79. }
  80. open_output(); /* open output, either raw socket or libnet */
  81. open_pcap(); /* open packet capture device */
  82. setuid(getuid()); /* don't need superuser privileges anymore */
  83. Signal(SIGTERM, cleanup);
  84. Signal(SIGINT, cleanup);
  85. Signal(SIGHUP, cleanup);
  86. test_udp();
  87. cleanup(0);
  88. }
  89. /* end main3 */
  90. static void
  91. usage(const char *msg)
  92. {
  93. err_msg(
  94. "usage: udpcksum [ options ] <host> <serv>\n"
  95. "options: -0 send UDP datagram with checksum set to 0\n"
  96. " -i s packet capture device\n"
  97. " -l a.b.c.d.p local IP=a.b.c.d, local port=p\n"
  98. " -v verbose output"
  99. );
  100. if (msg[0] != 0)
  101. err_quit("%s", msg);
  102. exit(1);
  103. }