1219b2ee8SDavid du Colombier #include <u.h> 2219b2ee8SDavid du Colombier #include <libc.h> 3219b2ee8SDavid du Colombier 4219b2ee8SDavid du Colombier static void 5219b2ee8SDavid du Colombier usage(void) 6219b2ee8SDavid du Colombier { 7ce31847cSDavid du Colombier fprint(2, "usage: %s [-dR] [-p perm] [-P patternfile] [-e exportfs] srvname path\n", argv0); 8219b2ee8SDavid du Colombier exits("usage"); 9219b2ee8SDavid du Colombier } 10219b2ee8SDavid du Colombier 11219b2ee8SDavid du Colombier void 12219b2ee8SDavid du Colombier main(int argc, char **argv) 13219b2ee8SDavid du Colombier { 14219b2ee8SDavid du Colombier char *ename, *arglist[16], **argp; 15219b2ee8SDavid du Colombier int n, fd, pipefd[2]; 169a747e4fSDavid du Colombier char buf[64]; 177dd7cddfSDavid du Colombier int perm = 0600; 18219b2ee8SDavid du Colombier 19219b2ee8SDavid du Colombier argp = arglist; 20219b2ee8SDavid du Colombier ename = "/bin/exportfs"; 21219b2ee8SDavid du Colombier *argp++ = "exportfs"; 22219b2ee8SDavid du Colombier ARGBEGIN{ 239a747e4fSDavid du Colombier default: 249a747e4fSDavid du Colombier usage(); 25219b2ee8SDavid du Colombier case 'd': 26219b2ee8SDavid du Colombier *argp++ = "-d"; 27219b2ee8SDavid du Colombier break; 28219b2ee8SDavid du Colombier case 'e': 29219b2ee8SDavid du Colombier ename = ARGF(); 30219b2ee8SDavid du Colombier break; 317dd7cddfSDavid du Colombier case 'p': 327dd7cddfSDavid du Colombier perm = strtol(ARGF(), 0, 8); 337dd7cddfSDavid du Colombier break; 34b280a0acSDavid du Colombier case 'P': 35b280a0acSDavid du Colombier *argp++ = "-P"; 36b280a0acSDavid du Colombier *argp++ = ARGF(); 37b280a0acSDavid du Colombier break; 38da51d93aSDavid du Colombier case 'R': 39da51d93aSDavid du Colombier *argp++ = "-R"; 40da51d93aSDavid du Colombier break; 41219b2ee8SDavid du Colombier }ARGEND 42219b2ee8SDavid du Colombier *argp = 0; 43219b2ee8SDavid du Colombier if(argc != 2) 44219b2ee8SDavid du Colombier usage(); 45219b2ee8SDavid du Colombier 46219b2ee8SDavid du Colombier if(pipe(pipefd) < 0){ 47219b2ee8SDavid du Colombier fprint(2, "can't pipe: %r\n"); 48219b2ee8SDavid du Colombier exits("pipe"); 49219b2ee8SDavid du Colombier } 50219b2ee8SDavid du Colombier 51219b2ee8SDavid du Colombier switch(rfork(RFPROC|RFNOWAIT|RFNOTEG|RFFDG)){ 52219b2ee8SDavid du Colombier case -1: 53219b2ee8SDavid du Colombier fprint(2, "can't rfork: %r\n"); 54219b2ee8SDavid du Colombier exits("rfork"); 55219b2ee8SDavid du Colombier case 0: 56219b2ee8SDavid du Colombier dup(pipefd[0], 0); 57219b2ee8SDavid du Colombier dup(pipefd[0], 1); 58219b2ee8SDavid du Colombier close(pipefd[0]); 59219b2ee8SDavid du Colombier close(pipefd[1]); 60219b2ee8SDavid du Colombier exec(ename, arglist); 61219b2ee8SDavid du Colombier fprint(2, "can't exec exportfs: %r\n"); 62219b2ee8SDavid du Colombier exits("exec"); 63219b2ee8SDavid du Colombier default: 64219b2ee8SDavid du Colombier break; 65219b2ee8SDavid du Colombier } 66219b2ee8SDavid du Colombier close(pipefd[0]); 67219b2ee8SDavid du Colombier if(fprint(pipefd[1], "%s", argv[1]) < 0){ 68219b2ee8SDavid du Colombier fprint(2, "can't write pipe: %r\n"); 69219b2ee8SDavid du Colombier exits("write"); 70219b2ee8SDavid du Colombier } 71219b2ee8SDavid du Colombier n = read(pipefd[1], buf, sizeof buf-1); 72219b2ee8SDavid du Colombier if(n < 0){ 73219b2ee8SDavid du Colombier fprint(2, "can't read pipe: %r\n"); 74219b2ee8SDavid du Colombier exits("read"); 75219b2ee8SDavid du Colombier } 76219b2ee8SDavid du Colombier buf[n] = 0; 77219b2ee8SDavid du Colombier if(n != 2 || strcmp(buf, "OK") != 0){ 78219b2ee8SDavid du Colombier fprint(2, "not OK (%d): %s\n", n, buf); 79219b2ee8SDavid du Colombier exits("OK"); 80219b2ee8SDavid du Colombier } 81da51d93aSDavid du Colombier if(argv[0][0] == '/') 82*4d44ba9bSDavid du Colombier strecpy(buf, buf+sizeof buf, argv[0]); 83da51d93aSDavid du Colombier else 84*4d44ba9bSDavid du Colombier snprint(buf, sizeof buf, "/srv/%s", argv[0]); 857dd7cddfSDavid du Colombier fd = create(buf, OWRITE, perm); 86219b2ee8SDavid du Colombier if(fd < 0){ 87219b2ee8SDavid du Colombier fprint(2, "can't create %s: %r\n", buf); 88219b2ee8SDavid du Colombier exits("create"); 89219b2ee8SDavid du Colombier } 90219b2ee8SDavid du Colombier fprint(fd, "%d", pipefd[1]); 91219b2ee8SDavid du Colombier close(fd); 92219b2ee8SDavid du Colombier close(pipefd[1]); 93219b2ee8SDavid du Colombier exits(0); 94219b2ee8SDavid du Colombier } 95