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