xref: /plan9/sys/src/cmd/srvfs.c (revision b280a0ac4379a1e3e7c70921ab1a3585b706975e)
1 #include <u.h>
2 #include <libc.h>
3 
4 static void
5 usage(void)
6 {
7 	fprint(2, "usage: %s [-dS] [-e exportfs] [-p perm] 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 = ARGF();
30 		break;
31 	case 'p':
32 		perm = strtol(ARGF(), 0, 8);
33 		break;
34 	case 'P':
35 		*argp++ = "-P";
36 		*argp++ = ARGF();
37 		break;
38 	}ARGEND
39 	*argp = 0;
40 	if(argc != 2)
41 		usage();
42 
43 	if(pipe(pipefd) < 0){
44 		fprint(2, "can't pipe: %r\n");
45 		exits("pipe");
46 	}
47 
48 	switch(rfork(RFPROC|RFNOWAIT|RFNOTEG|RFFDG)){
49 	case -1:
50 		fprint(2, "can't rfork: %r\n");
51 		exits("rfork");
52 	case 0:
53 		dup(pipefd[0], 0);
54 		dup(pipefd[0], 1);
55 		close(pipefd[0]);
56 		close(pipefd[1]);
57 		exec(ename, arglist);
58 		fprint(2, "can't exec exportfs: %r\n");
59 		exits("exec");
60 	default:
61 		break;
62 	}
63 	close(pipefd[0]);
64 	if(fprint(pipefd[1], "%s", argv[1]) < 0){
65 		fprint(2, "can't write pipe: %r\n");
66 		exits("write");
67 	}
68 	n = read(pipefd[1], buf, sizeof buf-1);
69 	if(n < 0){
70 		fprint(2, "can't read pipe: %r\n");
71 		exits("read");
72 	}
73 	buf[n] = 0;
74 	if(n != 2 || strcmp(buf, "OK") != 0){
75 		fprint(2, "not OK (%d): %s\n", n, buf);
76 		exits("OK");
77 	}
78 	sprint(buf, "/srv/%s", argv[0]);
79 	fd = create(buf, OWRITE, perm);
80 	if(fd < 0){
81 		fprint(2, "can't create %s: %r\n", buf);
82 		exits("create");
83 	}
84 	fprint(fd, "%d", pipefd[1]);
85 	close(fd);
86 	close(pipefd[1]);
87 	exits(0);
88 }
89