xref: /plan9-contrib/sys/src/cmd/ndb/dns.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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