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