senddnsquery-libnet.lc 5.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "udpcksum.h"## 1 ##src/udpcksum/senddnsquery-libnet.c##
  2. #include <libnet.h>## 2 ##src/udpcksum/senddnsquery-libnet.c##
  3. /*## 3 ##src/udpcksum/senddnsquery-libnet.c##
  4. * Build a DNS A query for "a.root-servers.net" and write it to## 4 ##src/udpcksum/senddnsquery-libnet.c##
  5. * the raw socket.## 5 ##src/udpcksum/senddnsquery-libnet.c##
  6. */## 6 ##src/udpcksum/senddnsquery-libnet.c##
  7. /* include open_output_libnet */
  8. static libnet_t *l; /* libnet descriptor */## 7 ##src/udpcksum/senddnsquery-libnet.c##
  9. void## 8 ##src/udpcksum/senddnsquery-libnet.c##
  10. open_output(void)## 9 ##src/udpcksum/senddnsquery-libnet.c##
  11. {## 10 ##src/udpcksum/senddnsquery-libnet.c##
  12. char errbuf[LIBNET_ERRBUF_SIZE];## 11 ##src/udpcksum/senddnsquery-libnet.c##
  13. /* Initialize libnet, with an IPv4 raw socket. */## 12 ##src/udpcksum/senddnsquery-libnet.c##
  14. l = libnet_init(LIBNET_RAW4, NULL, errbuf);## 13 ##src/udpcksum/senddnsquery-libnet.c##
  15. if (l == NULL) {## 14 ##src/udpcksum/senddnsquery-libnet.c##
  16. err_quit("Can't initialize libnet: %s", errbuf);## 15 ##src/udpcksum/senddnsquery-libnet.c##
  17. }## 16 ##src/udpcksum/senddnsquery-libnet.c##
  18. }## 17 ##src/udpcksum/senddnsquery-libnet.c##
  19. /* end open_output_libnet */
  20. /* include send_dns_query_libnet */
  21. void## 18 ##src/udpcksum/senddnsquery-libnet.c##
  22. send_dns_query(void)## 19 ##src/udpcksum/senddnsquery-libnet.c##
  23. {## 20 ##src/udpcksum/senddnsquery-libnet.c##
  24. char qbuf[24], *ptr;## 21 ##src/udpcksum/senddnsquery-libnet.c##
  25. u_int16_t one;## 22 ##src/udpcksum/senddnsquery-libnet.c##
  26. int packet_size = LIBNET_UDP_H + LIBNET_DNSV4_H + 24;## 23 ##src/udpcksum/senddnsquery-libnet.c##
  27. static libnet_ptag_t ip_tag, udp_tag, dns_tag;## 24 ##src/udpcksum/senddnsquery-libnet.c##
  28. /* Build the query portion of the DNS packet. */## 25 ##src/udpcksum/senddnsquery-libnet.c##
  29. ptr = qbuf;## 26 ##src/udpcksum/senddnsquery-libnet.c##
  30. memcpy(ptr, "\001a\014root-servers\003net\000", 20);## 27 ##src/udpcksum/senddnsquery-libnet.c##
  31. ptr += 20;## 28 ##src/udpcksum/senddnsquery-libnet.c##
  32. one = htons(1);## 29 ##src/udpcksum/senddnsquery-libnet.c##
  33. memcpy(ptr, &one, 2); /* query type = A */## 30 ##src/udpcksum/senddnsquery-libnet.c##
  34. ptr += 2;## 31 ##src/udpcksum/senddnsquery-libnet.c##
  35. memcpy(ptr, &one, 2); /* query class = 1 (IP addr) */## 32 ##src/udpcksum/senddnsquery-libnet.c##
  36. /* Build the DNS packet. */## 33 ##src/udpcksum/senddnsquery-libnet.c##
  37. dns_tag = libnet_build_dnsv4(1234 /* identification */ ,## 34 ##src/udpcksum/senddnsquery-libnet.c##
  38. 0x0100 /* flags: recursion desired */ ,## 35 ##src/udpcksum/senddnsquery-libnet.c##
  39. 1 /* #questions */ , 0 /* #answer RRs */ ,## 36 ##src/udpcksum/senddnsquery-libnet.c##
  40. 0 /* #authority RRs */ ,## 37 ##src/udpcksum/senddnsquery-libnet.c##
  41. 0 /* #additional RRs */ ,## 38 ##src/udpcksum/senddnsquery-libnet.c##
  42. qbuf /* query */ ,## 39 ##src/udpcksum/senddnsquery-libnet.c##
  43. 24 /* length of query */ , l, dns_tag);## 40 ##src/udpcksum/senddnsquery-libnet.c##
  44. /* Build the UDP header. */## 41 ##src/udpcksum/senddnsquery-libnet.c##
  45. udp_tag = libnet_build_udp(((struct sockaddr_in *) local)->## 42 ##src/udpcksum/senddnsquery-libnet.c##
  46. sin_port /* source port */ ,## 43 ##src/udpcksum/senddnsquery-libnet.c##
  47. ((struct sockaddr_in *) dest)->## 44 ##src/udpcksum/senddnsquery-libnet.c##
  48. sin_port /* dest port */ ,## 45 ##src/udpcksum/senddnsquery-libnet.c##
  49. packet_size /* length */ , 0 /* checksum */ ,## 46 ##src/udpcksum/senddnsquery-libnet.c##
  50. NULL /* payload */ , 0 /* payload length */ ,## 47 ##src/udpcksum/senddnsquery-libnet.c##
  51. l, udp_tag);## 48 ##src/udpcksum/senddnsquery-libnet.c##
  52. /* Since we specified the checksum as 0, libnet will automatically */## 49 ##src/udpcksum/senddnsquery-libnet.c##
  53. /* calculate the udp checksum. Turn it off if the user doesn't want it */## 50 ##src/udpcksum/senddnsquery-libnet.c##
  54. if (zerosum)## 51 ##src/udpcksum/senddnsquery-libnet.c##
  55. if (libnet_toggle_checksum(l, udp_tag, LIBNET_OFF) < 0)## 52 ##src/udpcksum/senddnsquery-libnet.c##
  56. err_quit("turning off checksums: %s\n", libnet_geterror(l));## 53 ##src/udpcksum/senddnsquery-libnet.c##
  57. /* Build the IP header. */## 54 ##src/udpcksum/senddnsquery-libnet.c##
  58. ip_tag = libnet_build_ipv4(packet_size + LIBNET_IPV4_H /* len */,## 55 ##src/udpcksum/senddnsquery-libnet.c##
  59. 0 /* tos */, 0 /* IP ID */, 0 /* fragment */,## 56 ##src/udpcksum/senddnsquery-libnet.c##
  60. TTL_OUT /* ttl */, IPPROTO_UDP /* protocol */,## 57 ##src/udpcksum/senddnsquery-libnet.c##
  61. 0 /* checksum */,## 58 ##src/udpcksum/senddnsquery-libnet.c##
  62. ((struct sockaddr_in *) local)->sin_addr.s_addr /* source */,## 59 ##src/udpcksum/senddnsquery-libnet.c##
  63. ((struct sockaddr_in *) dest)->sin_addr.s_addr /* dest */,## 60 ##src/udpcksum/senddnsquery-libnet.c##
  64. NULL /* payload */, 0 /* payload length */, l, ip_tag);## 61 ##src/udpcksum/senddnsquery-libnet.c##
  65. if (libnet_write(l) < 0) {## 62 ##src/udpcksum/senddnsquery-libnet.c##
  66. err_quit("libnet_write: %s\n", libnet_geterror(l));## 63 ##src/udpcksum/senddnsquery-libnet.c##
  67. }## 64 ##src/udpcksum/senddnsquery-libnet.c##
  68. if (verbose)## 65 ##src/udpcksum/senddnsquery-libnet.c##
  69. printf("sent: %d bytes of data\n", packet_size);## 66 ##src/udpcksum/senddnsquery-libnet.c##
  70. }## 67 ##src/udpcksum/senddnsquery-libnet.c##
  71. /* end send_dns_query_libnet */