1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
/* one-shot resolver */
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <ndb.h>
#include "dns.h"
Cfg cfg;
char *dbfile;
int debug = 0;
char *logfile = "dnsgetip";
int maxage = 60*60;
char mntpt[Maxpath];
int needrefresh = 0;
ulong now = 0;
vlong nowns = 0;
int testing = 0;
int traceactivity = 0;
char *zonerefreshprogram;
int aflag = 0;
int addresses = 0;
char Ebotch[] = "dns botch";
char*
resolve(char *name, int type)
{
int status;
char *errmsg;
Request req;
RR *rr, *rp, *neg;
status = Rok;
errmsg = nil;
memset(&req, 0, sizeof req);
getactivity(&req, 0);
req.isslave = 1;
req.aborttime = NS2MS(nowns) + Maxreqtm;
rr = dnresolve(name, Cin, type, &req, 0, 0, Recurse, 0, &status);
neg = rrremneg(&rr);
if(rr == nil || neg != nil){
if(neg != nil)
status = neg->negrcode;
errmsg = Ebotch;
if(status > 0 && status < nrname)
errmsg = rname[status];
}
rrfreelist(neg);
for(rp = rr; rp != nil; rp = rp->next){
print("%s\n", rp->ip->name);
addresses++;
if(!aflag)
exits(nil);
}
rrfreelist(rr);
return errmsg;
}
void
usage(void)
{
fprint(2, "%s: [-adx] domain\n", argv0);
exits("usage");
}
void
main(int argc, char **argv)
{
char *e4, *e6;
strcpy(mntpt, "/net");
cfg.inside = 1;
cfg.resolver = 1;
ARGBEGIN{
case 'a':
aflag = 1;
break;
case 'd':
debug++;
break;
case 'x':
strcpy(mntpt, "/net.alt");
break;
default:
usage();
}ARGEND
if(argc != 1)
usage();
if(strcmp(ipattr(*argv), "ip") == 0)
print("%s\n", *argv);
else {
dninit();
e4 = resolve(*argv, Ta);
e6 = resolve(*argv, Taaaa);
if(addresses == 0){
if(e4 == e6)
sysfatal("%s: dns failure: %s", *argv, e4);
sysfatal("%s: dns failure: v4: %s: v6: %s", *argv, e4, e6);
}
}
exits(nil);
}
RR*
getdnsservers(int class)
{
return dnsservers(class);
}
/* stubs */
void syslog(int, char*, char*, ...){}
void logreply(int, uchar*, DNSmsg*){}
void logsend(int, int, uchar*, char*, char*, int){}
|