dns.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. typedef struct Ndbtuple Ndbtuple;
  2. enum
  3. {
  4. /* RR types */
  5. Ta= 1,
  6. Tns= 2,
  7. Tmd= 3,
  8. Tmf= 4,
  9. Tcname= 5,
  10. Tsoa= 6,
  11. Tmb= 7,
  12. Tmg= 8,
  13. Tmr= 9,
  14. Tnull= 10,
  15. Twks= 11,
  16. Tptr= 12,
  17. Thinfo= 13,
  18. Tminfo= 14,
  19. Tmx= 15,
  20. Ttxt= 16,
  21. Trp= 17,
  22. Tsig= 24,
  23. Tkey= 25,
  24. Taaaa= 28,
  25. Tcert= 37,
  26. /* query types (all RR types are also queries) */
  27. Tixfr= 251, /* incremental zone transfer */
  28. Taxfr= 252, /* zone transfer */
  29. Tmailb= 253, /* { Tmb, Tmg, Tmr } */
  30. Tall= 255, /* all records */
  31. /* classes */
  32. Csym= 0, /* internal symbols */
  33. Cin= 1, /* internet */
  34. Ccs, /* CSNET (obsolete) */
  35. Cch, /* Chaos net */
  36. Chs, /* Hesiod (?) */
  37. /* class queries (all class types are also queries) */
  38. Call= 255, /* all classes */
  39. /* opcodes */
  40. Oquery= 0<<11, /* normal query */
  41. Oinverse= 1<<11, /* inverse query */
  42. Ostatus= 2<<11, /* status request */
  43. Omask= 0xf<<11, /* mask for opcode */
  44. /* response codes */
  45. Rok= 0,
  46. Rformat= 1, /* format error */
  47. Rserver= 2, /* server failure (e.g. no answer from something) */
  48. Rname= 3, /* bad name */
  49. Runimplimented= 4, /* unimplemented */
  50. Rrefused= 5, /* we don't like you */
  51. Rmask= 0xf, /* mask for response */
  52. Rtimeout= 0x10, /* timeout sending (for internal use only) */
  53. /* bits in flag word (other than opcode and response) */
  54. Fresp= 1<<15, /* message is a response */
  55. Fauth= 1<<10, /* true if an authoritative response */
  56. Ftrunc= 1<<9, /* truncated message */
  57. Frecurse= 1<<8, /* request recursion */
  58. Fcanrec= 1<<7, /* server can recurse */
  59. Domlen= 256, /* max domain name length (with NULL) */
  60. Labellen= 256, /* max domain label length (with NULL) */
  61. Strlen= 256, /* max string length (with NULL) */
  62. Iplen= 32, /* max ascii ip address length (with NULL) */
  63. /* time to live values (in seconds) */
  64. Min= 60,
  65. Hour= 60*Min, /* */
  66. Day= 24*Hour, /* Ta, Tmx */
  67. Week= 7*Day, /* Tsoa, Tns */
  68. Year= 52*Week,
  69. DEFTTL= Day,
  70. /* reserved time (can't be timed out earlier) */
  71. Reserved= 5*Min,
  72. /* packet header sizes */
  73. Maxudp= 512, /* maximum bytes per udp message */
  74. Maxudpin= 2048, /* maximum bytes per udp message */
  75. /* length of domain name hash table */
  76. HTLEN= 4*1024,
  77. RRmagic= 0xdeadbabe,
  78. DNmagic= 0xa110a110,
  79. /* parallelism */
  80. Maxactive= 32,
  81. };
  82. typedef struct DN DN;
  83. typedef struct DNSmsg DNSmsg;
  84. typedef struct RR RR;
  85. typedef struct SOA SOA;
  86. typedef struct Area Area;
  87. typedef struct Request Request;
  88. typedef struct Key Key;
  89. typedef struct Cert Cert;
  90. typedef struct Sig Sig;
  91. typedef struct Null Null;
  92. /*
  93. * a structure to track a request and any slave process handling it
  94. */
  95. struct Request
  96. {
  97. int isslave; /* pid of slave */
  98. ulong aborttime; /* time at which we give up */
  99. jmp_buf mret; /* where master jumps to after starting a slave */
  100. int id;
  101. };
  102. /*
  103. * a domain name
  104. */
  105. struct DN
  106. {
  107. int magic;
  108. DN *next; /* hash collision list */
  109. char *name; /* owner */
  110. RR *rr; /* resource records off this name */
  111. ulong referenced; /* time last referenced */
  112. ulong lookuptime; /* last time we tried to get a better value */
  113. ushort class; /* RR class */
  114. char refs; /* for mark and sweep */
  115. char nonexistent; /* true if we get an authoritative nx for this domain */
  116. ulong ordinal;
  117. };
  118. /*
  119. * security info
  120. */
  121. struct Key
  122. {
  123. int flags;
  124. int proto;
  125. int alg;
  126. int dlen;
  127. uchar *data;
  128. };
  129. struct Cert
  130. {
  131. int type;
  132. int tag;
  133. int alg;
  134. int dlen;
  135. uchar *data;
  136. };
  137. struct Sig
  138. {
  139. int type;
  140. int alg;
  141. int labels;
  142. ulong ttl;
  143. ulong exp;
  144. ulong incep;
  145. int tag;
  146. DN *signer;
  147. int dlen;
  148. uchar *data;
  149. };
  150. struct Null
  151. {
  152. int dlen;
  153. uchar *data;
  154. };
  155. /*
  156. * an unpacked resource record
  157. */
  158. struct RR
  159. {
  160. int magic;
  161. RR *next;
  162. DN *owner; /* domain that owns this resource record */
  163. uchar negative; /* this is a cached negative response */
  164. ulong pc;
  165. ulong ttl; /* time to live to be passed on */
  166. ulong expire; /* time this entry expires locally */
  167. ushort type; /* RR type */
  168. ushort query; /* query tyis is in response to */
  169. uchar auth; /* authoritative */
  170. uchar db; /* from database */
  171. uchar cached; /* rr in cache */
  172. ulong marker; /* used locally when scanning rrlists */
  173. union {
  174. DN *negsoaowner; /* soa for cached negative response */
  175. DN *host; /* hostname - soa, cname, mb, md, mf, mx, ns */
  176. DN *cpu; /* cpu type - hinfo */
  177. DN *mb; /* mailbox - mg, minfo */
  178. DN *ip; /* ip addrss - a */
  179. DN *txt; /* first text string - txt, rp */
  180. int cruftlen;
  181. ulong arg0;
  182. };
  183. union {
  184. int negrcode; /* response code for cached negative response */
  185. DN *rmb; /* responsible maibox - minfo, soa, rp */
  186. DN *ptr; /* pointer to domain name - ptr */
  187. DN *os; /* operating system - hinfo */
  188. ulong pref; /* preference value - mx */
  189. ulong local; /* ns served from local database - ns */
  190. ulong arg1;
  191. };
  192. union {
  193. SOA *soa; /* soa timers - soa */
  194. Key *key;
  195. Cert *cert;
  196. Sig *sig;
  197. Null *null;
  198. };
  199. };
  200. /*
  201. * timers for a start of authenticated record
  202. */
  203. struct SOA
  204. {
  205. ulong serial; /* zone serial # (sec) - soa */
  206. ulong refresh; /* zone refresh interval (sec) - soa */
  207. ulong retry; /* zone retry interval (sec) - soa */
  208. ulong expire; /* time to expiration (sec) - soa */
  209. ulong minttl; /* minimum time to live for any entry (sec) - soa */
  210. };
  211. /*
  212. * domain messages
  213. */
  214. struct DNSmsg
  215. {
  216. ushort id;
  217. int flags;
  218. int qdcount; /* questions */
  219. RR *qd;
  220. int ancount; /* answers */
  221. RR *an;
  222. int nscount; /* name servers */
  223. RR *ns;
  224. int arcount; /* hints */
  225. RR *ar;
  226. };
  227. /*
  228. * definition of local area for dblookup
  229. */
  230. struct Area
  231. {
  232. Area *next;
  233. int len; /* strlen(area->soarr->owner->name) */
  234. RR *soarr; /* soa defining this area */
  235. };
  236. enum
  237. {
  238. Recurse,
  239. Dontrecurse,
  240. NOneg,
  241. OKneg,
  242. };
  243. /* dn.c */
  244. extern char *rrtname[];
  245. extern char *rname[];
  246. extern char *opname[];
  247. extern void db2cache(int);
  248. extern void dninit(void);
  249. extern DN* dnlookup(char*, int, int);
  250. extern void dnage(DN*);
  251. extern void dnageall(int);
  252. extern void dnagedb(void);
  253. extern void dnauthdb(void);
  254. extern void dnget(void);
  255. extern void dnpurge(void);
  256. extern void dnput(void);
  257. extern Area* inmyarea(char*);
  258. extern void rrattach(RR*, int);
  259. extern RR* rralloc(int);
  260. extern void rrfree(RR*);
  261. extern void rrfreelist(RR*);
  262. extern RR* rrlookup(DN*, int, int);
  263. extern RR* rrcat(RR**, RR*);
  264. extern RR** rrcopy(RR*, RR**);
  265. extern RR* rrremneg(RR**);
  266. extern RR* rrremtype(RR**, int);
  267. extern int rrfmt(Fmt*);
  268. extern int rravfmt(Fmt*);
  269. extern int rrsupported(int);
  270. extern int rrtype(char*);
  271. extern char* rrname(int, char*, int);
  272. extern int tsame(int, int);
  273. extern void dndump(char*);
  274. extern int getactivity(Request*);
  275. extern void putactivity(void);
  276. extern void abort(); /* char*, ... */;
  277. extern void warning(char*, ...);
  278. extern void slave(Request*);
  279. extern void dncheck(void*, int);
  280. extern void unique(RR*);
  281. extern int subsume(char*, char*);
  282. extern RR* randomize(RR*);
  283. extern void* emalloc(int);
  284. extern char* estrdup(char*);
  285. extern void dnptr(uchar*, uchar*, char*, int, int);
  286. /* dblookup.c */
  287. extern RR* dblookup(char*, int, int, int, int);
  288. extern RR* dbinaddr(DN*, int);
  289. extern int baddelegation(RR*, RR*, uchar*);
  290. extern RR* dnsservers(int);
  291. extern RR* domainlist(int);
  292. extern int opendatabase(void);
  293. /* dns.c */
  294. extern char* walkup(char*);
  295. extern RR* dnresolve(char*, int, int, Request*, RR**, int, int, int, int*);
  296. extern RR* getdnsservers(int);
  297. extern void logreply(int, uchar*, DNSmsg*);
  298. extern void logsend(int, int, uchar*, char*, char*, int);
  299. /* dnserver.c */
  300. extern void dnserver(DNSmsg*, DNSmsg*, Request*);
  301. extern void dnudpserver(char*);
  302. extern void dntcpserver(char*);
  303. /* convDNS2M.c */
  304. extern int convDNS2M(DNSmsg*, uchar*, int);
  305. /* convM2DNS.c */
  306. extern char* convM2DNS(uchar*, int, DNSmsg*);
  307. /* malloc.c */
  308. extern void mallocsanity(void*);
  309. extern void lasthist(void*, int, ulong);
  310. extern int debug;
  311. extern char *trace;
  312. extern int testing; /* test cache whenever removing a DN */
  313. extern int cachedb;
  314. extern int needrefresh;
  315. extern char *dbfile;
  316. extern char mntpt[];
  317. extern char *logfile;
  318. extern int resolver;
  319. extern int maxage; /* age of oldest entry in cache (secs) */
  320. /* time base */
  321. extern ulong now;
  322. #pragma varargck type "R" RR*
  323. #pragma varargck type "Q" RR*