aboutsummaryrefslogtreecommitdiff
path: root/src/lib9
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/lib9
parentce1e3a796ccce89dd284dab916ec5b83a03fdcf8 (diff)
downloadplan9port-118dfa98b81785213b819f66cdb92e5a43f62326.tar.gz
plan9port-118dfa98b81785213b819f66cdb92e5a43f62326.tar.bz2
plan9port-118dfa98b81785213b819f66cdb92e5a43f62326.zip
post9pservice: accept mtpt (via fuse)
Diffstat (limited to 'src/lib9')
-rw-r--r--src/lib9/post9p.c89
1 files changed, 61 insertions, 28 deletions
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;
}