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