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