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