Commit Diff


commit - 0b1c1f414ddda722072bb7c84783db0279d3f7f9
commit + f0bf146d21ada82754fca0b033009c636d0aa084
blob - /dev/null
blob + 0f9762ff7ebdf03367bf5a64664043a620c1dd14 (mode 644)
--- /dev/null
+++ src/cmd/listen1.c
@@ -0,0 +1,106 @@
+#include <u.h>
+#include <libc.h>
+#include <auth.h>
+
+int verbose;
+int trusted;
+
+void
+usage(void)
+{
+	fprint(2, "usage: listen1 [-v] address cmd args...\n");
+	exits("usage");
+}
+
+char*
+remoteaddr(char *dir)
+{
+	static char buf[128];
+	char *p;
+	int n, fd;
+
+	snprint(buf, sizeof buf, "%s/remote", dir);
+	fd = open(buf, OREAD);
+	if(fd < 0)
+		return "";
+	n = read(fd, buf, sizeof(buf));
+	close(fd);
+	if(n > 0){
+		buf[n] = 0;
+		p = strchr(buf, '!');
+		if(p)
+			*p = 0;
+		return buf;
+	}
+	return "";
+}
+
+void
+main(int argc, char **argv)
+{
+	char dir[40], ndir[40];
+	int ctl, nctl, fd;
+
+	ARGBEGIN{
+	default:
+		usage();
+	case 't':
+		trusted = 1;
+		break;
+	case 'v':
+		verbose = 1;
+		break;
+	}ARGEND
+
+	if(argc < 2)
+		usage();
+
+	if(!verbose){
+		close(1);
+		fd = open("/dev/null", OWRITE);
+		if(fd != 1){
+			dup(fd, 1);
+			close(fd);
+		}
+	}
+
+	print("listen started\n");
+	ctl = announce(argv[0], dir);
+	if(ctl < 0)
+		sysfatal("announce %s: %r", argv[0]);
+
+	for(;;){
+		nctl = listen(dir, ndir);
+		if(nctl < 0)
+			sysfatal("listen %s: %r", argv[0]);
+
+		switch(rfork(RFFDG|RFPROC|RFNOWAIT|RFNOTEG)){
+		case -1:
+			close(nctl);
+			continue;
+		case 0:
+			fd = accept(nctl, ndir);
+			if(fd < 0){
+				fprint(2, "accept %s: can't open  %s/data: %r", argv[0], ndir);
+				_exits(0);
+			}
+			print("incoming call for %s from %s in %s\n", argv[0], remoteaddr(ndir), ndir);
+			close(ctl);
+			close(nctl);
+			//putenv("net", ndir);
+			//sprint(data, "%s/data", ndir);
+			//bind(data, "/dev/cons", MREPL);
+			dup(fd, 0);
+			dup(fd, 1);
+			dup(fd, 2);
+			close(fd);
+			exec(argv[1], argv+1);
+			fprint(2, "exec: %r");
+			exits(nil);
+		default:
+			close(nctl);
+			break;
+		}
+	}
+	exits(nil);
+}