code: plan9front

Download patch

ref: 498d86b9218287b2b5c16aa54a283249fbd4e5a3
parent: c67593125c93d80c281ee7a52ed81595ce2b7b92
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Mon Nov 1 12:31:39 EDT 2021

ndb/dnsquery: make ! bang work with reverse lookups, document in ndb(8)

--- a/sys/man/8/ndb
+++ b/sys/man/8/ndb
@@ -683,6 +683,9 @@
 .I Ndb/dnsquery
 prompts for commands of the form
 .IP
+[
+.B !
+]
 .I "domain-name request-type"
 .LP
 where
@@ -700,6 +703,11 @@
 will reverse the ip address and tack on the
 .B .in-addr.arpa
 if necessary.
+If the command starts with an exclamation mark
+.B !
+then the response is returned in
+.IR ndb (6)
+format.
 The
 .B -x
 option switches
@@ -707,7 +715,7 @@
 to query the dns server on
 .B /net.alt
 instead of
-.B /net
+.BR /net .
 .PP
 .I Ndb/dnsdebug
 is like
--- a/sys/src/cmd/ndb/dnsquery.c
+++ b/sys/src/cmd/ndb/dnsquery.c
@@ -53,41 +53,47 @@
 query(int fd)
 {
 	int n;
-	char *lp;
+	char *lp, *bang;
 	char buf[1024], line[1024];
 	Biobuf in;
 
 	Binit(&in, 0, OREAD);
 	for(fprint(2, "> "); lp = Brdline(&in, '\n'); fprint(2, "> ")){
-		n = Blinelen(&in) -1;
-		while(isspace(lp[n]))
-			lp[n--] = 0;
-		n++;
-		while(isspace(*lp)){
-			lp++;
+		n = Blinelen(&in);
+		while(n > 0 && isspace(lp[n-1]))
 			n--;
+		lp[n] = 0;
+		while(isspace(*lp))
+			lp++;
+		bang = "";
+		while(*lp == '!'){
+			bang = "!";
+			lp++;
 		}
-		if(!*lp)
+		while(isspace(*lp))
+			lp++;
+		if(*lp == 0)
 			continue;
-		strcpy(line, lp);
 
 		/* default to an "ip" request if alpha, "ptr" if numeric */
-		if(strchr(line, ' ') == nil)
-			if(strcmp(ipattr(line), "ip") == 0) {
-				strcat(line, " ptr");
-				n += 4;
+		if(strchr(lp, ' ') == nil){
+			if(strcmp(ipattr(lp), "ip") == 0) {
+				n = snprint(line, sizeof line, "%s ptr", lp);
 			} else {
-				strcat(line, " ip");
-				n += 3;
+				n = snprint(line, sizeof line, "%s ip", lp);
 			}
+		} else {
+			n = snprint(line, sizeof line, "%s", lp);
+		}
 
 		if(n > 4 && strcmp(" ptr", &line[n-4]) == 0){
 			line[n-4] = 0;
 			mkptrname(line, buf, sizeof buf);
-			n = snprint(line, sizeof line, "%s ptr", buf);
+			snprint(line, sizeof line, "%s ptr", buf);
 		}
 
-		querydns(fd, line, n);
+		n = snprint(buf, sizeof buf, "%s%s", bang, line);
+		querydns(fd, buf, n);
 	}
 	Bterm(&in);
 }