Blame


1 3e0d8fb3 2005-12-27 devnull #include <u.h>
2 3e0d8fb3 2005-12-27 devnull #include <libc.h>
3 3e0d8fb3 2005-12-27 devnull #include <ip.h>
4 3e0d8fb3 2005-12-27 devnull #include "dns.h"
5 3e0d8fb3 2005-12-27 devnull
6 3e0d8fb3 2005-12-27 devnull enum
7 3e0d8fb3 2005-12-27 devnull {
8 3e0d8fb3 2005-12-27 devnull Maxpath= 128,
9 3e0d8fb3 2005-12-27 devnull };
10 3e0d8fb3 2005-12-27 devnull
11 3e0d8fb3 2005-12-27 devnull char *logfile = "dns";
12 3e0d8fb3 2005-12-27 devnull char *dbfile;
13 3e0d8fb3 2005-12-27 devnull int debug;
14 3e0d8fb3 2005-12-27 devnull int cachedb = 1;
15 3e0d8fb3 2005-12-27 devnull int testing;
16 3e0d8fb3 2005-12-27 devnull int traceactivity;
17 3e0d8fb3 2005-12-27 devnull int needrefresh;
18 3e0d8fb3 2005-12-27 devnull int resolver;
19 3e0d8fb3 2005-12-27 devnull char mntpt[Maxpath];
20 3e0d8fb3 2005-12-27 devnull char *caller = "";
21 3e0d8fb3 2005-12-27 devnull ulong now;
22 3e0d8fb3 2005-12-27 devnull int maxage;
23 3e0d8fb3 2005-12-27 devnull uchar ipaddr[IPaddrlen]; /* my ip address */
24 3e0d8fb3 2005-12-27 devnull char *LOG;
25 3e0d8fb3 2005-12-27 devnull char *zonerefreshprogram;
26 3e0d8fb3 2005-12-27 devnull
27 3e0d8fb3 2005-12-27 devnull static int readmsg(int, uchar*, int);
28 3e0d8fb3 2005-12-27 devnull static void reply(int, DNSmsg*, Request*);
29 3e0d8fb3 2005-12-27 devnull static void dnzone(DNSmsg*, DNSmsg*, Request*);
30 3e0d8fb3 2005-12-27 devnull static void getcaller(char*);
31 3e0d8fb3 2005-12-27 devnull static void refreshmain(char*);
32 3e0d8fb3 2005-12-27 devnull
33 3e0d8fb3 2005-12-27 devnull void
34 3e0d8fb3 2005-12-27 devnull main(int argc, char *argv[])
35 3e0d8fb3 2005-12-27 devnull {
36 3e0d8fb3 2005-12-27 devnull int len;
37 3e0d8fb3 2005-12-27 devnull Request req;
38 3e0d8fb3 2005-12-27 devnull DNSmsg reqmsg, repmsg;
39 3e0d8fb3 2005-12-27 devnull uchar buf[512];
40 3e0d8fb3 2005-12-27 devnull char tname[32];
41 3e0d8fb3 2005-12-27 devnull char *err;
42 3e0d8fb3 2005-12-27 devnull char *ext = "";
43 3e0d8fb3 2005-12-27 devnull
44 3e0d8fb3 2005-12-27 devnull ARGBEGIN{
45 3e0d8fb3 2005-12-27 devnull case 'd':
46 3e0d8fb3 2005-12-27 devnull debug++;
47 3e0d8fb3 2005-12-27 devnull break;
48 3e0d8fb3 2005-12-27 devnull case 'f':
49 3e0d8fb3 2005-12-27 devnull dbfile = ARGF();
50 3e0d8fb3 2005-12-27 devnull break;
51 3e0d8fb3 2005-12-27 devnull case 'r':
52 3e0d8fb3 2005-12-27 devnull resolver = 1;
53 3e0d8fb3 2005-12-27 devnull break;
54 3e0d8fb3 2005-12-27 devnull case 'x':
55 3e0d8fb3 2005-12-27 devnull ext = ARGF();
56 3e0d8fb3 2005-12-27 devnull break;
57 3e0d8fb3 2005-12-27 devnull }ARGEND
58 3e0d8fb3 2005-12-27 devnull
59 3e0d8fb3 2005-12-27 devnull if(debug < 2)
60 3e0d8fb3 2005-12-27 devnull debug = 0;
61 3e0d8fb3 2005-12-27 devnull
62 3e0d8fb3 2005-12-27 devnull if(argc > 0)
63 3e0d8fb3 2005-12-27 devnull getcaller(argv[0]);
64 3e0d8fb3 2005-12-27 devnull
65 3e0d8fb3 2005-12-27 devnull dninit();
66 3e0d8fb3 2005-12-27 devnull
67 3e0d8fb3 2005-12-27 devnull snprint(mntpt, sizeof(mntpt), "/net%s", ext);
68 3e0d8fb3 2005-12-27 devnull if(myipaddr(ipaddr, mntpt) < 0)
69 3e0d8fb3 2005-12-27 devnull sysfatal("can't read my ip address");
70 3e0d8fb3 2005-12-27 devnull syslog(0, logfile, "dnstcp call from %s to %I", caller, ipaddr);
71 3e0d8fb3 2005-12-27 devnull
72 3e0d8fb3 2005-12-27 devnull db2cache(1);
73 3e0d8fb3 2005-12-27 devnull
74 3e0d8fb3 2005-12-27 devnull setjmp(req.mret);
75 3e0d8fb3 2005-12-27 devnull req.isslave = 0;
76 3e0d8fb3 2005-12-27 devnull
77 3e0d8fb3 2005-12-27 devnull /* loop on requests */
78 3e0d8fb3 2005-12-27 devnull for(;; putactivity()){
79 3e0d8fb3 2005-12-27 devnull now = time(0);
80 3e0d8fb3 2005-12-27 devnull memset(&repmsg, 0, sizeof(repmsg));
81 3e0d8fb3 2005-12-27 devnull alarm(10*60*1000);
82 3e0d8fb3 2005-12-27 devnull len = readmsg(0, buf, sizeof(buf));
83 3e0d8fb3 2005-12-27 devnull alarm(0);
84 3e0d8fb3 2005-12-27 devnull if(len <= 0)
85 3e0d8fb3 2005-12-27 devnull break;
86 3e0d8fb3 2005-12-27 devnull getactivity(&req);
87 3e0d8fb3 2005-12-27 devnull req.aborttime = now + 15*Min;
88 3e0d8fb3 2005-12-27 devnull err = convM2DNS(buf, len, &reqmsg);
89 3e0d8fb3 2005-12-27 devnull if(err){
90 3e0d8fb3 2005-12-27 devnull syslog(0, logfile, "server: input error: %s from %I", err, buf);
91 3e0d8fb3 2005-12-27 devnull break;
92 3e0d8fb3 2005-12-27 devnull }
93 3e0d8fb3 2005-12-27 devnull if(reqmsg.qdcount < 1){
94 3e0d8fb3 2005-12-27 devnull syslog(0, logfile, "server: no questions from %I", buf);
95 3e0d8fb3 2005-12-27 devnull break;
96 3e0d8fb3 2005-12-27 devnull }
97 3e0d8fb3 2005-12-27 devnull if(reqmsg.flags & Fresp){
98 3e0d8fb3 2005-12-27 devnull syslog(0, logfile, "server: reply not request from %I", buf);
99 3e0d8fb3 2005-12-27 devnull break;
100 3e0d8fb3 2005-12-27 devnull }
101 3e0d8fb3 2005-12-27 devnull if((reqmsg.flags & Omask) != Oquery){
102 3e0d8fb3 2005-12-27 devnull syslog(0, logfile, "server: op %d from %I", reqmsg.flags & Omask, buf);
103 3e0d8fb3 2005-12-27 devnull break;
104 3e0d8fb3 2005-12-27 devnull }
105 3e0d8fb3 2005-12-27 devnull
106 3e0d8fb3 2005-12-27 devnull if(debug)
107 3e0d8fb3 2005-12-27 devnull syslog(0, logfile, "%d: serve (%s) %d %s %s",
108 3e0d8fb3 2005-12-27 devnull req.id, caller,
109 3e0d8fb3 2005-12-27 devnull reqmsg.id,
110 3e0d8fb3 2005-12-27 devnull reqmsg.qd->owner->name,
111 3e0d8fb3 2005-12-27 devnull rrname(reqmsg.qd->type, tname, sizeof tname));
112 3e0d8fb3 2005-12-27 devnull
113 3e0d8fb3 2005-12-27 devnull /* loop through each question */
114 3e0d8fb3 2005-12-27 devnull while(reqmsg.qd){
115 3e0d8fb3 2005-12-27 devnull if(reqmsg.qd->type == Taxfr){
116 3e0d8fb3 2005-12-27 devnull dnzone(&reqmsg, &repmsg, &req);
117 3e0d8fb3 2005-12-27 devnull } else {
118 3e0d8fb3 2005-12-27 devnull dnserver(&reqmsg, &repmsg, &req);
119 3e0d8fb3 2005-12-27 devnull reply(1, &repmsg, &req);
120 3e0d8fb3 2005-12-27 devnull rrfreelist(repmsg.qd);
121 3e0d8fb3 2005-12-27 devnull rrfreelist(repmsg.an);
122 3e0d8fb3 2005-12-27 devnull rrfreelist(repmsg.ns);
123 3e0d8fb3 2005-12-27 devnull rrfreelist(repmsg.ar);
124 3e0d8fb3 2005-12-27 devnull }
125 3e0d8fb3 2005-12-27 devnull }
126 3e0d8fb3 2005-12-27 devnull
127 3e0d8fb3 2005-12-27 devnull rrfreelist(reqmsg.qd);
128 3e0d8fb3 2005-12-27 devnull rrfreelist(reqmsg.an);
129 3e0d8fb3 2005-12-27 devnull rrfreelist(reqmsg.ns);
130 3e0d8fb3 2005-12-27 devnull rrfreelist(reqmsg.ar);
131 3e0d8fb3 2005-12-27 devnull
132 3e0d8fb3 2005-12-27 devnull if(req.isslave){
133 3e0d8fb3 2005-12-27 devnull putactivity();
134 3e0d8fb3 2005-12-27 devnull _exits(0);
135 3e0d8fb3 2005-12-27 devnull }
136 3e0d8fb3 2005-12-27 devnull }
137 3e0d8fb3 2005-12-27 devnull refreshmain(mntpt);
138 3e0d8fb3 2005-12-27 devnull }
139 3e0d8fb3 2005-12-27 devnull
140 3e0d8fb3 2005-12-27 devnull static int
141 3e0d8fb3 2005-12-27 devnull readmsg(int fd, uchar *buf, int max)
142 3e0d8fb3 2005-12-27 devnull {
143 3e0d8fb3 2005-12-27 devnull int n;
144 3e0d8fb3 2005-12-27 devnull uchar x[2];
145 3e0d8fb3 2005-12-27 devnull
146 3e0d8fb3 2005-12-27 devnull if(readn(fd, x, 2) != 2)
147 3e0d8fb3 2005-12-27 devnull return -1;
148 3e0d8fb3 2005-12-27 devnull n = (x[0]<<8) | x[1];
149 3e0d8fb3 2005-12-27 devnull if(n > max)
150 3e0d8fb3 2005-12-27 devnull return -1;
151 3e0d8fb3 2005-12-27 devnull if(readn(fd, buf, n) != n)
152 3e0d8fb3 2005-12-27 devnull return -1;
153 3e0d8fb3 2005-12-27 devnull return n;
154 3e0d8fb3 2005-12-27 devnull }
155 3e0d8fb3 2005-12-27 devnull
156 3e0d8fb3 2005-12-27 devnull static void
157 3e0d8fb3 2005-12-27 devnull reply(int fd, DNSmsg *rep, Request *req)
158 3e0d8fb3 2005-12-27 devnull {
159 3e0d8fb3 2005-12-27 devnull int len, rv;
160 3e0d8fb3 2005-12-27 devnull char tname[32];
161 3e0d8fb3 2005-12-27 devnull uchar buf[4096];
162 3e0d8fb3 2005-12-27 devnull RR *rp;
163 3e0d8fb3 2005-12-27 devnull
164 3e0d8fb3 2005-12-27 devnull if(debug){
165 3e0d8fb3 2005-12-27 devnull syslog(0, logfile, "%d: reply (%s) %s %s %ux",
166 3e0d8fb3 2005-12-27 devnull req->id, caller,
167 3e0d8fb3 2005-12-27 devnull rep->qd->owner->name,
168 3e0d8fb3 2005-12-27 devnull rrname(rep->qd->type, tname, sizeof tname),
169 3e0d8fb3 2005-12-27 devnull rep->flags);
170 3e0d8fb3 2005-12-27 devnull for(rp = rep->an; rp; rp = rp->next)
171 3e0d8fb3 2005-12-27 devnull syslog(0, logfile, "an %R", rp);
172 3e0d8fb3 2005-12-27 devnull for(rp = rep->ns; rp; rp = rp->next)
173 3e0d8fb3 2005-12-27 devnull syslog(0, logfile, "ns %R", rp);
174 3e0d8fb3 2005-12-27 devnull for(rp = rep->ar; rp; rp = rp->next)
175 3e0d8fb3 2005-12-27 devnull syslog(0, logfile, "ar %R", rp);
176 3e0d8fb3 2005-12-27 devnull }
177 3e0d8fb3 2005-12-27 devnull
178 3e0d8fb3 2005-12-27 devnull
179 3e0d8fb3 2005-12-27 devnull len = convDNS2M(rep, buf+2, sizeof(buf) - 2);
180 3e0d8fb3 2005-12-27 devnull if(len <= 0)
181 3e0d8fb3 2005-12-27 devnull abort(); /* "dnserver: converting reply" */;
182 3e0d8fb3 2005-12-27 devnull buf[0] = len>>8;
183 3e0d8fb3 2005-12-27 devnull buf[1] = len;
184 3e0d8fb3 2005-12-27 devnull rv = write(fd, buf, len+2);
185 3e0d8fb3 2005-12-27 devnull if(rv != len+2){
186 3e0d8fb3 2005-12-27 devnull syslog(0, logfile, "sending reply: %d instead of %d", rv, len+2);
187 3e0d8fb3 2005-12-27 devnull exits(0);
188 3e0d8fb3 2005-12-27 devnull }
189 3e0d8fb3 2005-12-27 devnull }
190 3e0d8fb3 2005-12-27 devnull
191 3e0d8fb3 2005-12-27 devnull /*
192 3e0d8fb3 2005-12-27 devnull * Hash table for domain names. The hash is based only on the
193 3e0d8fb3 2005-12-27 devnull * first element of the domain name.
194 3e0d8fb3 2005-12-27 devnull */
195 3e0d8fb3 2005-12-27 devnull extern DN *ht[HTLEN];
196 3e0d8fb3 2005-12-27 devnull
197 3e0d8fb3 2005-12-27 devnull static int
198 3e0d8fb3 2005-12-27 devnull numelem(char *name)
199 3e0d8fb3 2005-12-27 devnull {
200 3e0d8fb3 2005-12-27 devnull int i;
201 3e0d8fb3 2005-12-27 devnull
202 3e0d8fb3 2005-12-27 devnull i = 1;
203 3e0d8fb3 2005-12-27 devnull for(; *name; name++)
204 3e0d8fb3 2005-12-27 devnull if(*name == '.')
205 3e0d8fb3 2005-12-27 devnull i++;
206 3e0d8fb3 2005-12-27 devnull return i;
207 3e0d8fb3 2005-12-27 devnull }
208 3e0d8fb3 2005-12-27 devnull
209 3e0d8fb3 2005-12-27 devnull int
210 3e0d8fb3 2005-12-27 devnull inzone(DN *dp, char *name, int namelen, int depth)
211 3e0d8fb3 2005-12-27 devnull {
212 3e0d8fb3 2005-12-27 devnull int n;
213 3e0d8fb3 2005-12-27 devnull
214 3e0d8fb3 2005-12-27 devnull if(dp->name == 0)
215 3e0d8fb3 2005-12-27 devnull return 0;
216 3e0d8fb3 2005-12-27 devnull if(numelem(dp->name) != depth)
217 3e0d8fb3 2005-12-27 devnull return 0;
218 3e0d8fb3 2005-12-27 devnull n = strlen(dp->name);
219 3e0d8fb3 2005-12-27 devnull if(n < namelen)
220 3e0d8fb3 2005-12-27 devnull return 0;
221 3e0d8fb3 2005-12-27 devnull if(strcmp(name, dp->name + n - namelen) != 0)
222 3e0d8fb3 2005-12-27 devnull return 0;
223 3e0d8fb3 2005-12-27 devnull if(n > namelen && dp->name[n - namelen - 1] != '.')
224 3e0d8fb3 2005-12-27 devnull return 0;
225 3e0d8fb3 2005-12-27 devnull return 1;
226 3e0d8fb3 2005-12-27 devnull }
227 3e0d8fb3 2005-12-27 devnull
228 3e0d8fb3 2005-12-27 devnull static void
229 3e0d8fb3 2005-12-27 devnull dnzone(DNSmsg *reqp, DNSmsg *repp, Request *req)
230 3e0d8fb3 2005-12-27 devnull {
231 3e0d8fb3 2005-12-27 devnull DN *dp, *ndp;
232 3e0d8fb3 2005-12-27 devnull RR r, *rp;
233 3e0d8fb3 2005-12-27 devnull int h, depth, found, nlen;
234 3e0d8fb3 2005-12-27 devnull
235 3e0d8fb3 2005-12-27 devnull memset(repp, 0, sizeof(*repp));
236 3e0d8fb3 2005-12-27 devnull repp->id = reqp->id;
237 3e0d8fb3 2005-12-27 devnull repp->flags = Fauth | Fresp | Fcanrec | Oquery;
238 3e0d8fb3 2005-12-27 devnull repp->qd = reqp->qd;
239 3e0d8fb3 2005-12-27 devnull reqp->qd = reqp->qd->next;
240 3e0d8fb3 2005-12-27 devnull repp->qd->next = 0;
241 3e0d8fb3 2005-12-27 devnull dp = repp->qd->owner;
242 3e0d8fb3 2005-12-27 devnull
243 3e0d8fb3 2005-12-27 devnull /* send the soa */
244 3e0d8fb3 2005-12-27 devnull repp->an = rrlookup(dp, Tsoa, NOneg);
245 3e0d8fb3 2005-12-27 devnull reply(1, repp, req);
246 3e0d8fb3 2005-12-27 devnull if(repp->an == 0)
247 3e0d8fb3 2005-12-27 devnull goto out;
248 3e0d8fb3 2005-12-27 devnull rrfreelist(repp->an);
249 3e0d8fb3 2005-12-27 devnull
250 3e0d8fb3 2005-12-27 devnull nlen = strlen(dp->name);
251 3e0d8fb3 2005-12-27 devnull
252 3e0d8fb3 2005-12-27 devnull /* construct a breadth first search of the name space (hard with a hash) */
253 3e0d8fb3 2005-12-27 devnull repp->an = &r;
254 3e0d8fb3 2005-12-27 devnull for(depth = numelem(dp->name); ; depth++){
255 3e0d8fb3 2005-12-27 devnull found = 0;
256 3e0d8fb3 2005-12-27 devnull for(h = 0; h < HTLEN; h++)
257 3e0d8fb3 2005-12-27 devnull for(ndp = ht[h]; ndp; ndp = ndp->next)
258 3e0d8fb3 2005-12-27 devnull if(inzone(ndp, dp->name, nlen, depth)){
259 3e0d8fb3 2005-12-27 devnull for(rp = ndp->rr; rp; rp = rp->next){
260 3e0d8fb3 2005-12-27 devnull /* there shouldn't be negatives, but just in case */
261 3e0d8fb3 2005-12-27 devnull if(rp->negative)
262 3e0d8fb3 2005-12-27 devnull continue;
263 3e0d8fb3 2005-12-27 devnull
264 3e0d8fb3 2005-12-27 devnull /* don't send an soa's, ns's are enough */
265 3e0d8fb3 2005-12-27 devnull if(rp->type == Tsoa)
266 3e0d8fb3 2005-12-27 devnull continue;
267 3e0d8fb3 2005-12-27 devnull
268 3e0d8fb3 2005-12-27 devnull r = *rp;
269 3e0d8fb3 2005-12-27 devnull r.next = 0;
270 3e0d8fb3 2005-12-27 devnull reply(1, repp, req);
271 3e0d8fb3 2005-12-27 devnull }
272 3e0d8fb3 2005-12-27 devnull found = 1;
273 3e0d8fb3 2005-12-27 devnull }
274 3e0d8fb3 2005-12-27 devnull if(!found)
275 3e0d8fb3 2005-12-27 devnull break;
276 3e0d8fb3 2005-12-27 devnull }
277 3e0d8fb3 2005-12-27 devnull
278 3e0d8fb3 2005-12-27 devnull /* resend the soa */
279 3e0d8fb3 2005-12-27 devnull repp->an = rrlookup(dp, Tsoa, NOneg);
280 3e0d8fb3 2005-12-27 devnull reply(1, repp, req);
281 3e0d8fb3 2005-12-27 devnull rrfreelist(repp->an);
282 3e0d8fb3 2005-12-27 devnull out:
283 3e0d8fb3 2005-12-27 devnull rrfree(repp->qd);
284 3e0d8fb3 2005-12-27 devnull }
285 3e0d8fb3 2005-12-27 devnull
286 3e0d8fb3 2005-12-27 devnull static void
287 3e0d8fb3 2005-12-27 devnull getcaller(char *dir)
288 3e0d8fb3 2005-12-27 devnull {
289 3e0d8fb3 2005-12-27 devnull int fd, n;
290 3e0d8fb3 2005-12-27 devnull static char remote[128];
291 3e0d8fb3 2005-12-27 devnull
292 3e0d8fb3 2005-12-27 devnull snprint(remote, sizeof(remote), "%s/remote", dir);
293 3e0d8fb3 2005-12-27 devnull fd = open(remote, OREAD);
294 3e0d8fb3 2005-12-27 devnull if(fd < 0)
295 3e0d8fb3 2005-12-27 devnull return;
296 3e0d8fb3 2005-12-27 devnull n = read(fd, remote, sizeof(remote)-1);
297 3e0d8fb3 2005-12-27 devnull close(fd);
298 3e0d8fb3 2005-12-27 devnull if(n <= 0)
299 3e0d8fb3 2005-12-27 devnull return;
300 3e0d8fb3 2005-12-27 devnull if(remote[n-1] == '\n')
301 3e0d8fb3 2005-12-27 devnull n--;
302 3e0d8fb3 2005-12-27 devnull remote[n] = 0;
303 3e0d8fb3 2005-12-27 devnull caller = remote;
304 3e0d8fb3 2005-12-27 devnull }
305 3e0d8fb3 2005-12-27 devnull
306 3e0d8fb3 2005-12-27 devnull static void
307 3e0d8fb3 2005-12-27 devnull refreshmain(char *net)
308 3e0d8fb3 2005-12-27 devnull {
309 3e0d8fb3 2005-12-27 devnull int fd;
310 3e0d8fb3 2005-12-27 devnull char file[128];
311 3e0d8fb3 2005-12-27 devnull
312 3e0d8fb3 2005-12-27 devnull snprint(file, sizeof(file), "%s/dns", net);
313 3e0d8fb3 2005-12-27 devnull if(debug)
314 3e0d8fb3 2005-12-27 devnull syslog(0, logfile, "refreshing %s", file);
315 3e0d8fb3 2005-12-27 devnull fd = open(file, ORDWR);
316 3e0d8fb3 2005-12-27 devnull if(fd < 0){
317 3e0d8fb3 2005-12-27 devnull syslog(0, logfile, "can't refresh %s", file);
318 3e0d8fb3 2005-12-27 devnull return;
319 3e0d8fb3 2005-12-27 devnull }
320 3e0d8fb3 2005-12-27 devnull fprint(fd, "refresh");
321 3e0d8fb3 2005-12-27 devnull close(fd);
322 3e0d8fb3 2005-12-27 devnull }
323 3e0d8fb3 2005-12-27 devnull
324 3e0d8fb3 2005-12-27 devnull /*
325 3e0d8fb3 2005-12-27 devnull * the following varies between dnsdebug and dns
326 3e0d8fb3 2005-12-27 devnull */
327 3e0d8fb3 2005-12-27 devnull void
328 3e0d8fb3 2005-12-27 devnull logreply(int id, uchar *addr, DNSmsg *mp)
329 3e0d8fb3 2005-12-27 devnull {
330 3e0d8fb3 2005-12-27 devnull RR *rp;
331 3e0d8fb3 2005-12-27 devnull
332 3e0d8fb3 2005-12-27 devnull syslog(0, LOG, "%d: rcvd %I flags:%s%s%s%s%s", id, addr,
333 3e0d8fb3 2005-12-27 devnull mp->flags & Fauth ? " auth" : "",
334 3e0d8fb3 2005-12-27 devnull mp->flags & Ftrunc ? " trunc" : "",
335 3e0d8fb3 2005-12-27 devnull mp->flags & Frecurse ? " rd" : "",
336 3e0d8fb3 2005-12-27 devnull mp->flags & Fcanrec ? " ra" : "",
337 3e0d8fb3 2005-12-27 devnull mp->flags & (Fauth|Rname) == (Fauth|Rname) ?
338 3e0d8fb3 2005-12-27 devnull " nx" : "");
339 3e0d8fb3 2005-12-27 devnull for(rp = mp->qd; rp != nil; rp = rp->next)
340 3e0d8fb3 2005-12-27 devnull syslog(0, LOG, "%d: rcvd %I qd %s", id, addr, rp->owner->name);
341 3e0d8fb3 2005-12-27 devnull for(rp = mp->an; rp != nil; rp = rp->next)
342 3e0d8fb3 2005-12-27 devnull syslog(0, LOG, "%d: rcvd %I an %R", id, addr, rp);
343 3e0d8fb3 2005-12-27 devnull for(rp = mp->ns; rp != nil; rp = rp->next)
344 3e0d8fb3 2005-12-27 devnull syslog(0, LOG, "%d: rcvd %I ns %R", id, addr, rp);
345 3e0d8fb3 2005-12-27 devnull for(rp = mp->ar; rp != nil; rp = rp->next)
346 3e0d8fb3 2005-12-27 devnull syslog(0, LOG, "%d: rcvd %I ar %R", id, addr, rp);
347 3e0d8fb3 2005-12-27 devnull }
348 3e0d8fb3 2005-12-27 devnull
349 3e0d8fb3 2005-12-27 devnull void
350 3e0d8fb3 2005-12-27 devnull logsend(int id, int subid, uchar *addr, char *sname, char *rname, int type)
351 3e0d8fb3 2005-12-27 devnull {
352 3e0d8fb3 2005-12-27 devnull char buf[12];
353 3e0d8fb3 2005-12-27 devnull
354 3e0d8fb3 2005-12-27 devnull syslog(0, LOG, "%d.%d: sending to %I/%s %s %s",
355 3e0d8fb3 2005-12-27 devnull id, subid, addr, sname, rname, rrname(type, buf, sizeof buf));
356 3e0d8fb3 2005-12-27 devnull }
357 3e0d8fb3 2005-12-27 devnull
358 3e0d8fb3 2005-12-27 devnull RR*
359 3e0d8fb3 2005-12-27 devnull getdnsservers(int class)
360 3e0d8fb3 2005-12-27 devnull {
361 3e0d8fb3 2005-12-27 devnull return dnsservers(class);
362 3e0d8fb3 2005-12-27 devnull }