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