git: 9front

Download patch

ref: aa4b0ebd3eec4ac96990f6fb7f29479609bbce80
parent: 23f3d33cdbbfdf2f169f1d7c4acf1f947ed5f5c5
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Wed Aug 1 21:25:34 EDT 2012

libndb: apply eriks dnsquery() ipv6 reverse lookup patch

--- a/sys/src/libndb/dnsquery.c
+++ b/sys/src/libndb/dnsquery.c
@@ -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,45 +77,24 @@
 static void
 mkptrname(char *ip, char *rip, int rlen)
 {
-	char buf[128];
-	char *p, *np;
-	int len;
+	uchar a[IPaddrlen];
+	char *p, *e;
+	int i;
 
-	if(cistrstr(ip, "in-addr.arpa") || cistrstr(ip, "ip6.arpa")){
-		nstrcpy(rip, ip, rlen);
-		return;
-	}
-	nstrcpy(buf, ip, sizeof buf);
-
-	/* truncate if result wont fit in rip[rlen] */
-	assert(rlen > 14);
-	if((rlen-14) < sizeof(buf))
-		buf[rlen-14] = 0;
-
-	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;
+	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*
--