summaryrefslogtreecommitdiff
path: root/appl/cmd/ndb/regquery.b
blob: f7f324628f1f2c096b63821b4bbe13df964b116a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
implement Regquery;

include "sys.m";
	sys: Sys;

include "draw.m";

include "bufio.m";
	bufio: Bufio;
	Iobuf: import bufio;

include "string.m";
	str: String;

include "arg.m";

Regquery: module
{
	init:	fn(nil: ref Draw->Context, nil: list of string);
};

init(nil: ref Draw->Context, args: list of string)
{
	sys = load Sys Sys->PATH;
	bufio = load Bufio Bufio->PATH;
	if(bufio == nil)
		cantload(Bufio->PATH);
	str = load String String->PATH;
	if(str == nil)
		cantload(String->PATH);

	mntpt := "/mnt/registry";
	arg := load Arg Arg->PATH;
	if(arg == nil)
		cantload(Arg->PATH);
	arg->init(args);
	arg->setusage("regquery [-m mntpt] [-n] [attr val attr val ...]");
	namesonly := 0;
	while((c := arg->opt()) != 0)
		case c {
		'm' =>	mntpt = arg->earg();
		'n' =>	namesonly = 1;
		* =>	arg->usage();
		}
	args = arg->argv();
	arg = nil;

	finder := mntpt+"/find";
	if(args != nil){
		s := "";
		for(; args != nil; args = tl args)
			s += sys->sprint(" %q", hd args);
		if(s != nil)
			s = s[1:];
		regquery(finder, s, namesonly);
	}else{
		f := bufio->fopen(sys->fildes(0), Sys->OREAD);
		if(f == nil)
			exit;
		for(;;){
			sys->print("> ");
			s := f.gets('\n');
			if(s == nil)
				break;
			regquery(finder, s[0:len s-1], namesonly);
		}
	}
}

cantload(s: string)
{
	sys->fprint(sys->fildes(2), "regquery: can't load %s: %r\n", s);
	raise "fail:load";
}

regquery(server: string, addr: string, namesonly: int)
{
	fd := sys->open(server, Sys->ORDWR);
	if(fd == nil){
		sys->fprint(sys->fildes(2), "regquery: can't open %s: %r\n", server);
		raise "fail:open";
	}
	stdout := sys->fildes(1);
	b := array of byte addr;
	if(sys->write(fd, b, len b) >= 0){
		sys->seek(fd, big 0, Sys->SEEKSTART);
		if(namesonly){
			bio := bufio->fopen(fd, Bufio->OREAD);
			while((s := bio.gets('\n')) != nil){
				l := str->unquoted(s);
				if(l != nil)
					sys->print("%s\n", hd l);
			}
			return;
		}else{
			buf := array[Sys->ATOMICIO] of byte;
			while((n := sys->read(fd, buf, len buf)) > 0)
				sys->print("%s", string buf[0:n]);
			if(n == 0)
				return;
		}
	}
	sys->fprint(sys->fildes(2), "regquery: %r\n");
}