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