tpost9pservice: accept mtpt (via fuse) - 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 118dfa98b81785213b819f66cdb92e5a43f62326
 (DIR) parent ce1e3a796ccce89dd284dab916ec5b83a03fdcf8
 (HTM) Author: Russ Cox <rsc@swtch.com>
       Date:   Mon,  5 May 2008 23:07:54 -0400
       
       post9pservice: accept mtpt (via fuse)
       
       Diffstat:
         M include/libc.h                      |       3 ++-
         M src/cmd/tapefs/fs.c                 |      12 ++++++++----
         M src/lib9/post9p.c                   |      89 +++++++++++++++++++++----------
         M src/lib9p/tpost.c                   |      12 +++++++-----
       
       4 files changed, 78 insertions(+), 38 deletions(-)
       ---
 (DIR) diff --git a/include/libc.h b/include/libc.h
       t@@ -832,7 +832,8 @@ extern        char*        get9root(void);
        extern        char*        unsharp(char*);
        extern        int        sendfd(int, int);
        extern        int        recvfd(int);
       -extern        int        post9pservice(int, char*);
       +extern        int        post9pservice(int, char*, char*);
       +extern        int        chattyfuse;
        
        /* external names that we don't want to step on */
        #ifndef NOPLAN9DEFINES
 (DIR) diff --git a/src/cmd/tapefs/fs.c b/src/cmd/tapefs/fs.c
       t@@ -75,18 +75,22 @@ void
        main(int argc, char *argv[])
        {
                Ram *r;
       -        char *defmnt;
       +        char *defmnt, *defsrv;
                int p[2];
                char buf[TICKREQLEN];
        
                fmtinstall('F', fcallfmt);
                initfcalls();
        
       -        defmnt = "tapefs";
       +        defmnt = nil;
       +        defsrv = nil;
                ARGBEGIN{
                case 'm':
                        defmnt = ARGF();
                        break;
       +        case 's':
       +                defsrv = ARGF();
       +                break;
                case 'p':                        /* password file */
                        uidmap = getpass(ARGF());
                        break;
       t@@ -142,8 +146,8 @@ main(int argc, char *argv[])
                        break;
                default:
                        close(p[0]);        /* don't deadlock if child fails */
       -                if(post9pservice(p[1], defmnt, nil) < 0) {
       -                        sprint(buf, "post on `%s' failed", defmnt);
       +                if(post9pservice(p[1], defsrv, defmnt) < 0){
       +                        sprint(buf, "post9pservice: %r");
                                error(buf);
                        }
                }
 (DIR) diff --git a/src/lib9/post9p.c b/src/lib9/post9p.c
       t@@ -1,46 +1,79 @@
        #include <u.h>
        #include <libc.h>
        
       +int chattyfuse;
       +
        int
       -post9pservice(int fd, char *name)
       +post9pservice(int fd, char *name, char *mtpt)
        {
       -        int i;
       -        char *ns, *s;
       +        int i, pid;
       +        char *ns, *addr;
                Waitmsg *w;
        
       -        if(strchr(name, '!'))        /* assume is already network address */
       -                s = strdup(name);
       -        else{
       -                if((ns = getns()) == nil)
       -                        return -1;
       -                s = smprint("unix!%s/%s", ns, name);
       -                free(ns);
       -        }
       -        if(s == nil)
       -                return -1;
       -        switch(fork()){
       -        case -1:
       +        if(name == nil && mtpt == nil){
       +                close(fd);
       +                werrstr("nothing to do");
                        return -1;
       -        case 0:
       -                dup(fd, 0);
       -                dup(fd, 1);
       -                for(i=3; i<20; i++)
       -                        close(i);
       -                execlp("9pserve", "9pserve", "-u", s, (char*)0);
       -                fprint(2, "exec 9pserve: %r\n");
       -                _exits("exec");
       -        default:
       -                w = wait();
       -                if(w == nil)
       +        }
       +
       +        if(name){
       +                if(strchr(name, '!'))        /* assume is already network address */
       +                        addr = strdup(name);
       +                else{
       +                        if((ns = getns()) == nil)
       +                                return -1;
       +                        addr = smprint("unix!%s/%s", ns, name);
       +                        free(ns);
       +                }
       +                if(addr == nil)
                                return -1;
       +                switch(pid = fork()){
       +                case -1:
       +                        return -1;
       +                case 0:
       +                        dup(fd, 0);
       +                        dup(fd, 1);
       +                        for(i=3; i<20; i++)
       +                                close(i);
       +                        execlp("9pserve", "9pserve", "-u", addr, (char*)0);
       +                        fprint(2, "exec 9pserve: %r\n");
       +                        _exits("exec");
       +                }
                        close(fd);
       -                free(s);
       +                w = waitfor(pid);
       +                if(w == nil)
       +                        return -1;
                        if(w->msg && w->msg[0]){
                                free(w);
                                werrstr("9pserve failed");
                                return -1;
                        }
                        free(w);
       -                return 0;
       +                if(mtpt){
       +                        /* reopen */
       +                        if((fd = dial(addr, nil, nil, nil)) < 0){
       +                                werrstr("cannot reopen for mount: %r");
       +                                return -1;
       +                        }
       +                }
       +                free(addr);
       +        }
       +        if(mtpt){
       +                switch(pid = rfork(RFFDG|RFPROC|RFNOWAIT)){
       +                case -1:
       +                        return -1;
       +                case 0:
       +                        dup(fd, 0);
       +                        for(i=3; i<20; i++)
       +                                close(i);
       +                        if(chattyfuse)
       +                                execlp("9pfuse", "9pfuse", "-D", "-", mtpt, (char*)0);
       +                        else
       +                                execlp("9pfuse", "9pfuse", "-", mtpt, (char*)0);
       +                        fprint(2, "exec 9pfuse: %r\n");
       +                        _exits("exec");
       +                }
       +                close(fd);
                }
       +        return 0;
        }
 (DIR) diff --git a/src/lib9p/tpost.c b/src/lib9p/tpost.c
       t@@ -14,9 +14,8 @@ void
        threadpostmountsrv(Srv *s, char *name, char *mtpt, int flag)
        {
                int fd[2];
       -
       -        if(mtpt)
       -                sysfatal("mount not supported");
       +        int mtfd;
       +        char *addr;
        
                if(!s->nopipe){
                        if(pipe(fd) < 0)
       t@@ -24,7 +23,10 @@ threadpostmountsrv(Srv *s, char *name, char *mtpt, int flag)
                        s->infd = s->outfd = fd[1];
                        s->srvfd = fd[0];
                }
       -        if(name && post9pservice(s->srvfd, name) < 0)
       -                sysfatal("post9pservice %s: %r", name);
       +        if(name || mtpt){
       +                if(post9pservice(s->srvfd, name, mtpt) < 0)
       +                        sysfatal("post9pservice %s: %r", name);
       +        }else if(!s->nopipe)
       +                sysfatal("no one to serve");
                proccreate(launchsrv, s, 32*1024);
        }