implement cmdhit;
# this is a wrapper for the cmd command
# cmd wants you to keep the ctl file open.
# I just wanted a one shot deal, give it the command and get the result
# M Heath 2003
# latest version http://www.proweb.co.uk/~matt/inferno/cmdhit.b
# example use cmdhit 'ssh domain.com "ls /"'
# of course ssh will only work with passwordless keys
include "sys.m";
include "draw.m";
cmdhit : module {
init: fn(nil: ref Draw->Context, argv: list of string);
};
init (nil: ref Draw->Context, argv: list of string) {
sys := load Sys Sys->PATH;
buf := array[1024] of byte;
ctl := sys->open("/cmd/clone", sys->ORDWR);
dir := sys->read(ctl, buf, len buf -1);
if(dir == -1) {
sys->fprint(sys->fildes(2), "cmdhit: clone failed, maybe you didn't do bind -a '#C' /\n");
# sys->raise("cmdhit: clone failed");
raise("cmdhit: clone failed");
}
buf[dir] = byte 0;
data_fn := sys->sprint("/cmd/%s/data", string buf);
data := sys->open(data_fn, sys->ORDWR);
cmdstr := "exec";
arg : string;
for(argv = tl argv; argv != nil; argv = tl argv) {
arg = hd argv;
cmdstr += " " + arg;
}
cmdbytes := array of byte cmdstr;
sys->write(ctl, cmdbytes, len cmdbytes);
stdout := sys->fildes(1);
for(output := sys->read(data, buf, len buf); output > 0; output = sys->read(data, buf, len buf)) {
sys->write(stdout, buf, output);
}
ctl = nil;
data = nil;
}
|