xref: /csrg-svn/sbin/dump/dumprmt.c (revision 6884)
1*6884Ssam static	char *sccsid = "@(#)dumprmt.c	1.2 (Berkeley) 05/20/82";
26645Ssam 
3*6884Ssam #include <stdio.h>
4*6884Ssam #include <sys/param.h>
56645Ssam #include <sys/mtio.h>
66645Ssam #include <sys/ioctl.h>
76645Ssam #include <net/in.h>
86645Ssam 
96645Ssam #define	TS_CLOSED	0
106645Ssam #define	TS_OPEN		1
116645Ssam 
126645Ssam static	int rmtstate = TS_CLOSED;
136645Ssam int	rmtape;
146645Ssam int	rmtconnaborted();
156645Ssam char	*rmtpeer;
166645Ssam 
176645Ssam rmthost(host)
186645Ssam 	char *host;
196645Ssam {
206645Ssam 
216645Ssam 	rmtpeer = host;
226645Ssam 	sigset(SIGPIPE, rmtconnaborted);
236645Ssam 	rmtgetconn();
246645Ssam 	if (rmtape < 0)
25*6884Ssam 		exit(1);
266645Ssam }
276645Ssam 
286645Ssam rmtconnaborted()
296645Ssam {
306645Ssam 
31*6884Ssam 	fprintf(stderr, "Lost connection to remote host.\n");
32*6884Ssam 	exit(1);
336645Ssam }
346645Ssam 
356645Ssam rmtgetconn()
366645Ssam {
376645Ssam 
386645Ssam 	rmtape = rcmd(&rmtpeer, IPPORT_CMDSERVER,
396645Ssam 	    "root", "root", "/etc/rmt", 0);
406645Ssam }
416645Ssam 
426645Ssam rmtopen(tape, mode)
436645Ssam 	char *tape;
446645Ssam 	int mode;
456645Ssam {
466645Ssam 	char buf[256];
476645Ssam 
486645Ssam 	sprintf(buf, "O%s\n%d\n", tape, mode);
496645Ssam 	rmtcall(tape, buf);
506645Ssam 	rmtstate = TS_OPEN;
516645Ssam }
526645Ssam 
536645Ssam rmtclose()
546645Ssam {
556645Ssam 
566645Ssam 	if (rmtstate != TS_OPEN)
576645Ssam 		return;
586645Ssam 	rmtcall("close", "C\n");
596645Ssam 	rmtstate = TS_CLOSED;
606645Ssam }
616645Ssam 
626645Ssam rmtread(buf, count)
636645Ssam 	char *buf;
646645Ssam 	int count;
656645Ssam {
666645Ssam 	char line[30];
676645Ssam 	int n, i, cc;
68*6884Ssam 	extern errno;
696645Ssam 
706645Ssam 	sprintf(line, "R%d\n", count);
716645Ssam 	n = rmtcall("read", line);
72*6884Ssam 	if (n < 0) {
73*6884Ssam 		errno = n;
746645Ssam 		return (-1);
75*6884Ssam 	}
766645Ssam 	for (i = 0; i < n; i += cc) {
776645Ssam 		cc = read(rmtape, buf+i, n - i);
78*6884Ssam 		if (cc <= 0) {
796645Ssam 			rmtconnaborted();
80*6884Ssam 		}
816645Ssam 	}
826645Ssam 	return (n);
836645Ssam }
846645Ssam 
856645Ssam rmtwrite(buf, count)
866645Ssam 	char *buf;
876645Ssam 	int count;
886645Ssam {
896645Ssam 	char line[30];
906645Ssam 
916645Ssam 	sprintf(line, "W%d\n", count);
926645Ssam 	write(rmtape, line, strlen(line));
936645Ssam 	write(rmtape, buf, count);
946645Ssam 	return (rmtreply("write"));
956645Ssam }
966645Ssam 
976645Ssam rmtwrite0(count)
986645Ssam 	int count;
996645Ssam {
1006645Ssam 	char line[30];
1016645Ssam 
1026645Ssam 	sprintf(line, "W%d\n", count);
1036645Ssam 	write(rmtape, line, strlen(line));
1046645Ssam }
1056645Ssam 
1066645Ssam rmtwrite1(buf, count)
1076645Ssam 	char *buf;
1086645Ssam 	int count;
1096645Ssam {
1106645Ssam 
1116645Ssam 	write(rmtape, buf, count);
1126645Ssam }
1136645Ssam 
1146645Ssam rmtwrite2()
1156645Ssam {
1166645Ssam 	int i;
1176645Ssam 
1186645Ssam 	return (rmtreply("write"));
1196645Ssam }
1206645Ssam 
1216645Ssam rmtseek(offset, pos)
1226645Ssam 	int offset, pos;
1236645Ssam {
1246645Ssam 	char line[80];
1256645Ssam 
1266645Ssam 	sprintf(line, "L%d\n%d\n", offset, pos);
1276645Ssam 	return (rmtcall("seek", line));
1286645Ssam }
1296645Ssam 
1306645Ssam struct	mtget mts;
1316645Ssam 
1326645Ssam struct mtget *
1336645Ssam rmtstatus()
1346645Ssam {
1356645Ssam 	register int i;
1366645Ssam 	register char *cp;
1376645Ssam 
1386645Ssam 	if (rmtstate != TS_OPEN)
1396645Ssam 		return (0);
1406645Ssam 	rmtcall("status", "S\n");
1416645Ssam 	for (i = 0, cp = (char *)&mts; i < sizeof(mts); i++)
1426645Ssam 		*cp++ = rmtgetb();
1436645Ssam 	return (&mts);
1446645Ssam }
1456645Ssam 
1466645Ssam rmtioctl(cmd, count)
1476645Ssam 	int cmd, count;
1486645Ssam {
1496645Ssam 	char buf[256];
1506645Ssam 
1516645Ssam 	if (count < 0)
1526645Ssam 		return (-1);
1536645Ssam 	sprintf(buf, "I%d\n%d\n", cmd, count);
1546645Ssam 	rmtcall("ioctl", buf);
1556645Ssam }
1566645Ssam 
1576645Ssam rmtcall(cmd, buf)
1586645Ssam 	char *cmd, *buf;
1596645Ssam {
1606645Ssam 
1616645Ssam 	if (write(rmtape, buf, strlen(buf)) != strlen(buf))
1626645Ssam 		rmtconnaborted();
1636645Ssam 	return (rmtreply(cmd));
1646645Ssam }
1656645Ssam 
1666645Ssam rmtreply(cmd)
1676645Ssam 	char *cmd;
1686645Ssam {
1696645Ssam 	register int c;
1706645Ssam 	char code[30], emsg[BUFSIZ];
1716645Ssam 
1726645Ssam 	rmtgets(code, sizeof (code));
1736645Ssam 	if (*code == 'E' || *code == 'F') {
1746645Ssam 		rmtgets(emsg, sizeof (emsg));
1756645Ssam 		msg("%s: %s\n", cmd, emsg, code + 1);
1766645Ssam 		if (*code == 'F') {
1776645Ssam 			rmtstate = TS_CLOSED;
1786645Ssam 			return (-1);
1796645Ssam 		}
1806645Ssam 		return (-1);
1816645Ssam 	}
1826645Ssam 	if (*code != 'A') {
1836645Ssam 		msg("Protocol to remote tape server botched (code %s?).\n",
1846645Ssam 		    code);
1856645Ssam 		rmtconnaborted();
1866645Ssam 	}
1876645Ssam 	return (atoi(code + 1));
1886645Ssam }
1896645Ssam 
1906645Ssam rmtgetb()
1916645Ssam {
1926645Ssam 	char c;
1936645Ssam 
1946645Ssam 	if (read(rmtape, &c, 1) != 1)
1956645Ssam 		rmtconnaborted();
1966645Ssam 	return (c);
1976645Ssam }
1986645Ssam 
1996645Ssam rmtgets(cp, len)
2006645Ssam 	char *cp;
2016645Ssam 	int len;
2026645Ssam {
2036645Ssam 
2046645Ssam 	while (len > 1) {
2056645Ssam 		*cp = rmtgetb();
2066645Ssam 		if (*cp == '\n') {
2076645Ssam 			cp[1] = 0;
2086645Ssam 			return;
2096645Ssam 		}
2106645Ssam 		cp++;
2116645Ssam 		len--;
2126645Ssam 	}
2136645Ssam 	msg("Protocol to remote tape server botched (in rmtgets).\n");
2146645Ssam 	rmtconnaborted();
2156645Ssam }
216*6884Ssam 
217*6884Ssam msg(cp, a1, a2, a3)
218*6884Ssam 	char *cp;
219*6884Ssam {
220*6884Ssam 
221*6884Ssam 	fprintf(stderr, cp, a1, a2, a3);
222*6884Ssam }
223