commit 118dfa98b81785213b819f66cdb92e5a43f62326 from: Russ Cox date: Tue May 06 03:07:54 2008 UTC post9pservice: accept mtpt (via fuse) commit - ce1e3a796ccce89dd284dab916ec5b83a03fdcf8 commit + 118dfa98b81785213b819f66cdb92e5a43f62326 blob - 6a04b7b0b25673fd343594abe7a379d520386c65 blob + 7611dde14457bcd9631aea8456d76252e595b85b --- include/libc.h +++ include/libc.h @@ -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 blob - f67fa6da5360c21fb9df2e6ad159f3b74f0e288d blob + dc3148ae89b881e5722947309ee64b713341a5f1 --- src/cmd/tapefs/fs.c +++ src/cmd/tapefs/fs.c @@ -75,17 +75,21 @@ 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()); @@ -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); } } blob - 37b6b80f9b8013e60d80dd64d76e654bc945f107 blob + c05b3363db68dad4cb766023e951cde05ec0f316 --- src/lib9/post9p.c +++ 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) + 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 @@ -14,17 +14,19 @@ void 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); }