1 #include <u.h> 2 #include <libc.h> 3 #include <auth.h> 4 #include <fcall.h> 5 6 int connect(char*, char*); 7 void error(int, char*, ...); 8 void usage(void); 9 10 void 11 main(int argc, char **argv) 12 { 13 char *mntpt; 14 int fd, mntflags; 15 16 mntflags = MREPL; 17 ARGBEGIN{ 18 case 'a': 19 mntflags = MAFTER; 20 break; 21 case 'b': 22 mntflags = MBEFORE; 23 break; 24 case 'c': 25 mntflags |= MCREATE; 26 break; 27 default: 28 usage(); 29 }ARGEND; 30 31 switch(argc) { 32 case 2: 33 mntpt = argv[1]; 34 break; 35 case 3: 36 mntpt = argv[2]; 37 break; 38 default: 39 mntpt = 0; /* to shut up compiler */ 40 usage(); 41 } 42 43 alarm(60*1000); 44 fd = connect(argv[0], argv[1]); 45 if(amount(fd, mntpt, mntflags, "") < 0) 46 error(1, "can't mount %s: %r", argv[1]); 47 alarm(0); 48 exits(0); 49 } 50 51 int 52 connect(char *system, char *tree) 53 { 54 char buf[ERRLEN], *na; 55 int fd, n; 56 57 na = netmkaddr(system, 0, "exportfs"); 58 if((fd = dial(na, 0, 0, 0)) < 0) 59 error(1, "can't dial %s", system); 60 61 if(auth(fd) < 0) 62 error(1, "%r: %s", system); 63 64 n = write(fd, tree, strlen(tree)); 65 if(n < 0) 66 error(1, "can't write tree"); 67 68 strcpy(buf, "can't read tree"); 69 70 n = read(fd, buf, sizeof buf - 1); 71 if(n!=2 || buf[0]!='O' || buf[1]!='K'){ 72 buf[sizeof buf - 1] = '\0'; 73 error(0, "bad remote tree: %s\n", buf); 74 } 75 return fd; 76 } 77 78 void 79 error(int syserr, char *fmt, ...) 80 { 81 char msg[256]; 82 83 doprint(msg, msg+sizeof(msg), fmt, (&fmt+1)); 84 if(syserr) 85 fprint(2, "import: %s: %r\n", msg); 86 else 87 fprint(2, "import: %s\n", msg); 88 exits(msg); 89 } 90 91 void 92 usage(void) 93 { 94 print("Usage: import [-abc] [-t|-s server] host remotefs [mountpoint]\n"); 95 exits("usage"); 96 } 97