commit - ce1e3a796ccce89dd284dab916ec5b83a03fdcf8
commit + 118dfa98b81785213b819f66cdb92e5a43f62326
blob - 6a04b7b0b25673fd343594abe7a379d520386c65
blob + 7611dde14457bcd9631aea8456d76252e595b85b
--- include/libc.h
+++ include/libc.h
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
blob - f67fa6da5360c21fb9df2e6ad159f3b74f0e288d
blob + dc3148ae89b881e5722947309ee64b713341a5f1
--- src/cmd/tapefs/fs.c
+++ src/cmd/tapefs/fs.c
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;
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);
}
}
blob - 37b6b80f9b8013e60d80dd64d76e654bc945f107
blob + c05b3363db68dad4cb766023e951cde05ec0f316
--- src/lib9/post9p.c
+++ src/lib9/post9p.c
#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)
+ if(name == nil && mtpt == nil){
+ close(fd);
+ werrstr("nothing to do");
return -1;
- switch(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", 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;
}
blob - 337d25445fa7f0b2327f54e719ea3123c5bcecb2
blob + 45426f12bab8e94360851a30c881fd2b918cd6da
--- src/lib9p/tpost.c
+++ src/lib9p/tpost.c
threadpostmountsrv(Srv *s, char *name, char *mtpt, int flag)
{
int fd[2];
+ int mtfd;
+ char *addr;
- if(mtpt)
- sysfatal("mount not supported");
-
if(!s->nopipe){
if(pipe(fd) < 0)
sysfatal("pipe: %r");
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);
}