ref: a5cb451b299b03f44154fac5780b6a57ca130ce0
dir: /appl/cmd/engridden.b/
implement Engridden;
include "sys.m";
sys: Sys;
include "draw.m";
include "string.m";
include "env.m";
include "arg.m";
include "bufio.m";
stderr: ref Sys->FD;
Engridden: module {
init: fn(nil: ref Draw->Context, argv: list of string);
};
# Mount ourselves into the public grid
# $pubgridreg sets the public grid registry dialstr
init(nil: ref Draw->Context, argv: list of string)
{
sys = load Sys Sys->PATH;
str := load String String->PATH;
env := load Env Env->PATH;
arg := load Arg Arg->PATH;
bio := load Bufio Bufio->PATH;
Iobuf: import bio;
reg := env->getenv("pubgridreg");
mtpt := "/mnt/registry";
ndir := "/n";
arg->init(argv);
arg->setusage("engridden [-r tcp!registry] [-m /mnt/registry] [-n /n]");
while((c := arg->opt()) != 0)
case c {
'm' => mtpt = arg->earg();
'r' => reg = arg->earg();
'n' => ndir = arg->earg();
* => arg->usage();
}
argv = arg->argv();
if(reg == ""){
sys->print("err: $pubgridreg or '-r' must be provided to mount a registry\n");
exit;
}
sys->print("Mounting public grid registry %s…\n", reg);
if(dialmount(reg, mtpt) < 0)
exit;
buf := bio->open(mtpt + "/index", Bufio->OREAD);
if(buf == nil){
sys->print("err: open failed → %r\n");
exit;
}
Read:
for(;;){
line := buf.gets('\n');
if(line == "")
break Read;
(toks, err) := str->qtokenize(line);
if(err != nil){
sys->print("fail: can't parse line → %s\n", line);
continue Read;
}
if(len toks < 2){
sys->print("fail: not enough tokens in line → %s\n", line);
continue Read;
}
dialstr := hd toks;
name := "";
toks = tl toks;
# Modeled after 9p.zone's registry
for(; toks != nil; toks = tl toks){
case hd toks {
"description" =>
toks = tl toks;
name = hd toks;
* =>
;
}
}
if(dialstr == ""){
sys->print("fail: no dialstring in line → %s\n", line);
continue Read;
}
if(name == ""){
sys->print("fail: could not find 'description' value in line → %s\n", line);
continue Read;
}
at := ndir + "/" + name;
sys->print("Mounting %s at %s…\n", dialstr, at);
if(dialmount(dialstr, at) < 0)
continue Read;
}
sys->print("Done.\n");
exit;
}
dialmount(dialstr, mtpt: string): int {
(ok, conn) := sys->dial(dialstr, nil);
if(ok < 0){
sys->print("err: dial failed for %s → %r\n", dialstr);
return ok;
}
ok = sys->mount(conn.dfd, nil, mtpt, Sys->MREPL|Sys->MCREATE, nil);
if(ok < 0){
sys->print("err: mount failed for %s → %r\n", mtpt);
return ok;
}
return 0;
}