xref: /plan9-contrib/sys/src/cmd/import.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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