summaryrefslogtreecommitdiff
path: root/sys/src/cmd/ndb/dnsquery.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/ndb/dnsquery.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/ndb/dnsquery.c')
-rwxr-xr-xsys/src/cmd/ndb/dnsquery.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/sys/src/cmd/ndb/dnsquery.c b/sys/src/cmd/ndb/dnsquery.c
new file mode 100755
index 000000000..8c2721336
--- /dev/null
+++ b/sys/src/cmd/ndb/dnsquery.c
@@ -0,0 +1,140 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <ctype.h>
+#include <ndb.h>
+#include "dns.h"
+#include "ip.h"
+
+static int domount;
+static char *mtpt, *dns, *srv;
+
+static int
+setup(int argc, char **argv)
+{
+ int fd;
+
+ if(argc == 1){
+ domount = 0;
+ mtpt = argv[0];
+ }
+
+ fd = open(dns, ORDWR);
+ if(fd < 0){
+ if(domount == 0)
+ sysfatal("can't open %s: %r", dns);
+ fd = open(srv, ORDWR);
+ if(fd < 0)
+ sysfatal("can't open %s: %r", srv);
+ if(mount(fd, -1, mtpt, MBEFORE, "") < 0)
+ sysfatal("can't mount(%s, %s): %r", srv, mtpt);
+ fd = open(dns, ORDWR);
+ if(fd < 0)
+ sysfatal("can't open %s: %r", dns);
+ }
+ return fd;
+}
+
+static void
+querydns(int fd, char *line, int n)
+{
+ char buf[1024];
+
+ seek(fd, 0, 0);
+ if(write(fd, line, n) != n) {
+ print("!%r\n");
+ return;
+ }
+ seek(fd, 0, 0);
+ buf[0] = '\0';
+ while((n = read(fd, buf, sizeof(buf))) > 0){
+ buf[n] = '\0';
+ print("%s\n", buf);
+ }
+}
+
+static void
+query(int fd)
+{
+ int n, len;
+ char *lp, *p, *np;
+ char buf[1024], line[1024];
+ Biobuf in;
+
+ Binit(&in, 0, OREAD);
+ for(print("> "); lp = Brdline(&in, '\n'); print("> ")){
+ n = Blinelen(&in) -1;
+ while(isspace(lp[n]))
+ lp[n--] = 0;
+ n++;
+ while(isspace(*lp)){
+ lp++;
+ n--;
+ }
+ if(!*lp)
+ 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;
+ } else {
+ strcat(line, " ip");
+ n += 3;
+ }
+
+ /* inverse queries may need to be permuted */
+ if(n > 4 && strcmp(" ptr", &line[n-4]) == 0 &&
+ cistrstr(line, ".arpa") == nil){
+ /* TODO: reversing v6 addrs is harder */
+ 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"); /* TODO: ip6.arpa for v6 */
+ strcpy(line, buf);
+ n = strlen(line);
+ }
+
+ querydns(fd, line, n);
+ }
+ Bterm(&in);
+}
+
+void
+main(int argc, char *argv[])
+{
+ mtpt = "/net";
+ dns = "/net/dns";
+ srv = "/srv/dns";
+ domount = 1;
+ ARGBEGIN {
+ case 'x':
+ mtpt = "/net.alt";
+ dns = "/net.alt/dns";
+ srv = "/srv/dns_net.alt";
+ break;
+ default:
+ fprint(2, "usage: %s [-x] [dns-mount-point]\n", argv0);
+ exits("usage");
+ } ARGEND;
+
+ query(setup(argc, argv));
+ exits(0);
+}