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/lib9/post9p.c | 89 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 28 deletions(-) (limited to 'src/lib9') 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; } -- cgit v1.2.3