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); }