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