1implement Runas; 2 3include "sys.m"; 4include "draw.m"; 5include "sh.m"; 6 7sys: Sys; 8sh: Sh; 9 10Context: import sh; 11 12Runas: module { 13 init: fn(nil: ref Draw->Context, argv: list of string); 14}; 15 16init(drawctxt: ref Draw->Context, argv: list of string) 17{ 18 sys = load Sys Sys->PATH; 19 sh = load Sh Sh->PATH; 20 if (sh == nil) 21 badmodule(Sh->PATH); 22 23 if (len argv < 3) 24 usage(); 25 26 argv = tl argv; 27 user := hd argv; 28 argv = tl argv; 29 30 fd := sys->open("/dev/user", Sys->OWRITE); 31 if (fd == nil) 32 error(sys->sprint("cannot open /dev/user: %r")); 33 u := array of byte user; 34 if (sys->write(fd, u, len u) != len u) 35 error(sys->sprint("cannot set user: %r")); 36 sh->run(drawctxt, argv); 37} 38 39badmodule(p: string) 40{ 41 sys->fprint(stderr(), "runas: cannot load %s: %r\n", p); 42 raise "fail:bad module"; 43} 44 45stderr(): ref Sys->FD 46{ 47 return sys->fildes(2); 48} 49 50usage() 51{ 52 sys->fprint(stderr(), "usage: runas user cmd [args...]\n"); 53 raise "fail:usage"; 54} 55 56error(e: string) 57{ 58 sys->fprint(stderr(), "runas: %s\n", e); 59 raise "fail:error"; 60}