1 enum 2 { 3 /* RR types */ 4 Ta= 1, 5 Tns= 2, 6 Tmd= 3, 7 Tmf= 4, 8 Tcname= 5, 9 Tsoa= 6, 10 Tmb= 7, 11 Tmg= 8, 12 Tmr= 9, 13 Tnull= 10, 14 Twks= 11, 15 Tptr= 12, 16 Thinfo= 13, 17 Tminfo= 14, 18 Tmx= 15, 19 Ttxt= 16, 20 21 /* query types (all RR types are also queries) */ 22 Taxfr= 252, /* zone transfer */ 23 Tmailb= 253, /* { Tmb, Tmg, Tmr } */ 24 Tall= 255, /* all records */ 25 26 /* classes */ 27 Csym= 0, /* internal symbols */ 28 Cin= 1, /* internet */ 29 Ccs, /* CSNET (obsolete) */ 30 Cch, /* Chaos net */ 31 Chs, /* Hesiod (?) */ 32 33 /* class queries (all class types are also queries) */ 34 Call= 255, /* all classes */ 35 36 /* opcodes */ 37 Oquery= 0<<11, /* normal query */ 38 Oinverse= 1<<11, /* inverse query */ 39 Ostatus= 2<<11, /* status request */ 40 Omask= 0xf<<11, /* mask for opcode */ 41 42 /* response codes */ 43 Rok= 0, 44 Rformat= 1, /* format error */ 45 Rserver= 2, /* server failure */ 46 Rname= 3, /* bad name */ 47 Runimplimented= 4, /* unimplemented */ 48 Rrefused= 5, /* we don't like you */ 49 Rmask= 0xf, /* mask for response */ 50 51 /* bits in flag word (other than opcode and response) */ 52 Fresp= 1<<15, /* message is a response */ 53 Fauth= 1<<10, /* true if an authoritative response */ 54 Ftrunc= 1<<9, /* truncated message */ 55 Frecurse= 1<<8, /* request recursion */ 56 Fcanrec= 1<<7, /* server can recurse */ 57 58 Domlen= 256, /* max domain name length (with NULL) */ 59 Labellen= 256, /* max domain label length (with NULL) */ 60 Strlen= 256, /* max string length (with NULL) */ 61 Iplen= 32, /* max ascii ip address length (with NULL) */ 62 63 /* time ti live values (in seconds) */ 64 Min= 60, 65 Hour= 60*Min, /* */ 66 Day= 24*Hour, /* Ta, Tmx */ 67 Week= 7*Day, /* Tsoa, Tns */ 68 69 /* packet header sizes */ 70 Maxudp= 512, /* maximum bytes per udp message */ 71 }; 72 73 typedef struct DN DN; 74 typedef struct DNSmsg DNSmsg; 75 typedef struct RR RR; 76 typedef struct SOA SOA; 77 typedef struct Request Request; 78 79 /* 80 * a structure to track a request and any slave process handling it 81 */ 82 struct Request 83 { 84 int isslave; /* pid of slave */ 85 jmp_buf mret; /* where master jumps to after starting a slave */ 86 }; 87 88 /* 89 * a domain name 90 */ 91 struct DN 92 { 93 DN *next; /* hash collision list */ 94 char *name; /* owner */ 95 RR *rr; /* resource records off this name */ 96 int class; /* RR class */ 97 ulong reserved; /* don't age until after this time */ 98 }; 99 100 /* 101 * an unpacked resource record 102 */ 103 struct RR 104 { 105 RR *next; 106 DN *owner; /* domain that owns this resource record */ 107 ulong ttl; /* time to live (secs) */ 108 ushort type; /* RR type */ 109 uchar auth; /* authoritative */ 110 uchar db; /* from database */ 111 union { 112 DN *host; /* hostname - soa, cname, mb, md, mf, mx, ns */ 113 DN *cpu; /* cpu type - hinfo */ 114 DN *mb; /* mailbox - mg, minfo */ 115 DN *ip; /* ip addrss - a */ 116 ulong arg0; 117 }; 118 union { 119 DN *rmb; /* responsible maibox - minfo, soa */ 120 DN *ptr; /* pointer to a name space node - ptr */ 121 DN *os; /* operating system - hinfo */ 122 ulong pref; /* preference value - mx */ 123 ulong local; /* ns served from local database - ns */ 124 ulong arg1; 125 }; 126 SOA *soa; /* soa timers - soa */ 127 }; 128 129 /* 130 * timers for a start of authenticated record 131 */ 132 struct SOA 133 { 134 ulong serial; /* zone serial # (sec) - soa */ 135 ulong refresh; /* zone refresh interval (sec) - soa */ 136 ulong retry; /* zone retry interval (sec) - soa */ 137 ulong expire; /* time to expiration (sec) - soa */ 138 ulong minttl; /* minimum time to live for any entry (sec) - soa */ 139 }; 140 141 /* 142 * domain messages 143 */ 144 struct DNSmsg 145 { 146 ulong id; 147 int flags; 148 int qdcount; /* questions */ 149 RR *qd; 150 int ancount; /* answers */ 151 RR *an; 152 int nscount; /* name servers */ 153 RR *ns; 154 int arcount; /* hints */ 155 RR *ar; 156 }; 157 158 /* dn.c */ 159 extern char *rrtname[]; 160 extern char *rname[]; 161 extern char *opname[]; 162 extern void dninit(void); 163 extern DN* dnlookup(char*, int, int); 164 extern void dnage(DN*); 165 extern void rrattach(RR*, int); 166 extern RR* rralloc(int); 167 extern void rrfree(RR*); 168 extern void rrfreelist(RR*); 169 extern RR* rrlookup(DN*, int); 170 extern RR* rrcat(RR**, RR*, int); 171 extern int rrconv(void*, Fconv*); 172 extern int rrtype(char*); 173 extern char* rrname(int, char*); 174 extern int cistrcmp(char*, char*); 175 extern int tsame(int, int); 176 extern void dndump(char*); 177 178 /* dblookup.c */ 179 extern RR* dblookup(char*, int, int, int); 180 extern RR* dbinaddr(DN*); 181 182 /* dns.c */ 183 extern char* walkup(char*); 184 extern RR* dnresolve(char*, int, int, Request*, RR**); 185 extern void fatal(char*, ...); 186 extern void warning(char*, ...); 187 extern void slave(Request*); 188 189 /* dnserver.c */ 190 extern void dnserver(void); 191 192 /* convDNS2M.c */ 193 extern int convDNS2M(DNSmsg*, uchar*, int); 194 195 /* convM2DNS.c */ 196 extern char* convM2DNS(uchar*, int, DNSmsg*); 197 198 extern int debug; 199 extern char *dbfile; 200