Commit Diff


commit - 14125803572e1fa6efb2badf4a41e2e59e81a76d
commit + e63025d09486aea0f644578b5e05a093c130b7d2
blob - aaec3ef02b5bc0aec87898357e5ab89ef376ff97
blob + f5038e163228b82b77d8508879fc5770f9a51c01
--- src/cmd/9pfuse/a.h
+++ src/cmd/9pfuse/a.h
@@ -3,6 +3,7 @@
 #include <sys/stat.h>
 #include <sys/uio.h>
 #include <sys/socket.h>
+#include <sys/select.h>
 #include <libc.h>
 #include <fcall.h>
 #include <thread.h>
blob - 50c835bb64bd53d243d165c2f94e46361f90d985
blob + fa27cb9ca53dbd71610d6bc2c54a67a16ad69573
--- src/cmd/9pfuse/main.c
+++ src/cmd/9pfuse/main.c
@@ -39,7 +39,6 @@
 #  endif
 #endif
 
-
 int debug;
 char *argv0;
 char *aname = "";
@@ -77,6 +76,7 @@ usage(void)
 }
 
 void fusereader(void*);
+void watchfd(void*);
 
 void
 threadmain(int argc, char **argv)
@@ -139,8 +139,12 @@ init9p(char *addr, char *spec)
 {
 	int fd;
 
-	if((fd = dial(netmkaddr(addr, "tcp", "564"), nil, nil, nil)) < 0)
-		sysfatal("dial %s: %r", addr);
+	if(strcmp(addr, "-") == 0)
+		fd = 0;
+	else
+		if((fd = dial(netmkaddr(addr, "tcp", "564"), nil, nil, nil)) < 0)
+			sysfatal("dial %s: %r", addr);
+	proccreate(watchfd, (void*)(uintptr)fd, STACK);
 	if((fsys = fsmount(fd, spec)) == nil)
 		sysfatal("fsmount: %r");
 	fsysroot = fsroot(fsys);
@@ -1208,4 +1212,16 @@ estrdup(char *p)
 	return pp;
 }
 
+void
+watchfd(void *v)
+{
+	int fd = (int)(uintptr)v;
 
+	/* wait for exception (file closed) */
+	fd_set set;
+	FD_ZERO(&set);
+	FD_SET(fd, &set);
+	if(select(fd+1, NULL, NULL, &set, NULL) >= 0)
+		threadexitsall(nil);
+	return;
+}