17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier #include <auth.h>
57dd7cddfSDavid du Colombier
67dd7cddfSDavid du Colombier /*
77dd7cddfSDavid du Colombier * called by listen as rexexec rexexec net dir ...
87dd7cddfSDavid du Colombier */
97dd7cddfSDavid du Colombier void
main(int argc,char ** argv)107dd7cddfSDavid du Colombier main(int argc, char **argv)
117dd7cddfSDavid du Colombier {
129a747e4fSDavid du Colombier char buf[8192];
139a747e4fSDavid du Colombier int n, nn;
149a747e4fSDavid du Colombier AuthInfo *ai;
157dd7cddfSDavid du Colombier
167dd7cddfSDavid du Colombier ARGBEGIN{
177dd7cddfSDavid du Colombier }ARGEND;
187dd7cddfSDavid du Colombier
193ff48bf5SDavid du Colombier ai = auth_proxy(0, auth_getkey, "proto=p9any role=server");
209a747e4fSDavid du Colombier if(ai == nil)
219a747e4fSDavid du Colombier sysfatal("auth_proxy: %r");
229a747e4fSDavid du Colombier if(strcmp(ai->cuid, "none") == 0)
239a747e4fSDavid du Colombier sysfatal("rexexec by none disallowed");
249a747e4fSDavid du Colombier if(auth_chuid(ai, nil) < 0)
259a747e4fSDavid du Colombier sysfatal("auth_chuid: %r");
269a747e4fSDavid du Colombier
277dd7cddfSDavid du Colombier n = 0;
287dd7cddfSDavid du Colombier do {
299a747e4fSDavid du Colombier nn = read(0, buf+n, 1);
307dd7cddfSDavid du Colombier if(nn <= 0)
319a747e4fSDavid du Colombier sysfatal("can't read command");
327dd7cddfSDavid du Colombier n += nn;
337dd7cddfSDavid du Colombier if(n == sizeof buf)
347dd7cddfSDavid du Colombier buf[n-1] = '\0';
357dd7cddfSDavid du Colombier } while (buf[n-1] != '\0');
367dd7cddfSDavid du Colombier
377dd7cddfSDavid du Colombier putenv("service", "rx");
38*f19e7b74SDavid du Colombier execl("/bin/rc", "rc", "-lc", buf, nil);
399a747e4fSDavid du Colombier sysfatal("can't exec rc");
407dd7cddfSDavid du Colombier }
41