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