Blame


1 b3994ec5 2003-12-11 devnull #include <u.h>
2 b3994ec5 2003-12-11 devnull #include <libc.h>
3 b3994ec5 2003-12-11 devnull
4 118dfa98 2008-05-06 rsc int chattyfuse;
5 118dfa98 2008-05-06 rsc
6 b3994ec5 2003-12-11 devnull int
7 118dfa98 2008-05-06 rsc post9pservice(int fd, char *name, char *mtpt)
8 b3994ec5 2003-12-11 devnull {
9 118dfa98 2008-05-06 rsc int i, pid;
10 118dfa98 2008-05-06 rsc char *ns, *addr;
11 b3994ec5 2003-12-11 devnull Waitmsg *w;
12 b3994ec5 2003-12-11 devnull
13 118dfa98 2008-05-06 rsc if(name == nil && mtpt == nil){
14 118dfa98 2008-05-06 rsc close(fd);
15 118dfa98 2008-05-06 rsc werrstr("nothing to do");
16 b3994ec5 2003-12-11 devnull return -1;
17 118dfa98 2008-05-06 rsc }
18 118dfa98 2008-05-06 rsc
19 118dfa98 2008-05-06 rsc if(name){
20 118dfa98 2008-05-06 rsc if(strchr(name, '!')) /* assume is already network address */
21 118dfa98 2008-05-06 rsc addr = strdup(name);
22 118dfa98 2008-05-06 rsc else{
23 118dfa98 2008-05-06 rsc if((ns = getns()) == nil)
24 118dfa98 2008-05-06 rsc return -1;
25 118dfa98 2008-05-06 rsc addr = smprint("unix!%s/%s", ns, name);
26 118dfa98 2008-05-06 rsc free(ns);
27 118dfa98 2008-05-06 rsc }
28 118dfa98 2008-05-06 rsc if(addr == nil)
29 005a85f3 2005-01-07 devnull return -1;
30 118dfa98 2008-05-06 rsc switch(pid = fork()){
31 118dfa98 2008-05-06 rsc case -1:
32 118dfa98 2008-05-06 rsc return -1;
33 118dfa98 2008-05-06 rsc case 0:
34 118dfa98 2008-05-06 rsc dup(fd, 0);
35 118dfa98 2008-05-06 rsc dup(fd, 1);
36 118dfa98 2008-05-06 rsc for(i=3; i<20; i++)
37 118dfa98 2008-05-06 rsc close(i);
38 118dfa98 2008-05-06 rsc execlp("9pserve", "9pserve", "-u", addr, (char*)0);
39 118dfa98 2008-05-06 rsc fprint(2, "exec 9pserve: %r\n");
40 118dfa98 2008-05-06 rsc _exits("exec");
41 118dfa98 2008-05-06 rsc }
42 b3994ec5 2003-12-11 devnull close(fd);
43 118dfa98 2008-05-06 rsc w = waitfor(pid);
44 118dfa98 2008-05-06 rsc if(w == nil)
45 118dfa98 2008-05-06 rsc return -1;
46 b3994ec5 2003-12-11 devnull if(w->msg && w->msg[0]){
47 b3994ec5 2003-12-11 devnull free(w);
48 b3994ec5 2003-12-11 devnull werrstr("9pserve failed");
49 b3994ec5 2003-12-11 devnull return -1;
50 b3994ec5 2003-12-11 devnull }
51 b3994ec5 2003-12-11 devnull free(w);
52 118dfa98 2008-05-06 rsc if(mtpt){
53 118dfa98 2008-05-06 rsc /* reopen */
54 118dfa98 2008-05-06 rsc if((fd = dial(addr, nil, nil, nil)) < 0){
55 118dfa98 2008-05-06 rsc werrstr("cannot reopen for mount: %r");
56 118dfa98 2008-05-06 rsc return -1;
57 118dfa98 2008-05-06 rsc }
58 118dfa98 2008-05-06 rsc }
59 118dfa98 2008-05-06 rsc free(addr);
60 b3994ec5 2003-12-11 devnull }
61 118dfa98 2008-05-06 rsc if(mtpt){
62 118dfa98 2008-05-06 rsc switch(pid = rfork(RFFDG|RFPROC|RFNOWAIT)){
63 118dfa98 2008-05-06 rsc case -1:
64 118dfa98 2008-05-06 rsc return -1;
65 118dfa98 2008-05-06 rsc case 0:
66 118dfa98 2008-05-06 rsc dup(fd, 0);
67 118dfa98 2008-05-06 rsc for(i=3; i<20; i++)
68 118dfa98 2008-05-06 rsc close(i);
69 3e4ceac7 2008-06-19 rsc
70 3e4ceac7 2008-06-19 rsc /* Try v9fs on Linux, which will mount 9P directly. */
71 3e4ceac7 2008-06-19 rsc execlp("mount9p", "mount9p", "-", mtpt, (char*)0);
72 3e4ceac7 2008-06-19 rsc
73 118dfa98 2008-05-06 rsc if(chattyfuse)
74 118dfa98 2008-05-06 rsc execlp("9pfuse", "9pfuse", "-D", "-", mtpt, (char*)0);
75 118dfa98 2008-05-06 rsc else
76 118dfa98 2008-05-06 rsc execlp("9pfuse", "9pfuse", "-", mtpt, (char*)0);
77 118dfa98 2008-05-06 rsc fprint(2, "exec 9pfuse: %r\n");
78 118dfa98 2008-05-06 rsc _exits("exec");
79 118dfa98 2008-05-06 rsc }
80 118dfa98 2008-05-06 rsc close(fd);
81 118dfa98 2008-05-06 rsc }
82 118dfa98 2008-05-06 rsc return 0;
83 b3994ec5 2003-12-11 devnull }