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