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