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