|
|
1.1 ! root 1: /* map.c - VT telnet profile mappings */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/vt/RCS/map.c,v 7.1 90/07/09 14:51:50 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/vt/RCS/map.c,v 7.1 90/07/09 14:51:50 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: map.c,v $ ! 12: * Revision 7.1 90/07/09 14:51:50 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.0 89/11/23 22:31:31 mrose ! 16: * Release 6.0 ! 17: * ! 18: */ ! 19: ! 20: /* ! 21: * NOTICE ! 22: * ! 23: * Acquisition, use, and distribution of this module and related ! 24: * materials are subject to the restrictions of a license agreement. ! 25: * Consult the Preface in the User's Manual for the full terms of ! 26: * this agreement. ! 27: * ! 28: */ ! 29: ! 30: ! 31: #define DO_LOCAL_ECHO ! 32: #undef PEPYPARM ! 33: #define PEPYPARM int * ! 34: ! 35: ! 36: #include "vtpm.h" ! 37: #include "sector1.h" ! 38: ! 39: #include <sys/ioctl.h> ! 40: #ifdef BSD44 ! 41: #include <sys/termios.h> ! 42: #endif ! 43: ! 44: extern char erase_char; ! 45: extern char erase_line; ! 46: #ifdef BSD44 ! 47: extern struct termios oterm; ! 48: #else ! 49: extern struct sgttyb ottyb; ! 50: extern struct tchars otc; ! 51: #endif ! 52: extern char intr_char; ! 53: extern char ni_image; ! 54: extern char na_image; ! 55: extern char nego_state; ! 56: extern char kb_image; ! 57: extern char di_image; ! 58: extern char sync_image; ! 59: extern char ga_image; ! 60: extern int my_right; ! 61: extern int cur_emode; ! 62: extern char *myhostname; ! 63: extern int pty; ! 64: extern int transparent; ! 65: extern int showoptions; ! 66: extern int debug; ! 67: extern int telnet_profile; ! 68: ! 69: TEXT_UPDATE *ndq_queue, *deq(); /*Incoming (From Net) NDQ's*/ ! 70: ! 71: map(ndq) /*Parse the given NDQ (could contain several updates). ! 72: Pass individual updates to appropriate processing ! 73: routine. ! 74: */ ! 75: PE ndq; ! 76: { ! 77: ! 78: TEXT_UPDATE *ud; ! 79: ! 80: if(unbuild_NDQPDU_NDQpdu(ndq,1,NULLIP,NULLVP,(PEPYPARM)0) == NOTOK) ! 81: { ! 82: advise (LLOG_NOTICE,NULLCP, "NDQ parse failure (%s)", PY_pepy); ! 83: return; ! 84: } ! 85: while(ud = deq(&ndq_queue) ) ! 86: { ! 87: if(ud->type_sw == DISPLAY_OBJ) ! 88: { ! 89: display_ud(&ud->updates.do_list); ! 90: free((char *)ud->updates.do_list.do_name); ! 91: } ! 92: else if(ud->type_sw == CTRL_OBJ) ! 93: { ! 94: control_ud(&ud->updates.co_list); ! 95: free((char *)ud->updates.co_list.co_name); ! 96: } ! 97: else ! 98: advise(LLOG_NOTICE,NULLCP, "Invalid Update"); ! 99: free((char *)ud); ! 100: } ! 101: pe_free(ndq); ! 102: } ! 103: ! 104: ! 105: display_ud(doptr) /*Handle Display Updates*/ ! 106: DO_UPDATE *doptr; ! 107: { ! 108: ! 109: int i; ! 110: char *pt; ! 111: #ifdef BSD44 ! 112: struct termios term; ! 113: #else ! 114: struct sgttyb ttyb; ! 115: #endif ! 116: ! 117: switch(doptr->do_type) { ! 118: ! 119: case DO_NEXT_X: ! 120: if(putch('\r') == NOTOK) { ! 121: if(debug) ! 122: advise(LLOG_NOTICE,NULLCP, "DROPPED CHAR"); ! 123: return; ! 124: } ! 125: ! 126: if(my_right == INITIATOR) { ! 127: if(putch('\n') == NOTOK) /*Current Telnet only gives ! 128: CR to PTY*/ ! 129: { ! 130: advise(LLOG_NOTICE,NULLCP, "DROPPED CHAR"); ! 131: return; ! 132: } ! 133: } ! 134: break; ! 135: ! 136: case DO_NEXT_Y: ! 137: if(debug) ! 138: advise(LLOG_DEBUG,NULLCP, "Next Y Array"); ! 139: break; ! 140: ! 141: case DO_PTR_REL: /*Ignore for TELNET since next update must ! 142: be erase. */ ! 143: break; ! 144: ! 145: case DO_PTR_ABS: /*Ignore for TELNET since must have been ! 146: preceeded by erase line. */ ! 147: break; ! 148: ! 149: case DO_TEXT: ! 150: for(pt = doptr->do_cmd.text_ud.text_ptr, i = 0; ! 151: i < doptr->do_cmd.text_ud.text_count; ++pt,++i) ! 152: { ! 153: if(putch(*pt) == NOTOK) ! 154: { ! 155: advise(LLOG_NOTICE,NULLCP, "DROPPED CHAR"); ! 156: return; ! 157: } ! 158: } ! 159: free(doptr->do_cmd.text_ud.text_ptr); ! 160: break; ! 161: ! 162: case DO_RPT_TEXT: ! 163: if(debug) ! 164: advise(LLOG_DEBUG,NULLCP, "Repeat Text"); ! 165: break; ! 166: ! 167: case DO_ATTR: ! 168: if(debug) ! 169: advise(LLOG_DEBUG,NULLCP, "Write Attribute"); ! 170: attrib_hdlr(doptr); ! 171: break; ! 172: ! 173: case DO_ERASE: ! 174: if((doptr->do_cmd.erase.start_erase.ptr_type == 0) && ! 175: (doptr->do_cmd.erase.end_erase.ptr_type == 0) ) ! 176: { ! 177: if(my_right == ACCEPTOR) ! 178: { ! 179: #ifdef BSD44 ! 180: if (tcgetattr(pty, &term) == -1) ! 181: perror("ioctl"); ! 182: else ! 183: (void)putch(erase_char=term.c_cc[VERASE]); /* XXX what if _POSIX_VDISABLE */ ! 184: #else ! 185: if (ioctl(pty,TIOCGETP,(char*)&ttyb) == -1) { ! 186: perror("ioctl"); ! 187: adios(NULLCP, "ioctl failed"); ! 188: } ! 189: (void)putch(ttyb.sg_erase); ! 190: erase_char = ttyb.sg_erase; ! 191: #endif ! 192: } ! 193: else (void)putch(erase_char); ! 194: } ! 195: else if((doptr->do_cmd.erase.start_erase.ptr_type == 3) && ! 196: (doptr->do_cmd.erase.end_erase.ptr_type == 6)) ! 197: { ! 198: if(my_right == ACCEPTOR) ! 199: { ! 200: #ifdef BSD44 ! 201: if (tcgetattr(pty, &term) == -1) ! 202: perror("ioctl"); ! 203: else ! 204: (void)putch(erase_line=term.c_cc[VKILL]); /* XXX what if _POSIX_VDISABLE */ ! 205: #else ! 206: if (ioctl(pty,TIOCGETP,(char*)&ttyb) == -1) { ! 207: perror("ioctl"); ! 208: adios(NULLCP, "ioctl failed"); ! 209: } ! 210: (void)putch(ttyb.sg_kill); ! 211: erase_line = ttyb.sg_kill; ! 212: #endif ! 213: } ! 214: else (void)putch(erase_line); ! 215: } ! 216: break; ! 217: ! 218: case DO_PREV_X: ! 219: if(debug) ! 220: advise(LLOG_DEBUG,NULLCP, "Previous X-Array\n"); ! 221: break; ! 222: ! 223: case DO_PREV_Y: ! 224: if(debug) ! 225: advise(LLOG_DEBUG,NULLCP, "Previous Y-Array\n"); ! 226: break; ! 227: } /*End Switch*/ ! 228: } ! 229: ! 230: ! 231: control_ud(coptr) /*Handle Control Object Updates*/ ! 232: CO_UPDATE *coptr; ! 233: { ! 234: ! 235: char active = 0; ! 236: #ifdef BSD44 ! 237: struct termios term; ! 238: #else ! 239: struct sgttyb sb; ! 240: #endif ! 241: ! 242: if(!telnet_profile) ! 243: { ! 244: if((my_right == INITIATOR) && (!strcmp(coptr->co_name,"E"))) ! 245: /*The Echo Control Object in Default Profile is WACA*/ ! 246: def_echo(coptr); ! 247: else ! 248: advise(LLOG_NOTICE,NULLCP, "Received Invalid CO Update under Default Profile\n"); ! 249: return; ! 250: } ! 251: if(coptr->co_type != 1) /*Only Booleans allowed in TELNET*/ ! 252: { ! 253: advise(LLOG_NOTICE,NULLCP, "Invalid CO Type\n"); ! 254: return; ! 255: } ! 256: if(coptr->co_cmd.bool_update.mask_count == 0) active = 0xff; ! 257: else active = *coptr->co_cmd.bool_update.mask; ! 258: ! 259: if(my_right == INITIATOR) ! 260: { ! 261: if(!strcmp(coptr->co_name,"DI") ) ! 262: { ! 263: if(active & AYT_OBJ) ! 264: /*If This CO contains potential update to Are You There bit*/ ! 265: { ! 266: if( (di_image & AYT_OBJ) != ! 267: (AYT_OBJ & *coptr->co_cmd.bool_update.value)) ! 268: /*If this bit was toggled*/ ! 269: { ! 270: if(debug) ! 271: advise(LLOG_DEBUG,NULLCP, "Toggled AYT in DI\n"); ! 272: di_image ^= AYT_OBJ; /*Save the new value*/ ! 273: } ! 274: } ! 275: if(active & AO_OBJ) ! 276: /*If potential update to Abort Output bit*/ ! 277: { ! 278: if( (di_image & AO_OBJ) != ! 279: (AO_OBJ & *coptr->co_cmd.bool_update.value)) ! 280: /*Toggled AO bit*/ ! 281: { ! 282: if(debug) ! 283: advise(LLOG_DEBUG,NULLCP, "Toggled AO in DI\n"); ! 284: di_image ^= AO_OBJ; /*Record it*/ ! 285: } ! 286: } ! 287: if(active & IP_OBJ) ! 288: /*If potential update to Interrupt Process bit*/ ! 289: { ! 290: if( (di_image & IP_OBJ) != ! 291: (IP_OBJ & *coptr->co_cmd.bool_update.value)) ! 292: /*Toggled AO bit*/ ! 293: { ! 294: if(debug) ! 295: advise(LLOG_DEBUG,NULLCP, "Toggled IP in DI/n"); ! 296: di_image ^= IP_OBJ; ! 297: } ! 298: } ! 299: if(active & DM_OBJ) ! 300: { ! 301: if( (di_image & DM_OBJ) != ! 302: (DM_OBJ & *coptr->co_cmd.bool_update.value) ) ! 303: ! 304: /*Toggled DM Bit*/ ! 305: { ! 306: if(debug) ! 307: advise(LLOG_DEBUG,NULLCP, "Toggled DM in DI\n"); ! 308: di_image ^= DM_OBJ; ! 309: } ! 310: } ! 311: if(active & BRK_OBJ) ! 312: { ! 313: if( (di_image & BRK_OBJ) != ! 314: (BRK_OBJ & *coptr->co_cmd.bool_update.value) ) ! 315: /*Toggled Break Bit*/ ! 316: { ! 317: if(debug) ! 318: advise(LLOG_DEBUG,NULLCP, "Toggled BRK in DI\n"); ! 319: di_image ^= BRK_OBJ; ! 320: } ! 321: } ! 322: } ! 323: else if( !strcmp(coptr->co_name,"NA") ) ! 324: { ! 325: if(active & ECHO_OBJ) ! 326: /*Update to Echo Control Object*/ ! 327: { ! 328: if(ECHO_OBJ & *coptr->co_cmd.bool_update.value) ! 329: /*Request from Server for Remote Echo*/ ! 330: { ! 331: na_image |= ECHO_OBJ; ! 332: if(showoptions) ! 333: (void)printf("Remote Echo Update Received\r\n"); ! 334: if(ECHO_OBJ & nego_state) /*If now in Remote Echo*/ ! 335: { ! 336: if(ni_image & ECHO_OBJ) /*No request outstatnding*/ ! 337: { ! 338: if(showoptions) ! 339: (void)printf("Server Request ignored--Now in Remote echo\r\n"); ! 340: } ! 341: else ! 342: { ! 343: if(showoptions) ! 344: (void)printf("Request for Local Echo Denied by Server\r\n"); ! 345: ni_image |= ECHO_OBJ; ! 346: } ! 347: } ! 348: else /*Else Not in Remote Echo*/ ! 349: { ! 350: if(ni_image & ECHO_OBJ) /*I Requested Remote Echo*/ ! 351: /*This must be confirmation*/ ! 352: { ! 353: if(showoptions) ! 354: (void)printf("Server agreed to do Remote Echo\r\n"); ! 355: } ! 356: else /*Request to do Remote Echo*/ ! 357: { ! 358: if(showoptions) ! 359: (void)printf("Server Requested Remote Echo\r\n"); ! 360: ni_image |= ECHO_OBJ; ! 361: vt_set_nego(ni_image,ECHO_OBJ);/*Respond "WILL"*/ ! 362: } ! 363: (void) tmode(1); ! 364: nego_state |= ECHO_OBJ; ! 365: cur_emode = ECHO_NOW; /*Want Server to Echo*/ ! 366: } ! 367: } ! 368: else /*Request from server for Local Echo*/ ! 369: { ! 370: if(showoptions) ! 371: (void)printf("NA--Local Echo\r\n"); ! 372: cur_emode = NOT_ECHO_NOW; ! 373: na_image &= ~ECHO_OBJ; ! 374: if(nego_state & ECHO_OBJ) /*If now in Remote Echo*/ ! 375: { ! 376: if(ni_image & ECHO_OBJ) /*If no request pending*/ ! 377: /*Must be request from sender*/ ! 378: { ! 379: if(showoptions) ! 380: (void)printf("Server requested Local Echo -- O.K.\r\n"); ! 381: ni_image &= ~ECHO_OBJ; ! 382: vt_set_nego(ni_image,ECHO_OBJ);/*Respond "WILL"*/ ! 383: } ! 384: else ! 385: { ! 386: if(showoptions) ! 387: (void)printf("User request for Local Echo Accepted\r\n"); ! 388: } ! 389: nego_state &= ~ECHO_OBJ; ! 390: /* sb = ottyb; ! 391: /* sb.sg_flags |= ECHO|CRMOD|CBREAK; ! 392: /* ioctl(fileno(stdin),TIOCSETP,(char*)&sb); ! 393: */ ! 394: (void)tmode(2); ! 395: } ! 396: else /*Else now in Local Echo*/ ! 397: { ! 398: if(ni_image & ECHO_OBJ) /*If requeset pending*/ ! 399: /*Must be negative response*/ ! 400: { ! 401: ni_image &= ~ECHO_OBJ; ! 402: if(showoptions) ! 403: (void)printf("Request for Remote Echo Denied by Server\r\n"); ! 404: } ! 405: else /*Else no request pending*/ ! 406: { ! 407: if(showoptions) ! 408: (void)printf("Server Request Ignored--Now in Local Echo\r\n"); ! 409: } ! 410: } ! 411: } ! 412: } ! 413: if(active & SUP_GA) ! 414: /*Update to Suppress Go Ahead Control Object*/ ! 415: { ! 416: if(SUP_GA & *coptr->co_cmd.bool_update.value) ! 417: { ! 418: if(showoptions) ! 419: (void)printf("Suppress Go Ahead\r\n"); ! 420: na_image |= SUP_GA; ! 421: if((ni_image & SUP_GA) == (nego_state & SUP_GA)) ! 422: /*If no outstanding request from User*/ ! 423: { ! 424: if(!(nego_state & SUP_GA)) ! 425: /*If not currently in Suppress Go Ahead*/ ! 426: { ! 427: ni_image |= SUP_GA; ! 428: vt_set_nego(ni_image,SUP_GA);/*Reply "Will"*/ ! 429: } ! 430: } ! 431: nego_state |= SUP_GA;/*Either here now or entering*/ ! 432: } ! 433: else ! 434: { ! 435: if(showoptions) ! 436: (void)printf("Go Ahead\r\n"); ! 437: na_image &= ~SUP_GA; ! 438: if( (ni_image & SUP_GA) == (nego_state & SUP_GA) ) ! 439: /*Must be request from Server*/ ! 440: { ! 441: ni_image |= SUP_GA; ! 442: vt_set_nego(ni_image,SUP_GA);/*Reply "Won't"*/ ! 443: } ! 444: else /*Else response to my request to Suppress*/ ! 445: { ! 446: if(showoptions) ! 447: (void)printf("Server refuses to Suppress Go Ahead\r\n"); ! 448: ni_image &= ~SUP_GA; /*Give Up*/ ! 449: /*May want to terminate Association here*/ ! 450: } ! 451: } ! 452: } ! 453: if(active & DISP_BIN) ! 454: /*Update to WACA Binary Repertoire*/ ! 455: { ! 456: if(DISP_BIN & *coptr->co_cmd.bool_update.value) ! 457: { ! 458: if(showoptions) ! 459: (void)printf("WACA requested Binary Repertoire on DI\r\n"); ! 460: if((ni_image & DISP_BIN) == (nego_state & DISP_BIN)) ! 461: /*No request outstanding from Initiator*/ ! 462: { ! 463: if(!(nego_state & DISP_BIN)) /*If not now binary*/ ! 464: { ! 465: ni_image |= DISP_BIN; ! 466: vt_set_nego(ni_image,DISP_BIN); /*Send "Will"*/ ! 467: } ! 468: } ! 469: nego_state |= DISP_BIN; ! 470: ni_image |= DISP_BIN; ! 471: } ! 472: else ! 473: { ! 474: if(showoptions) ! 475: (void)printf("WACA requested ASCII Repertoire on DI\r\n"); ! 476: if((ni_image & DISP_BIN) == (nego_state & DISP_BIN)) ! 477: { ! 478: if(nego_state & DISP_BIN) /*If not now ASCII*/ ! 479: { ! 480: ni_image &= ~DISP_BIN; ! 481: vt_set_nego(ni_image,DISP_BIN); ! 482: } ! 483: } ! 484: nego_state &= ~DISP_BIN; ! 485: ni_image &= ~DISP_BIN; ! 486: } ! 487: } ! 488: if(active & KBD_BIN) ! 489: /*Update to WACI Binary Repertoire*/ ! 490: { ! 491: if(KBD_BIN & *coptr->co_cmd.bool_update.value) ! 492: { ! 493: if(showoptions) ! 494: (void)printf("WACA requested Binary Repertoire on KB\r\n"); ! 495: if((ni_image & KBD_BIN) == (nego_state & KBD_BIN)) ! 496: /*If no initiator request outstanding*/ ! 497: { ! 498: if(!(nego_state & KBD_BIN))/*If not now binary*/ ! 499: { ! 500: ni_image |= KBD_BIN; ! 501: vt_set_nego(ni_image,KBD_BIN); /*Reply "Will"*/ ! 502: switch_rep(2); ! 503: /*Send Attribute update to use Binary Repertoire*/ ! 504: } ! 505: } ! 506: else /*Else a response to Initiator Request*/ ! 507: { ! 508: if(ni_image & KBD_BIN) /*Positive response*/ ! 509: switch_rep(2); ! 510: } ! 511: ni_image |= KBD_BIN; ! 512: nego_state |= KBD_BIN; ! 513: } ! 514: else ! 515: { ! 516: if(showoptions) ! 517: (void)printf("Acceptor requested ASCII Repertoire on KB\r\n"); ! 518: if((ni_image & KBD_BIN) == (nego_state & KBD_BIN)) ! 519: /*Request from Acceptor*/ ! 520: { ! 521: if(nego_state & KBD_BIN) /*If not now ASCII*/ ! 522: { ! 523: ni_image &= ~KBD_BIN; ! 524: vt_set_nego(ni_image,KBD_BIN); /*Reply "Will"*/ ! 525: switch_rep(1);/*Send Attr to ASCII*/ ! 526: } ! 527: } ! 528: else /*Else response to Initiator Request*/ ! 529: { ! 530: if( !(ni_image & KBD_BIN))/*Positive response*/ ! 531: switch_rep(1); ! 532: } ! 533: ni_image &= ~KBD_BIN; ! 534: nego_state &= ~KBD_BIN; ! 535: } ! 536: } ! 537: } ! 538: } ! 539: else /*Else Server (Display) side*/ ! 540: { ! 541: if(!strcmp(coptr->co_name,"KB") ) ! 542: /*Server receives updates to the Keyboard*/ ! 543: { ! 544: if(active & AYT_OBJ) ! 545: /*If This CO contains potential update to Are You There bit*/ ! 546: { ! 547: if( (kb_image & AYT_OBJ) != ! 548: (AYT_OBJ & *coptr->co_cmd.bool_update.value)) ! 549: /*If this bit was toggled*/ ! 550: { ! 551: if(debug) ! 552: advise(LLOG_DEBUG,NULLCP, "Toggled AYT in KB"); ! 553: kb_image ^= AYT_OBJ; /*Save the new value*/ ! 554: if (vt_text("[associated with terminal service on ", strlen("[associated with terminal service on ")) != OK) ! 555: advise(LLOG_NOTICE,NULLCP, "vt_text failed"); ! 556: if (vt_text(myhostname,strlen(myhostname)) != OK) ! 557: advise(LLOG_NOTICE,NULLCP, "vt_text failed"); ! 558: if (vt_text("]\r\n",3) != OK) ! 559: advise(LLOG_NOTICE,NULLCP, "vt_text failed"); ! 560: vtsend(); ! 561: } ! 562: } ! 563: if(active & AO_OBJ) ! 564: /*If potential update to Abort Output bit*/ ! 565: { ! 566: if( (kb_image & AO_OBJ) != ! 567: (AO_OBJ & *coptr->co_cmd.bool_update.value)) ! 568: /*Toggled AO bit*/ ! 569: { ! 570: if(debug) ! 571: advise(LLOG_DEBUG,NULLCP, "Toggled AO in KB"); ! 572: kb_image ^= AO_OBJ; /*Record it*/ ! 573: } ! 574: } ! 575: if(active & IP_OBJ) ! 576: /*If potential update to Interrupt Process bit*/ ! 577: { ! 578: if( (kb_image & IP_OBJ) != ! 579: (IP_OBJ & *coptr->co_cmd.bool_update.value)) ! 580: /*Toggled IP bit*/ ! 581: { ! 582: if(debug) ! 583: advise(LLOG_DEBUG,NULLCP, "Toggled IP in KB"); ! 584: kb_image ^= IP_OBJ; ! 585: kill_proc(); ! 586: } ! 587: } ! 588: if(active & DM_OBJ) ! 589: { ! 590: if( (kb_image & DM_OBJ) != ! 591: (DM_OBJ & *coptr->co_cmd.bool_update.value)) ! 592: { ! 593: /*Toggled DM BIt*/ ! 594: if(debug) ! 595: advise(LLOG_DEBUG,NULLCP, "Toggled DM in KB"); ! 596: kb_image ^= DM_OBJ; ! 597: } ! 598: } ! 599: if(active & BRK_OBJ) ! 600: /*If potential update to Break Bit*/ ! 601: { ! 602: if( (kb_image & BRK_OBJ) != ! 603: (BRK_OBJ & *coptr->co_cmd.bool_update.value)) ! 604: /*Toggled BREAK bit*/ ! 605: { ! 606: if(debug) ! 607: advise(LLOG_DEBUG,NULLCP, "Toggled BREAK in KB"); ! 608: kb_image ^= BRK_OBJ; ! 609: kill_proc(); ! 610: } ! 611: } ! 612: } ! 613: else if( !strcmp(coptr->co_name,"NI") ) ! 614: { ! 615: if(active & ECHO_OBJ) ! 616: /*Update to Echo Control Object*/ ! 617: { ! 618: if(ECHO_OBJ & *coptr->co_cmd.bool_update.value) ! 619: /*Request from User for Remote Echo*/ ! 620: { ! 621: ni_image |= ECHO_OBJ; ! 622: if(showoptions) ! 623: (void)printf("Remote Echo Update Received\n"); ! 624: if(ECHO_OBJ & nego_state) /*If now in Remote Echo*/ ! 625: { ! 626: if(na_image & ECHO_OBJ) /*No request outstatnding*/ ! 627: advise(LLOG_NOTICE,NULLCP, "User Request ignored--Now in Remote echo"); ! 628: else /*Must be user's response to a request*/ ! 629: { ! 630: if(showoptions) ! 631: (void)printf("Request for Local Echo Denied by User\n"); ! 632: na_image |= ECHO_OBJ; ! 633: } ! 634: } ! 635: else /*Else Not in Remote Echo*/ ! 636: { ! 637: if(na_image & ECHO_OBJ) /*I Requested Remote Echo*/ ! 638: /*This must be confirmation*/ ! 639: { ! 640: if(showoptions) ! 641: (void)printf("User agreed to do Remote Echo\n"); ! 642: } ! 643: else /*Request to do Remote Echo*/ ! 644: { ! 645: if(showoptions) ! 646: (void)printf("User Requested Remote Echo--O.K.\n"); ! 647: na_image |= ECHO_OBJ; ! 648: vt_set_nego(na_image,ECHO_OBJ);/*Respond "WILL"*/ ! 649: } ! 650: #ifdef BSD44 ! 651: realptyecho(1); ! 652: #else ! 653: if (ioctl(pty,TIOCGETP,(char*)&sb) == -1) { ! 654: perror("ioctl"); ! 655: adios(NULLCP, "ioctl failed"); ! 656: } ! 657: sb.sg_flags |= ECHO; /*Turn on Echo*/ ! 658: if (ioctl(pty,TIOCSETP,(char*)&sb) == -1) { ! 659: perror("ioctl"); ! 660: adios(NULLCP, "ioctl failed"); ! 661: } ! 662: #endif ! 663: nego_state |= ECHO_OBJ; ! 664: cur_emode = NOT_ECHO_NOW; /*Don't Want user to Echo*/ ! 665: } ! 666: } ! 667: else /*Request from user for Local Echo*/ ! 668: { ! 669: if(showoptions) ! 670: (void)printf("NI--Local Echo\n"); ! 671: cur_emode = NOT_ECHO_NOW; ! 672: ni_image &= ~ECHO_OBJ; ! 673: if(nego_state & ECHO_OBJ) /*If now in Remote Echo*/ ! 674: { ! 675: if(na_image & ECHO_OBJ) /*If no request pending*/ ! 676: /*Must be request from user*/ ! 677: { ! 678: ! 679: #ifdef DO_LOCAL_ECHO ! 680: if(showoptions) ! 681: (void)printf("User requested Local Echo -- O.K.\n"); ! 682: ! 683: na_image &= ~ECHO_OBJ; ! 684: nego_state &= ~ECHO_OBJ; ! 685: #ifdef BSD44 ! 686: ptyecho(0); ! 687: #else ! 688: setmode(0,ECHO); ! 689: #endif ! 690: #else ! 691: na_image |= ECHO_OBJ; ! 692: if(showoptions) ! 693: (void)printf("User requested Local Echo -- Denied\n"); ! 694: #endif ! 695: ! 696: vt_set_nego(na_image,ECHO_OBJ); /*Respond "WILL"*/ ! 697: } ! 698: else ! 699: { ! 700: if(showoptions) ! 701: (void)printf("Server request for Local Echo Accepted\n"); ! 702: nego_state &= ~ECHO_OBJ; ! 703: #ifdef BSD44 ! 704: ptyecho(0); ! 705: #else ! 706: setmode(0,ECHO); ! 707: #endif ! 708: } ! 709: } ! 710: else /*Else now in Local Echo*/ ! 711: { ! 712: if(na_image & ECHO_OBJ) /*If requeset pending*/ ! 713: /*Must be negative response*/ ! 714: { ! 715: na_image &= ~ECHO_OBJ; ! 716: if(showoptions) ! 717: (void)printf("Request for Remote Echo Denied by User\n"); ! 718: } ! 719: else /*Else no request pending*/ ! 720: { ! 721: if(showoptions) ! 722: (void)printf("User Request Ignored--Now in Local Echo\n"); ! 723: } ! 724: } ! 725: } ! 726: } ! 727: if(active & SUP_GA) ! 728: /*Update to Suppress Go Ahead Control Object*/ ! 729: { ! 730: if(SUP_GA & *coptr->co_cmd.bool_update.value) ! 731: { ! 732: if(showoptions) ! 733: (void)printf("Suppress Go Ahead\n"); ! 734: ni_image |= SUP_GA; ! 735: if((na_image & SUP_GA) == (nego_state &SUP_GA)) ! 736: /*If no request from Acceptor outstanding*/ ! 737: { ! 738: if(!(nego_state & SUP_GA)) ! 739: /*If not currently in Supress Go Ahead*/ ! 740: { ! 741: na_image |= SUP_GA; ! 742: vt_set_nego(na_image,SUP_GA);/*Reply "Will"*/ ! 743: } ! 744: } ! 745: nego_state |= SUP_GA; /*Entering or already there*/ ! 746: } ! 747: else ! 748: { ! 749: if(showoptions) ! 750: (void)printf("Don't Suppress Go Ahead\n"); ! 751: ni_image &= ~SUP_GA; ! 752: if((na_image & SUP_GA) == (nego_state & SUP_GA)) ! 753: /*Must be request from Initiator*/ ! 754: { ! 755: na_image |= SUP_GA; ! 756: vt_set_nego(na_image,SUP_GA);/*Reply "Won't"*/ ! 757: } ! 758: else /*Else reply to my request*/ ! 759: { ! 760: if(showoptions) ! 761: (void)printf("User refuses to Suppress Go Ahead\n"); ! 762: na_image &= ~SUP_GA; /*Give up*/ ! 763: } ! 764: } ! 765: } ! 766: if(active & DISP_BIN) ! 767: /*Update to WACI Binary Repertoire*/ ! 768: { ! 769: if(DISP_BIN & *coptr->co_cmd.bool_update.value) ! 770: { ! 771: if(showoptions) ! 772: (void)printf("Initiator requested Binary Repertoire on DI\n"); ! 773: if((na_image & DISP_BIN) == (nego_state & DISP_BIN)) ! 774: /*No request outstanding from Acceptor*/ ! 775: { ! 776: if(!(nego_state & DISP_BIN)) /*If not now binary*/ ! 777: { ! 778: na_image |= DISP_BIN; ! 779: vt_set_nego(na_image,DISP_BIN); /*Send "Will"*/ ! 780: switch_rep(2); ! 781: } ! 782: } ! 783: else /*Else a response to Acceptor request*/ ! 784: { ! 785: if(na_image & KBD_BIN) /*Positive Response*/ ! 786: switch_rep(2); ! 787: } ! 788: nego_state |= DISP_BIN; ! 789: na_image |= DISP_BIN; ! 790: } ! 791: else ! 792: { ! 793: if(showoptions) ! 794: (void)printf("Initiator requested ASCII Repertoire on DI\n"); ! 795: if((na_image & DISP_BIN) == (nego_state & DISP_BIN)) ! 796: { ! 797: if(nego_state & DISP_BIN) /*If not now ASCII*/ ! 798: { ! 799: na_image &= ~DISP_BIN; ! 800: vt_set_nego(na_image,DISP_BIN); ! 801: switch_rep(1); ! 802: } ! 803: } ! 804: else ! 805: { ! 806: if(!(na_image & KBD_BIN)) /*Positive Response*/ ! 807: switch_rep(1); ! 808: } ! 809: nego_state &= ~DISP_BIN; ! 810: na_image &= ~DISP_BIN; ! 811: } ! 812: } ! 813: if(active & KBD_BIN) ! 814: /*Update to WACI Binary Repertoire*/ ! 815: { ! 816: if(KBD_BIN & *coptr->co_cmd.bool_update.value) ! 817: { ! 818: if(showoptions) ! 819: (void)printf("Initiator requested Binary Repertoire on KB\n"); ! 820: if((na_image & KBD_BIN) == (nego_state & KBD_BIN)) ! 821: /*If no Acceptor request outstanding*/ ! 822: { ! 823: if(!(nego_state & KBD_BIN))/*If not now binary*/ ! 824: { ! 825: na_image |= KBD_BIN; ! 826: vt_set_nego(na_image,KBD_BIN); /*Reply "Will"*/ ! 827: } ! 828: } ! 829: na_image |= KBD_BIN; ! 830: nego_state |= KBD_BIN; ! 831: } ! 832: else ! 833: { ! 834: if(showoptions) ! 835: (void)printf("Initiator requested ASCII Repertoire on KB\n"); ! 836: if((na_image & KBD_BIN) == (nego_state & KBD_BIN)) ! 837: /*Request from Initator*/ ! 838: { ! 839: if(nego_state & KBD_BIN) /*If not now ASCII*/ ! 840: { ! 841: na_image &= ~KBD_BIN; ! 842: vt_set_nego(na_image,KBD_BIN); /*Reply "Will"*/ ! 843: } ! 844: } ! 845: na_image &= ~KBD_BIN; ! 846: nego_state &= ~KBD_BIN; ! 847: } ! 848: } ! 849: } ! 850: } ! 851: if( !strcmp(coptr->co_name,"SY") ) /*SYNCHRONIZE CO can be written ! 852: by Initiator or Acceptor*/ ! 853: { ! 854: if(active & SYNC) ! 855: /*Potential Update to Synch*/ ! 856: { ! 857: if( (SYNC & *coptr->co_cmd.bool_update.value) != ! 858: (SYNC & sync_image) ) ! 859: { ! 860: advise(LLOG_NOTICE,NULLCP, "Toggled SYNC"); ! 861: sync_image ^= SYNC; ! 862: } ! 863: } ! 864: } ! 865: if( !strcmp(coptr->co_name,"GA") ) ! 866: { ! 867: if(active & GO_AHEAD) ! 868: /*Potential Update to Go Ahead*/ ! 869: { ! 870: if( (GO_AHEAD & *coptr->co_cmd.bool_update.value) != ! 871: (GO_AHEAD & ga_image) ) ! 872: { ! 873: if(debug) ! 874: advise(LLOG_DEBUG,NULLCP, "Toggled Go Ahead"); ! 875: ga_image ^= GO_AHEAD; ! 876: } ! 877: } ! 878: } ! 879: ! 880: } ! 881: ! 882: attrib_hdlr(doptr) /*Handle Write Attribute Display Object Update*/ ! 883: DO_UPDATE *doptr; ! 884: { ! 885: ! 886: ! 887: if(doptr->do_cmd.wrt_attrib.attr_id == 0) ! 888: /*If switching repertoires*/ ! 889: { ! 890: if(doptr->do_cmd.wrt_attrib.attr_ext == 2) ! 891: /*If Modal extent*/ ! 892: { ! 893: if(doptr->do_cmd.wrt_attrib.attr_val == 1) ! 894: { ! 895: if(showoptions) ! 896: if(my_right == INITIATOR) ! 897: (void)printf("Switching to ASCII Repertoire\r\n"); ! 898: transparent = 0; ! 899: } ! 900: else if(doptr->do_cmd.wrt_attrib.attr_val == 2) ! 901: { ! 902: if(showoptions) ! 903: if(my_right == INITIATOR) ! 904: (void)printf("Switching to Transparent profile.\r\n"); ! 905: transparent = 1; ! 906: } ! 907: else (void)printf("Attribute for unavailable repertoire\n"); ! 908: } ! 909: else (void)printf("Attribute update with invalid extent (%d)\n", ! 910: doptr->do_cmd.wrt_attrib.attr_ext); ! 911: } ! 912: else ! 913: advise(LLOG_NOTICE,NULLCP, "Attribute Update with invalid I.D. (%d)\n", doptr->do_cmd.wrt_attrib.attr_id); ! 914: } ! 915: ! 916: /* TTY */ ! 917: ! 918: #ifdef BSD44 ! 919: extern struct termios oterm; ! 920: ! 921: int ! 922: tmode(f) ! 923: int f; ! 924: { ! 925: static int prevmode = 0; ! 926: struct termios term; ! 927: int onoff, old; ! 928: ! 929: if (prevmode == f) ! 930: return (f); ! 931: old = prevmode; ! 932: prevmode = f; ! 933: term = oterm; ! 934: switch (f) { ! 935: case 0: ! 936: onoff = 0; ! 937: break; ! 938: case 1: ! 939: case 2: ! 940: onoff = 1; ! 941: if (f == 1) ! 942: { ! 943: term.c_lflag &= ~ECHO; ! 944: term.c_oflag &= ~OPOST; ! 945: } ! 946: else ! 947: { ! 948: term.c_lflag |= ECHO; ! 949: term.c_oflag |= OPOST; ! 950: } ! 951: term.c_lflag &= ~(IEXTEN|ISIG|ICANON); ! 952: break; ! 953: default: ! 954: return old; ! 955: } ! 956: if (tcsetattr(fileno(stdin), TCSAFLUSH, &term) == -1) ! 957: perror("tcsetattr"); ! 958: if (ioctl(fileno(stdin), FIONBIO, (char*)&onoff) == -1) { ! 959: perror("ioctl"); ! 960: } ! 961: return (old); ! 962: } ! 963: ! 964: #else ! 965: ! 966: extern struct tchars otc; ! 967: extern struct ltchars oltc; ! 968: extern struct sgttyb ottyb; ! 969: ! 970: /* struct tchars notc = { -1, 3, -1, -1, -1, -1 };*/ ! 971: struct tchars notc = { ! 972: -1, -1, -1, -1, -1, -1 }; ! 973: struct ltchars noltc = { ! 974: -1, -1, -1, -1, -1, -1 }; ! 975: ! 976: int ! 977: tmode(f) ! 978: register int f; ! 979: { ! 980: static int prevmode = 0; ! 981: struct tchars *tc; ! 982: struct ltchars *ltc; ! 983: struct sgttyb sb; ! 984: int onoff, old; ! 985: ! 986: if (prevmode == f) ! 987: return (f); ! 988: old = prevmode; ! 989: prevmode = f; ! 990: sb = ottyb; ! 991: switch (f) { ! 992: ! 993: case 0: ! 994: onoff = 0; ! 995: tc = &otc; ! 996: ltc = &oltc; ! 997: break; ! 998: ! 999: case 1: ! 1000: case 2: ! 1001: if (f == 1) ! 1002: { ! 1003: sb.sg_flags |= CBREAK; ! 1004: sb.sg_flags &= ~(ECHO|CRMOD); ! 1005: sb.sg_erase = sb.sg_kill = -1; ! 1006: } ! 1007: else ! 1008: { ! 1009: sb.sg_flags &= CBREAK; ! 1010: sb.sg_flags |= ECHO|CRMOD; ! 1011: } ! 1012: tc = ¬c; ! 1013: notc.t_stopc = otc.t_stopc; ! 1014: notc.t_startc = otc.t_startc; ! 1015: ltc = &noltc; ! 1016: onoff = 1; ! 1017: break; ! 1018: ! 1019: default: ! 1020: return old; ! 1021: } ! 1022: if (ioctl(fileno(stdin), TIOCSLTC, (char *)ltc) == -1) { ! 1023: perror("ioctl"); ! 1024: adios(NULLCP, "ioctl failed"); ! 1025: } ! 1026: if (ioctl(fileno(stdin), TIOCSETC, (char *)tc) == -1) { ! 1027: perror("ioctl"); ! 1028: adios(NULLCP, "ioctl failed"); ! 1029: } ! 1030: if (ioctl(fileno(stdin), TIOCSETP, (char *)&sb) == -1) { ! 1031: perror("ioctl"); ! 1032: adios(NULLCP, "ioctl failed"); ! 1033: } ! 1034: if (ioctl(fileno(stdin), FIONBIO, (char*)&onoff) == -1) { ! 1035: perror("ioctl"); ! 1036: adios(NULLCP, "ioctl failed"); ! 1037: } ! 1038: if (ioctl(fileno(stdout), FIONBIO, (char*)&onoff) == -1) { ! 1039: perror("ioctl"); ! 1040: adios(NULLCP, "ioctl failed"); ! 1041: } ! 1042: return (old); ! 1043: } ! 1044: #endif ! 1045: ! 1046: kill_proc() /*Terminate current UNIX process using UNIX interrupt char*/ ! 1047: { ! 1048: #ifdef BSD44 ! 1049: struct termios term; ! 1050: ! 1051: if (tcgetattr(pty, &term) == -1) ! 1052: perror("tcgetattr"); ! 1053: else if (term.c_cc[VINTR] != _POSIX_VDISABLE) ! 1054: (void) putch(term.c_cc[VINTR]); ! 1055: #else ! 1056: if(ioctl(pty,TIOCGETC,(char *)&otc) == -1) ! 1057: { ! 1058: perror("ioctl"); ! 1059: adios(NULLCP, "ioctl failed"); ! 1060: } ! 1061: (void) putch(otc.t_intrc); ! 1062: #endif ! 1063: } ! 1064: ! 1065: def_echo(coptr) /*Handle Default Profile Echo Ctrl Object*/ ! 1066: CO_UPDATE *coptr; ! 1067: { ! 1068: ! 1069: char active = 0; ! 1070: ! 1071: if(coptr->co_cmd.bool_update.mask_count == 0) active = 0xff; ! 1072: else active = *coptr->co_cmd.bool_update.mask; ! 1073: ! 1074: if (active & ECHO_OBJ) { ! 1075: if(*coptr->co_cmd.bool_update.value & ECHO_OBJ) ! 1076: /*True means do local echo*/ ! 1077: (void) tmode(2); ! 1078: else ! 1079: (void) tmode(1); ! 1080: } ! 1081: } ! 1082: #ifdef BSD44 ! 1083: static realptyecho(on) ! 1084: { ! 1085: struct termios term; ! 1086: ! 1087: if (tcgetattr(pty, &term) == -1) { ! 1088: perror("tcgetattr"); ! 1089: return; ! 1090: } ! 1091: if (on) ! 1092: term.c_lflag |= ECHO; ! 1093: else ! 1094: term.c_lflag &= ECHO; ! 1095: if (tcsetattr(pty, TCSAFLUSH, &term) == -1) { ! 1096: perror("tcsetattr"); ! 1097: return; ! 1098: } ! 1099: } ! 1100: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.