1 #include <u.h>
2 #include <libc.h>
3
4 static void
usage(void)5 usage(void)
6 {
7 fprint(2, "usage: %s [-dR] [-p perm] [-P patternfile] [-e exportfs] srvname path\n", argv0);
8 exits("usage");
9 }
10
11 void
main(int argc,char ** argv)12 main(int argc, char **argv)
13 {
14 char *ename, *arglist[16], **argp;
15 int n, fd, pipefd[2];
16 char buf[64];
17 int perm = 0600;
18
19 argp = arglist;
20 ename = "/bin/exportfs";
21 *argp++ = "exportfs";
22 ARGBEGIN{
23 default:
24 usage();
25 case 'd':
26 *argp++ = "-d";
27 break;
28 case 'e':
29 ename = EARGF(usage());
30 break;
31 case 'p':
32 perm = strtol(EARGF(usage()), 0, 8);
33 break;
34 case 'P':
35 *argp++ = "-P";
36 *argp++ = EARGF(usage());
37 break;
38 case 'R':
39 *argp++ = "-R";
40 break;
41 }ARGEND
42 *argp = 0;
43 if(argc != 2)
44 usage();
45
46 if(pipe(pipefd) < 0){
47 fprint(2, "can't pipe: %r\n");
48 exits("pipe");
49 }
50
51 switch(rfork(RFPROC|RFNOWAIT|RFNOTEG|RFFDG)){
52 case -1:
53 fprint(2, "can't rfork: %r\n");
54 exits("rfork");
55 case 0:
56 dup(pipefd[0], 0);
57 dup(pipefd[0], 1);
58 close(pipefd[0]);
59 close(pipefd[1]);
60 exec(ename, arglist);
61 fprint(2, "can't exec exportfs: %r\n");
62 exits("exec");
63 default:
64 break;
65 }
66 close(pipefd[0]);
67 if(fprint(pipefd[1], "%s", argv[1]) < 0){
68 fprint(2, "can't write pipe: %r\n");
69 exits("write");
70 }
71 n = read(pipefd[1], buf, sizeof buf-1);
72 if(n < 0){
73 fprint(2, "can't read pipe: %r\n");
74 exits("read");
75 }
76 buf[n] = 0;
77 if(n != 2 || strcmp(buf, "OK") != 0){
78 fprint(2, "not OK (%d): %s\n", n, buf);
79 exits("OK");
80 }
81 if(argv[0][0] == '/')
82 strecpy(buf, buf+sizeof buf, argv[0]);
83 else
84 snprint(buf, sizeof buf, "/srv/%s", argv[0]);
85 fd = create(buf, OWRITE, perm);
86 if(fd < 0){
87 fprint(2, "can't create %s: %r\n", buf);
88 exits("create");
89 }
90 fprint(fd, "%d", pipefd[1]);
91 close(fd);
92 close(pipefd[1]);
93 exits(0);
94 }
95