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
|
implement Rpcio;
include "sys.m";
sys: Sys;
include "draw.m";
include "bufio.m";
bufio: Bufio;
Iobuf: import bufio;
include "arg.m";
Rpcio: module
{
init: fn(nil: ref Draw->Context, nil: list of string);
};
usage()
{
sys->fprint(sys->fildes(2), "usage: rpc\n");
raise "fail:usage";
}
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);
file := "/mnt/factotum/rpc";
if(len args > 1)
file = hd tl args;
rfd := sys->open(file, Sys->ORDWR);
if(rfd == nil){
sys->fprint(sys->fildes(2), "rpc: can't open %s: %r\n", file);
raise "fail:load";
}
f := bufio->fopen(sys->fildes(0), Sys->OREAD);
for(;;){
sys->print("> ");
s := f.gets('\n');
if(s == nil)
break;
rpc(rfd, s[0:len s-1]);
}
}
cantload(s: string)
{
sys->fprint(sys->fildes(2), "csquery: can't load %s: %r\n", s);
raise "fail:load";
}
rpc(f: ref Sys->FD, addr: string)
{
b := array of byte addr;
if(sys->write(f, b, len b) > 0){
sys->seek(f, big 0, Sys->SEEKSTART);
buf := array[4096+3] of byte;
if((n := sys->read(f, buf, len buf)) > 0)
sys->print("%s\n", string buf[0:n]);
if(n >= 0)
return;
}
sys->print("!%r\n");
}
|