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 } 95