dns.h 8.8 KB

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