12 fprint(2, "usage: listen1 [-tv] [-p maxprocs] address cmd args...\n");
21 fd = open("#c/user", OWRITE);
22 if(fd < 0 || write(fd, "none", strlen("none")) < 0)
23 sysfatal("can't become none: %r");
25 if(newns("none", nil) < 0)
26 sysfatal("can't build namespace: %r");
36 snprint(buf, sizeof buf, "%s/remote", dir);
37 fd = open(buf, OREAD);
40 n = read(fd, buf, sizeof(buf));
53 main(int argc, char **argv)
55 char data[60], dir[40], ndir[40], wbuf[64];
57 int wfd, nowait, procs;
70 maxprocs = atoi(EARGF(usage()));
79 fd = open("/dev/null", OWRITE);
89 print("listen started\n");
90 ctl = announce(argv[0], dir);
92 sysfatal("announce %s: %r", argv[0]);
97 snprint(wbuf, sizeof(wbuf), "/proc/%d/wait", getpid());
98 if((wfd = open(wbuf, OREAD)) >= 0)
103 if(nowait == 0 && (procs >= maxprocs || (procs % 8) == 0))
105 if(procs < maxprocs){
107 if(d == nil || d->length == 0){
113 if(read(wfd, wbuf, sizeof(wbuf)) > 0)
117 nctl = listen(dir, ndir);
119 sysfatal("listen %s: %r", argv[0]);
121 switch(rfork(RFFDG|RFPROC|RFMEM|RFENVG|RFNAMEG|RFNOTEG|RFREND|nowait)){
123 reject(nctl, ndir, "host overloaded");
127 fd = accept(nctl, ndir);
129 fprint(2, "accept %s: can't open %s/data: %r\n",
133 print("incoming call for %s from %s in %s\n", argv[0],
134 remoteaddr(ndir), ndir);
135 fprint(nctl, "keepalive");
141 snprint(data, sizeof data, "%s/data", ndir);
142 bind(data, "/dev/cons", MREPL);
145 /* dup(fd, 2); keep stderr */
147 exec(argv[1], argv+1);
148 if(argv[1][0] != '/')
149 exec(smprint("/bin/%s", argv[1]), argv+1);
150 fprint(2, "%s: exec: %r\n", argv0);