t9pfuse: accept - for stdin, try to hang up cleanly - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit e63025d09486aea0f644578b5e05a093c130b7d2
 (DIR) parent 14125803572e1fa6efb2badf4a41e2e59e81a76d
 (HTM) Author: Russ Cox <rsc@swtch.com>
       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(-)
       ---
 (DIR) diff --git a/src/cmd/9pfuse/a.h b/src/cmd/9pfuse/a.h
       t@@ -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>
 (DIR) 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;
       +}