]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/srvfs.c
mothra: fix alt display resizing, filter control characters in panel entries, use...
[plan9front.git] / sys / src / cmd / srvfs.c
1 #include <u.h>
2 #include <libc.h>
3
4 static 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
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 }