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.

ntkresolv.h 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. /* This file is part of Netsukuku
  2. *
  3. * This source code is free software; you can redistribute it and/or
  4. * modify it under the terms of the GNU General Public License as published
  5. * by the Free Software Foundation; either version 2 of the License,
  6. * or (at your option) any later version.
  7. *
  8. * This source code is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. * Please refer to the GNU Public License for more details.
  12. *
  13. * You should have received a copy of the GNU Public License along with
  14. * this source code; if not, write to:
  15. * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. *
  17. */
  18. #ifndef NTK_RESOLV_H
  19. #define NTK_RESOLV_H
  20. #include <errno.h>
  21. #include <netdb.h>
  22. #include <strings.h>
  23. #include <arpa/inet.h>
  24. #include <sys/socket.h>
  25. #include "andns_lib.h"
  26. #define VERSION "0.3.3"
  27. #define NTK_RESOLV_MAIL_BUGS "efphe@netsukuku.org"
  28. #define NTKRESOLV_PORT 53
  29. #define NTKRESOLV_PORT_STR "53"
  30. #define MAX_NS 3
  31. #define LOCALHOST "localhost"
  32. #define NTK_RESOLV_TIMEOUT 15
  33. #define MAX_HOSTNAME_LEN 512
  34. #define NTKRESOLV_MAX_OBJ_LEN 512
  35. //#define ANDNS_MAX_SZ 1024
  36. #define min(x,y) (x)<(y)?(x):(y)
  37. #define REALM_NTK 0+1
  38. #define REALM_INT 1+1
  39. #define REALM_NTK_STR "ntk"
  40. #define REALM_INT_STR "inet"
  41. #define QTYPE_A AT_A
  42. #define QTYPE_PTR AT_PTR
  43. #define QTYPE_G AT_G
  44. #define QTYPE_MX 3
  45. #define QTYPE_A_STR "snsd"
  46. #define QTYPE_PTR_STR "ptr"
  47. #define QTYPE_G_STR "global"
  48. #define QTYPE_MX_STR "mx"
  49. #define SNSD_PROTO_TCP 0
  50. #define SNSD_PROTO_UDP 1
  51. #define SNSD_PROTO_TCP_STR "tcp"
  52. #define SNSD_PROTO_UDP_STR "udp"
  53. #define SNSD_PROTO_DEFAULT SNSD_PROTO_TCP
  54. #define SNSD_SERVICE_DEFAULT 0
  55. /* NK BIT */
  56. #define NK_DNS 0
  57. #define NK_NTK 1
  58. #define NK_INET 2
  59. #define TIME_SCALE 1000000.0
  60. #define HELP_STR "help"
  61. char *QTYPE_STR_LIST[] =
  62. { QTYPE_A_STR, QTYPE_PTR_STR, QTYPE_G_STR, QTYPE_MX_STR };
  63. int QT_LEN = 4;
  64. #define QTFROMPREF(s) \
  65. ({ \
  66. int __n,__res=-1; \
  67. for (__n=0;__n<QT_LEN;__n++) \
  68. if (!strncasecmp(s,QTYPE_STR_LIST[__n],strlen(s))) \
  69. {__res=__n;break;} \
  70. __res; })
  71. #define REALMFROMPREF(s) \
  72. ({ \
  73. uint8_t __res=0; \
  74. if (!strncasecmp(REALM_NTK_STR,s,strlen(s))) \
  75. __res=REALM_NTK; \
  76. else if (!strncasecmp(REALM_INT_STR,s,strlen(s))) \
  77. __res=REALM_INT; \
  78. __res; })
  79. #define PROTOFROMPREF(s) \
  80. ({ \
  81. uint8_t __res=-1; \
  82. if (!strncasecmp(SNSD_PROTO_UDP_STR,s,strlen(s))) \
  83. __res=SNSD_PROTO_UDP; \
  84. else if (!strncasecmp(SNSD_PROTO_TCP_STR,s,strlen(s))) \
  85. __res=SNSD_PROTO_TCP; \
  86. __res; })
  87. typedef struct ntkresolv_opts {
  88. char nsserver[MAX_HOSTNAME_LEN];
  89. int16_t port;
  90. int8_t silent;
  91. char obj[NTKRESOLV_MAX_OBJ_LEN];
  92. uint16_t id;
  93. uint8_t hash;
  94. andns_pkt *q;
  95. } ntkresolv_opts;
  96. #define NTKRESOLV_OPTS_SZ sizeof(ntkresolv_opts)
  97. #define QR_STR(ap) ((ap)->qr==0)?"QUERY":"ANSWER"
  98. #define QTYPE_STR(ap) \
  99. ({ \
  100. char *__c; \
  101. switch((ap)->qtype) { \
  102. case AT_A: \
  103. __c="Host2Ip"; \
  104. break; \
  105. case AT_PTR: \
  106. __c="Ip2Host"; \
  107. break; \
  108. case AT_G: \
  109. __c=" Global"; \
  110. break; \
  111. default: \
  112. __c="Unknow"; \
  113. break; \
  114. } \
  115. __c;})
  116. #define NK_STR(ap) \
  117. ({ \
  118. char *__d; \
  119. switch((ap)->nk) { \
  120. case NK_DNS: \
  121. __d="DNS"; \
  122. break; \
  123. case NK_NTK: \
  124. __d="Ntk"; \
  125. break; \
  126. case NK_INET: \
  127. __d="Inet"; \
  128. break; \
  129. default: \
  130. __d="UNKNOW"; \
  131. break; \
  132. } \
  133. __d;})
  134. #define RCODE_STR(ap) \
  135. ({ \
  136. char *__e; \
  137. switch((ap)->rcode) { \
  138. case ANDNS_RCODE_NOERR: \
  139. __e="NoError"; \
  140. break; \
  141. case ANDNS_RCODE_EINTRPRT: \
  142. __e="InError"; \
  143. break; \
  144. case ANDNS_RCODE_ESRVFAIL: \
  145. __e="SrvFail"; \
  146. break; \
  147. case ANDNS_RCODE_ENSDMN: \
  148. __e="NoXHost"; \
  149. break; \
  150. case ANDNS_RCODE_ENIMPL: \
  151. __e="NotImpl"; \
  152. break; \
  153. case ANDNS_RCODE_ERFSD: \
  154. __e="Refused"; \
  155. break; \
  156. default: \
  157. __e="UNKNOW"; \
  158. break; \
  159. } \
  160. __e;})
  161. #define IPV_STR(ap) \
  162. ({ \
  163. char *__f; \
  164. switch((ap)->ipv) { \
  165. case ANDNS_IPV4: \
  166. __f="IPv4"; \
  167. break; \
  168. case ANDNS_IPV6: \
  169. __f="IPv6"; \
  170. break; \
  171. default: \
  172. __f="UNKNOW"; \
  173. break; \
  174. } \
  175. __f;})
  176. #define MAX_INT_STR 10
  177. #define SERVICE_STR(ap) \
  178. ({ \
  179. char *__g; \
  180. char __t[MAX_INT_STR]; \
  181. switch((ap)->qtype) { \
  182. case AT_G: \
  183. __g="*"; \
  184. break; \
  185. case AT_PTR: \
  186. __g="None"; \
  187. break; \
  188. case AT_A: \
  189. snprintf(__t,MAX_INT_STR,"%d", \
  190. ap->service); \
  191. __g=__t; \
  192. break; \
  193. default: \
  194. __g="UNKNOW"; \
  195. break; \
  196. } \
  197. __g;})
  198. #define PROTO_STR(ap) \
  199. ({ \
  200. char *__h; \
  201. switch((ap)->qtype) { \
  202. case AT_G: \
  203. __h="*"; \
  204. break; \
  205. case AT_PTR: \
  206. __h="None"; \
  207. break; \
  208. case AT_A: \
  209. if (!ap->service) \
  210. __h="None"; \
  211. else \
  212. __h=ap->p==SNSD_PROTO_TCP? \
  213. SNSD_PROTO_TCP_STR: \
  214. SNSD_PROTO_UDP_STR; \
  215. break; \
  216. default: \
  217. __h="UNKNOW"; \
  218. break; \
  219. } \
  220. __h;})
  221. #define GET_OPT_REALM (globopts.realm==REALM_NTK)?"NTK":"INET"
  222. /* CODE UTILS */
  223. #define GOP (globopts)
  224. #define AMISILENT (GOP.silent)
  225. #define GQT (GOP.q)
  226. #define say printf
  227. #define bye if (!AMISILENT) say("\tBye!\n");
  228. #define COMPUTE_TIME diff_time(time_start,time_stop)
  229. #define time_report if (!AMISILENT){gettimeofday(&time_stop,NULL); \
  230. say("Query time: %f seconds.\n" \
  231. ,COMPUTE_TIME);}
  232. #define G_ALIGN(len) GQT->qstlength=len;GQT->qstdata=(char*) \
  233. xmalloc(len+1); \
  234. if (!GQT->qstdata){say("Fatal malloc!\n"); \
  235. exit(1);}
  236. #define G_SETQST_A(s) G_ALIGN(strlen(s)+1);strcpy(GQT->qstdata,s); \
  237. GQT->qstlength=strlen(s);
  238. #define NTK_RESOLV_HASH_STR(s,d) \
  239. ({ \
  240. int __i; \
  241. for (__i=0;__i<ANDNS_HASH_H;__i++) \
  242. sprintf(d+2*__i,"%02x",((unsigned char*)(s))[__i]); \
  243. d[2*ANDNS_HASH_H]=0;})
  244. #define NTK_RESOLV_STR_HASH(s,d) \
  245. ({ \
  246. int __i,__t; \
  247. for (__i=0;__i<ANDNS_HASH_H;__i++) { \
  248. sscanf(s+2*__i,"%02x",&__t); \
  249. d[__i]=(unsigned char)(__t);}})
  250. #define NTK_RESOLV_IP_SYMBOL "~"
  251. #define NTK_RESOLV_HNAME_SYMBOL "-"
  252. #define NTK_RESOLV_SYMBOL(apd) (apd)->m&APD_IP?NTK_RESOLV_IP_SYMBOL: \
  253. NTK_RESOLV_HNAME_SYMBOL
  254. /* FUNCTIONS */
  255. void version(void);
  256. void usage(void);
  257. void qt_usage(char *arg);
  258. void realm_usage(char *arg);
  259. void proto_usage(char *arg);
  260. void service_and_proto_usage(char *arg);
  261. double diff_time(struct timeval a, struct timeval b);
  262. void opts_init(void);
  263. void opts_set_silent(void);
  264. void opts_set_port(char *arg);
  265. void opts_set_ns(char *arg);
  266. void opts_set_qt(char *arg);
  267. void opts_set_realm(char *arg);
  268. void opts_set_service_and_proto(char *arg);
  269. void opts_set_proto(char *arg);
  270. void opts_set_recursion(void);
  271. void opts_set_hash(void);
  272. void opts_set_compute_hash(void);
  273. void opts_set_parsable_output(void);
  274. void opts_set_question(char *arg);
  275. void opts_finish(char *arg);
  276. void print_headers();
  277. void print_question();
  278. void ip_bin_to_str(void *data, char *dst);
  279. void answer_data_to_str(andns_pkt_data * apd, char *dst);
  280. void print_answers();
  281. void print_parsable_answers(void);
  282. void print_results(void);
  283. void do_command(void);
  284. void ntkresolv_exit(int i);
  285. void ntkresolv_safe_exit(int i);
  286. int main(int argc, char **argv);
  287. #endif /* NTK_RESOLV_H */