Blob
1 #include <u.h>2 #include <libc.h>3 #include <auth.h>5 int verbose;6 int trusted;8 void9 usage(void)10 {11 fprint(2, "usage: listen1 [-v] address cmd args...\n");12 exits("usage");13 }15 char*16 remoteaddr(char *dir)17 {18 static char buf[128];19 char *p;20 int n, fd;22 snprint(buf, sizeof buf, "%s/remote", dir);23 fd = open(buf, OREAD);24 if(fd < 0)25 return "";26 n = read(fd, buf, sizeof(buf));27 close(fd);28 if(n > 0){29 buf[n] = 0;30 p = strchr(buf, '!');31 if(p)32 *p = 0;33 return buf;34 }35 return "";36 }38 void39 main(int argc, char **argv)40 {41 char dir[40], ndir[40];42 int ctl, nctl, fd;44 ARGBEGIN{45 default:46 usage();47 case 't':48 trusted = 1;49 break;50 case 'v':51 verbose = 1;52 break;53 }ARGEND55 if(argc < 2)56 usage();58 if(!verbose){59 close(1);60 fd = open("/dev/null", OWRITE);61 if(fd != 1){62 dup(fd, 1);63 close(fd);64 }65 }67 print("listen started\n");68 ctl = announce(argv[0], dir);69 if(ctl < 0)70 sysfatal("announce %s: %r", argv[0]);72 for(;;){73 nctl = listen(dir, ndir);74 if(nctl < 0)75 sysfatal("listen %s: %r", argv[0]);77 switch(rfork(RFFDG|RFPROC|RFNOWAIT|RFNOTEG)){78 case -1:79 close(nctl);80 continue;81 case 0:82 fd = accept(nctl, ndir);83 if(fd < 0){84 fprint(2, "accept %s: can't open %s/data: %r", argv[0], ndir);85 _exits(0);86 }87 print("incoming call for %s from %s in %s\n", argv[0], remoteaddr(ndir), ndir);88 close(ctl);89 close(nctl);90 /*putenv("net", ndir); */91 /*sprint(data, "%s/data", ndir); */92 /*bind(data, "/dev/cons", MREPL); */93 dup(fd, 0);94 dup(fd, 1);95 dup(fd, 2);96 close(fd);97 exec(argv[1], argv+1);98 fprint(2, "exec: %r");99 exits(nil);100 default:101 close(nctl);102 break;103 }104 }105 }