xref: /csrg-svn/sbin/dump/dumprmt.c (revision 6645)
1*6645Ssam static	char *sccsid = "@(#)dumprmt.c	1.1 (Berkeley) 05/07/82";
2*6645Ssam #include "dump.h"
3*6645Ssam 
4*6645Ssam #include <sys/mtio.h>
5*6645Ssam #include <sys/ioctl.h>
6*6645Ssam #include <net/in.h>
7*6645Ssam 
8*6645Ssam #define	TS_CLOSED	0
9*6645Ssam #define	TS_OPEN		1
10*6645Ssam 
11*6645Ssam static	int rmtstate = TS_CLOSED;
12*6645Ssam int	rmtape;
13*6645Ssam int	rmtconnaborted();
14*6645Ssam char	*rmtpeer;
15*6645Ssam 
16*6645Ssam rmthost(host)
17*6645Ssam 	char *host;
18*6645Ssam {
19*6645Ssam 
20*6645Ssam 	rmtpeer = host;
21*6645Ssam 	sigset(SIGPIPE, rmtconnaborted);
22*6645Ssam 	rmtgetconn();
23*6645Ssam 	if (rmtape < 0)
24*6645Ssam 		rmtreconnect();
25*6645Ssam }
26*6645Ssam 
27*6645Ssam rmtconnaborted()
28*6645Ssam {
29*6645Ssam 
30*6645Ssam 	msg("Lost connection to tape server.\n");
31*6645Ssam 	if (rmtape >= 0) {
32*6645Ssam 		close(rmtape);
33*6645Ssam 		rmtape = -1;
34*6645Ssam 	}
35*6645Ssam 	exit(X_REWRITE);
36*6645Ssam }
37*6645Ssam 
38*6645Ssam rmtreconnect()
39*6645Ssam {
40*6645Ssam 
41*6645Ssam 	do {
42*6645Ssam 		if (query("Retry conection to remote host?") == 0)
43*6645Ssam 			exit(X_ABORT);
44*6645Ssam 		rmtgetconn();
45*6645Ssam 	} while (rmtape < 0);
46*6645Ssam }
47*6645Ssam 
48*6645Ssam rmtgetconn()
49*6645Ssam {
50*6645Ssam 
51*6645Ssam 	rmtape = rcmd(&rmtpeer, IPPORT_CMDSERVER,
52*6645Ssam 	    "root", "root", "/etc/rmt", 0);
53*6645Ssam }
54*6645Ssam 
55*6645Ssam rmtopen(tape, mode)
56*6645Ssam 	char *tape;
57*6645Ssam 	int mode;
58*6645Ssam {
59*6645Ssam 	char buf[256];
60*6645Ssam 
61*6645Ssam 	sprintf(buf, "O%s\n%d\n", tape, mode);
62*6645Ssam 	rmtcall(tape, buf);
63*6645Ssam 	rmtstate = TS_OPEN;
64*6645Ssam }
65*6645Ssam 
66*6645Ssam rmtclose()
67*6645Ssam {
68*6645Ssam 
69*6645Ssam 	if (rmtstate != TS_OPEN)
70*6645Ssam 		return;
71*6645Ssam 	rmtcall("close", "C\n");
72*6645Ssam 	rmtstate = TS_CLOSED;
73*6645Ssam }
74*6645Ssam 
75*6645Ssam rmtread(buf, count)
76*6645Ssam 	char *buf;
77*6645Ssam 	int count;
78*6645Ssam {
79*6645Ssam 	char line[30];
80*6645Ssam 	int n, i, cc;
81*6645Ssam 
82*6645Ssam 	sprintf(line, "R%d\n", count);
83*6645Ssam 	n = rmtcall("read", line);
84*6645Ssam 	if (n < 0)
85*6645Ssam 		return (-1);
86*6645Ssam 	for (i = 0; i < n; i += cc) {
87*6645Ssam 		cc = read(rmtape, buf+i, n - i);
88*6645Ssam 		if (cc <= 0)
89*6645Ssam 			rmtconnaborted();
90*6645Ssam 	}
91*6645Ssam 	return (n);
92*6645Ssam }
93*6645Ssam 
94*6645Ssam rmtwrite(buf, count)
95*6645Ssam 	char *buf;
96*6645Ssam 	int count;
97*6645Ssam {
98*6645Ssam 	char line[30];
99*6645Ssam 
100*6645Ssam 	sprintf(line, "W%d\n", count);
101*6645Ssam 	write(rmtape, line, strlen(line));
102*6645Ssam 	write(rmtape, buf, count);
103*6645Ssam 	return (rmtreply("write"));
104*6645Ssam }
105*6645Ssam 
106*6645Ssam rmtwrite0(count)
107*6645Ssam 	int count;
108*6645Ssam {
109*6645Ssam 	char line[30];
110*6645Ssam 
111*6645Ssam 	sprintf(line, "W%d\n", count);
112*6645Ssam 	write(rmtape, line, strlen(line));
113*6645Ssam }
114*6645Ssam 
115*6645Ssam rmtwrite1(buf, count)
116*6645Ssam 	char *buf;
117*6645Ssam 	int count;
118*6645Ssam {
119*6645Ssam 
120*6645Ssam 	write(rmtape, buf, count);
121*6645Ssam }
122*6645Ssam 
123*6645Ssam rmtwrite2()
124*6645Ssam {
125*6645Ssam 	int i;
126*6645Ssam 
127*6645Ssam 	return (rmtreply("write"));
128*6645Ssam }
129*6645Ssam 
130*6645Ssam rmtseek(offset, pos)
131*6645Ssam 	int offset, pos;
132*6645Ssam {
133*6645Ssam 	char line[80];
134*6645Ssam 
135*6645Ssam 	sprintf(line, "L%d\n%d\n", offset, pos);
136*6645Ssam 	return (rmtcall("seek", line));
137*6645Ssam }
138*6645Ssam 
139*6645Ssam struct	mtget mts;
140*6645Ssam 
141*6645Ssam struct mtget *
142*6645Ssam rmtstatus()
143*6645Ssam {
144*6645Ssam 	register int i;
145*6645Ssam 	register char *cp;
146*6645Ssam 
147*6645Ssam 	if (rmtstate != TS_OPEN)
148*6645Ssam 		return (0);
149*6645Ssam 	rmtcall("status", "S\n");
150*6645Ssam 	for (i = 0, cp = (char *)&mts; i < sizeof(mts); i++)
151*6645Ssam 		*cp++ = rmtgetb();
152*6645Ssam 	return (&mts);
153*6645Ssam }
154*6645Ssam 
155*6645Ssam rmtioctl(cmd, count)
156*6645Ssam 	int cmd, count;
157*6645Ssam {
158*6645Ssam 	char buf[256];
159*6645Ssam 
160*6645Ssam 	if (count < 0)
161*6645Ssam 		return (-1);
162*6645Ssam 	sprintf(buf, "I%d\n%d\n", cmd, count);
163*6645Ssam 	rmtcall("ioctl", buf);
164*6645Ssam }
165*6645Ssam 
166*6645Ssam rmtcall(cmd, buf)
167*6645Ssam 	char *cmd, *buf;
168*6645Ssam {
169*6645Ssam 
170*6645Ssam 	if (write(rmtape, buf, strlen(buf)) != strlen(buf))
171*6645Ssam 		rmtconnaborted();
172*6645Ssam 	return (rmtreply(cmd));
173*6645Ssam }
174*6645Ssam 
175*6645Ssam rmtreply(cmd)
176*6645Ssam 	char *cmd;
177*6645Ssam {
178*6645Ssam 	register int c;
179*6645Ssam 	char code[30], emsg[BUFSIZ];
180*6645Ssam 
181*6645Ssam 	rmtgets(code, sizeof (code));
182*6645Ssam 	if (*code == 'E' || *code == 'F') {
183*6645Ssam 		rmtgets(emsg, sizeof (emsg));
184*6645Ssam 		msg("%s: %s\n", cmd, emsg, code + 1);
185*6645Ssam 		if (*code == 'F') {
186*6645Ssam 			rmtstate = TS_CLOSED;
187*6645Ssam 			return (-1);
188*6645Ssam 		}
189*6645Ssam 		return (-1);
190*6645Ssam 	}
191*6645Ssam 	if (*code != 'A') {
192*6645Ssam 		msg("Protocol to remote tape server botched (code %s?).\n",
193*6645Ssam 		    code);
194*6645Ssam 		rmtconnaborted();
195*6645Ssam 	}
196*6645Ssam 	return (atoi(code + 1));
197*6645Ssam }
198*6645Ssam 
199*6645Ssam rmtgetb()
200*6645Ssam {
201*6645Ssam 	char c;
202*6645Ssam 
203*6645Ssam 	if (read(rmtape, &c, 1) != 1)
204*6645Ssam 		rmtconnaborted();
205*6645Ssam 	return (c);
206*6645Ssam }
207*6645Ssam 
208*6645Ssam rmtgets(cp, len)
209*6645Ssam 	char *cp;
210*6645Ssam 	int len;
211*6645Ssam {
212*6645Ssam 
213*6645Ssam 	while (len > 1) {
214*6645Ssam 		*cp = rmtgetb();
215*6645Ssam 		if (*cp == '\n') {
216*6645Ssam 			cp[1] = 0;
217*6645Ssam 			return;
218*6645Ssam 		}
219*6645Ssam 		cp++;
220*6645Ssam 		len--;
221*6645Ssam 	}
222*6645Ssam 	msg("Protocol to remote tape server botched (in rmtgets).\n");
223*6645Ssam 	rmtconnaborted();
224*6645Ssam }
225