]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/ndb/dnsgetip.c
fix misleading/wrong fd checks
[plan9front.git] / sys / src / cmd / ndb / dnsgetip.c
index 50c548b8b24daf9515404391b13d1763579ce4cc..e53fccbb6b0f31c7d0cbadf0432be65e1350a0d5 100644 (file)
@@ -8,49 +8,72 @@
 Cfg cfg;
 char *dbfile;
 int debug              = 0;
-char *logfile          = "resolve";
+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;
+int aflag = 0;
+int addresses = 0;
 
-void
+char Ebotch[] = "dns botch";
+
+char*
 resolve(char *name, int type)
 {
+       int status;
+       char *errmsg;
        Request req;
-       RR *rp;
+       RR *rr, *rp, *neg;
+
+       status = Rok;
+       errmsg = nil;
 
        memset(&req, 0, sizeof req);
        getactivity(&req, 0);
        req.isslave = 1;
        req.aborttime = NS2MS(nowns) + Maxreqtm;
 
-       rp = dnresolve(name, Cin, type, &req, 0, 0, Recurse, 0, 0);
-       while(rp != nil){
-               if(rp->ip != nil)
-                       print("%s\n", rp->ip->name);
+       rr = dnresolve(name, Cin, type, &req, nil, 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);
-               rp = rp->next;
        }
+
+       rrfreelist(rr);
+
+       return errmsg;
 }
 
 void
 usage(void)
 {
-       fprint(2, "%s: [-adx] [-f ndb-file] domain\n", argv0);
+       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;
@@ -65,9 +88,6 @@ main(int argc, char **argv)
        case 'x':
                strcpy(mntpt, "/net.alt");
                break;
-       case 'f':
-               dbfile = EARGF(usage());
-               break;
        default:
                usage();
        }ARGEND
@@ -75,14 +95,20 @@ main(int argc, char **argv)
        if(argc != 1)
                usage();
 
-       if(strcmp(ipattr(argv[0]), "ip") == 0){
-               print("%s\n", argv[0]);
-               exits(nil);
-       }
+       if(strcmp(ipattr(*argv), "ip") == 0)
+               print("%s\n", *argv);
+       else {
+               dninit();
+               e4 = resolve(*argv, Ta);
+               e6 = resolve(*argv, Taaaa);
 
-       dninit();
-       resolve(argv[0], Ta);
-       resolve(argv[0], 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);
 }
 
@@ -96,4 +122,3 @@ getdnsservers(int class)
 void syslog(int, char*, char*, ...){}
 void logreply(int, uchar*, DNSmsg*){}
 void logsend(int, int, uchar*, char*, char*, int){}
-