implement Trampoline; include "sys.m"; sys: Sys; include "draw.m"; include "dial.m"; Trampoline: 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; if(len args != 2) { sys->fprint(sys->fildes(2), "usage: %s addr\n", hd args); raise "fail:usage"; } progname := hd args; addr := hd tl args; dial := load Dial Dial->PATH; if((conn := dial->dial(addr, nil)) == nil) { sys->fprint(sys->fildes(2), "%s: dial %s: %r\n", progname, addr); raise "fail:dial"; } dial = nil; fd := conn.dfd; pid := sys->pctl(Sys->NEWPGRP, nil); done := chan of int; spawn copy(sys->fildes(0), fd, done); spawn copy(fd, sys->fildes(1), done); <-done; ctl := sys->open("/prog/" + string pid + "/ctl", Sys->OWRITE); sys->fprint(ctl, "killgrp"); } copy(src, dst: ref Sys->FD, done: chan of int) { buf := array[Sys->ATOMICIO] of byte; while((n := sys->read(src, buf, len buf)) > 0) sys->write(dst, buf, n); done <-= 69105; }