zero link count table increased 50 => 500; corrupted directories now pfatal.
[unix-history] / usr / src / sbin / dump / dumprmt.c
CommitLineData
ba8a6acf 1static char *sccsid = "@(#)dumprmt.c 1.4 (Berkeley) %G%";
e23a0a9f 2
a920c801 3#include <sys/param.h>
e23a0a9f
SL
4#include <sys/mtio.h>
5#include <sys/ioctl.h>
ba8a6acf
SL
6
7#include <netinet/in.h>
8
9#include <stdio.h>
10#include <netdb.h>
e23a0a9f
SL
11
12#define TS_CLOSED 0
13#define TS_OPEN 1
14
15static int rmtstate = TS_CLOSED;
16int rmtape;
17int rmtconnaborted();
18char *rmtpeer;
19
20rmthost(host)
21 char *host;
22{
23
24 rmtpeer = host;
25 sigset(SIGPIPE, rmtconnaborted);
26 rmtgetconn();
27 if (rmtape < 0)
a920c801 28 exit(1);
e23a0a9f
SL
29}
30
31rmtconnaborted()
32{
33
a920c801
SL
34 fprintf(stderr, "Lost connection to remote host.\n");
35 exit(1);
e23a0a9f
SL
36}
37
38rmtgetconn()
39{
ba8a6acf 40 static struct servent *sp = 0;
e23a0a9f 41
ba8a6acf
SL
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);
e23a0a9f
SL
50}
51
52rmtopen(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
63rmtclose()
64{
65
66 if (rmtstate != TS_OPEN)
67 return;
68 rmtcall("close", "C\n");
69 rmtstate = TS_CLOSED;
70}
71
72rmtread(buf, count)
73 char *buf;
74 int count;
75{
76 char line[30];
77 int n, i, cc;
a920c801 78 extern errno;
e23a0a9f
SL
79
80 sprintf(line, "R%d\n", count);
81 n = rmtcall("read", line);
a920c801
SL
82 if (n < 0) {
83 errno = n;
e23a0a9f 84 return (-1);
a920c801 85 }
e23a0a9f
SL
86 for (i = 0; i < n; i += cc) {
87 cc = read(rmtape, buf+i, n - i);
a920c801 88 if (cc <= 0) {
e23a0a9f 89 rmtconnaborted();
a920c801 90 }
e23a0a9f
SL
91 }
92 return (n);
93}
94
95rmtwrite(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
107rmtwrite0(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
116rmtwrite1(buf, count)
117 char *buf;
118 int count;
119{
120
121 write(rmtape, buf, count);
122}
123
124rmtwrite2()
125{
126 int i;
127
128 return (rmtreply("write"));
129}
130
131rmtseek(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
140struct mtget mts;
141
142struct mtget *
143rmtstatus()
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
156rmtioctl(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
167rmtcall(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
176rmtreply(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
200rmtgetb()
201{
202 char c;
203
204 if (read(rmtape, &c, 1) != 1)
205 rmtconnaborted();
206 return (c);
207}
208
209rmtgets(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}