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