|
|
1.1 root 1: static char *sccsid = "@(#)dumprmt.c 1.6 (Berkeley) 7/1/83";
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: signal(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: return (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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.