Blob
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"10 void11 usage(void)12 {13 fprint(2, "usage: dnsquery [-x service]\n");14 threadexitsall("usage");15 }17 void18 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];26 dns = "dns";27 ARGBEGIN{28 case 'x':29 dns = EARGF(usage());30 break;31 default:32 usage();33 }ARGEND;35 if(argc)36 usage();38 fd = nsopen(dns, nil, "dns", ORDWR);39 if(fd == nil)40 sysfatal("open %s!dns: %r", dns);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 }60 /* inverse queries may need to be permuted */61 if(n > 4 && strcmp("ptr", &line[n-3]) == 062 && 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 }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 }