xref: /csrg-svn/sbin/dump/dumprmt.c (revision 13032)
1*13032Ssam static	char *sccsid = "@(#)dumprmt.c	1.5 (Berkeley) 06/12/83";
26645Ssam 
36884Ssam #include <sys/param.h>
46645Ssam #include <sys/mtio.h>
56645Ssam #include <sys/ioctl.h>
66645Ssam 
79306Ssam #include <netinet/in.h>
89306Ssam 
99306Ssam #include <stdio.h>
109306Ssam #include <netdb.h>
119306Ssam 
126645Ssam #define	TS_CLOSED	0
136645Ssam #define	TS_OPEN		1
146645Ssam 
156645Ssam static	int rmtstate = TS_CLOSED;
166645Ssam int	rmtape;
176645Ssam int	rmtconnaborted();
186645Ssam char	*rmtpeer;
196645Ssam 
206645Ssam rmthost(host)
216645Ssam 	char *host;
226645Ssam {
236645Ssam 
246645Ssam 	rmtpeer = host;
25*13032Ssam 	signal(SIGPIPE, rmtconnaborted);
266645Ssam 	rmtgetconn();
276645Ssam 	if (rmtape < 0)
286884Ssam 		exit(1);
296645Ssam }
306645Ssam 
316645Ssam rmtconnaborted()
326645Ssam {
336645Ssam 
346884Ssam 	fprintf(stderr, "Lost connection to remote host.\n");
356884Ssam 	exit(1);
366645Ssam }
376645Ssam 
386645Ssam rmtgetconn()
396645Ssam {
409306Ssam 	static struct servent *sp = 0;
416645Ssam 
429306Ssam 	if (sp == 0) {
439306Ssam 		sp = getservbyname("shell", "tcp");
449306Ssam 		if (sp == 0) {
459306Ssam 			fprintf(stderr, "rdump: shell/tcp: unknown service\n");
469306Ssam 			exit(1);
479306Ssam 		}
489306Ssam 	}
499306Ssam 	rmtape = rcmd(&rmtpeer, sp->s_port, "root", "root", "/etc/rmt", 0);
506645Ssam }
516645Ssam 
526645Ssam rmtopen(tape, mode)
536645Ssam 	char *tape;
546645Ssam 	int mode;
556645Ssam {
566645Ssam 	char buf[256];
576645Ssam 
586645Ssam 	sprintf(buf, "O%s\n%d\n", tape, mode);
596645Ssam 	rmtcall(tape, buf);
606645Ssam 	rmtstate = TS_OPEN;
616645Ssam }
626645Ssam 
636645Ssam rmtclose()
646645Ssam {
656645Ssam 
666645Ssam 	if (rmtstate != TS_OPEN)
676645Ssam 		return;
686645Ssam 	rmtcall("close", "C\n");
696645Ssam 	rmtstate = TS_CLOSED;
706645Ssam }
716645Ssam 
726645Ssam rmtread(buf, count)
736645Ssam 	char *buf;
746645Ssam 	int count;
756645Ssam {
766645Ssam 	char line[30];
776645Ssam 	int n, i, cc;
786884Ssam 	extern errno;
796645Ssam 
806645Ssam 	sprintf(line, "R%d\n", count);
816645Ssam 	n = rmtcall("read", line);
826884Ssam 	if (n < 0) {
836884Ssam 		errno = n;
846645Ssam 		return (-1);
856884Ssam 	}
866645Ssam 	for (i = 0; i < n; i += cc) {
876645Ssam 		cc = read(rmtape, buf+i, n - i);
886884Ssam 		if (cc <= 0) {
896645Ssam 			rmtconnaborted();
906884Ssam 		}
916645Ssam 	}
926645Ssam 	return (n);
936645Ssam }
946645Ssam 
956645Ssam rmtwrite(buf, count)
966645Ssam 	char *buf;
976645Ssam 	int count;
986645Ssam {
996645Ssam 	char line[30];
1006645Ssam 
1016645Ssam 	sprintf(line, "W%d\n", count);
1026645Ssam 	write(rmtape, line, strlen(line));
1036645Ssam 	write(rmtape, buf, count);
1046645Ssam 	return (rmtreply("write"));
1056645Ssam }
1066645Ssam 
1076645Ssam rmtwrite0(count)
1086645Ssam 	int count;
1096645Ssam {
1106645Ssam 	char line[30];
1116645Ssam 
1126645Ssam 	sprintf(line, "W%d\n", count);
1136645Ssam 	write(rmtape, line, strlen(line));
1146645Ssam }
1156645Ssam 
1166645Ssam rmtwrite1(buf, count)
1176645Ssam 	char *buf;
1186645Ssam 	int count;
1196645Ssam {
1206645Ssam 
1216645Ssam 	write(rmtape, buf, count);
1226645Ssam }
1236645Ssam 
1246645Ssam rmtwrite2()
1256645Ssam {
1266645Ssam 	int i;
1276645Ssam 
1286645Ssam 	return (rmtreply("write"));
1296645Ssam }
1306645Ssam 
1316645Ssam rmtseek(offset, pos)
1326645Ssam 	int offset, pos;
1336645Ssam {
1346645Ssam 	char line[80];
1356645Ssam 
1366645Ssam 	sprintf(line, "L%d\n%d\n", offset, pos);
1376645Ssam 	return (rmtcall("seek", line));
1386645Ssam }
1396645Ssam 
1406645Ssam struct	mtget mts;
1416645Ssam 
1426645Ssam struct mtget *
1436645Ssam rmtstatus()
1446645Ssam {
1456645Ssam 	register int i;
1466645Ssam 	register char *cp;
1476645Ssam 
1486645Ssam 	if (rmtstate != TS_OPEN)
1496645Ssam 		return (0);
1506645Ssam 	rmtcall("status", "S\n");
1516645Ssam 	for (i = 0, cp = (char *)&mts; i < sizeof(mts); i++)
1526645Ssam 		*cp++ = rmtgetb();
1536645Ssam 	return (&mts);
1546645Ssam }
1556645Ssam 
1566645Ssam rmtioctl(cmd, count)
1576645Ssam 	int cmd, count;
1586645Ssam {
1596645Ssam 	char buf[256];
1606645Ssam 
1616645Ssam 	if (count < 0)
1626645Ssam 		return (-1);
1636645Ssam 	sprintf(buf, "I%d\n%d\n", cmd, count);
1646645Ssam 	rmtcall("ioctl", buf);
1656645Ssam }
1666645Ssam 
1676645Ssam rmtcall(cmd, buf)
1686645Ssam 	char *cmd, *buf;
1696645Ssam {
1706645Ssam 
1716645Ssam 	if (write(rmtape, buf, strlen(buf)) != strlen(buf))
1726645Ssam 		rmtconnaborted();
1736645Ssam 	return (rmtreply(cmd));
1746645Ssam }
1756645Ssam 
1766645Ssam rmtreply(cmd)
1776645Ssam 	char *cmd;
1786645Ssam {
1796645Ssam 	register int c;
1806645Ssam 	char code[30], emsg[BUFSIZ];
1816645Ssam 
1826645Ssam 	rmtgets(code, sizeof (code));
1836645Ssam 	if (*code == 'E' || *code == 'F') {
1846645Ssam 		rmtgets(emsg, sizeof (emsg));
1856645Ssam 		msg("%s: %s\n", cmd, emsg, code + 1);
1866645Ssam 		if (*code == 'F') {
1876645Ssam 			rmtstate = TS_CLOSED;
1886645Ssam 			return (-1);
1896645Ssam 		}
1906645Ssam 		return (-1);
1916645Ssam 	}
1926645Ssam 	if (*code != 'A') {
1936645Ssam 		msg("Protocol to remote tape server botched (code %s?).\n",
1946645Ssam 		    code);
1956645Ssam 		rmtconnaborted();
1966645Ssam 	}
1976645Ssam 	return (atoi(code + 1));
1986645Ssam }
1996645Ssam 
2006645Ssam rmtgetb()
2016645Ssam {
2026645Ssam 	char c;
2036645Ssam 
2046645Ssam 	if (read(rmtape, &c, 1) != 1)
2056645Ssam 		rmtconnaborted();
2066645Ssam 	return (c);
2076645Ssam }
2086645Ssam 
2096645Ssam rmtgets(cp, len)
2106645Ssam 	char *cp;
2116645Ssam 	int len;
2126645Ssam {
2136645Ssam 
2146645Ssam 	while (len > 1) {
2156645Ssam 		*cp = rmtgetb();
2166645Ssam 		if (*cp == '\n') {
2176645Ssam 			cp[1] = 0;
2186645Ssam 			return;
2196645Ssam 		}
2206645Ssam 		cp++;
2216645Ssam 		len--;
2226645Ssam 	}
2236645Ssam 	msg("Protocol to remote tape server botched (in rmtgets).\n");
2246645Ssam 	rmtconnaborted();
2256645Ssam }
226