|
|
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: #include <pwd.h>
12:
13: #define TS_CLOSED 0
14: #define TS_OPEN 1
15:
16: static int rmtstate = TS_CLOSED;
17: int rmtape;
18: int rmtconnaborted();
19: char *rmtpeer;
20: struct passwd *getpwuid();
21:
22: rmthost(host)
23: char *host;
24: {
25:
26: rmtpeer = host;
27: signal(SIGPIPE, rmtconnaborted);
28: rmtgetconn();
29: if (rmtape < 0)
30: exit(1);
31: }
32:
33: rmtconnaborted()
34: {
35:
36: fprintf(stderr, "Lost connection to remote host.\n");
37: exit(1);
38: }
39:
40: rmtgetconn()
41: {
42: static struct servent *sp = 0;
43: struct passwd *pwd;
44:
45: if (sp == 0) {
46: sp = getservbyname("shell", "tcp");
47: if (sp == 0) {
48: fprintf(stderr, "rdump: shell/tcp: unknown service\n");
49: exit(1);
50: }
51: }
52: pwd = (struct passwd *)getpwuid(getuid());
53: if (pwd == 0) {
54: fprintf(stderr, "Who are you?\n");
55: exit(1);
56: }
57: rmtape = rcmd(&rmtpeer, sp->s_port, pwd->pw_name,
58: pwd->pw_name, "/etc/rmt", 0);
59: }
60:
61: rmtopen(tape, mode)
62: char *tape;
63: int mode;
64: {
65: char buf[256];
66:
67: sprintf(buf, "O%s\n%d\n", tape, mode);
68: rmtcall(tape, buf);
69: rmtstate = TS_OPEN;
70: }
71:
72: rmtcreat(tape, mode)
73: char *tape;
74: int mode;
75: {
76: char buf[256];
77:
78: sprintf(buf, "N%s\n%d\n", tape, mode);
79: rmtcall(tape, buf);
80: rmtstate = TS_OPEN;
81: }
82:
83: rmtclose()
84: {
85:
86: if (rmtstate != TS_OPEN)
87: return;
88: rmtcall("close", "C\n");
89: rmtstate = TS_CLOSED;
90: }
91:
92: rmtread(buf, count)
93: char *buf;
94: int count;
95: {
96: char line[30];
97: int n, i, cc;
98: extern errno;
99:
100: sprintf(line, "R%d\n", count);
101: n = rmtcall("read", line);
102: if (n < 0) {
103: errno = n;
104: return (-1);
105: }
106: for (i = 0; i < n; i += cc) {
107: cc = read(rmtape, buf+i, n - i);
108: if (cc <= 0) {
109: rmtconnaborted();
110: }
111: }
112: return (n);
113: }
114:
115: rmtwrite(buf, count)
116: char *buf;
117: int count;
118: {
119: char line[30];
120:
121: sprintf(line, "W%d\n", count);
122: write(rmtape, line, strlen(line));
123: write(rmtape, buf, count);
124: return (rmtreply("write"));
125: }
126:
127: rmtwrite0(count)
128: int count;
129: {
130: char line[30];
131:
132: sprintf(line, "W%d\n", count);
133: write(rmtape, line, strlen(line));
134: }
135:
136: rmtwrite1(buf, count)
137: char *buf;
138: int count;
139: {
140:
141: write(rmtape, buf, count);
142: }
143:
144: rmtwrite2()
145: {
146: int i;
147:
148: return (rmtreply("write"));
149: }
150:
151: rmtseek(offset, pos)
152: int offset, pos;
153: {
154: char line[80];
155:
156: sprintf(line, "L%d\n%d\n", offset, pos);
157: return (rmtcall("seek", line));
158: }
159:
160: struct mtget mts;
161:
162: struct mtget *
163: rmtstatus()
164: {
165: register int i;
166: register char *cp;
167:
168: if (rmtstate != TS_OPEN)
169: return (0);
170: if (rmtcall("status", "S\n") < 0)
171: return((struct mtget *)0);
172: /* rmtcall("status", "S\n"); */
173: for (i = 0, cp = (char *)&mts; i < sizeof(mts); i++)
174: *cp++ = rmtgetb();
175: return (&mts);
176: }
177:
178: rmtioctl(cmd, count)
179: int cmd, count;
180: {
181: char buf[256];
182:
183: if (count < 0)
184: return (-1);
185: sprintf(buf, "I%d\n%d\n", cmd, count);
186: return (rmtcall("ioctl", buf));
187: }
188:
189: rmtcall(cmd, buf)
190: char *cmd, *buf;
191: {
192:
193: if (write(rmtape, buf, strlen(buf)) != strlen(buf))
194: rmtconnaborted();
195: return (rmtreply(cmd));
196: }
197:
198: rmtreply(cmd)
199: char *cmd;
200: {
201: register int c;
202: char code[30], emsg[BUFSIZ];
203:
204: rmtgets(code, sizeof (code));
205: if (*code == 'E' || *code == 'F') {
206: rmtgets(emsg, sizeof (emsg));
207: msg("%s: %s\n", cmd, emsg, code + 1);
208: if (*code == 'F') {
209: rmtstate = TS_CLOSED;
210: return (-1);
211: }
212: return (-1);
213: }
214: if (*code != 'A') {
215: msg("Protocol to remote tape server botched (code %s?).\n",
216: code);
217: rmtconnaborted();
218: }
219: return (atoi(code + 1));
220: }
221:
222: rmtgetb()
223: {
224: char c;
225:
226: if (read(rmtape, &c, 1) != 1)
227: rmtconnaborted();
228: return (c);
229: }
230:
231: rmtgets(cp, len)
232: char *cp;
233: int len;
234: {
235:
236: while (len > 1) {
237: *cp = rmtgetb();
238: if (*cp == '\n') {
239: cp[1] = 0;
240: return;
241: }
242: cp++;
243: len--;
244: }
245: msg("Protocol to remote tape server botched (in rmtgets).\n");
246: rmtconnaborted();
247: }
248: msg(cp, a1, a2, a3)
249: char *cp;
250: {
251:
252: fprintf(stderr, cp, a1, a2, a3);
253: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.