95 lines
1.7 KiB
C
95 lines
1.7 KiB
C
|
#include <u.h>
|
||
|
#include <libc.h>
|
||
|
|
||
|
static void
|
||
|
usage(void)
|
||
|
{
|
||
|
fprint(2, "usage: %s [-dR] [-p perm] [-P patternfile] [-e exportfs] srvname path\n", argv0);
|
||
|
exits("usage");
|
||
|
}
|
||
|
|
||
|
void
|
||
|
main(int argc, char **argv)
|
||
|
{
|
||
|
char *ename, *arglist[16], **argp;
|
||
|
int n, fd, pipefd[2];
|
||
|
char buf[64];
|
||
|
int perm = 0600;
|
||
|
|
||
|
argp = arglist;
|
||
|
ename = "/bin/exportfs";
|
||
|
*argp++ = "exportfs";
|
||
|
ARGBEGIN{
|
||
|
default:
|
||
|
usage();
|
||
|
case 'd':
|
||
|
*argp++ = "-d";
|
||
|
break;
|
||
|
case 'e':
|
||
|
ename = EARGF(usage());
|
||
|
break;
|
||
|
case 'p':
|
||
|
perm = strtol(EARGF(usage()), 0, 8);
|
||
|
break;
|
||
|
case 'P':
|
||
|
*argp++ = "-P";
|
||
|
*argp++ = EARGF(usage());
|
||
|
break;
|
||
|
case 'R':
|
||
|
*argp++ = "-R";
|
||
|
break;
|
||
|
}ARGEND
|
||
|
*argp = 0;
|
||
|
if(argc != 2)
|
||
|
usage();
|
||
|
|
||
|
if(pipe(pipefd) < 0){
|
||
|
fprint(2, "can't pipe: %r\n");
|
||
|
exits("pipe");
|
||
|
}
|
||
|
|
||
|
switch(rfork(RFPROC|RFNOWAIT|RFNOTEG|RFFDG)){
|
||
|
case -1:
|
||
|
fprint(2, "can't rfork: %r\n");
|
||
|
exits("rfork");
|
||
|
case 0:
|
||
|
dup(pipefd[0], 0);
|
||
|
dup(pipefd[0], 1);
|
||
|
close(pipefd[0]);
|
||
|
close(pipefd[1]);
|
||
|
exec(ename, arglist);
|
||
|
fprint(2, "can't exec exportfs: %r\n");
|
||
|
exits("exec");
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
close(pipefd[0]);
|
||
|
if(fprint(pipefd[1], "%s", argv[1]) < 0){
|
||
|
fprint(2, "can't write pipe: %r\n");
|
||
|
exits("write");
|
||
|
}
|
||
|
n = read(pipefd[1], buf, sizeof buf-1);
|
||
|
if(n < 0){
|
||
|
fprint(2, "can't read pipe: %r\n");
|
||
|
exits("read");
|
||
|
}
|
||
|
buf[n] = 0;
|
||
|
if(n != 2 || strcmp(buf, "OK") != 0){
|
||
|
fprint(2, "not OK (%d): %s\n", n, buf);
|
||
|
exits("OK");
|
||
|
}
|
||
|
if(argv[0][0] == '/')
|
||
|
strecpy(buf, buf+sizeof buf, argv[0]);
|
||
|
else
|
||
|
snprint(buf, sizeof buf, "/srv/%s", argv[0]);
|
||
|
fd = create(buf, OWRITE, perm);
|
||
|
if(fd < 0){
|
||
|
fprint(2, "can't create %s: %r\n", buf);
|
||
|
exits("create");
|
||
|
}
|
||
|
fprint(fd, "%d", pipefd[1]);
|
||
|
close(fd);
|
||
|
close(pipefd[1]);
|
||
|
exits(0);
|
||
|
}
|