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