xref: /csrg-svn/usr.bin/telnet/utilities.c (revision 33286)
132149Sminshall #define	TELOPTS
232149Sminshall #include <arpa/telnet.h>
332381Sminshall #include <sys/types.h>
432149Sminshall 
532149Sminshall #include <ctype.h>
632149Sminshall 
732381Sminshall #include "ring.h"
832381Sminshall 
932149Sminshall #include "externs.h"
1032149Sminshall 
1132149Sminshall FILE	*NetTrace = 0;		/* Not in bss, since needs to stay */
1232149Sminshall 
1332149Sminshall /*
1432149Sminshall  * upcase()
1532149Sminshall  *
1632149Sminshall  *	Upcase (in place) the argument.
1732149Sminshall  */
1832149Sminshall 
1932149Sminshall void
2032149Sminshall upcase(argument)
2132149Sminshall register char *argument;
2232149Sminshall {
2332149Sminshall     register int c;
2432149Sminshall 
2532149Sminshall     while ((c = *argument) != 0) {
2632149Sminshall 	if (islower(c)) {
2732149Sminshall 	    *argument = toupper(c);
2832149Sminshall 	}
2932149Sminshall 	argument++;
3032149Sminshall     }
3132149Sminshall }
3232149Sminshall 
3332149Sminshall /*
3432149Sminshall  * SetSockOpt()
3532149Sminshall  *
3632149Sminshall  * Compensate for differences in 4.2 and 4.3 systems.
3732149Sminshall  */
3832149Sminshall 
3932149Sminshall int
4032149Sminshall SetSockOpt(fd, level, option, yesno)
4132149Sminshall int
4232149Sminshall 	fd,
4332149Sminshall 	level,
4432149Sminshall 	option,
4532149Sminshall 	yesno;
4632149Sminshall {
4732149Sminshall #ifndef	NOT43
4832149Sminshall     return setsockopt(fd, level, option,
4932149Sminshall 				(char *)&yesno, sizeof yesno);
5032149Sminshall #else	/* NOT43 */
5132149Sminshall     if (yesno == 0) {		/* Can't do that in 4.2! */
5232149Sminshall 	fprintf(stderr, "Error: attempt to turn off an option 0x%x.\n",
5332149Sminshall 				option);
5432149Sminshall 	return -1;
5532149Sminshall     }
5632149Sminshall     return setsockopt(fd, level, option, 0, 0);
5732149Sminshall #endif	/* NOT43 */
5832149Sminshall }
5932149Sminshall 
6032149Sminshall /*
6132149Sminshall  * The following are routines used to print out debugging information.
6232149Sminshall  */
6332149Sminshall 
6432149Sminshall 
6532149Sminshall void
6632149Sminshall Dump(direction, buffer, length)
6732149Sminshall char	direction;
6832149Sminshall char	*buffer;
6932149Sminshall int	length;
7032149Sminshall {
7132149Sminshall #   define BYTES_PER_LINE	32
7232149Sminshall #   define min(x,y)	((x<y)? x:y)
7332149Sminshall     char *pThis;
7432149Sminshall     int offset;
7532149Sminshall 
7632149Sminshall     offset = 0;
7732149Sminshall 
7832149Sminshall     while (length) {
7932149Sminshall 	/* print one line */
8032149Sminshall 	fprintf(NetTrace, "%c 0x%x\t", direction, offset);
8132149Sminshall 	pThis = buffer;
8232149Sminshall 	buffer = buffer+min(length, BYTES_PER_LINE);
8332149Sminshall 	while (pThis < buffer) {
8432149Sminshall 	    fprintf(NetTrace, "%.2x", (*pThis)&0xff);
8532149Sminshall 	    pThis++;
8632149Sminshall 	}
8732149Sminshall 	fprintf(NetTrace, "\n");
8832149Sminshall 	length -= BYTES_PER_LINE;
8932149Sminshall 	offset += BYTES_PER_LINE;
9032149Sminshall 	if (length < 0) {
9132149Sminshall 	    return;
9232149Sminshall 	}
9332149Sminshall 	/* find next unique line */
9432149Sminshall     }
9532149Sminshall }
9632149Sminshall 
9732149Sminshall 
9832149Sminshall /*VARARGS*/
9932149Sminshall void
10032149Sminshall printoption(direction, fmt, option, what)
10132149Sminshall 	char *direction, *fmt;
10232149Sminshall 	int option, what;
10332149Sminshall {
10432149Sminshall 	if (!showoptions)
10532149Sminshall 		return;
10632149Sminshall 	fprintf(NetTrace, "%s ", direction+1);
10732149Sminshall 	if (fmt == doopt)
10832149Sminshall 		fmt = "do";
10932149Sminshall 	else if (fmt == dont)
11032149Sminshall 		fmt = "dont";
11132149Sminshall 	else if (fmt == will)
11232149Sminshall 		fmt = "will";
11332149Sminshall 	else if (fmt == wont)
11432149Sminshall 		fmt = "wont";
11532149Sminshall 	else
11632149Sminshall 		fmt = "???";
11732149Sminshall 	if (option < (sizeof telopts/sizeof telopts[0]))
11832149Sminshall 		fprintf(NetTrace, "%s %s", fmt, telopts[option]);
11932149Sminshall 	else
12032149Sminshall 		fprintf(NetTrace, "%s %d", fmt, option);
12132149Sminshall 	if (*direction == '<') {
12232149Sminshall 		fprintf(NetTrace, "\r\n");
12332149Sminshall 		return;
12432149Sminshall 	}
12532149Sminshall 	fprintf(NetTrace, " (%s)\r\n", what ? "reply" : "don't reply");
12632149Sminshall }
12732149Sminshall 
12832149Sminshall void
12932149Sminshall printsub(direction, pointer, length)
13032149Sminshall char	*direction,		/* "<" or ">" */
13132149Sminshall 	*pointer;		/* where suboption data sits */
13232149Sminshall int	length;			/* length of suboption data */
13332149Sminshall {
13432149Sminshall     if (showoptions) {
13532149Sminshall 	fprintf(NetTrace, "%s suboption ",
13632149Sminshall 				(direction[0] == '<')? "Received":"Sent");
13732149Sminshall 	switch (pointer[0]) {
13832149Sminshall 	case TELOPT_TTYPE:
13932149Sminshall 	    fprintf(NetTrace, "Terminal type ");
14032149Sminshall 	    switch (pointer[1]) {
14132149Sminshall 	    case TELQUAL_IS:
14232149Sminshall 		{
143*33286Sminshall 		    char tmpbuf[SUBBUFSIZE];
14432149Sminshall 		    int minlen = min(length, sizeof tmpbuf);
14532149Sminshall 
14632149Sminshall 		    memcpy(tmpbuf, pointer+2, minlen);
14732149Sminshall 		    tmpbuf[minlen-1] = 0;
14832149Sminshall 		    fprintf(NetTrace, "is %s.\n", tmpbuf);
14932149Sminshall 		}
15032149Sminshall 		break;
15132149Sminshall 	    case TELQUAL_SEND:
15232149Sminshall 		fprintf(NetTrace, "- request to send.\n");
15332149Sminshall 		break;
15432149Sminshall 	    default:
15532149Sminshall 		fprintf(NetTrace,
15632149Sminshall 				"- unknown qualifier %d (0x%x).\n", pointer[1]);
15732149Sminshall 	    }
15832149Sminshall 	    break;
15932149Sminshall 	default:
16032149Sminshall 	    fprintf(NetTrace, "Unknown option %d (0x%x)\n",
16132149Sminshall 					pointer[0], pointer[0]);
16232149Sminshall 	}
16332149Sminshall     }
16432149Sminshall }
165