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