plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

dnsquery.c (1722B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <bio.h>
      4 #include <ndb.h>
      5 #include <thread.h>
      6 #include <9pclient.h>
      7 #include "dns.h"
      8 #include "ip.h"
      9 
     10 void
     11 usage(void)
     12 {
     13 	fprint(2, "usage: dnsquery [-x service]\n");
     14 	threadexitsall("usage");
     15 }
     16 
     17 void
     18 threadmain(int argc, char *argv[])
     19 {
     20 	CFid *fd;
     21 	int n, len;
     22 	Biobuf in;
     23 	char line[1024], *lp, *p, *np, *dns;
     24 	char buf[1024];
     25 
     26 	dns = "dns";
     27 	ARGBEGIN{
     28 	case 'x':
     29 		dns = EARGF(usage());
     30 		break;
     31 	default:
     32 		usage();
     33 	}ARGEND;
     34 
     35 	if(argc)
     36 		usage();
     37 
     38 	fd = nsopen(dns, nil, "dns", ORDWR);
     39 	if(fd == nil)
     40 		sysfatal("open %s!dns: %r", dns);
     41 
     42 	Binit(&in, 0, OREAD);
     43 	for(print("> "); lp = Brdline(&in, '\n'); print("> ")){
     44 		n = Blinelen(&in)-1;
     45 		strncpy(line, lp, n);
     46 		line[n] = 0;
     47 		if (n<=1)
     48 			continue;
     49 		/* default to an "ip" request if alpha, "ptr" if numeric */
     50 		if (strchr(line, ' ')==0) {
     51 			if(strcmp(ipattr(line), "ip") == 0) {
     52 				strcat(line, " ptr");
     53 				n += 4;
     54 			} else {
     55 				strcat(line, " ip");
     56 				n += 3;
     57 			}
     58 		}
     59 
     60 		/* inverse queries may need to be permuted */
     61 		if(n > 4 && strcmp("ptr", &line[n-3]) == 0
     62 		&& strstr(line, "IN-ADDR") == 0 && strstr(line, "in-addr") == 0){
     63 			for(p = line; *p; p++)
     64 				if(*p == ' '){
     65 					*p = '.';
     66 					break;
     67 				}
     68 			np = buf;
     69 			len = 0;
     70 			while(p >= line){
     71 				len++;
     72 				p--;
     73 				if(*p == '.'){
     74 					memmove(np, p+1, len);
     75 					np += len;
     76 					len = 0;
     77 				}
     78 			}
     79 			memmove(np, p+1, len);
     80 			np += len;
     81 			strcpy(np, "in-addr.arpa ptr");
     82 			strcpy(line, buf);
     83 			n = strlen(line);
     84 		}
     85 
     86 		fsseek(fd, 0, 0);
     87 		if(fswrite(fd, line, n) < 0) {
     88 			print("!%r\n");
     89 			continue;
     90 		}
     91 		fsseek(fd, 0, 0);
     92 		while((n = fsread(fd, buf, sizeof(buf))) > 0){
     93 			buf[n] = 0;
     94 			print("%s\n", buf);
     95 		}
     96 	}
     97 	threadexitsall(0);
     98 }