From 118dfa98b81785213b819f66cdb92e5a43f62326 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 5 May 2008 23:07:54 -0400 Subject: post9pservice: accept mtpt (via fuse) --- src/cmd/tapefs/fs.c | 12 +++++--- src/lib9/post9p.c | 89 ++++++++++++++++++++++++++++++++++++----------------- src/lib9p/tpost.c | 12 +++++--- 3 files changed, 76 insertions(+), 37 deletions(-) (limited to 'src') diff --git a/src/cmd/tapefs/fs.c b/src/cmd/tapefs/fs.c index f67fa6da..dc3148ae 100644 --- a/src/cmd/tapefs/fs.c +++ b/src/cmd/tapefs/fs.c @@ -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; @@ -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); } } diff --git a/src/lib9/post9p.c b/src/lib9/post9p.c index 37b6b80f..c05b3363 100644 --- a/src/lib9/post9p.c +++ b/src/lib9/post9p.c @@ -1,46 +1,79 @@ #include #include +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; } diff --git a/src/lib9p/tpost.c b/src/lib9p/tpost.c index 337d2544..45426f12 100644 --- a/src/lib9p/tpost.c +++ b/src/lib9p/tpost.c @@ -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) @@ -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); } -- cgit v1.2.3