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