aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRuss Cox <rsc@swtch.com>2008-05-05 23:07:54 -0400
committerRuss Cox <rsc@swtch.com>2008-05-05 23:07:54 -0400
commit118dfa98b81785213b819f66cdb92e5a43f62326 (patch)
treedee2a68ea379b85eb7bfcdd98a07b53b0531a565 /src
parentce1e3a796ccce89dd284dab916ec5b83a03fdcf8 (diff)
downloadplan9port-118dfa98b81785213b819f66cdb92e5a43f62326.tar.gz
plan9port-118dfa98b81785213b819f66cdb92e5a43f62326.tar.bz2
plan9port-118dfa98b81785213b819f66cdb92e5a43f62326.zip
post9pservice: accept mtpt (via fuse)
Diffstat (limited to 'src')
-rw-r--r--src/cmd/tapefs/fs.c12
-rw-r--r--src/lib9/post9p.c89
-rw-r--r--src/lib9p/tpost.c12
3 files changed, 76 insertions, 37 deletions
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 <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;
}
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);
}