|
|
1.1 root 1: /*
2: * Copyright (c) 1988 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that this notice is preserved and that due credit is given
7: * to the University of California at Berkeley. The name of the University
8: * may not be used to endorse or promote products derived from this
9: * software without specific prior written permission. This software
10: * is provided ``as is'' without express or implied warranty.
11: */
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)utilities.c 1.5 (Berkeley) 5/15/88";
15: #endif /* not lint */
16:
17: #define TELOPTS
18: #include <arpa/telnet.h>
19: #include <sys/types.h>
20:
21: #include <ctype.h>
22:
23: #include "general.h"
24:
25: #include "ring.h"
26:
27: #include "externs.h"
28:
29: FILE *NetTrace = 0; /* Not in bss, since needs to stay */
30:
31: /*
32: * upcase()
33: *
34: * Upcase (in place) the argument.
35: */
36:
37: void
38: upcase(argument)
39: register char *argument;
40: {
41: register int c;
42:
43: while ((c = *argument) != 0) {
44: if (islower(c)) {
45: *argument = toupper(c);
46: }
47: argument++;
48: }
49: }
50:
51: /*
52: * SetSockOpt()
53: *
54: * Compensate for differences in 4.2 and 4.3 systems.
55: */
56:
57: int
58: SetSockOpt(fd, level, option, yesno)
59: int
60: fd,
61: level,
62: option,
63: yesno;
64: {
65: #ifndef NOT43
66: return setsockopt(fd, level, option,
67: (char *)&yesno, sizeof yesno);
68: #else /* NOT43 */
69: if (yesno == 0) { /* Can't do that in 4.2! */
70: fprintf(stderr, "Error: attempt to turn off an option 0x%x.\n",
71: option);
72: return -1;
73: }
74: return setsockopt(fd, level, option, 0, 0);
75: #endif /* NOT43 */
76: }
77:
78: /*
79: * The following are routines used to print out debugging information.
80: */
81:
82:
83: void
84: Dump(direction, buffer, length)
85: char direction;
86: char *buffer;
87: int length;
88: {
89: # define BYTES_PER_LINE 32
90: # define min(x,y) ((x<y)? x:y)
91: char *pThis;
92: int offset;
93:
94: offset = 0;
95:
96: while (length) {
97: /* print one line */
98: fprintf(NetTrace, "%c 0x%x\t", direction, offset);
99: pThis = buffer;
100: buffer = buffer+min(length, BYTES_PER_LINE);
101: while (pThis < buffer) {
102: fprintf(NetTrace, "%.2x", (*pThis)&0xff);
103: pThis++;
104: }
105: fprintf(NetTrace, "\n");
106: length -= BYTES_PER_LINE;
107: offset += BYTES_PER_LINE;
108: if (length < 0) {
109: return;
110: }
111: /* find next unique line */
112: }
113: }
114:
115:
116: /*VARARGS*/
117: void
118: printoption(direction, fmt, option, what)
119: char *direction, *fmt;
120: int option, what;
121: {
122: if (!showoptions)
123: return;
124: fprintf(NetTrace, "%s ", direction+1);
125: if (fmt == doopt)
126: fmt = "do";
127: else if (fmt == dont)
128: fmt = "dont";
129: else if (fmt == will)
130: fmt = "will";
131: else if (fmt == wont)
132: fmt = "wont";
133: else
134: fmt = "???";
135: if (option < (sizeof telopts/sizeof telopts[0]))
136: fprintf(NetTrace, "%s %s", fmt, telopts[option]);
137: else
138: fprintf(NetTrace, "%s %d", fmt, option);
139: if (*direction == '<') {
140: fprintf(NetTrace, "\r\n");
141: return;
142: }
143: fprintf(NetTrace, " (%s)\r\n", what ? "reply" : "don't reply");
144: }
145:
146: void
147: printsub(direction, pointer, length)
148: char *direction, /* "<" or ">" */
149: *pointer; /* where suboption data sits */
150: int length; /* length of suboption data */
151: {
152: if (showoptions) {
153: fprintf(NetTrace, "%s suboption ",
154: (direction[0] == '<')? "Received":"Sent");
155: switch (pointer[0]) {
156: case TELOPT_TTYPE:
157: fprintf(NetTrace, "Terminal type ");
158: switch (pointer[1]) {
159: case TELQUAL_IS:
160: {
161: char tmpbuf[SUBBUFSIZE];
162: int minlen = min(length, sizeof tmpbuf);
163:
164: memcpy(tmpbuf, pointer+2, minlen);
165: tmpbuf[minlen-1] = 0;
166: fprintf(NetTrace, "is %s.\n", tmpbuf);
167: }
168: break;
169: case TELQUAL_SEND:
170: fprintf(NetTrace, "- request to send.\n");
171: break;
172: default:
173: fprintf(NetTrace,
174: "- unknown qualifier %d (0x%x).\n", pointer[1]);
175: }
176: break;
177: default:
178: fprintf(NetTrace, "Unknown option %d (0x%x)\n",
179: pointer[0], pointer[0]);
180: }
181: }
182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.