]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/libndb/dnsquery.c
merge
[plan9front.git] / sys / src / libndb / dnsquery.c
old mode 100755 (executable)
new mode 100644 (file)
index 1523031..634756b
@@ -3,8 +3,8 @@
 #include <bio.h>
 #include <ndb.h>
 #include <ndbhf.h>
+#include <ip.h>
 
-static void nstrcpy(char*, char*, int);
 static void mkptrname(char*, char*, int);
 static Ndbtuple *doquery(int, char *dn, char *type);
 
@@ -77,40 +77,24 @@ dnsquery(char *net, char *val, char *type)
 static void
 mkptrname(char *ip, char *rip, int rlen)
 {
-       char buf[128];
-       char *p, *np;
-       int len;
-
-       if(strstr(ip, "in-addr.arpa") || strstr(ip, "IN-ADDR.ARPA")){
-               nstrcpy(rip, ip, rlen);
-               return;
-       }
-
-       nstrcpy(buf, ip, sizeof buf);
-       for(p = buf; *p; p++)
-               ;
-       *p = '.';
-       np = rip;
-       len = 0;
-       while(p >= buf){
-               len++;
-               p--;
-               if(*p == '.'){
-                       memmove(np, p+1, len);
-                       np += len;
-                       len = 0;
+       uchar a[IPaddrlen];
+       char *p, *e;
+       int i;
+
+       if(cistrstr(ip, "in-addr.arpa") || cistrstr(ip, "ip6.arpa") || parseip(a, ip) == -1)
+               snprint(rip, rlen, "%s", ip);
+       else if(isv4(a))
+               snprint(rip, rlen, "%ud.%ud.%ud.%ud.in-addr.arpa",
+                       a[15], a[14], a[13], a[12]);
+       else{
+               p = rip;
+               e = rip + rlen;
+               for(i = 15; i >= 0; i--){
+                       p = seprint(p, e, "%ux.", a[i]&0xf);
+                       p = seprint(p, e, "%ux.", a[i]>>4);
                }
+               seprint(p, e, "ip6.arpa");
        }
-       memmove(np, p+1, len);
-       np += len;
-       strcpy(np, "in-addr.arpa");
-}
-
-static void
-nstrcpy(char *to, char *from, int len)
-{
-       strncpy(to, from, len);
-       to[len-1] = 0;
 }
 
 static Ndbtuple*
@@ -145,17 +129,14 @@ doquery(int fd, char *dn, char *type)
 
                t = _ndbparseline(buf);
                if(t != nil){
-                       if(first)
+                       if(first != nil)
                                last->entry = t;
                        else
                                first = t;
                        last = t;
-
-                       while(last->entry)
+                       while(last->entry != nil)
                                last = last->entry;
                }
        }
-
-       ndbsetmalloctag(first, getcallerpc(&fd));
        return first;
 }