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