#include <u.h> | |
#include <libc.h> | |
#include <auth.h> | |
int verbose; | |
int trusted; | |
void | |
usage(void) | |
{ | |
fprint(2, "usage: listen1 [-v] address cmd args...\n"); | |
exits("usage"); | |
} | |
char* | |
remoteaddr(char *dir) | |
{ | |
static char buf[128]; | |
char *p; | |
int n, fd; | |
snprint(buf, sizeof buf, "%s/remote", dir); | |
fd = open(buf, OREAD); | |
if(fd < 0) | |
return ""; | |
n = read(fd, buf, sizeof(buf)); | |
close(fd); | |
if(n > 0){ | |
buf[n] = 0; | |
p = strchr(buf, '!'); | |
if(p) | |
*p = 0; | |
return buf; | |
} | |
return ""; | |
} | |
void | |
main(int argc, char **argv) | |
{ | |
char dir[40], ndir[40]; | |
int ctl, nctl, fd; | |
ARGBEGIN{ | |
default: | |
usage(); | |
case 't': | |
trusted = 1; | |
break; | |
case 'v': | |
verbose = 1; | |
break; | |
}ARGEND | |
if(argc < 2) | |
usage(); | |
if(!verbose){ | |
close(1); | |
fd = open("/dev/null", OWRITE); | |
if(fd != 1){ | |
dup(fd, 1); | |
close(fd); | |
} | |
} | |
print("listen started\n"); | |
ctl = announce(argv[0], dir); | |
if(ctl < 0) | |
sysfatal("announce %s: %r", argv[0]); | |
for(;;){ | |
nctl = listen(dir, ndir); | |
if(nctl < 0) | |
sysfatal("listen %s: %r", argv[0]); | |
switch(rfork(RFFDG|RFPROC|RFNOWAIT|RFNOTEG)){ | |
case -1: | |
close(nctl); | |
continue; | |
case 0: | |
fd = accept(nctl, ndir); | |
if(fd < 0){ | |
fprint(2, "accept %s: can't open %s/data: %r", argv[0], ndir); | |
_exits(0); | |
} | |
print("incoming call for %s from %s in %s\n", argv[0], remoteaddr(ndir), ndir); | |
close(ctl); | |
close(nctl); | |
/*putenv("net", ndir); */ | |
/*sprint(data, "%s/data", ndir); */ | |
/*bind(data, "/dev/cons", MREPL); */ | |
dup(fd, 0); | |
dup(fd, 1); | |
dup(fd, 2); | |
close(fd); | |
exec(argv[1], argv+1); | |
fprint(2, "exec: %r"); | |
exits(nil); | |
default: | |
close(nctl); | |
break; | |
} | |
} | |
} |