# # Execution helpers for os commands # implement Os; include "sys.m"; sys: Sys; Dir, pctl, NEWPGRP, DMDIR, open, OREAD, FD, OWRITE, ORCLOSE, FORKFD, ORDWR, FORKNS, NEWFD, MREPL, MBEFORE, MAFTER, MCREATE, pipe, mount, fprint, sprint, create, pwrite, read, QTDIR, QTFILE, fildes, Qid: import sys; include "error.m"; err: Error; checkload, stderr, panic, kill, error: import err; include "env.m"; env: Env; getenv: import env; include "string.m"; str: String; splitl, splitstrr : import str; include "names.m"; names: Names; cleanname, rooted: import names; include "workdir.m"; wdir: Workdir; include "os.m"; emuroot: string; init() { sys = load Sys Sys->PATH; err = load Error Error->PATH; err->init(); str = checkload(load String String->PATH, String->PATH); env = checkload(load Env Env->PATH, Env->PATH); names = checkload(load Names Names->PATH, Names->PATH); wdir = checkload(load Workdir Workdir->PATH, Workdir->PATH); host = getenv("emuhost"); } filename(name: string): string { if (emuroot == nil) emuroot = getenv("emuroot"); if (emuroot == nil) emuroot = "/usr/inferno"; name = cleanname(name); name = rooted(wdir->init(), name); return emuroot + name; } readall(fd: ref FD) : string { if (fd == nil) return ""; max : con int 8192; data := array[max] of byte; tot := nr := 0; do { nr = read(fd, data[tot:], len data - tot); if (nr > 0) tot += nr; } while(nr > 0 && tot < len data); if (tot == 0) return ""; return string data[0:tot]; } run(cmd: string): (string, string) { cfd := open("/cmd/clone", ORDWR); if (cfd == nil) return (nil, sprint("cmd: clone: %r")); nam := array[40] of byte; nr := read(cfd, nam, len nam); if (nr == 0) return(nil, "cmd: ctl eof"); if (nr < 0) return (nil, sprint("cmd: ctl: %r")); dir := "/cmd/" + string nam[0:nr]; fd := open(dir + "/data", OREAD); fprint(cfd, "killonclose"); fprint(cfd, "exec %s", cmd); out := readall(fd); return (out, nil); }