Plan 9 from Bell Labs’s /usr/web/sources/contrib/quanstro/root/sys/src/cmd/ndb/dnsquery.c

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


#include <u.h>
#include <libc.h>
#include <bio.h>
#include <ndb.h>
#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);
}

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].