xref: /inferno-os/appl/cmd/ndb/csquery.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Csquery;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.Forsyth	sys: Sys;
5*37da2899SCharles.Forsyth
6*37da2899SCharles.Forsythinclude "draw.m";
7*37da2899SCharles.Forsyth
8*37da2899SCharles.Forsythinclude "bufio.m";
9*37da2899SCharles.Forsyth	bufio: Bufio;
10*37da2899SCharles.Forsyth	Iobuf: import bufio;
11*37da2899SCharles.Forsyth
12*37da2899SCharles.Forsythinclude "arg.m";
13*37da2899SCharles.Forsyth
14*37da2899SCharles.ForsythCsquery: module
15*37da2899SCharles.Forsyth{
16*37da2899SCharles.Forsyth	init:	fn(nil: ref Draw->Context, nil: list of string);
17*37da2899SCharles.Forsyth};
18*37da2899SCharles.Forsyth
19*37da2899SCharles.Forsythusage()
20*37da2899SCharles.Forsyth{
21*37da2899SCharles.Forsyth	sys->fprint(sys->fildes(2), "usage: csquery [-x /net] [-s server] [address ...]\n");
22*37da2899SCharles.Forsyth	raise "fail:usage";
23*37da2899SCharles.Forsyth}
24*37da2899SCharles.Forsyth
25*37da2899SCharles.Forsythinit(nil: ref Draw->Context, args: list of string)
26*37da2899SCharles.Forsyth{
27*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
28*37da2899SCharles.Forsyth	bufio = load Bufio Bufio->PATH;
29*37da2899SCharles.Forsyth	if(bufio == nil)
30*37da2899SCharles.Forsyth		cantload(Bufio->PATH);
31*37da2899SCharles.Forsyth
32*37da2899SCharles.Forsyth	net := "/net";
33*37da2899SCharles.Forsyth	server: string;
34*37da2899SCharles.Forsyth	arg := load Arg Arg->PATH;
35*37da2899SCharles.Forsyth	if(arg == nil)
36*37da2899SCharles.Forsyth		cantload(Arg->PATH);
37*37da2899SCharles.Forsyth	arg->init(args);
38*37da2899SCharles.Forsyth	while((c := arg->opt()) != 0)
39*37da2899SCharles.Forsyth		case c {
40*37da2899SCharles.Forsyth		'x' =>
41*37da2899SCharles.Forsyth			net = arg->arg();
42*37da2899SCharles.Forsyth			if(net == nil)
43*37da2899SCharles.Forsyth				usage();
44*37da2899SCharles.Forsyth		's' =>
45*37da2899SCharles.Forsyth			server = arg->arg();
46*37da2899SCharles.Forsyth			if(server == nil)
47*37da2899SCharles.Forsyth				usage();
48*37da2899SCharles.Forsyth		* =>
49*37da2899SCharles.Forsyth			usage();
50*37da2899SCharles.Forsyth		}
51*37da2899SCharles.Forsyth	args = arg->argv();
52*37da2899SCharles.Forsyth	arg = nil;
53*37da2899SCharles.Forsyth
54*37da2899SCharles.Forsyth	if(server == nil)
55*37da2899SCharles.Forsyth		server = net+"/cs";
56*37da2899SCharles.Forsyth	if(args != nil){
57*37da2899SCharles.Forsyth		for(; args != nil; args = tl args)
58*37da2899SCharles.Forsyth			csquery(server, hd args);
59*37da2899SCharles.Forsyth	}else{
60*37da2899SCharles.Forsyth		f := bufio->fopen(sys->fildes(0), Sys->OREAD);
61*37da2899SCharles.Forsyth		if(f == nil)
62*37da2899SCharles.Forsyth			exit;
63*37da2899SCharles.Forsyth		for(;;){
64*37da2899SCharles.Forsyth			sys->print("> ");
65*37da2899SCharles.Forsyth			s := f.gets('\n');
66*37da2899SCharles.Forsyth			if(s == nil)
67*37da2899SCharles.Forsyth				break;
68*37da2899SCharles.Forsyth			csquery(server, s[0:len s-1]);
69*37da2899SCharles.Forsyth		}
70*37da2899SCharles.Forsyth	}
71*37da2899SCharles.Forsyth}
72*37da2899SCharles.Forsyth
73*37da2899SCharles.Forsythcantload(s: string)
74*37da2899SCharles.Forsyth{
75*37da2899SCharles.Forsyth	sys->fprint(sys->fildes(2), "csquery: can't load %s: %r\n", s);
76*37da2899SCharles.Forsyth	raise "fail:load";
77*37da2899SCharles.Forsyth}
78*37da2899SCharles.Forsyth
79*37da2899SCharles.Forsythcsquery(server: string, addr: string)
80*37da2899SCharles.Forsyth{
81*37da2899SCharles.Forsyth	cs := sys->open(server, Sys->ORDWR);
82*37da2899SCharles.Forsyth	if(cs == nil){
83*37da2899SCharles.Forsyth		sys->fprint(sys->fildes(2), "csquery: can't open %s: %r\n", server);
84*37da2899SCharles.Forsyth		raise "fail:open";
85*37da2899SCharles.Forsyth	}
86*37da2899SCharles.Forsyth	stdout := sys->fildes(1);
87*37da2899SCharles.Forsyth	b := array of byte addr;
88*37da2899SCharles.Forsyth	if(sys->write(cs, b, len b) > 0){
89*37da2899SCharles.Forsyth		sys->seek(cs, big 0, Sys->SEEKSTART);
90*37da2899SCharles.Forsyth		buf := array[256] of byte;
91*37da2899SCharles.Forsyth		while((n := sys->read(cs, buf, len buf)) > 0)
92*37da2899SCharles.Forsyth			sys->print("%s\n", string buf[0:n]);
93*37da2899SCharles.Forsyth		if(n == 0)
94*37da2899SCharles.Forsyth			return;
95*37da2899SCharles.Forsyth	}
96*37da2899SCharles.Forsyth	sys->print("%s: %r\n", addr);
97*37da2899SCharles.Forsyth}
98