13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include <auth.h> 4*219b2ee8SDavid du Colombier #include <fcall.h> 53e12c5d1SDavid du Colombier 63e12c5d1SDavid du Colombier int connect(char*, char*); 73e12c5d1SDavid du Colombier void error(int, char*, ...); 83e12c5d1SDavid du Colombier void usage(void); 93e12c5d1SDavid du Colombier 103e12c5d1SDavid du Colombier void 113e12c5d1SDavid du Colombier main(int argc, char **argv) 123e12c5d1SDavid du Colombier { 133e12c5d1SDavid du Colombier char *mntpt; 143e12c5d1SDavid du Colombier int fd, mntflags; 153e12c5d1SDavid du Colombier 163e12c5d1SDavid du Colombier mntflags = MREPL; 173e12c5d1SDavid du Colombier ARGBEGIN{ 183e12c5d1SDavid du Colombier case 'a': 193e12c5d1SDavid du Colombier mntflags = MAFTER; 203e12c5d1SDavid du Colombier break; 213e12c5d1SDavid du Colombier case 'b': 223e12c5d1SDavid du Colombier mntflags = MBEFORE; 233e12c5d1SDavid du Colombier break; 243e12c5d1SDavid du Colombier case 'c': 253e12c5d1SDavid du Colombier mntflags |= MCREATE; 263e12c5d1SDavid du Colombier break; 273e12c5d1SDavid du Colombier default: 283e12c5d1SDavid du Colombier usage(); 293e12c5d1SDavid du Colombier }ARGEND; 303e12c5d1SDavid du Colombier 313e12c5d1SDavid du Colombier switch(argc) { 323e12c5d1SDavid du Colombier case 2: 333e12c5d1SDavid du Colombier mntpt = argv[1]; 343e12c5d1SDavid du Colombier break; 353e12c5d1SDavid du Colombier case 3: 363e12c5d1SDavid du Colombier mntpt = argv[2]; 373e12c5d1SDavid du Colombier break; 383e12c5d1SDavid du Colombier default: 393e12c5d1SDavid du Colombier mntpt = 0; /* to shut up compiler */ 403e12c5d1SDavid du Colombier usage(); 413e12c5d1SDavid du Colombier } 423e12c5d1SDavid du Colombier 43*219b2ee8SDavid du Colombier alarm(60*1000); 443e12c5d1SDavid du Colombier fd = connect(argv[0], argv[1]); 45*219b2ee8SDavid du Colombier if(amount(fd, mntpt, mntflags, "") < 0) 46*219b2ee8SDavid du Colombier error(1, "can't mount %s: %r", argv[1]); 47*219b2ee8SDavid du Colombier alarm(0); 483e12c5d1SDavid du Colombier exits(0); 493e12c5d1SDavid du Colombier } 503e12c5d1SDavid du Colombier 513e12c5d1SDavid du Colombier int 523e12c5d1SDavid du Colombier connect(char *system, char *tree) 533e12c5d1SDavid du Colombier { 54*219b2ee8SDavid du Colombier char buf[ERRLEN], *na; 553e12c5d1SDavid du Colombier int fd, n; 563e12c5d1SDavid du Colombier 573e12c5d1SDavid du Colombier na = netmkaddr(system, 0, "exportfs"); 583e12c5d1SDavid du Colombier if((fd = dial(na, 0, 0, 0)) < 0) 593e12c5d1SDavid du Colombier error(1, "can't dial %s", system); 603e12c5d1SDavid du Colombier 61*219b2ee8SDavid du Colombier if(auth(fd) < 0) 62*219b2ee8SDavid du Colombier error(1, "%r: %s", system); 633e12c5d1SDavid du Colombier 643e12c5d1SDavid du Colombier n = write(fd, tree, strlen(tree)); 653e12c5d1SDavid du Colombier if(n < 0) 663e12c5d1SDavid du Colombier error(1, "can't write tree"); 673e12c5d1SDavid du Colombier 683e12c5d1SDavid du Colombier strcpy(buf, "can't read tree"); 693e12c5d1SDavid du Colombier 703e12c5d1SDavid du Colombier n = read(fd, buf, sizeof buf - 1); 713e12c5d1SDavid du Colombier if(n!=2 || buf[0]!='O' || buf[1]!='K'){ 723e12c5d1SDavid du Colombier buf[sizeof buf - 1] = '\0'; 733e12c5d1SDavid du Colombier error(0, "bad remote tree: %s\n", buf); 743e12c5d1SDavid du Colombier } 753e12c5d1SDavid du Colombier return fd; 763e12c5d1SDavid du Colombier } 773e12c5d1SDavid du Colombier 783e12c5d1SDavid du Colombier void 793e12c5d1SDavid du Colombier error(int syserr, char *fmt, ...) 803e12c5d1SDavid du Colombier { 813e12c5d1SDavid du Colombier char msg[256]; 823e12c5d1SDavid du Colombier 833e12c5d1SDavid du Colombier doprint(msg, msg+sizeof(msg), fmt, (&fmt+1)); 843e12c5d1SDavid du Colombier if(syserr) 853e12c5d1SDavid du Colombier fprint(2, "import: %s: %r\n", msg); 863e12c5d1SDavid du Colombier else 873e12c5d1SDavid du Colombier fprint(2, "import: %s\n", msg); 883e12c5d1SDavid du Colombier exits(msg); 893e12c5d1SDavid du Colombier } 903e12c5d1SDavid du Colombier 913e12c5d1SDavid du Colombier void 923e12c5d1SDavid du Colombier usage(void) 933e12c5d1SDavid du Colombier { 943e12c5d1SDavid du Colombier print("Usage: import [-abc] [-t|-s server] host remotefs [mountpoint]\n"); 953e12c5d1SDavid du Colombier exits("usage"); 963e12c5d1SDavid du Colombier } 97