#include #include #include #include #include "dns.h" #include "ip.h" int doquery(int fd, char *line, int n) { int len; char *p, *np; char buf[1024]; /* 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); } seek(fd, 0, 0); if(write(fd, line, n) < 0) { print("!%r\n"); return -1; } seek(fd, 0, 0); while((n = read(fd, buf, sizeof(buf))) > 0){ buf[n] = 0; print("%s\n", buf); } return 0; } void main(int argc, char *argv[]) { int fd, rv, n, domount; Biobuf in; char line[1024], *lp, *p, *e, *net, mtpt[40], srv[40], dns[40]; net = nil; domount = 1; ARGBEGIN { case 'x': net = ARGF(); if(net == nil){ /* temporary compatability */ fprint(2, "-x needs argument; assuming net.alt\n"); net = "/net.alt"; } break; default: fprint(2, "usage: %s [-x netmtpt]\n", argv0); exits("usage"); } ARGEND; setnetmtpt(mtpt, sizeof mtpt, net); snprint(dns, sizeof dns, "%s/dns", mtpt); snprint(srv, sizeof srv, "/srv/dns_%s", mtpt+1); for(n = strlen(srv); n>0 && srv[-1] == '/'; ) srv[--n] = 0; if(strcmp(srv, "/srv/dns_net") == 0) srv[8] = 0; fd = open(dns, ORDWR); if(fd < 0){ if(domount == 0){ fprint(2, "can't open %s: %r\n", mtpt); exits(0); } fd = open(srv, ORDWR); if(fd < 0){ print("can't open %s: %r\n", srv); exits(0); } if(mount(fd, -1, mtpt, MBEFORE, "") < 0){ print("can't mount(%s, %s): %r\n", srv, mtpt); exits(0); } fd = open(dns, ORDWR); if(fd < 0){ print("can't open %s: %r\n", mtpt); exits(0); } } rv = 0; if(argc > 0){ p = line; e = line+sizeof line; while(--argc) p = seprint(p, e, "%s ", *argv++); p = seprint(p, e, "%s", *argv); *p = 0; rv |= doquery(fd, line, p-line); }else{ Binit(&in, 0, OREAD); for(fprint(2, "> "); lp = Brdline(&in, '\n'); fprint(2, "> ")){ n = Blinelen(&in)-1; strncpy(line, lp, n); line[n] = 0; if (n<=1) continue; rv |= doquery(fd, line, n); } } close(fd); exits(rv ? "fail" : 0); }