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