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