13 fprint(2, "usage: listen1 [-tv] [-p maxprocs] [-n namespace] address cmd args...\n");
22 fd = open("#c/user", OWRITE);
23 if(fd < 0 || write(fd, "none", strlen("none")) < 0)
24 sysfatal("can't become none: %r");
26 if(newns("none", nsfile) < 0)
27 sysfatal("can't build namespace: %r");
37 snprint(buf, sizeof buf, "%s/remote", dir);
38 fd = open(buf, OREAD);
41 n = read(fd, buf, sizeof(buf));
54 main(int argc, char **argv)
56 char data[60], dir[40], ndir[40], wbuf[64];
58 int wfd, nowait, procs;
71 maxprocs = atoi(EARGF(usage()));
74 nsfile = EARGF(usage());
83 fd = open("/dev/null", OWRITE);
93 print("listen started\n");
94 ctl = announce(argv[0], dir);
96 sysfatal("announce %s: %r", argv[0]);
101 snprint(wbuf, sizeof(wbuf), "/proc/%d/wait", getpid());
102 if((wfd = open(wbuf, OREAD)) >= 0)
107 if(nowait == 0 && (procs >= maxprocs || (procs % 8) == 0))
109 if(procs < maxprocs){
111 if(d == nil || d->length == 0){
117 if(read(wfd, wbuf, sizeof(wbuf)) > 0)
121 nctl = listen(dir, ndir);
123 sysfatal("listen %s: %r", argv[0]);
125 switch(rfork(RFFDG|RFPROC|RFMEM|RFENVG|RFNAMEG|RFNOTEG|RFREND|nowait)){
127 reject(nctl, ndir, "host overloaded");
131 fd = accept(nctl, ndir);
133 fprint(2, "accept %s: can't open %s/data: %r\n",
137 print("incoming call for %s from %s in %s\n", argv[0],
138 remoteaddr(ndir), ndir);
139 fprint(nctl, "keepalive");
145 snprint(data, sizeof data, "%s/data", ndir);
146 bind(data, "/dev/cons", MREPL);
149 /* dup(fd, 2); keep stderr */
151 exec(argv[1], argv+1);
152 if(argv[1][0] != '/')
153 exec(smprint("/bin/%s", argv[1]), argv+1);
154 fprint(2, "%s: exec: %r\n", argv0);