xref: /inferno-os/appl/cmd/runas.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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}