Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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