1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier
4219b2ee8SDavid du Colombier static void
usage(void)5219b2ee8SDavid du Colombier usage(void)
6219b2ee8SDavid du Colombier {
7ce31847cSDavid du Colombier fprint(2, "usage: %s [-dR] [-p perm] [-P patternfile] [-e exportfs] srvname path\n", argv0);
8219b2ee8SDavid du Colombier exits("usage");
9219b2ee8SDavid du Colombier }
10219b2ee8SDavid du Colombier
11219b2ee8SDavid du Colombier void
main(int argc,char ** argv)12219b2ee8SDavid du Colombier main(int argc, char **argv)
13219b2ee8SDavid du Colombier {
14219b2ee8SDavid du Colombier char *ename, *arglist[16], **argp;
15219b2ee8SDavid du Colombier int n, fd, pipefd[2];
169a747e4fSDavid du Colombier char buf[64];
177dd7cddfSDavid du Colombier int perm = 0600;
18219b2ee8SDavid du Colombier
19219b2ee8SDavid du Colombier argp = arglist;
20219b2ee8SDavid du Colombier ename = "/bin/exportfs";
21219b2ee8SDavid du Colombier *argp++ = "exportfs";
22219b2ee8SDavid du Colombier ARGBEGIN{
239a747e4fSDavid du Colombier default:
249a747e4fSDavid du Colombier usage();
25219b2ee8SDavid du Colombier case 'd':
26219b2ee8SDavid du Colombier *argp++ = "-d";
27219b2ee8SDavid du Colombier break;
28219b2ee8SDavid du Colombier case 'e':
29*de8abbc9SDavid du Colombier ename = EARGF(usage());
30219b2ee8SDavid du Colombier break;
317dd7cddfSDavid du Colombier case 'p':
32*de8abbc9SDavid du Colombier perm = strtol(EARGF(usage()), 0, 8);
337dd7cddfSDavid du Colombier break;
34b280a0acSDavid du Colombier case 'P':
35b280a0acSDavid du Colombier *argp++ = "-P";
36*de8abbc9SDavid du Colombier *argp++ = EARGF(usage());
37b280a0acSDavid du Colombier break;
38da51d93aSDavid du Colombier case 'R':
39da51d93aSDavid du Colombier *argp++ = "-R";
40da51d93aSDavid du Colombier break;
41219b2ee8SDavid du Colombier }ARGEND
42219b2ee8SDavid du Colombier *argp = 0;
43219b2ee8SDavid du Colombier if(argc != 2)
44219b2ee8SDavid du Colombier usage();
45219b2ee8SDavid du Colombier
46219b2ee8SDavid du Colombier if(pipe(pipefd) < 0){
47219b2ee8SDavid du Colombier fprint(2, "can't pipe: %r\n");
48219b2ee8SDavid du Colombier exits("pipe");
49219b2ee8SDavid du Colombier }
50219b2ee8SDavid du Colombier
51219b2ee8SDavid du Colombier switch(rfork(RFPROC|RFNOWAIT|RFNOTEG|RFFDG)){
52219b2ee8SDavid du Colombier case -1:
53219b2ee8SDavid du Colombier fprint(2, "can't rfork: %r\n");
54219b2ee8SDavid du Colombier exits("rfork");
55219b2ee8SDavid du Colombier case 0:
56219b2ee8SDavid du Colombier dup(pipefd[0], 0);
57219b2ee8SDavid du Colombier dup(pipefd[0], 1);
58219b2ee8SDavid du Colombier close(pipefd[0]);
59219b2ee8SDavid du Colombier close(pipefd[1]);
60219b2ee8SDavid du Colombier exec(ename, arglist);
61219b2ee8SDavid du Colombier fprint(2, "can't exec exportfs: %r\n");
62219b2ee8SDavid du Colombier exits("exec");
63219b2ee8SDavid du Colombier default:
64219b2ee8SDavid du Colombier break;
65219b2ee8SDavid du Colombier }
66219b2ee8SDavid du Colombier close(pipefd[0]);
67219b2ee8SDavid du Colombier if(fprint(pipefd[1], "%s", argv[1]) < 0){
68219b2ee8SDavid du Colombier fprint(2, "can't write pipe: %r\n");
69219b2ee8SDavid du Colombier exits("write");
70219b2ee8SDavid du Colombier }
71219b2ee8SDavid du Colombier n = read(pipefd[1], buf, sizeof buf-1);
72219b2ee8SDavid du Colombier if(n < 0){
73219b2ee8SDavid du Colombier fprint(2, "can't read pipe: %r\n");
74219b2ee8SDavid du Colombier exits("read");
75219b2ee8SDavid du Colombier }
76219b2ee8SDavid du Colombier buf[n] = 0;
77219b2ee8SDavid du Colombier if(n != 2 || strcmp(buf, "OK") != 0){
78219b2ee8SDavid du Colombier fprint(2, "not OK (%d): %s\n", n, buf);
79219b2ee8SDavid du Colombier exits("OK");
80219b2ee8SDavid du Colombier }
81da51d93aSDavid du Colombier if(argv[0][0] == '/')
824d44ba9bSDavid du Colombier strecpy(buf, buf+sizeof buf, argv[0]);
83da51d93aSDavid du Colombier else
844d44ba9bSDavid du Colombier snprint(buf, sizeof buf, "/srv/%s", argv[0]);
857dd7cddfSDavid du Colombier fd = create(buf, OWRITE, perm);
86219b2ee8SDavid du Colombier if(fd < 0){
87219b2ee8SDavid du Colombier fprint(2, "can't create %s: %r\n", buf);
88219b2ee8SDavid du Colombier exits("create");
89219b2ee8SDavid du Colombier }
90219b2ee8SDavid du Colombier fprint(fd, "%d", pipefd[1]);
91219b2ee8SDavid du Colombier close(fd);
92219b2ee8SDavid du Colombier close(pipefd[1]);
93219b2ee8SDavid du Colombier exits(0);
94219b2ee8SDavid du Colombier }
95