#include #include #include #include #include #include <9pclient.h> #include "dns.h" #include "ip.h" void usage(void) { fprint(2, "usage: dnsquery [-x service]\n"); threadexitsall("usage"); } void threadmain(int argc, char *argv[]) { CFid *fd; int n, len; Biobuf in; char line[1024], *lp, *p, *np, *dns; char buf[1024]; dns = "dns"; ARGBEGIN{ case 'x': dns = EARGF(usage()); break; default: usage(); }ARGEND; if(argc) usage(); fd = nsopen(dns, nil, "dns", ORDWR); if(fd == nil) sysfatal("open %s!dns: %r", dns); Binit(&in, 0, OREAD); for(print("> "); lp = Brdline(&in, '\n'); print("> ")){ n = Blinelen(&in)-1; strncpy(line, lp, n); line[n] = 0; if (n<=1) continue; /* default to an "ip" request if alpha, "ptr" if numeric */ if (strchr(line, ' ')==0) { if(strcmp(ipattr(line), "ip") == 0) { strcat(line, " ptr"); n += 4; } else { strcat(line, " ip"); n += 3; } } /* inverse queries may need to be permuted */ if(n > 4 && strcmp("ptr", &line[n-3]) == 0 && strstr(line, "IN-ADDR") == 0 && strstr(line, "in-addr") == 0){ for(p = line; *p; p++) if(*p == ' '){ *p = '.'; break; } np = buf; len = 0; while(p >= line){ len++; p--; if(*p == '.'){ memmove(np, p+1, len); np += len; len = 0; } } memmove(np, p+1, len); np += len; strcpy(np, "in-addr.arpa ptr"); strcpy(line, buf); n = strlen(line); } fsseek(fd, 0, 0); if(fswrite(fd, line, n) < 0) { print("!%r\n"); continue; } fsseek(fd, 0, 0); while((n = fsread(fd, buf, sizeof(buf))) > 0){ buf[n] = 0; print("%s\n", buf); } } threadexitsall(0); }