xref: /csrg-svn/usr.bin/telnet/utilities.c (revision 32149)
1*32149Sminshall #define	TELOPTS
2*32149Sminshall #include <arpa/telnet.h>
3*32149Sminshall 
4*32149Sminshall #include <ctype.h>
5*32149Sminshall 
6*32149Sminshall #include "externs.h"
7*32149Sminshall 
8*32149Sminshall FILE	*NetTrace = 0;		/* Not in bss, since needs to stay */
9*32149Sminshall 
10*32149Sminshall /*
11*32149Sminshall  * upcase()
12*32149Sminshall  *
13*32149Sminshall  *	Upcase (in place) the argument.
14*32149Sminshall  */
15*32149Sminshall 
16*32149Sminshall void
17*32149Sminshall upcase(argument)
18*32149Sminshall register char *argument;
19*32149Sminshall {
20*32149Sminshall     register int c;
21*32149Sminshall 
22*32149Sminshall     while ((c = *argument) != 0) {
23*32149Sminshall 	if (islower(c)) {
24*32149Sminshall 	    *argument = toupper(c);
25*32149Sminshall 	}
26*32149Sminshall 	argument++;
27*32149Sminshall     }
28*32149Sminshall }
29*32149Sminshall 
30*32149Sminshall /*
31*32149Sminshall  * SetSockOpt()
32*32149Sminshall  *
33*32149Sminshall  * Compensate for differences in 4.2 and 4.3 systems.
34*32149Sminshall  */
35*32149Sminshall 
36*32149Sminshall int
37*32149Sminshall SetSockOpt(fd, level, option, yesno)
38*32149Sminshall int
39*32149Sminshall 	fd,
40*32149Sminshall 	level,
41*32149Sminshall 	option,
42*32149Sminshall 	yesno;
43*32149Sminshall {
44*32149Sminshall #ifndef	NOT43
45*32149Sminshall     return setsockopt(fd, level, option,
46*32149Sminshall 				(char *)&yesno, sizeof yesno);
47*32149Sminshall #else	/* NOT43 */
48*32149Sminshall     if (yesno == 0) {		/* Can't do that in 4.2! */
49*32149Sminshall 	fprintf(stderr, "Error: attempt to turn off an option 0x%x.\n",
50*32149Sminshall 				option);
51*32149Sminshall 	return -1;
52*32149Sminshall     }
53*32149Sminshall     return setsockopt(fd, level, option, 0, 0);
54*32149Sminshall #endif	/* NOT43 */
55*32149Sminshall }
56*32149Sminshall 
57*32149Sminshall /*
58*32149Sminshall  * The following are routines used to print out debugging information.
59*32149Sminshall  */
60*32149Sminshall 
61*32149Sminshall 
62*32149Sminshall void
63*32149Sminshall Dump(direction, buffer, length)
64*32149Sminshall char	direction;
65*32149Sminshall char	*buffer;
66*32149Sminshall int	length;
67*32149Sminshall {
68*32149Sminshall #   define BYTES_PER_LINE	32
69*32149Sminshall #   define min(x,y)	((x<y)? x:y)
70*32149Sminshall     char *pThis;
71*32149Sminshall     int offset;
72*32149Sminshall 
73*32149Sminshall     offset = 0;
74*32149Sminshall 
75*32149Sminshall     while (length) {
76*32149Sminshall 	/* print one line */
77*32149Sminshall 	fprintf(NetTrace, "%c 0x%x\t", direction, offset);
78*32149Sminshall 	pThis = buffer;
79*32149Sminshall 	buffer = buffer+min(length, BYTES_PER_LINE);
80*32149Sminshall 	while (pThis < buffer) {
81*32149Sminshall 	    fprintf(NetTrace, "%.2x", (*pThis)&0xff);
82*32149Sminshall 	    pThis++;
83*32149Sminshall 	}
84*32149Sminshall 	fprintf(NetTrace, "\n");
85*32149Sminshall 	length -= BYTES_PER_LINE;
86*32149Sminshall 	offset += BYTES_PER_LINE;
87*32149Sminshall 	if (length < 0) {
88*32149Sminshall 	    return;
89*32149Sminshall 	}
90*32149Sminshall 	/* find next unique line */
91*32149Sminshall     }
92*32149Sminshall }
93*32149Sminshall 
94*32149Sminshall 
95*32149Sminshall /*VARARGS*/
96*32149Sminshall void
97*32149Sminshall printoption(direction, fmt, option, what)
98*32149Sminshall 	char *direction, *fmt;
99*32149Sminshall 	int option, what;
100*32149Sminshall {
101*32149Sminshall 	if (!showoptions)
102*32149Sminshall 		return;
103*32149Sminshall 	fprintf(NetTrace, "%s ", direction+1);
104*32149Sminshall 	if (fmt == doopt)
105*32149Sminshall 		fmt = "do";
106*32149Sminshall 	else if (fmt == dont)
107*32149Sminshall 		fmt = "dont";
108*32149Sminshall 	else if (fmt == will)
109*32149Sminshall 		fmt = "will";
110*32149Sminshall 	else if (fmt == wont)
111*32149Sminshall 		fmt = "wont";
112*32149Sminshall 	else
113*32149Sminshall 		fmt = "???";
114*32149Sminshall 	if (option < (sizeof telopts/sizeof telopts[0]))
115*32149Sminshall 		fprintf(NetTrace, "%s %s", fmt, telopts[option]);
116*32149Sminshall 	else
117*32149Sminshall 		fprintf(NetTrace, "%s %d", fmt, option);
118*32149Sminshall 	if (*direction == '<') {
119*32149Sminshall 		fprintf(NetTrace, "\r\n");
120*32149Sminshall 		return;
121*32149Sminshall 	}
122*32149Sminshall 	fprintf(NetTrace, " (%s)\r\n", what ? "reply" : "don't reply");
123*32149Sminshall }
124*32149Sminshall 
125*32149Sminshall void
126*32149Sminshall printsub(direction, pointer, length)
127*32149Sminshall char	*direction,		/* "<" or ">" */
128*32149Sminshall 	*pointer;		/* where suboption data sits */
129*32149Sminshall int	length;			/* length of suboption data */
130*32149Sminshall {
131*32149Sminshall     if (showoptions) {
132*32149Sminshall 	fprintf(NetTrace, "%s suboption ",
133*32149Sminshall 				(direction[0] == '<')? "Received":"Sent");
134*32149Sminshall 	switch (pointer[0]) {
135*32149Sminshall 	case TELOPT_TTYPE:
136*32149Sminshall 	    fprintf(NetTrace, "Terminal type ");
137*32149Sminshall 	    switch (pointer[1]) {
138*32149Sminshall 	    case TELQUAL_IS:
139*32149Sminshall 		{
140*32149Sminshall 		    char tmpbuf[sizeof subbuffer];
141*32149Sminshall 		    int minlen = min(length, sizeof tmpbuf);
142*32149Sminshall 
143*32149Sminshall 		    memcpy(tmpbuf, pointer+2, minlen);
144*32149Sminshall 		    tmpbuf[minlen-1] = 0;
145*32149Sminshall 		    fprintf(NetTrace, "is %s.\n", tmpbuf);
146*32149Sminshall 		}
147*32149Sminshall 		break;
148*32149Sminshall 	    case TELQUAL_SEND:
149*32149Sminshall 		fprintf(NetTrace, "- request to send.\n");
150*32149Sminshall 		break;
151*32149Sminshall 	    default:
152*32149Sminshall 		fprintf(NetTrace,
153*32149Sminshall 				"- unknown qualifier %d (0x%x).\n", pointer[1]);
154*32149Sminshall 	    }
155*32149Sminshall 	    break;
156*32149Sminshall 	default:
157*32149Sminshall 	    fprintf(NetTrace, "Unknown option %d (0x%x)\n",
158*32149Sminshall 					pointer[0], pointer[0]);
159*32149Sminshall 	}
160*32149Sminshall     }
161*32149Sminshall }
162