t9pfuse: accept - for stdin, try to hang up cleanly - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit e63025d09486aea0f644578b5e05a093c130b7d2
parent 14125803572e1fa6efb2badf4a41e2e59e81a76d
Author: Russ Cox 
Date:   Thu, 17 Apr 2008 16:03:49 -0400

9pfuse: accept - for stdin, try to hang up cleanly

Diffstat:
  M src/cmd/9pfuse/a.h                  |       1 +
  M src/cmd/9pfuse/main.c               |      24 ++++++++++++++++++++----

2 files changed, 21 insertions(+), 4 deletions(-)
---
diff --git a/src/cmd/9pfuse/a.h b/src/cmd/9pfuse/a.h
t@@ -3,6 +3,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
diff --git a/src/cmd/9pfuse/main.c b/src/cmd/9pfuse/main.c
t@@ -39,7 +39,6 @@
 #  endif
 #endif
 
-
 int debug;
 char *argv0;
 char *aname = "";
t@@ -77,6 +76,7 @@ usage(void)
 }
 
 void fusereader(void*);
+void watchfd(void*);
 
 void
 threadmain(int argc, char **argv)
t@@ -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);
t@@ -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;
+}