1 f0bf146d 2005-07-13 devnull #include <u.h>
2 f0bf146d 2005-07-13 devnull #include <libc.h>
3 f0bf146d 2005-07-13 devnull #include <auth.h>
5 f0bf146d 2005-07-13 devnull int verbose;
6 f0bf146d 2005-07-13 devnull int trusted;
9 f0bf146d 2005-07-13 devnull usage(void)
11 f0bf146d 2005-07-13 devnull fprint(2, "usage: listen1 [-v] address cmd args...\n");
12 f0bf146d 2005-07-13 devnull exits("usage");
16 f0bf146d 2005-07-13 devnull remoteaddr(char *dir)
18 f0bf146d 2005-07-13 devnull static char buf[128];
20 f0bf146d 2005-07-13 devnull int n, fd;
22 f0bf146d 2005-07-13 devnull snprint(buf, sizeof buf, "%s/remote", dir);
23 f0bf146d 2005-07-13 devnull fd = open(buf, OREAD);
24 f0bf146d 2005-07-13 devnull if(fd < 0)
25 f0bf146d 2005-07-13 devnull return "";
26 f0bf146d 2005-07-13 devnull n = read(fd, buf, sizeof(buf));
27 f0bf146d 2005-07-13 devnull close(fd);
28 f0bf146d 2005-07-13 devnull if(n > 0){
29 f0bf146d 2005-07-13 devnull buf[n] = 0;
30 f0bf146d 2005-07-13 devnull p = strchr(buf, '!');
33 f0bf146d 2005-07-13 devnull return buf;
35 f0bf146d 2005-07-13 devnull return "";
39 f0bf146d 2005-07-13 devnull main(int argc, char **argv)
41 f0bf146d 2005-07-13 devnull char dir[40], ndir[40];
42 f0bf146d 2005-07-13 devnull int ctl, nctl, fd;
44 f0bf146d 2005-07-13 devnull ARGBEGIN{
47 f0bf146d 2005-07-13 devnull case 't':
48 f0bf146d 2005-07-13 devnull trusted = 1;
50 f0bf146d 2005-07-13 devnull case 'v':
51 f0bf146d 2005-07-13 devnull verbose = 1;
55 f0bf146d 2005-07-13 devnull if(argc < 2)
58 f0bf146d 2005-07-13 devnull if(!verbose){
59 f0bf146d 2005-07-13 devnull close(1);
60 f0bf146d 2005-07-13 devnull fd = open("/dev/null", OWRITE);
61 f0bf146d 2005-07-13 devnull if(fd != 1){
62 f0bf146d 2005-07-13 devnull dup(fd, 1);
63 f0bf146d 2005-07-13 devnull close(fd);
67 f0bf146d 2005-07-13 devnull print("listen started\n");
68 f0bf146d 2005-07-13 devnull ctl = announce(argv[0], dir);
69 f0bf146d 2005-07-13 devnull if(ctl < 0)
70 f0bf146d 2005-07-13 devnull sysfatal("announce %s: %r", argv[0]);
73 f0bf146d 2005-07-13 devnull nctl = listen(dir, ndir);
74 f0bf146d 2005-07-13 devnull if(nctl < 0)
75 f0bf146d 2005-07-13 devnull sysfatal("listen %s: %r", argv[0]);
77 f0bf146d 2005-07-13 devnull switch(rfork(RFFDG|RFPROC|RFNOWAIT|RFNOTEG)){
79 f0bf146d 2005-07-13 devnull close(nctl);
80 f0bf146d 2005-07-13 devnull continue;
82 f0bf146d 2005-07-13 devnull fd = accept(nctl, ndir);
83 f0bf146d 2005-07-13 devnull if(fd < 0){
84 f0bf146d 2005-07-13 devnull fprint(2, "accept %s: can't open %s/data: %r", argv[0], ndir);
85 f0bf146d 2005-07-13 devnull _exits(0);
87 f0bf146d 2005-07-13 devnull print("incoming call for %s from %s in %s\n", argv[0], remoteaddr(ndir), ndir);
88 f0bf146d 2005-07-13 devnull close(ctl);
89 f0bf146d 2005-07-13 devnull close(nctl);
90 cbeb0b26 2006-04-01 devnull /*putenv("net", ndir); */
91 cbeb0b26 2006-04-01 devnull /*sprint(data, "%s/data", ndir); */
92 cbeb0b26 2006-04-01 devnull /*bind(data, "/dev/cons", MREPL); */
93 f0bf146d 2005-07-13 devnull dup(fd, 0);
94 f0bf146d 2005-07-13 devnull dup(fd, 1);
95 f0bf146d 2005-07-13 devnull dup(fd, 2);
96 f0bf146d 2005-07-13 devnull close(fd);
97 f0bf146d 2005-07-13 devnull exec(argv[1], argv+1);
98 f0bf146d 2005-07-13 devnull fprint(2, "exec: %r");
99 f0bf146d 2005-07-13 devnull exits(nil);
100 f0bf146d 2005-07-13 devnull default:
101 f0bf146d 2005-07-13 devnull close(nctl);