13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include <bio.h> 4*219b2ee8SDavid du Colombier #include <auth.h> 53e12c5d1SDavid du Colombier #include <fcall.h> 63e12c5d1SDavid du Colombier 73e12c5d1SDavid du Colombier Fcall hdr; 83e12c5d1SDavid du Colombier char dest[2*NAMELEN]; 93e12c5d1SDavid du Colombier 103e12c5d1SDavid du Colombier void error(char *); 113e12c5d1SDavid du Colombier int cyclone(void); 123e12c5d1SDavid du Colombier void rpc(int, int); 133e12c5d1SDavid du Colombier void post(char*, int); 143e12c5d1SDavid du Colombier void mountfs(char*, int); 153e12c5d1SDavid du Colombier 163e12c5d1SDavid du Colombier void 173e12c5d1SDavid du Colombier usage(void) 183e12c5d1SDavid du Colombier { 19bd389b36SDavid du Colombier fprint(2, "usage: %s [-m] [net!]host [srvname [mtpt]]\n", argv0); 203e12c5d1SDavid du Colombier exits("usage"); 213e12c5d1SDavid du Colombier } 223e12c5d1SDavid du Colombier 233e12c5d1SDavid du Colombier void 243e12c5d1SDavid du Colombier main(int argc, char *argv[]) 253e12c5d1SDavid du Colombier { 263e12c5d1SDavid du Colombier int fd, cfd; 27bd389b36SDavid du Colombier char srv[64], mtpt[64]; 283e12c5d1SDavid du Colombier char dir[NAMELEN*4]; 29*219b2ee8SDavid du Colombier char err[ERRLEN]; 30*219b2ee8SDavid du Colombier char tickets[2*TICKETLEN]; 31*219b2ee8SDavid du Colombier char *p, *p2; 32bd389b36SDavid du Colombier int domount, record, try; 333e12c5d1SDavid du Colombier 34bd389b36SDavid du Colombier domount = 0; 35bd389b36SDavid du Colombier record = 0; 363e12c5d1SDavid du Colombier ARGBEGIN{ 373e12c5d1SDavid du Colombier case 'm': 383e12c5d1SDavid du Colombier domount = 1; 393e12c5d1SDavid du Colombier break; 403e12c5d1SDavid du Colombier case 'r': 413e12c5d1SDavid du Colombier record = 1; 423e12c5d1SDavid du Colombier break; 433e12c5d1SDavid du Colombier default: 443e12c5d1SDavid du Colombier usage(); 453e12c5d1SDavid du Colombier break; 463e12c5d1SDavid du Colombier }ARGEND 473e12c5d1SDavid du Colombier 483e12c5d1SDavid du Colombier switch(argc){ 493e12c5d1SDavid du Colombier case 1: /* calculate srv and mtpt from address */ 503e12c5d1SDavid du Colombier p = strrchr(argv[0], '/'); 513e12c5d1SDavid du Colombier p = p ? p+1 : argv[0]; 523e12c5d1SDavid du Colombier sprint(srv, "/srv/%.28s", p); 533e12c5d1SDavid du Colombier p2 = strchr(p, '!'); 543e12c5d1SDavid du Colombier p2 = p2 ? p2+1 : p; 553e12c5d1SDavid du Colombier sprint(mtpt, "/n/%.28s", p2); 563e12c5d1SDavid du Colombier break; 573e12c5d1SDavid du Colombier case 2: /* calculate mtpt from address, srv given */ 583e12c5d1SDavid du Colombier sprint(srv, "/srv/%.28s", argv[1]); 593e12c5d1SDavid du Colombier p = strrchr(argv[0], '/'); 603e12c5d1SDavid du Colombier p = p ? p+1 : argv[0]; 613e12c5d1SDavid du Colombier p2 = strchr(p, '!'); 623e12c5d1SDavid du Colombier p2 = p2 ? p2+1 : p; 633e12c5d1SDavid du Colombier sprint(mtpt, "/n/%.28s", p2); 643e12c5d1SDavid du Colombier break; 653e12c5d1SDavid du Colombier case 3: /* srv and mtpt given */ 663e12c5d1SDavid du Colombier domount = 1; 673e12c5d1SDavid du Colombier sprint(srv, "/srv/%.28s", argv[1]); 683e12c5d1SDavid du Colombier sprint(mtpt, "%.28s", argv[2]); 693e12c5d1SDavid du Colombier break; 703e12c5d1SDavid du Colombier default: 713e12c5d1SDavid du Colombier usage(); 723e12c5d1SDavid du Colombier } 733e12c5d1SDavid du Colombier 743e12c5d1SDavid du Colombier try = 0; 753e12c5d1SDavid du Colombier Again: 763e12c5d1SDavid du Colombier try++; 773e12c5d1SDavid du Colombier if(access(srv, 0) == 0){ 783e12c5d1SDavid du Colombier if(domount){ 793e12c5d1SDavid du Colombier fd = open(srv, ORDWR); 803e12c5d1SDavid du Colombier if(fd >= 0) 813e12c5d1SDavid du Colombier goto Mount; 823e12c5d1SDavid du Colombier remove(srv); 833e12c5d1SDavid du Colombier } 843e12c5d1SDavid du Colombier else{ 853e12c5d1SDavid du Colombier fprint(2, "srv: %s already exists\n", srv); 863e12c5d1SDavid du Colombier exits(0); 873e12c5d1SDavid du Colombier } 883e12c5d1SDavid du Colombier } 893e12c5d1SDavid du Colombier 903e12c5d1SDavid du Colombier strcpy(dest, *argv); 913e12c5d1SDavid du Colombier 923e12c5d1SDavid du Colombier if(strncmp(*argv, "cyc!", 4) == 0) 933e12c5d1SDavid du Colombier fd = cyclone(); 943e12c5d1SDavid du Colombier else { 953e12c5d1SDavid du Colombier fd = dial(netmkaddr(*argv, 0, "9fs"), 0, dir, &cfd); 963e12c5d1SDavid du Colombier if(fd < 0) { 973e12c5d1SDavid du Colombier fprint(2, "srv: dial %s: %r\n", netmkaddr(*argv, 0, "9fs")); 983e12c5d1SDavid du Colombier exits("dial"); 993e12c5d1SDavid du Colombier } 1003e12c5d1SDavid du Colombier if(record || strstr(dir, "tcp")) { 1013e12c5d1SDavid du Colombier if(write(cfd, "push fcall", 10) < 0) { 1023e12c5d1SDavid du Colombier fprint(2, "srv: push fcall %r\n"); 1033e12c5d1SDavid du Colombier exits(0); 1043e12c5d1SDavid du Colombier } 1053e12c5d1SDavid du Colombier close(cfd); 1063e12c5d1SDavid du Colombier } 1073e12c5d1SDavid du Colombier } 1083e12c5d1SDavid du Colombier 109*219b2ee8SDavid du Colombier fprint(2, "session..."); 110*219b2ee8SDavid du Colombier fsession(fd, tickets); 1113e12c5d1SDavid du Colombier post(srv, fd); 1123e12c5d1SDavid du Colombier 1133e12c5d1SDavid du Colombier Mount: 1143e12c5d1SDavid du Colombier if(domount == 0) 1153e12c5d1SDavid du Colombier exits(0); 1163e12c5d1SDavid du Colombier 117*219b2ee8SDavid du Colombier if(amount(fd, mtpt, MREPL, "") < 0){ 118*219b2ee8SDavid du Colombier err[0] = 0; 1193e12c5d1SDavid du Colombier errstr(err); 1203e12c5d1SDavid du Colombier if(strstr(err, "hungup") || strstr(err, "timed out")){ 1213e12c5d1SDavid du Colombier remove(srv); 1223e12c5d1SDavid du Colombier if(try == 1) 1233e12c5d1SDavid du Colombier goto Again; 1243e12c5d1SDavid du Colombier } 1253e12c5d1SDavid du Colombier fprint(2, "srv %s: mount failed: %s\n", dest, err); 1263e12c5d1SDavid du Colombier exits("mount"); 1273e12c5d1SDavid du Colombier } 1283e12c5d1SDavid du Colombier exits(0); 1293e12c5d1SDavid du Colombier } 1303e12c5d1SDavid du Colombier 1313e12c5d1SDavid du Colombier void 1323e12c5d1SDavid du Colombier post(char *srv, int fd) 1333e12c5d1SDavid du Colombier { 1343e12c5d1SDavid du Colombier int f; 1353e12c5d1SDavid du Colombier char buf[128]; 1363e12c5d1SDavid du Colombier 1373e12c5d1SDavid du Colombier fprint(2, "post...\n"); 1383e12c5d1SDavid du Colombier f = create(srv, OWRITE, 0666); 1393e12c5d1SDavid du Colombier if(f < 0){ 1403e12c5d1SDavid du Colombier sprint(buf, "create(%s)", srv); 1413e12c5d1SDavid du Colombier error(buf); 1423e12c5d1SDavid du Colombier } 1433e12c5d1SDavid du Colombier sprint(buf, "%d", fd); 1443e12c5d1SDavid du Colombier if(write(f, buf, strlen(buf)) != strlen(buf)) 1453e12c5d1SDavid du Colombier error("write"); 1463e12c5d1SDavid du Colombier } 1473e12c5d1SDavid du Colombier 1483e12c5d1SDavid du Colombier int 1493e12c5d1SDavid du Colombier cyclone(void) 1503e12c5d1SDavid du Colombier { 1513e12c5d1SDavid du Colombier int fd; 1523e12c5d1SDavid du Colombier 1533e12c5d1SDavid du Colombier fd = open("#H/hotrod", ORDWR); 1543e12c5d1SDavid du Colombier if(fd < 0) 1553e12c5d1SDavid du Colombier error("opening #H/hotrod"); 1563e12c5d1SDavid du Colombier return fd; 1573e12c5d1SDavid du Colombier } 1583e12c5d1SDavid du Colombier 1593e12c5d1SDavid du Colombier void 1603e12c5d1SDavid du Colombier error(char *s) 1613e12c5d1SDavid du Colombier { 1623e12c5d1SDavid du Colombier fprint(2, "srv %s: %s: %r\n", dest, s); 1633e12c5d1SDavid du Colombier exits("srv: error"); 1643e12c5d1SDavid du Colombier } 165