diff options
Diffstat (limited to 'appl/cmd/ndb/regquery.b')
| -rw-r--r-- | appl/cmd/ndb/regquery.b | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/appl/cmd/ndb/regquery.b b/appl/cmd/ndb/regquery.b new file mode 100644 index 00000000..f7f32462 --- /dev/null +++ b/appl/cmd/ndb/regquery.b @@ -0,0 +1,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"); +} |
