You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dnslib.h 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /**************************************
  2. * AUTHOR: Federico Tomassini *
  3. * Copyright (C) Federico Tomassini *
  4. * Contact effetom@gmail.com *
  5. ***********************************************
  6. ******* BEGIN 3/2006 ********
  7. *************************************************************************
  8. * *
  9. * This program is free software; you can redistribute it and/or modify *
  10. * it under the terms of the GNU General Public License as published by *
  11. * the Free Software Foundation; either version 2 of the License, or *
  12. * (at your option) any later version. *
  13. * *
  14. * This program is distributed in the hope that it will be useful, *
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  17. * GNU General Public License for more details. *
  18. * *
  19. ************************************************************************/
  20. #ifndef DNSLIB_H
  21. #define DNSLIB_H
  22. #include <string.h>
  23. #include <stdint.h>
  24. #include <sys/socket.h>
  25. #include <arpa/inet.h>
  26. #define LBL_PTR_MASK 0xC0 /* Network byte order */
  27. #define LBL_PTR_OFF_MASK 0x3f /* N.b. order */
  28. #define LBL_PTR(c) ((c)&LBL_PTR_MASK) /* AND whith 0xC000 */
  29. #define MAX_RECURSION_PTR 20
  30. /* PREFIXES FOR PTR QUERY */
  31. #define DNS_INV_PREFIX ".IN-ADDR.ARPA"
  32. #define DNS_INV_PREFIX6 ".IP6.ARPA"
  33. #define OLD_DNS_INV_PREFIX6 ".IP6.INT" /* For backward compatibility */
  34. /* DNS QUERY-TYPE: others type will be discarded */
  35. #define T_AAAA 28 /* h->ip IPV6 */
  36. #define T_A 1 /* h->ip IPV4 */
  37. #define T_PTR 12 /* ip->h */
  38. #define T_MX 15 /* h->mx */
  39. /* RCODES */
  40. #define DNS_RCODE_NOERR 0 /* No error */
  41. #define DNS_RCODE_EINTRPRT 1 /* Intepret error */
  42. #define DNS_RCODE_ESRVFAIL 2 /* Server failure */
  43. #define DNS_RCODE_ENSDMN 3 /* No such domain */
  44. #define DNS_RCODE_ENIMPL 4 /* Not implemented */
  45. #define DNS_RCODE_ERFSD 5 /* Refused */
  46. /* INET CLASS */
  47. #define C_IN 1
  48. /* RFC */
  49. #define DNS_MAX_SZ 512
  50. #define DNS_HDR_SZ 12
  51. #define DNS_MAX_LABELS 63
  52. #define DNS_MAX_HNAME_LEN 255
  53. #define DNS_TTL 86400;
  54. #define min(x,y) ((x)<(y))?(x):(y)
  55. typedef struct dns_pkt_hdr {
  56. uint16_t id;
  57. uint8_t qr;
  58. uint8_t opcode;
  59. uint8_t aa;
  60. uint8_t tc;
  61. uint8_t rd;
  62. uint8_t ra;
  63. uint8_t z;
  64. uint8_t rcode;
  65. uint8_t qdcount;
  66. uint8_t ancount;
  67. uint8_t nscount;
  68. uint8_t arcount;
  69. } dns_pkt_hdr;
  70. #define DNS_PKT_HDR_SZ sizeof(dns_pkt_hdr)
  71. /* DNS_PKT_HDR MACROS */
  72. #define DP_QDCOUNT(dp) ((dp)->pkt_hdr).qdcount
  73. #define DP_ANCOUNT(dp) ((dp)->pkt_hdr).ancount
  74. #define DP_NSCOUNT(dp) ((dp)->pkt_hdr).nscount
  75. #define DP_ARCOUNT(dp) ((dp)->pkt_hdr).arcount
  76. struct dns_pkt_qst {
  77. char qname[DNS_MAX_HNAME_LEN];
  78. uint16_t qtype;
  79. uint16_t qclass;
  80. struct dns_pkt_qst *next;
  81. };
  82. typedef struct dns_pkt_qst dns_pkt_qst;
  83. #define DNS_PKT_QST_SZ sizeof(dns_pkt_qst)
  84. struct dns_pkt_a {
  85. char name[DNS_MAX_HNAME_LEN];
  86. uint16_t type;
  87. uint16_t cl;
  88. uint32_t ttl;
  89. uint16_t rdlength;
  90. char rdata[DNS_MAX_HNAME_LEN];
  91. struct dns_pkt_a *next;
  92. };
  93. typedef struct dns_pkt_a dns_pkt_a;
  94. #define DNS_PKT_A_SZ sizeof(dns_pkt_a)
  95. typedef struct dns_pkt {
  96. dns_pkt_hdr pkt_hdr;
  97. dns_pkt_qst *pkt_qst;
  98. dns_pkt_a *pkt_answ;
  99. dns_pkt_a *pkt_auth;
  100. dns_pkt_a *pkt_add;
  101. } dns_pkt;
  102. #define DNS_PKT_SZ sizeof(dns_pkt)
  103. /* USER MACRO */
  104. #define DNS_GET_ID(dp) (dp)->pkt_hdr.id
  105. #define DNS_GET_QR(dp) (dp)->pkt_hdr.qr
  106. #define DNS_GET_OPCODE(dp) (dp)->pkt_hdr.opcode
  107. #define DNS_GET_AA(dp) (dp)->pkt_hdr.aa
  108. #define DNS_GET_TC(dp) (dp)->pkt_hdr.tc
  109. #define DNS_GET_RD(dp) (dp)->pkt_hdr.rd
  110. #define DNS_GET_RA(dp) (dp)->pkt_hdr.ra
  111. #define DNS_GET_Z(dp) (dp)->pkt_hdr.z
  112. #define DNS_GET_RCODE(dp) (dp)->pkt_hdr.rcode
  113. #define DNS_GET_QDCOUNT(dp) (dp)->pkt_hdr.qdcount
  114. #define DNS_GET_ANCOUNT(dp) (dp)->pkt_hdr.ancount
  115. #define DNS_GET_NSCOUNT(dp) (dp)->pkt_hdr.nscount
  116. #define DNS_GET_ARCOUNT(dp) (dp)->pkt_hdr.arcount
  117. #define DNS_SET_ID(dp,x) (dp)->pkt_hdr.id=x
  118. #define DNS_SET_QR(dp,x) (dp)->pkt_hdr.qr=x
  119. #define DNS_SET_OPCODE(dp,x) (dp)->pkt_hdr.opcode=x
  120. #define DNS_SET_AA(dp,x) (dp)->pkt_hdr.aa=x
  121. #define DNS_SET_TC(dp,x) (dp)->pkt_hdr.tc=x
  122. #define DNS_SET_RD(dp,x) (dp)->pkt_hdr.rd=x
  123. #define DNS_SET_RA(dp,x) (dp)->pkt_hdr.ra=x
  124. #define DNS_SET_Z(dp,x) (dp)->pkt_hdr.z=x
  125. #define DNS_SET_RCODE(dp,x) (dp)->pkt_hdr.rcode=x
  126. #define DNS_SET_QDCOUNT(dp,x) (dp)->pkt_hdr.qdcount=x
  127. #define DNS_SET_ANCOUNT(dp,x) (dp)->pkt_hdr.ancount=x
  128. #define DNS_SET_NSCOUNT(dp,x) (dp)->pkt_hdr.nscount=x
  129. #define DNS_SET_ARCOUNT(dp,x) (dp)->pkt_hdr.arcount=x
  130. #define DP_ADD_ANSWER(dp) dns_add_a(&((dp)->pkt_answ));DP_ANCOUNT(dp)+=1;
  131. #define DP_ADD_AUTH(dp) dns_add_a(&((dp)->pkt_auth));DP_NSCOUNT(dp)+=1;
  132. #define DP_ADD_ADD(dp) dns_add_a(&((dp)->pkt_add));DP_ARCOUNT(dp)+=1;
  133. /* Functions */
  134. int getlblptr(char *buf);
  135. int read_label_octet(const char *src, char *dst, int limit);
  136. int lbltoname(char *buf, char *start_pkt, char *dst, int limit);
  137. int swap_straddr(char *src, char *dst);
  138. int swap_straddr6(char *src, char *dst);
  139. int rm_inv_prefix(char *src, char *dst);
  140. int add_inv_prefix(char *s, int family);
  141. int swapped_straddr(char *src, char *dst);
  142. int swapped_straddr_pref(char *src, char *dst, int family);
  143. int nametolbl(char *name, char *dst);
  144. int d_hdr_u(char *buf, dns_pkt_hdr * dph);
  145. int d_qst_u(char *start_buf, char *buf, dns_pkt * dp, int limit_len);
  146. int d_qsts_u(char *start_buf, char *buf, dns_pkt * dp, int limit_len);
  147. int d_a_u(char *start_buf, char *buf, dns_pkt_a ** dpa_orig,
  148. int limit_len);
  149. int d_as_u(char *start_buf, char *buf, dns_pkt_a ** dpa, int limit_len,
  150. int count);
  151. int d_u(char *buf, int pktlen, dns_pkt ** dpp);
  152. int d_hdr_p(dns_pkt * dp, char *buf);
  153. int d_qst_p(dns_pkt_qst * dpq, char *buf, int limitlen);
  154. int d_qsts_p(dns_pkt * dp, char *buf, int limitlen);
  155. int d_a_p(dns_pkt_a * dpa, char *buf, int limitlen);
  156. int d_as_p(dns_pkt_a * dpa, char *buf, int limitlen, int count);
  157. int d_p(dns_pkt * dp, char *buf);
  158. dns_pkt *create_dns_pkt(void);
  159. dns_pkt_qst *create_dns_pkt_qst(void);
  160. dns_pkt_a *create_dns_pkt_a(void);
  161. dns_pkt_qst *dns_add_qst(dns_pkt * dp);
  162. void dns_del_last_qst(dns_pkt * dp);
  163. dns_pkt_a *dns_add_a(dns_pkt_a ** dpa);
  164. void dns_a_default_fill(dns_pkt * dp, dns_pkt_a * dpa);
  165. void destroy_dns_pkt(dns_pkt * dp);
  166. #endif /* DNSLIB_H */