xref: /csrg-svn/usr.bin/telnet/utilities.c (revision 33686)
1*33686Sbostic /*
2*33686Sbostic  * Copyright (c) 1988 Regents of the University of California.
3*33686Sbostic  * All rights reserved.
4*33686Sbostic  *
5*33686Sbostic  * Redistribution and use in source and binary forms are permitted
6*33686Sbostic  * provided that this notice is preserved and that due credit is given
7*33686Sbostic  * to the University of California at Berkeley. The name of the University
8*33686Sbostic  * may not be used to endorse or promote products derived from this
9*33686Sbostic  * software without specific prior written permission. This software
10*33686Sbostic  * is provided ``as is'' without express or implied warranty.
11*33686Sbostic  */
12*33686Sbostic 
13*33686Sbostic #ifndef lint
14*33686Sbostic static char sccsid[] = "@(#)utilities.c	1.4 (Berkeley) 03/08/88";
15*33686Sbostic #endif /* not lint */
16*33686Sbostic 
1732149Sminshall #define	TELOPTS
1832149Sminshall #include <arpa/telnet.h>
1932381Sminshall #include <sys/types.h>
2032149Sminshall 
2132149Sminshall #include <ctype.h>
2232149Sminshall 
2332381Sminshall #include "ring.h"
2432381Sminshall 
2532149Sminshall #include "externs.h"
2632149Sminshall 
2732149Sminshall FILE	*NetTrace = 0;		/* Not in bss, since needs to stay */
2832149Sminshall 
2932149Sminshall /*
3032149Sminshall  * upcase()
3132149Sminshall  *
3232149Sminshall  *	Upcase (in place) the argument.
3332149Sminshall  */
3432149Sminshall 
3532149Sminshall void
3632149Sminshall upcase(argument)
3732149Sminshall register char *argument;
3832149Sminshall {
3932149Sminshall     register int c;
4032149Sminshall 
4132149Sminshall     while ((c = *argument) != 0) {
4232149Sminshall 	if (islower(c)) {
4332149Sminshall 	    *argument = toupper(c);
4432149Sminshall 	}
4532149Sminshall 	argument++;
4632149Sminshall     }
4732149Sminshall }
4832149Sminshall 
4932149Sminshall /*
5032149Sminshall  * SetSockOpt()
5132149Sminshall  *
5232149Sminshall  * Compensate for differences in 4.2 and 4.3 systems.
5332149Sminshall  */
5432149Sminshall 
5532149Sminshall int
5632149Sminshall SetSockOpt(fd, level, option, yesno)
5732149Sminshall int
5832149Sminshall 	fd,
5932149Sminshall 	level,
6032149Sminshall 	option,
6132149Sminshall 	yesno;
6232149Sminshall {
6332149Sminshall #ifndef	NOT43
6432149Sminshall     return setsockopt(fd, level, option,
6532149Sminshall 				(char *)&yesno, sizeof yesno);
6632149Sminshall #else	/* NOT43 */
6732149Sminshall     if (yesno == 0) {		/* Can't do that in 4.2! */
6832149Sminshall 	fprintf(stderr, "Error: attempt to turn off an option 0x%x.\n",
6932149Sminshall 				option);
7032149Sminshall 	return -1;
7132149Sminshall     }
7232149Sminshall     return setsockopt(fd, level, option, 0, 0);
7332149Sminshall #endif	/* NOT43 */
7432149Sminshall }
7532149Sminshall 
7632149Sminshall /*
7732149Sminshall  * The following are routines used to print out debugging information.
7832149Sminshall  */
7932149Sminshall 
8032149Sminshall 
8132149Sminshall void
8232149Sminshall Dump(direction, buffer, length)
8332149Sminshall char	direction;
8432149Sminshall char	*buffer;
8532149Sminshall int	length;
8632149Sminshall {
8732149Sminshall #   define BYTES_PER_LINE	32
8832149Sminshall #   define min(x,y)	((x<y)? x:y)
8932149Sminshall     char *pThis;
9032149Sminshall     int offset;
9132149Sminshall 
9232149Sminshall     offset = 0;
9332149Sminshall 
9432149Sminshall     while (length) {
9532149Sminshall 	/* print one line */
9632149Sminshall 	fprintf(NetTrace, "%c 0x%x\t", direction, offset);
9732149Sminshall 	pThis = buffer;
9832149Sminshall 	buffer = buffer+min(length, BYTES_PER_LINE);
9932149Sminshall 	while (pThis < buffer) {
10032149Sminshall 	    fprintf(NetTrace, "%.2x", (*pThis)&0xff);
10132149Sminshall 	    pThis++;
10232149Sminshall 	}
10332149Sminshall 	fprintf(NetTrace, "\n");
10432149Sminshall 	length -= BYTES_PER_LINE;
10532149Sminshall 	offset += BYTES_PER_LINE;
10632149Sminshall 	if (length < 0) {
10732149Sminshall 	    return;
10832149Sminshall 	}
10932149Sminshall 	/* find next unique line */
11032149Sminshall     }
11132149Sminshall }
11232149Sminshall 
11332149Sminshall 
11432149Sminshall /*VARARGS*/
11532149Sminshall void
11632149Sminshall printoption(direction, fmt, option, what)
11732149Sminshall 	char *direction, *fmt;
11832149Sminshall 	int option, what;
11932149Sminshall {
12032149Sminshall 	if (!showoptions)
12132149Sminshall 		return;
12232149Sminshall 	fprintf(NetTrace, "%s ", direction+1);
12332149Sminshall 	if (fmt == doopt)
12432149Sminshall 		fmt = "do";
12532149Sminshall 	else if (fmt == dont)
12632149Sminshall 		fmt = "dont";
12732149Sminshall 	else if (fmt == will)
12832149Sminshall 		fmt = "will";
12932149Sminshall 	else if (fmt == wont)
13032149Sminshall 		fmt = "wont";
13132149Sminshall 	else
13232149Sminshall 		fmt = "???";
13332149Sminshall 	if (option < (sizeof telopts/sizeof telopts[0]))
13432149Sminshall 		fprintf(NetTrace, "%s %s", fmt, telopts[option]);
13532149Sminshall 	else
13632149Sminshall 		fprintf(NetTrace, "%s %d", fmt, option);
13732149Sminshall 	if (*direction == '<') {
13832149Sminshall 		fprintf(NetTrace, "\r\n");
13932149Sminshall 		return;
14032149Sminshall 	}
14132149Sminshall 	fprintf(NetTrace, " (%s)\r\n", what ? "reply" : "don't reply");
14232149Sminshall }
14332149Sminshall 
14432149Sminshall void
14532149Sminshall printsub(direction, pointer, length)
14632149Sminshall char	*direction,		/* "<" or ">" */
14732149Sminshall 	*pointer;		/* where suboption data sits */
14832149Sminshall int	length;			/* length of suboption data */
14932149Sminshall {
15032149Sminshall     if (showoptions) {
15132149Sminshall 	fprintf(NetTrace, "%s suboption ",
15232149Sminshall 				(direction[0] == '<')? "Received":"Sent");
15332149Sminshall 	switch (pointer[0]) {
15432149Sminshall 	case TELOPT_TTYPE:
15532149Sminshall 	    fprintf(NetTrace, "Terminal type ");
15632149Sminshall 	    switch (pointer[1]) {
15732149Sminshall 	    case TELQUAL_IS:
15832149Sminshall 		{
15933286Sminshall 		    char tmpbuf[SUBBUFSIZE];
16032149Sminshall 		    int minlen = min(length, sizeof tmpbuf);
16132149Sminshall 
16232149Sminshall 		    memcpy(tmpbuf, pointer+2, minlen);
16332149Sminshall 		    tmpbuf[minlen-1] = 0;
16432149Sminshall 		    fprintf(NetTrace, "is %s.\n", tmpbuf);
16532149Sminshall 		}
16632149Sminshall 		break;
16732149Sminshall 	    case TELQUAL_SEND:
16832149Sminshall 		fprintf(NetTrace, "- request to send.\n");
16932149Sminshall 		break;
17032149Sminshall 	    default:
17132149Sminshall 		fprintf(NetTrace,
17232149Sminshall 				"- unknown qualifier %d (0x%x).\n", pointer[1]);
17332149Sminshall 	    }
17432149Sminshall 	    break;
17532149Sminshall 	default:
17632149Sminshall 	    fprintf(NetTrace, "Unknown option %d (0x%x)\n",
17732149Sminshall 					pointer[0], pointer[0]);
17832149Sminshall 	}
17932149Sminshall     }
18032149Sminshall }
181