xref: /plan9/sys/src/cmd/ip/rexexec.c (revision f19e7b749ec99577072cd8e44030fe810f42c7ad)
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <auth.h>
5 
6 /*
7  * called by listen as rexexec rexexec net dir ...
8  */
9 void
main(int argc,char ** argv)10 main(int argc, char **argv)
11 {
12 	char buf[8192];
13 	int n, nn;
14 	AuthInfo *ai;
15 
16 	ARGBEGIN{
17 	}ARGEND;
18 
19 	ai = auth_proxy(0, auth_getkey, "proto=p9any role=server");
20 	if(ai == nil)
21 		sysfatal("auth_proxy: %r");
22 	if(strcmp(ai->cuid, "none") == 0)
23 		sysfatal("rexexec by none disallowed");
24 	if(auth_chuid(ai, nil) < 0)
25 		sysfatal("auth_chuid: %r");
26 
27 	n = 0;
28 	do {
29 		nn = read(0, buf+n, 1);
30 		if(nn <= 0)
31 			sysfatal("can't read command");
32 		n += nn;
33 		if(n == sizeof buf)
34 			buf[n-1] = '\0';
35 	} while (buf[n-1] != '\0');
36 
37 	putenv("service", "rx");
38 	execl("/bin/rc", "rc", "-lc", buf, nil);
39 	sysfatal("can't exec rc");
40 }
41