Blame


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>
4 f0bf146d 2005-07-13 devnull
5 f0bf146d 2005-07-13 devnull int verbose;
6 f0bf146d 2005-07-13 devnull int trusted;
7 f0bf146d 2005-07-13 devnull
8 f0bf146d 2005-07-13 devnull void
9 f0bf146d 2005-07-13 devnull usage(void)
10 f0bf146d 2005-07-13 devnull {
11 f0bf146d 2005-07-13 devnull fprint(2, "usage: listen1 [-v] address cmd args...\n");
12 f0bf146d 2005-07-13 devnull exits("usage");
13 f0bf146d 2005-07-13 devnull }
14 f0bf146d 2005-07-13 devnull
15 f0bf146d 2005-07-13 devnull char*
16 f0bf146d 2005-07-13 devnull remoteaddr(char *dir)
17 f0bf146d 2005-07-13 devnull {
18 f0bf146d 2005-07-13 devnull static char buf[128];
19 f0bf146d 2005-07-13 devnull char *p;
20 f0bf146d 2005-07-13 devnull int n, fd;
21 f0bf146d 2005-07-13 devnull
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, '!');
31 f0bf146d 2005-07-13 devnull if(p)
32 f0bf146d 2005-07-13 devnull *p = 0;
33 f0bf146d 2005-07-13 devnull return buf;
34 f0bf146d 2005-07-13 devnull }
35 f0bf146d 2005-07-13 devnull return "";
36 f0bf146d 2005-07-13 devnull }
37 f0bf146d 2005-07-13 devnull
38 f0bf146d 2005-07-13 devnull void
39 f0bf146d 2005-07-13 devnull main(int argc, char **argv)
40 f0bf146d 2005-07-13 devnull {
41 f0bf146d 2005-07-13 devnull char dir[40], ndir[40];
42 f0bf146d 2005-07-13 devnull int ctl, nctl, fd;
43 f0bf146d 2005-07-13 devnull
44 f0bf146d 2005-07-13 devnull ARGBEGIN{
45 f0bf146d 2005-07-13 devnull default:
46 f0bf146d 2005-07-13 devnull usage();
47 f0bf146d 2005-07-13 devnull case 't':
48 f0bf146d 2005-07-13 devnull trusted = 1;
49 f0bf146d 2005-07-13 devnull break;
50 f0bf146d 2005-07-13 devnull case 'v':
51 f0bf146d 2005-07-13 devnull verbose = 1;
52 f0bf146d 2005-07-13 devnull break;
53 f0bf146d 2005-07-13 devnull }ARGEND
54 f0bf146d 2005-07-13 devnull
55 f0bf146d 2005-07-13 devnull if(argc < 2)
56 f0bf146d 2005-07-13 devnull usage();
57 f0bf146d 2005-07-13 devnull
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);
64 f0bf146d 2005-07-13 devnull }
65 f0bf146d 2005-07-13 devnull }
66 f0bf146d 2005-07-13 devnull
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]);
71 f0bf146d 2005-07-13 devnull
72 f0bf146d 2005-07-13 devnull for(;;){
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]);
76 f0bf146d 2005-07-13 devnull
77 f0bf146d 2005-07-13 devnull switch(rfork(RFFDG|RFPROC|RFNOWAIT|RFNOTEG)){
78 f0bf146d 2005-07-13 devnull case -1:
79 f0bf146d 2005-07-13 devnull close(nctl);
80 f0bf146d 2005-07-13 devnull continue;
81 f0bf146d 2005-07-13 devnull case 0:
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);
86 f0bf146d 2005-07-13 devnull }
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);
102 f0bf146d 2005-07-13 devnull break;
103 f0bf146d 2005-07-13 devnull }
104 f0bf146d 2005-07-13 devnull }
105 f0bf146d 2005-07-13 devnull }