lint
[unix-history] / usr / src / old / implog / implog.c
CommitLineData
bbb841ef
SL
1/* implog.c 4.1 82/04/04 */
2
3#include <stdio.h>
4#include <time.h>
5#include <signal.h>
6#include <sgtty.h>
7#include <sys/types.h>
8#include <sys/stat.h>
9#include <sys/socket.h>
10#include <net/in.h>
11#define IMPLEADERS
12#include <net/if_imp.h>
13
14#define min(a, b) ((a) < (b) ? (a) : (b))
15
16u_char buf[1024];
17int showdata = 1;
18int showcontents = 0;
19int follow = 0;
20int link = -1;
21int host = -1;
22int imp = -1;
23int packettype = -1;
24extern int errno;
25int log;
26char *logfile = "/usr/adm/implog";
27
28/*
29 * Socket address, internet style, with
30 * unused space taken by timestamp and packet
31 * size.
32 */
33struct sockstamp {
34 short sin_family;
35 u_short sin_port;
36 struct in_addr sin_addr;
37 time_t sin_time;
38 int sin_cc;
39};
40struct sockstamp from;
41
42main(argc, argv)
43 char *argv[];
44{
45 struct stat b;
46 int size;
47 char *cp;
48
49 argc--, argv++;
50 while (argc > 0 && argv[0][0] == '-') {
51 if (strcmp(*argv, "-D") == 0) {
52 showdata = 0;
53 argv++, argc--;
54 continue;
55 }
56 if (strcmp(*argv, "-f") == 0) {
57 follow++;
58 argv++, argc--;
59 continue;
60 }
61 if (strcmp(*argv, "-c") == 0) {
62 showcontents++;
63 argv++, argc--;
64 continue;
65 }
66 if (strcmp(*argv, "-l") == 0) {
67 argc--, argv++;
68 if (argc > 0) {
69 link = atoi(*argv);
70 argc--, argv++;
71 } else
72 link = IMPLINK_IP;
73 continue;
74 }
75 if (strcmp(*argv, "-h") == 0) {
76 argc--, argv++;
77 if (argc < 1) {
78 printf("-h: missing host #\n");
79 exit(2);
80 }
81 host = atoi(*argv);
82 argv++, argc--;
83 continue;
84 }
85 if (strcmp(*argv, "-i") == 0) {
86 argc--, argv++;
87 if (argc < 1) {
88 printf("-i: missing imp #\n");
89 exit(2);
90 }
91 imp = atoi(*argv);
92 argv++, argc--;
93 continue;
94 }
95 if (strcmp(*argv, "-t") == 0) {
96 argc--, argv++;;
97 if (argc < 1) {
98 printf("-t: missing packet type\n");
99 exit(2);
100 }
101 packettype = atoi(*argv);
102 argv++, argc--;;
103 continue;
104 }
105 printf("usage: prlog [ -D ] [ -c ] [ -f ] [-h #] [-i #] [ -t # ] [-l [#]] [logfile]\n");
106 exit(2);
107 }
108 if (argc > 0)
109 logfile = argv[0];
110 log = open(logfile, 0);
111 if (log < 0) {
112 perror(logfile);
113 exit(1);
114 }
115 fstat(log, &b);
116 size = b.st_size;
117again:
118 while (read(log, (char *)&from, sizeof(from)) == sizeof(from)) {
119 if (from.sin_family == 0) {
120 printf("restarted: %.24s\n", ctime(&from.sin_time));
121 continue;
122 }
123 if (host >= 0 && from.sin_addr.s_host != host) {
124 lseek(log, from.sin_cc, 1);
125 continue;
126 }
127 if (imp >= 0) {
128 from.sin_addr.s_imp = ntohs(from.sin_addr.s_imp);
129 if (from.sin_addr.s_imp != imp) {
130 lseek(log, from.sin_cc, 1);
131 continue;
132 }
133 }
134 process(log, &from);
135 }
136 while (follow) {
137 fflush(stdout);
138 sleep(5);
139 fstat(log, &b);
140 if (b.st_size > size) {
141 size = b.st_size;
142 goto again;
143 }
144 }
145}
146
147int impdata(), impbadleader(), impdown(), impnoop();
148int imprfnm(), impincomplete(), imphostdead(), imphostunreach();
149int impbaddata(), impreset(), impretry(), impnotify(), imptrying();
150int impready(), impundef();
151
152struct messages {
153 u_char m_type; /* type of message */
154 int (*m_func)(); /* routine to process message */
155} mtypes[] = {
156 { IMPTYPE_DATA, impdata },
157 { IMPTYPE_BADLEADER, impbadleader },
158 { IMPTYPE_DOWN, impdown },
159 { IMPTYPE_NOOP, impnoop },
160 { IMPTYPE_RFNM, imprfnm },
161 { IMPTYPE_INCOMPLETE, impincomplete },
162 { IMPTYPE_HOSTDEAD, imphostdead },
163 { IMPTYPE_HOSTUNREACH, imphostunreach },
164 { IMPTYPE_BADDATA, impbaddata },
165 { IMPTYPE_RESET, impreset },
166 { IMPTYPE_RETRY, impretry },
167 { IMPTYPE_NOTIFY, impnotify },
168 { IMPTYPE_TRYING, imptrying },
169 { IMPTYPE_READY, impready },
170 { -1, impundef }
171};
172
173/*
174 * Print a packet.
175 */
176process(l, f)
177 int l;
178 struct sockstamp *f;
179{
180 register struct messages *mp;
181 struct imp_leader *ip;
182
183 if (read(l, (char *)buf, f->sin_cc) != f->sin_cc) {
184 perror("read");
185 return;
186 }
187 ip = (struct imp_leader *)buf;
188#if vax
189 ip->il_imp = ntohs(ip->il_imp);
190#endif
191 for (mp = mtypes; mp->m_type != -1; mp++)
192 if (mp->m_type == ip->il_mtype)
193 break;
194 if (mp->m_type == IMPTYPE_DATA) {
195 if (link >= 0 && ip->il_link != link)
196 return;
197 if (!showdata)
198 return;
199 }
200 if (packettype >= 0 && mp->m_type != packettype)
201 return;
202 printf("%.24s: ", ctime(&f->sin_time));
203 (*mp->m_func)(ip, f->sin_cc);
204}
205
206impdata(ip, cc)
207 register struct imp_leader *ip;
208{
209 printf("<%d/%d, DATA, link=", ip->il_host, ntohs(ip->il_imp));
210 if (ip->il_link == IMPLINK_IP)
211 printf("ip,");
212 else
213 printf("%d,", ip->il_link);
214 printf(" len=%d bytes>\n", ntohs(ip->il_length) >> 3);
215 if (showcontents) {
216 register u_char *cp = ((u_char *)ip) + sizeof(*ip);
217 register int i;
218
219 i = (ntohs(ip->il_length) >> 3) - sizeof(struct imp_leader);
220 cc = min(i, cc);
221 printf("data: (%d bytes)", cc);
222 for (i = 0; i < cc; i++, cp++) {
223 if (i % 25 == 0)
224 printf("\n");
225 printf("%02x ", *cp);
226 }
227 putchar('\n');
228 }
229}
230
231char *badleader[] = {
232 "error flip-flop set",
233 "message < 80 bits",
234 "illegal type field",
235 "opposite leader type"
236};
237
238impbadleader(ip)
239 register struct imp_leader *ip;
240{
241 printf("bad leader: ");
242 if (ip->il_subtype > IMPLEADER_OPPOSITE)
243 printf("%x\n", ip->il_subtype);
244 else
245 printf("%s\n", badleader[ip->il_subtype]);
246}
247
248char *down[] = {
249 "in 30 secs",
250 "for hardware pm",
251 "for software reload",
252 "for emergency restart"
253};
254
255impdown(ip)
256 register struct imp_leader *ip;
257{
258 int tdown, tbackup;
259
260 printf("imp going down %s", down[ip->il_link & IMP_DMASK]);
261 tdown = ((ip->il_link >> 2) & 0xf) * 5;
262 if (ip->il_link & IMP_DMASK)
263 printf(" in %d minutes", tdown);
264 tbackup = ip->il_subtype * 5;
265 printf(": back up ");
266 if (tbackup)
267 printf("%d minutes\n", tbackup);
268 else
269 printf("immediately\n");
270}
271
272impnoop(ip)
273 register struct imp_leader *ip;
274{
275 printf("noop: host %d, imp %d\n", ip->il_host, ntohs(ip->il_imp));
276}
277
278imprfnm(ip)
279 register struct imp_leader *ip;
280{
281 printf("rfnm: htype=%x, source=%d/%d, link=",
282 ip->il_htype, ip->il_host, ip->il_imp);
283 if (ip->il_link == IMPLINK_IP)
284 printf("ip,");
285 else
286 printf("%x,", ip->il_link);
287 printf(" subtype=%x\n", ip->il_subtype);
288}
289
290char *hostdead[] = {
291 "???",
292 "ready-line negated",
293 "tardy receiving messages",
294 "ncc doesn't know host",
295 "imp software won't allow messages",
296 "host down for scheduled pm",
297 "host down for hardware work",
298 "host down for software work",
299 "host down for emergency restart",
300 "host down because of power outage",
301 "host stopped at a breakpoint",
302 "host down due to hardware failure",
303 "host not scheduled to be up",
304 "???",
305 "???",
306 "host in the process of coming up"
307};
308
309imphostdead(ip)
310 register struct imp_leader *ip;
311{
312 printf("host dead: ");
313 if (ip->il_link & IMP_DMASK)
314 printf("down %s, ", down[ip->il_link & IMP_DMASK]);
315 if (ip->il_subtype <= IMPHOST_COMINGUP)
316 printf("%s\n", hostdead[ip->il_subtype]);
317 else
318 printf("subtype=%x\n", ip->il_subtype);
319}
320
321char *hostunreach[] = {
322 "destination imp can't be reached",
323 "destination host isn't up",
324 "host doesn't support long leader",
325 "communication is prohibited"
326};
327
328imphostunreach(ip)
329 register struct imp_leader *ip;
330{
331 printf("host unreachable: ");
332 if (ip->il_subtype <= IMPREACH_PROHIBITED)
333 printf("%s\n", hostunreach[ip->il_subtype]);
334 else
335 printf("subtype=%x\n", ip->il_subtype);
336}
337
338impbaddata(ip)
339 register struct imp_leader *ip;
340{
341 printf("error in data: htype=%x, source=%d/%d, link=",
342 ip->il_htype, ip->il_host, ip->il_imp);
343 if (ip->il_link == IMPLINK_IP)
344 printf("ip, ");
345 else
346 printf("%x, ", ip->il_link);
347 printf("subtype=%x\n", ip->il_subtype);
348}
349
350char *incomplete[] = {
351 "host didn't take data fast enough",
352 "message was too long",
353 "message transmission time > 15 seconds",
354 "imp/circuit failure",
355 "no resources within 15 seconds",
356 "source imp i/o failure during receipt"
357};
358
359impincomplete(ip)
360 register struct imp_leader *ip;
361{
362 printf("incomplete: htype=%x, source=%d/%d, link=",
363 ip->il_htype, ip->il_host, ip->il_imp);
364 if (ip->il_link == IMPLINK_IP)
365 printf("ip,");
366 else
367 printf("%x,", ip->il_link);
368 if (ip->il_subtype <= IMPCOMPLETE_IMPIO)
369 printf(" %s\n", incomplete[ip->il_subtype]);
370 else
371 printf(" subtype=%x\n", ip->il_subtype);
372}
373
374impreset(ip)
375 register struct imp_leader *ip;
376{
377 printf("reset complete\n");
378}
379
380char *retry[] = {
381 "imp buffer wasn't available",
382 "connection block unavailable"
383};
384
385impretry(ip)
386 register struct imp_leader *ip;
387{
388 printf("refused, try again: ");
389 if (ip->il_subtype <= IMPRETRY_BLOCK)
390 printf("%s\n", retry[ip->il_subtype]);
391 else
392 printf("subtype=%x\n", ip->il_subtype);
393}
394
395char *notify[] = {
396 "???",
397 "???",
398 "connection not available",
399 "reassembly space not available at destination",
400 "message number not available",
401 "transaction block for message not available"
402};
403
404impnotify(ip)
405 register struct imp_leader *ip;
406{
407 printf("refused, will notify: ");
408 if (ip->il_subtype <= 5)
409 printf("%s\n", notify[ip->il_subtype]);
410 else
411 printf("subtype=%x\n", ip->il_subtype);
412}
413
414imptrying(ip)
415 register struct imp_leader *ip;
416{
417 printf("refused, still trying\n");
418}
419
420impready(ip)
421 register struct imp_leader *ip;
422{
423 printf("ready\n");
424}
425
426impundef(ip)
427 register struct imp_leader *ip;
428{
429 printf("<fmt=%x, net=%x, flags=%x, mtype=", ip->il_format,
430 ip->il_network, ip->il_flags);
431 printf("%x, htype=%x, host=%x, imp=%x, link=", ip->il_mtype,
432 ip->il_htype, ip->il_host, ip->il_imp);
433 if (ip->il_link == IMPLINK_IP)
434 printf("ip,");
435 else
436 printf("%x,", ip->il_link);
437 printf(" subtype=%x>\n", ip->il_subtype);
438}