|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted provided ! 6: * that: (1) source distributions retain this entire copyright notice and ! 7: * comment, and (2) distributions including binaries display the following ! 8: * acknowledgement: ``This product includes software developed by the ! 9: * University of California, Berkeley and its contributors'' in the ! 10: * documentation or other materials provided with the distribution and in ! 11: * all advertising materials mentioning features or use of this software. ! 12: * Neither the name of the University nor the names of its contributors may ! 13: * be used to endorse or promote products derived from this software without ! 14: * specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char sccsid[] = "@(#)utilities.c 1.19 (Berkeley) 6/28/90"; ! 22: #endif /* not lint */ ! 23: ! 24: #define TELOPTS ! 25: #define TELCMDS ! 26: #include <arpa/telnet.h> ! 27: #include <sys/types.h> ! 28: #include <sys/time.h> ! 29: ! 30: #include <ctype.h> ! 31: ! 32: #include "general.h" ! 33: ! 34: #include "fdset.h" ! 35: ! 36: #include "ring.h" ! 37: ! 38: #include "defines.h" ! 39: ! 40: #include "externs.h" ! 41: ! 42: FILE *NetTrace = 0; /* Not in bss, since needs to stay */ ! 43: int prettydump; ! 44: ! 45: /* ! 46: * upcase() ! 47: * ! 48: * Upcase (in place) the argument. ! 49: */ ! 50: ! 51: void ! 52: upcase(argument) ! 53: register char *argument; ! 54: { ! 55: register int c; ! 56: ! 57: while ((c = *argument) != 0) { ! 58: if (islower(c)) { ! 59: *argument = toupper(c); ! 60: } ! 61: argument++; ! 62: } ! 63: } ! 64: ! 65: /* ! 66: * SetSockOpt() ! 67: * ! 68: * Compensate for differences in 4.2 and 4.3 systems. ! 69: */ ! 70: ! 71: int ! 72: SetSockOpt(fd, level, option, yesno) ! 73: int ! 74: fd, ! 75: level, ! 76: option, ! 77: yesno; ! 78: { ! 79: #ifndef NOT43 ! 80: return setsockopt(fd, level, option, ! 81: (char *)&yesno, sizeof yesno); ! 82: #else /* NOT43 */ ! 83: if (yesno == 0) { /* Can't do that in 4.2! */ ! 84: fprintf(stderr, "Error: attempt to turn off an option 0x%x.\n", ! 85: option); ! 86: return -1; ! 87: } ! 88: return setsockopt(fd, level, option, 0, 0); ! 89: #endif /* NOT43 */ ! 90: } ! 91: ! 92: /* ! 93: * The following are routines used to print out debugging information. ! 94: */ ! 95: ! 96: unsigned char NetTraceFile[256] = "(standard output)"; ! 97: ! 98: void ! 99: SetNetTrace(file) ! 100: register char *file; ! 101: { ! 102: if (NetTrace && NetTrace != stdout) ! 103: fclose(NetTrace); ! 104: if (file && (strcmp(file, "-") != 0)) { ! 105: NetTrace = fopen(file, "w"); ! 106: if (NetTrace) { ! 107: strcpy(NetTraceFile, file); ! 108: return; ! 109: } ! 110: fprintf(stderr, "Cannot open %s.\n", file); ! 111: } ! 112: NetTrace = stdout; ! 113: strcpy(NetTraceFile, "(standard output)"); ! 114: } ! 115: ! 116: void ! 117: Dump(direction, buffer, length) ! 118: char direction; ! 119: char *buffer; ! 120: int length; ! 121: { ! 122: # define BYTES_PER_LINE 32 ! 123: # define min(x,y) ((x<y)? x:y) ! 124: char *pThis; ! 125: int offset; ! 126: extern pettydump; ! 127: ! 128: offset = 0; ! 129: ! 130: while (length) { ! 131: /* print one line */ ! 132: fprintf(NetTrace, "%c 0x%x\t", direction, offset); ! 133: pThis = buffer; ! 134: if (prettydump) { ! 135: buffer = buffer + min(length, BYTES_PER_LINE/2); ! 136: while (pThis < buffer) { ! 137: fprintf(NetTrace, "%c%.2x", ! 138: (((*pThis)&0xff) == 0xff) ? '*' : ' ', ! 139: (*pThis)&0xff); ! 140: pThis++; ! 141: } ! 142: length -= BYTES_PER_LINE/2; ! 143: offset += BYTES_PER_LINE/2; ! 144: } else { ! 145: buffer = buffer + min(length, BYTES_PER_LINE); ! 146: while (pThis < buffer) { ! 147: fprintf(NetTrace, "%.2x", (*pThis)&0xff); ! 148: pThis++; ! 149: } ! 150: length -= BYTES_PER_LINE; ! 151: offset += BYTES_PER_LINE; ! 152: } ! 153: if (NetTrace == stdout) { ! 154: fprintf(NetTrace, "\r\n"); ! 155: } else { ! 156: fprintf(NetTrace, "\n"); ! 157: } ! 158: if (length < 0) { ! 159: fflush(NetTrace); ! 160: return; ! 161: } ! 162: /* find next unique line */ ! 163: } ! 164: fflush(NetTrace); ! 165: } ! 166: ! 167: ! 168: void ! 169: printoption(direction, fmt, option) ! 170: char *direction, *fmt; ! 171: int option; ! 172: { ! 173: if (!showoptions) ! 174: return; ! 175: fprintf(NetTrace, "%s ", direction); ! 176: if (TELOPT_OK(option)) ! 177: fprintf(NetTrace, "%s %s", fmt, TELOPT(option)); ! 178: else if (TELCMD_OK(option)) ! 179: fprintf(NetTrace, "%s %s", fmt, TELCMD(option)); ! 180: else ! 181: fprintf(NetTrace, "%s %d", fmt, option); ! 182: if (NetTrace == stdout) ! 183: fprintf(NetTrace, "\r\n"); ! 184: else ! 185: fprintf(NetTrace, "\n"); ! 186: return; ! 187: } ! 188: ! 189: optionstatus() ! 190: { ! 191: register int i; ! 192: extern char will_wont_resp[], do_dont_resp[]; ! 193: ! 194: for (i = 0; i < 256; i++) { ! 195: if (do_dont_resp[i]) { ! 196: if (TELOPT_OK(i)) ! 197: printf("resp DO_DONT %s: %d\n", TELOPT(i), do_dont_resp[i]); ! 198: else if (TELCMD_OK(i)) ! 199: printf("resp DO_DONT %s: %d\n", TELCMD(i), do_dont_resp[i]); ! 200: else ! 201: printf("resp DO_DONT %d: %d\n", i, ! 202: do_dont_resp[i]); ! 203: if (my_want_state_is_do(i)) { ! 204: if (TELOPT_OK(i)) ! 205: printf("want DO %s\n", TELOPT(i)); ! 206: else if (TELCMD_OK(i)) ! 207: printf("want DO %s\n", TELCMD(i)); ! 208: else ! 209: printf("want DO %d\n", i); ! 210: } else { ! 211: if (TELOPT_OK(i)) ! 212: printf("want DONT %s\n", TELOPT(i)); ! 213: else if (TELCMD_OK(i)) ! 214: printf("want DONT %s\n", TELCMD(i)); ! 215: else ! 216: printf("want DONT %d\n", i); ! 217: } ! 218: } else { ! 219: if (my_state_is_do(i)) { ! 220: if (TELOPT_OK(i)) ! 221: printf(" DO %s\n", TELOPT(i)); ! 222: else if (TELCMD_OK(i)) ! 223: printf(" DO %s\n", TELCMD(i)); ! 224: else ! 225: printf(" DO %d\n", i); ! 226: } ! 227: } ! 228: if (will_wont_resp[i]) { ! 229: if (TELOPT_OK(i)) ! 230: printf("resp WILL_WONT %s: %d\n", TELOPT(i), will_wont_resp[i]); ! 231: else if (TELCMD_OK(i)) ! 232: printf("resp WILL_WONT %s: %d\n", TELCMD(i), will_wont_resp[i]); ! 233: else ! 234: printf("resp WILL_WONT %d: %d\n", ! 235: i, will_wont_resp[i]); ! 236: if (my_want_state_is_will(i)) { ! 237: if (TELOPT_OK(i)) ! 238: printf("want WILL %s\n", TELOPT(i)); ! 239: else if (TELCMD_OK(i)) ! 240: printf("want WILL %s\n", TELCMD(i)); ! 241: else ! 242: printf("want WILL %d\n", i); ! 243: } else { ! 244: if (TELOPT_OK(i)) ! 245: printf("want WONT %s\n", TELOPT(i)); ! 246: else if (TELCMD_OK(i)) ! 247: printf("want WONT %s\n", TELCMD(i)); ! 248: else ! 249: printf("want WONT %d\n", i); ! 250: } ! 251: } else { ! 252: if (my_state_is_will(i)) { ! 253: if (TELOPT_OK(i)) ! 254: printf(" WILL %s\n", TELOPT(i)); ! 255: else if (TELCMD_OK(i)) ! 256: printf(" WILL %s\n", TELCMD(i)); ! 257: else ! 258: printf(" WILL %d\n", i); ! 259: } ! 260: } ! 261: } ! 262: ! 263: } ! 264: ! 265: char *slcnames[] = { SLC_NAMES }; ! 266: ! 267: #ifdef KERBEROS ! 268: static char *authtypes[3] = { "NONE", "PRIVATE", "KERBEROS" }; ! 269: #endif ! 270: ! 271: void ! 272: printsub(direction, pointer, length) ! 273: char direction; /* '<' or '>' */ ! 274: unsigned char *pointer; /* where suboption data sits */ ! 275: int length; /* length of suboption data */ ! 276: { ! 277: register int i; ! 278: ! 279: if (showoptions) { ! 280: if (direction) { ! 281: fprintf(NetTrace, "%s suboption ", ! 282: (direction == '<')? "Received":"Sent"); ! 283: if (length >= 3) { ! 284: register int j; ! 285: ! 286: i = pointer[length-2]; ! 287: j = pointer[length-1]; ! 288: ! 289: if (i != IAC || j != SE) { ! 290: fprintf(NetTrace, "(terminated by "); ! 291: if (TELOPT_OK(i)) ! 292: fprintf(NetTrace, "%s ", TELOPT(i)); ! 293: else if (TELCMD_OK(i)) ! 294: fprintf(NetTrace, "%s ", TELCMD(i)); ! 295: else ! 296: fprintf(NetTrace, "%d ", i); ! 297: if (TELOPT_OK(j)) ! 298: fprintf(NetTrace, "%s", TELOPT(j)); ! 299: else if (TELCMD_OK(j)) ! 300: fprintf(NetTrace, "%s", TELCMD(j)); ! 301: else ! 302: fprintf(NetTrace, "%d", j); ! 303: fprintf(NetTrace, ", not IAC SE!) "); ! 304: } ! 305: } ! 306: length -= 2; ! 307: } ! 308: if (length < 1) { ! 309: fprintf(NetTrace, "(Empty suboption???)"); ! 310: return; ! 311: } ! 312: switch (pointer[0]) { ! 313: case TELOPT_TTYPE: ! 314: fprintf(NetTrace, "TERMINAL-TYPE "); ! 315: switch (pointer[1]) { ! 316: case TELQUAL_IS: ! 317: fprintf(NetTrace, "IS \"%.*s\"", length-2, (char *)pointer+2); ! 318: break; ! 319: case TELQUAL_SEND: ! 320: fprintf(NetTrace, "SEND"); ! 321: break; ! 322: default: ! 323: fprintf(NetTrace, ! 324: "- unknown qualifier %d (0x%x).", ! 325: pointer[1], pointer[1]); ! 326: } ! 327: break; ! 328: case TELOPT_TSPEED: ! 329: fprintf(NetTrace, "TERMINAL-SPEED"); ! 330: if (length < 2) { ! 331: fprintf(NetTrace, " (empty suboption???)"); ! 332: break; ! 333: } ! 334: switch (pointer[1]) { ! 335: case TELQUAL_IS: ! 336: fprintf(NetTrace, " IS "); ! 337: fprintf(NetTrace, "%.*s", length-2, (char *)pointer+2); ! 338: break; ! 339: default: ! 340: if (pointer[1] == 1) ! 341: fprintf(NetTrace, " SEND"); ! 342: else ! 343: fprintf(NetTrace, " %d (unknown)", pointer[1]); ! 344: for (i = 2; i < length; i++) ! 345: fprintf(NetTrace, " ?%d?", pointer[i]); ! 346: break; ! 347: } ! 348: break; ! 349: ! 350: case TELOPT_LFLOW: ! 351: fprintf(NetTrace, "TOGGLE-FLOW-CONTROL"); ! 352: if (length < 2) { ! 353: fprintf(NetTrace, " (empty suboption???)"); ! 354: break; ! 355: } ! 356: switch (pointer[1]) { ! 357: case 0: ! 358: fprintf(NetTrace, " OFF"); break; ! 359: case 1: ! 360: fprintf(NetTrace, " ON"); break; ! 361: default: ! 362: fprintf(NetTrace, " %d (unknown)", pointer[1]); ! 363: } ! 364: for (i = 2; i < length; i++) ! 365: fprintf(NetTrace, " ?%d?", pointer[i]); ! 366: break; ! 367: ! 368: case TELOPT_NAWS: ! 369: fprintf(NetTrace, "NAWS"); ! 370: if (length < 2) { ! 371: fprintf(NetTrace, " (empty suboption???)"); ! 372: break; ! 373: } ! 374: if (length == 2) { ! 375: fprintf(NetTrace, " ?%d?", pointer[1]); ! 376: break; ! 377: } ! 378: fprintf(NetTrace, " %d %d (%d)", ! 379: pointer[1], pointer[2], ! 380: (int)((((unsigned int)pointer[1])<<8)|((unsigned int)pointer[2]))); ! 381: if (length == 4) { ! 382: fprintf(NetTrace, " ?%d?", pointer[3]); ! 383: break; ! 384: } ! 385: fprintf(NetTrace, " %d %d (%d)", ! 386: pointer[3], pointer[4], ! 387: (int)((((unsigned int)pointer[3])<<8)|((unsigned int)pointer[4]))); ! 388: for (i = 5; i < length; i++) ! 389: fprintf(NetTrace, " ?%d?", pointer[i]); ! 390: break; ! 391: ! 392: #ifdef KERBEROS ! 393: case TELOPT_AUTHENTICATION: ! 394: fprintf(NetTrace, "Authentication information "); ! 395: switch (pointer[1]) { ! 396: case TELQUAL_IS: ! 397: switch (pointer[2]) { ! 398: case TELQUAL_AUTHTYPE_NONE: ! 399: case TELQUAL_AUTHTYPE_PRIVATE: ! 400: case TELQUAL_AUTHTYPE_KERBEROS: ! 401: ! 402: fprintf(NetTrace, "is type %s\r\n", authtypes[pointer[2]]); ! 403: break; ! 404: default: ! 405: fprintf(NetTrace, "is type unknown\r\n"); ! 406: break; ! 407: } ! 408: ! 409: case TELQUAL_SEND: ! 410: { ! 411: int idx = 2; ! 412: fprintf(NetTrace, "- request to send, types"); ! 413: for (idx = 2; idx < length - 1; idx++) ! 414: switch (pointer[idx]) { ! 415: case TELQUAL_AUTHTYPE_NONE: ! 416: case TELQUAL_AUTHTYPE_PRIVATE: ! 417: case TELQUAL_AUTHTYPE_KERBEROS: ! 418: fprintf(NetTrace, " %s", ! 419: authtypes[pointer[idx]]); ! 420: break; ! 421: default: ! 422: fprintf(NetTrace, " <unknown %u>", ! 423: pointer[idx]); ! 424: break; ! 425: } ! 426: fprintf(NetTrace, "\r\n"); ! 427: } ! 428: break; ! 429: ! 430: default: ! 431: fprintf(NetTrace, " - unknown qualifier %d (0x%x).\r\n", ! 432: pointer[1], pointer[1]); ! 433: } ! 434: break; ! 435: #endif /* KERBEROS */ ! 436: ! 437: case TELOPT_LINEMODE: ! 438: fprintf(NetTrace, "LINEMODE "); ! 439: if (length < 2) { ! 440: fprintf(NetTrace, " (empty suboption???)"); ! 441: break; ! 442: } ! 443: switch (pointer[1]) { ! 444: case WILL: ! 445: fprintf(NetTrace, "WILL "); ! 446: goto common; ! 447: case WONT: ! 448: fprintf(NetTrace, "WONT "); ! 449: goto common; ! 450: case DO: ! 451: fprintf(NetTrace, "DO "); ! 452: goto common; ! 453: case DONT: ! 454: fprintf(NetTrace, "DONT "); ! 455: common: ! 456: if (length < 3) { ! 457: fprintf(NetTrace, "(no option???)"); ! 458: break; ! 459: } ! 460: switch (pointer[2]) { ! 461: case LM_FORWARDMASK: ! 462: fprintf(NetTrace, "Forward Mask"); ! 463: for (i = 3; i < length; i++) ! 464: fprintf(NetTrace, " %x", pointer[i]); ! 465: break; ! 466: default: ! 467: fprintf(NetTrace, "%d (unknown)", pointer[2]); ! 468: for (i = 3; i < length; i++) ! 469: fprintf(NetTrace, " %d", pointer[i]); ! 470: break; ! 471: } ! 472: break; ! 473: ! 474: case LM_SLC: ! 475: fprintf(NetTrace, "SLC"); ! 476: for (i = 2; i < length - 2; i += 3) { ! 477: if (pointer[i+SLC_FUNC] <= NSLC) ! 478: fprintf(NetTrace, " %s", slcnames[pointer[i+SLC_FUNC]]); ! 479: else ! 480: fprintf(NetTrace, " %d", pointer[i+SLC_FUNC]); ! 481: switch (pointer[i+SLC_FLAGS]&SLC_LEVELBITS) { ! 482: case SLC_NOSUPPORT: ! 483: fprintf(NetTrace, " NOSUPPORT"); break; ! 484: case SLC_CANTCHANGE: ! 485: fprintf(NetTrace, " CANTCHANGE"); break; ! 486: case SLC_VARIABLE: ! 487: fprintf(NetTrace, " VARIABLE"); break; ! 488: case SLC_DEFAULT: ! 489: fprintf(NetTrace, " DEFAULT"); break; ! 490: } ! 491: fprintf(NetTrace, "%s%s%s", ! 492: pointer[i+SLC_FLAGS]&SLC_ACK ? "|ACK" : "", ! 493: pointer[i+SLC_FLAGS]&SLC_FLUSHIN ? "|FLUSHIN" : "", ! 494: pointer[i+SLC_FLAGS]&SLC_FLUSHOUT ? "|FLUSHOUT" : ""); ! 495: if (pointer[i+SLC_FLAGS]& ~(SLC_ACK|SLC_FLUSHIN| ! 496: SLC_FLUSHOUT| SLC_LEVELBITS)) ! 497: fprintf(NetTrace, "(0x%x)", pointer[i+SLC_FLAGS]); ! 498: fprintf(NetTrace, " %d;", pointer[i+SLC_VALUE]); ! 499: if ((pointer[i+SLC_VALUE] == IAC) && ! 500: (pointer[i+SLC_VALUE+1] == IAC)) ! 501: i++; ! 502: } ! 503: for (; i < length; i++) ! 504: fprintf(NetTrace, " ?%d?", pointer[i]); ! 505: break; ! 506: ! 507: case LM_MODE: ! 508: fprintf(NetTrace, "MODE "); ! 509: if (length < 3) { ! 510: fprintf(NetTrace, "(no mode???)"); ! 511: break; ! 512: } ! 513: { ! 514: char tbuf[64]; ! 515: sprintf(tbuf, "%s%s%s%s%s", ! 516: pointer[2]&MODE_EDIT ? "|EDIT" : "", ! 517: pointer[2]&MODE_TRAPSIG ? "|TRAPSIG" : "", ! 518: pointer[2]&MODE_SOFT_TAB ? "|SOFT_TAB" : "", ! 519: pointer[2]&MODE_LIT_ECHO ? "|LIT_ECHO" : "", ! 520: pointer[2]&MODE_ACK ? "|ACK" : ""); ! 521: fprintf(NetTrace, "%s", tbuf[1] ? &tbuf[1] : "0"); ! 522: } ! 523: if (pointer[2]&~(MODE_EDIT|MODE_TRAPSIG|MODE_ACK)) ! 524: fprintf(NetTrace, " (0x%x)", pointer[2]); ! 525: for (i = 3; i < length; i++) ! 526: fprintf(NetTrace, " ?0x%x?", pointer[i]); ! 527: break; ! 528: default: ! 529: fprintf(NetTrace, "%d (unknown)", pointer[1]); ! 530: for (i = 2; i < length; i++) ! 531: fprintf(NetTrace, " %d", pointer[i]); ! 532: } ! 533: break; ! 534: ! 535: case TELOPT_STATUS: { ! 536: register char *cp; ! 537: register int j, k; ! 538: ! 539: fprintf(NetTrace, "STATUS"); ! 540: ! 541: switch (pointer[1]) { ! 542: default: ! 543: if (pointer[1] == TELQUAL_SEND) ! 544: fprintf(NetTrace, " SEND"); ! 545: else ! 546: fprintf(NetTrace, " %d (unknown)", pointer[1]); ! 547: for (i = 2; i < length; i++) ! 548: fprintf(NetTrace, " ?%d?", pointer[i]); ! 549: break; ! 550: case TELQUAL_IS: ! 551: if (NetTrace == stdout) ! 552: fprintf(NetTrace, " IS\r\n"); ! 553: else ! 554: fprintf(NetTrace, " IS\n"); ! 555: ! 556: for (i = 2; i < length; i++) { ! 557: switch(pointer[i]) { ! 558: case DO: cp = "DO"; goto common2; ! 559: case DONT: cp = "DONT"; goto common2; ! 560: case WILL: cp = "WILL"; goto common2; ! 561: case WONT: cp = "WONT"; goto common2; ! 562: common2: ! 563: i++; ! 564: if (TELOPT_OK((int)pointer[i])) ! 565: fprintf(NetTrace, " %s %s", cp, TELOPT(pointer[i])); ! 566: else ! 567: fprintf(NetTrace, " %s %d", cp, pointer[i]); ! 568: ! 569: if (NetTrace == stdout) ! 570: fprintf(NetTrace, "\r\n"); ! 571: else ! 572: fprintf(NetTrace, "\n"); ! 573: break; ! 574: ! 575: case SB: ! 576: fprintf(NetTrace, " SB "); ! 577: i++; ! 578: j = k = i; ! 579: while (j < length) { ! 580: if (pointer[j] == SE) { ! 581: if (j+1 == length) ! 582: break; ! 583: if (pointer[j+1] == SE) ! 584: j++; ! 585: else ! 586: break; ! 587: } ! 588: pointer[k++] = pointer[j++]; ! 589: } ! 590: printsub(0, &pointer[i], k - i); ! 591: if (i < length) { ! 592: fprintf(NetTrace, " SE"); ! 593: i = j; ! 594: } else ! 595: i = j - 1; ! 596: ! 597: if (NetTrace == stdout) ! 598: fprintf(NetTrace, "\r\n"); ! 599: else ! 600: fprintf(NetTrace, "\n"); ! 601: ! 602: break; ! 603: ! 604: default: ! 605: fprintf(NetTrace, " %d", pointer[i]); ! 606: break; ! 607: } ! 608: } ! 609: break; ! 610: } ! 611: break; ! 612: } ! 613: ! 614: case TELOPT_XDISPLOC: ! 615: fprintf(NetTrace, "X-DISPLAY-LOCATION "); ! 616: switch (pointer[1]) { ! 617: case TELQUAL_IS: ! 618: fprintf(NetTrace, "IS \"%.*s\"", length-2, (char *)pointer+2); ! 619: break; ! 620: case TELQUAL_SEND: ! 621: fprintf(NetTrace, "SEND"); ! 622: break; ! 623: default: ! 624: fprintf(NetTrace, "- unknown qualifier %d (0x%x).", ! 625: pointer[1], pointer[1]); ! 626: } ! 627: break; ! 628: ! 629: case TELOPT_ENVIRON: ! 630: fprintf(NetTrace, "ENVIRON "); ! 631: switch (pointer[1]) { ! 632: case TELQUAL_IS: ! 633: fprintf(NetTrace, "IS "); ! 634: goto env_common; ! 635: case TELQUAL_SEND: ! 636: fprintf(NetTrace, "SEND "); ! 637: goto env_common; ! 638: case TELQUAL_INFO: ! 639: fprintf(NetTrace, "INFO "); ! 640: env_common: ! 641: { ! 642: register int noquote = 2; ! 643: for (i = 2; i < length; i++ ) { ! 644: switch (pointer[i]) { ! 645: case ENV_VAR: ! 646: if (pointer[1] == TELQUAL_SEND) ! 647: goto def_case; ! 648: fprintf(NetTrace, "\" VAR " + noquote); ! 649: noquote = 2; ! 650: break; ! 651: ! 652: case ENV_VALUE: ! 653: fprintf(NetTrace, "\" VALUE " + noquote); ! 654: noquote = 2; ! 655: break; ! 656: ! 657: case ENV_ESC: ! 658: fprintf(NetTrace, "\" ESC " + noquote); ! 659: noquote = 2; ! 660: break; ! 661: ! 662: default: ! 663: def_case: ! 664: if (isprint(pointer[i]) && pointer[i] != '"') { ! 665: if (noquote) { ! 666: putc('"', NetTrace); ! 667: noquote = 0; ! 668: } ! 669: putc(pointer[i], NetTrace); ! 670: } else { ! 671: fprintf(NetTrace, "\" %03o " + noquote, ! 672: pointer[i]); ! 673: noquote = 2; ! 674: } ! 675: break; ! 676: } ! 677: } ! 678: if (!noquote) ! 679: putc('"', NetTrace); ! 680: break; ! 681: } ! 682: } ! 683: break; ! 684: ! 685: default: ! 686: fprintf(NetTrace, "Unknown option "); ! 687: for (i = 0; i < length; i++) ! 688: fprintf(NetTrace, " %d", pointer[i]); ! 689: break; ! 690: } ! 691: if (direction) { ! 692: if (NetTrace == stdout) ! 693: fprintf(NetTrace, "\r\n"); ! 694: else ! 695: fprintf(NetTrace, "\n"); ! 696: } ! 697: } ! 698: } ! 699: ! 700: /* EmptyTerminal - called to make sure that the terminal buffer is empty. ! 701: * Note that we consider the buffer to run all the ! 702: * way to the kernel (thus the select). ! 703: */ ! 704: ! 705: void ! 706: EmptyTerminal() ! 707: { ! 708: #if defined(unix) ! 709: fd_set o; ! 710: ! 711: FD_ZERO(&o); ! 712: #endif /* defined(unix) */ ! 713: ! 714: if (TTYBYTES() == 0) { ! 715: #if defined(unix) ! 716: FD_SET(tout, &o); ! 717: (void) select(tout+1, (fd_set *) 0, &o, (fd_set *) 0, ! 718: (struct timeval *) 0); /* wait for TTLOWAT */ ! 719: #endif /* defined(unix) */ ! 720: } else { ! 721: while (TTYBYTES()) { ! 722: (void) ttyflush(0); ! 723: #if defined(unix) ! 724: FD_SET(tout, &o); ! 725: (void) select(tout+1, (fd_set *) 0, &o, (fd_set *) 0, ! 726: (struct timeval *) 0); /* wait for TTLOWAT */ ! 727: #endif /* defined(unix) */ ! 728: } ! 729: } ! 730: } ! 731: ! 732: void ! 733: SetForExit() ! 734: { ! 735: setconnmode(0); ! 736: #if defined(TN3270) ! 737: if (In3270) { ! 738: Finish3270(); ! 739: } ! 740: #else /* defined(TN3270) */ ! 741: do { ! 742: (void)telrcv(); /* Process any incoming data */ ! 743: EmptyTerminal(); ! 744: } while (ring_full_count(&netiring)); /* While there is any */ ! 745: #endif /* defined(TN3270) */ ! 746: setcommandmode(); ! 747: fflush(stdout); ! 748: fflush(stderr); ! 749: #if defined(TN3270) ! 750: if (In3270) { ! 751: StopScreen(1); ! 752: } ! 753: #endif /* defined(TN3270) */ ! 754: setconnmode(0); ! 755: EmptyTerminal(); /* Flush the path to the tty */ ! 756: setcommandmode(); ! 757: } ! 758: ! 759: void ! 760: Exit(returnCode) ! 761: int returnCode; ! 762: { ! 763: SetForExit(); ! 764: exit(returnCode); ! 765: } ! 766: ! 767: void ! 768: ExitString(string, returnCode) ! 769: char *string; ! 770: int returnCode; ! 771: { ! 772: SetForExit(); ! 773: fwrite(string, 1, strlen(string), stderr); ! 774: exit(returnCode); ! 775: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.