DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T m

⟦12bc1e6dd⟧ TextFile

    Length: 24068 (0x5e04)
    Types: TextFile
    Names: »map.c«

Derivation

└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
    └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« 
        └─⟦d3ac74d73⟧ 
            └─⟦this⟧ »isode-5.0/vt/map.c« 

TextFile

/* map.c - VT telnet profile mappings */

#ifndef	lint
static char *rcsid = "$Header: /f/osi/vt/RCS/map.c,v 6.0 89/03/18 23:46:03 mrose Rel $";
#endif

/* 
 * $Header: /f/osi/vt/RCS/map.c,v 6.0 89/03/18 23:46:03 mrose Rel $
 *
 *
 * $Log:	map.c,v $
 * Revision 6.0  89/03/18  23:46:03  mrose
 * Release 5.0
 * 
 */

/*
 *				  NOTICE
 *
 *    Acquisition, use, and distribution of this module and related
 *    materials are subject to the restrictions of a license agreement.
 *    Consult the Preface in the User's Manual for the full terms of
 *    this agreement.
 *
 */


#define DO_LOCAL_ECHO
#undef PEPYPARM
#define PEPYPARM int *


#include "vtpm.h"
#include "sector1.h"

#include <sys/ioctl.h>

extern char erase_char;
extern char erase_line;
extern struct sgttyb ottyb;
extern struct tchars otc;
extern char intr_char;
extern char ni_image;
extern char na_image;
extern char nego_state;
extern char kb_image;
extern char di_image;
extern char sync_image;
extern char ga_image;
extern int my_right;
extern int cur_emode;
extern char *myhostname;
extern int pty;
extern int transparent;
extern int showoptions;
extern int debug;
extern int telnet_profile;

TEXT_UPDATE *ndq_queue, *deq();		/*Incoming (From Net) NDQ's*/

map(ndq)	/*Parse the given NDQ (could contain several updates).
		  Pass individual updates to appropriate processing
		  routine.
		*/
PE ndq;
{

	TEXT_UPDATE *ud;

	if(unbuild_NDQPDU_NDQpdu(ndq,1,NULLIP,NULLVP,(PEPYPARM)0) == NOTOK)
	{
		advise (LLOG_NOTICE,NULLCP,  "NDQ parse failure (%s)", PY_pepy);
		return;
	}
	while(ud = deq(&ndq_queue) )
	{
		if(ud->type_sw == DISPLAY_OBJ)
		{
			display_ud(&ud->updates.do_list);
			free((char *)ud->updates.do_list.do_name);
		}
		else if(ud->type_sw == CTRL_OBJ)
		{
			control_ud(&ud->updates.co_list);
			free((char *)ud->updates.co_list.co_name);
		}
		else 
			advise(LLOG_NOTICE,NULLCP,  "Invalid Update");
			free((char *)ud);
	}
	pe_free(ndq);
}

\f


display_ud(doptr) 		/*Handle Display Updates*/
DO_UPDATE *doptr;
{

	int i;
	char *pt;
	struct sgttyb ttyb;

	switch(doptr->do_type) {

	case DO_NEXT_X:
		if(putch('\r') == NOTOK) {
			if(debug)
				advise(LLOG_NOTICE,NULLCP,  "DROPPED CHAR");
			return;
		}

		if(my_right == INITIATOR) {
			if(putch('\n') == NOTOK) /*Current Telnet only gives
									   CR to PTY*/
			{
				advise(LLOG_NOTICE,NULLCP,  "DROPPED CHAR");
				return;
			}
		}
		break;

	case DO_NEXT_Y:
		if(debug)
			advise(LLOG_DEBUG,NULLCP,  "Next Y Array");
		break;

	case DO_PTR_REL:	/*Ignore for TELNET since next update must
						  be erase. */
		break;

	case DO_PTR_ABS:	/*Ignore for TELNET since must have been
						  preceeded by erase line. */
		break;

	case DO_TEXT:
		for(pt = doptr->do_cmd.text_ud.text_ptr, i = 0;
		    i < doptr->do_cmd.text_ud.text_count; ++pt,++i)
		{
			if(putch(*pt) == NOTOK)
			{
				advise(LLOG_NOTICE,NULLCP,  "DROPPED CHAR");
				return;
			}
		}
		free(doptr->do_cmd.text_ud.text_ptr);
		break;

	case DO_RPT_TEXT:
		if(debug)
			advise(LLOG_DEBUG,NULLCP,  "Repeat Text");
		break;

	case DO_ATTR:
		if(debug) 
			advise(LLOG_DEBUG,NULLCP,  "Write Attribute");
		attrib_hdlr(doptr);
		break;

	case DO_ERASE:
		if((doptr->do_cmd.erase.start_erase.ptr_type == 0) &&
		    (doptr->do_cmd.erase.end_erase.ptr_type == 0) )
		{
			if(my_right == ACCEPTOR)
			{
				if (ioctl(pty,TIOCGETP,(char*)&ttyb) == -1) {
					perror("ioctl");
					adios(NULLCP, "ioctl failed");
				}
				(void)putch(ttyb.sg_erase);
				erase_char = ttyb.sg_erase;
			}
			else (void)putch(erase_char);
		}
		else if((doptr->do_cmd.erase.start_erase.ptr_type == 3) &&
		    (doptr->do_cmd.erase.end_erase.ptr_type == 6))
		{
			if(my_right == ACCEPTOR)
			{
				if (ioctl(pty,TIOCGETP,(char*)&ttyb) == -1) {
					perror("ioctl");
					adios(NULLCP, "ioctl failed");
				}
				(void)putch(ttyb.sg_kill);
				erase_line = ttyb.sg_kill;
			}
			else (void)putch(erase_line);
		}
		break;

	case DO_PREV_X:
		if(debug)
			advise(LLOG_DEBUG,NULLCP,  "Previous X-Array\n");
		break;

	case DO_PREV_Y:
		if(debug)
			advise(LLOG_DEBUG,NULLCP,  "Previous Y-Array\n");
		break;
	}		/*End Switch*/
}
\f



control_ud(coptr)		/*Handle Control Object Updates*/
CO_UPDATE *coptr;
{

	char active = 0;
	struct sgttyb sb;

	if(!telnet_profile)
	{
		if((my_right == INITIATOR) && (!strcmp(coptr->co_name,"E")))
		/*The Echo Control Object in Default Profile is WACA*/
			def_echo(coptr);
		else
			advise(LLOG_NOTICE,NULLCP,  "Received Invalid CO Update under Default Profile\n");
		return;
	}
	if(coptr->co_type != 1)	/*Only Booleans allowed in TELNET*/
	{
		advise(LLOG_NOTICE,NULLCP,  "Invalid CO Type\n");
		return;
	}
	if(coptr->co_cmd.bool_update.mask_count == 0) active = 0xff;
	else active = *coptr->co_cmd.bool_update.mask;

	if(my_right == INITIATOR)
	{
		if(!strcmp(coptr->co_name,"DI") )
		{
			if(active & AYT_OBJ)
			/*If This CO contains potential update to Are You There bit*/
			{
				if( (di_image & AYT_OBJ) != 
				    (AYT_OBJ & *coptr->co_cmd.bool_update.value))
				/*If this bit was toggled*/
				{
					if(debug)
						advise(LLOG_DEBUG,NULLCP,  "Toggled AYT in DI\n");
					di_image ^= AYT_OBJ;	/*Save the new value*/
				}
			}
			if(active & AO_OBJ)
			/*If potential update to Abort Output bit*/
			{
				if( (di_image & AO_OBJ) !=
				    (AO_OBJ & *coptr->co_cmd.bool_update.value))
				/*Toggled AO bit*/
				{
					if(debug)
						advise(LLOG_DEBUG,NULLCP,  "Toggled AO in DI\n");
					di_image ^= AO_OBJ;	/*Record it*/
				}
			}
			if(active & IP_OBJ)
			/*If potential update to Interrupt Process bit*/
			{
				if( (di_image & IP_OBJ) !=
				    (IP_OBJ & *coptr->co_cmd.bool_update.value))
				/*Toggled AO bit*/
				{
					if(debug)
						advise(LLOG_DEBUG,NULLCP,  "Toggled IP in DI/n");
					di_image ^= IP_OBJ;
				}
			}
			if(active & DM_OBJ)
			{
				if( (di_image & DM_OBJ) !=
				    (DM_OBJ & *coptr->co_cmd.bool_update.value) )

				/*Toggled DM Bit*/
				{
					if(debug)
						advise(LLOG_DEBUG,NULLCP,  "Toggled DM in DI\n");
					di_image ^= DM_OBJ;
				}
			}
			if(active & BRK_OBJ)
			{
				if( (di_image & BRK_OBJ) !=
				    (BRK_OBJ & *coptr->co_cmd.bool_update.value) )
				/*Toggled Break Bit*/
				{
					if(debug)
						advise(LLOG_DEBUG,NULLCP,  "Toggled BRK in DI\n");
					di_image ^= BRK_OBJ;
				}
			}
		}
		else if( !strcmp(coptr->co_name,"NA") )
		{
			if(active & ECHO_OBJ)
			/*Update to Echo Control Object*/
			{
				if(ECHO_OBJ & *coptr->co_cmd.bool_update.value)
				/*Request from Server for Remote Echo*/
				{
					na_image |= ECHO_OBJ;
					if(showoptions)
						(void)printf("Remote Echo Update Received\r\n");
					if(ECHO_OBJ & nego_state) /*If now in Remote Echo*/
					{
						if(ni_image & ECHO_OBJ) /*No request outstatnding*/
						{
							if(showoptions)
								(void)printf("Server Request ignored--Now in Remote echo\r\n");
						}
						else
						{
							if(showoptions)
								(void)printf("Request for Local Echo Denied by Server\r\n");
							ni_image |= ECHO_OBJ;
						}
					}
					else	/*Else Not in Remote Echo*/
					{
						if(ni_image & ECHO_OBJ) /*I Requested Remote Echo*/
						/*This must be confirmation*/
						{
							if(showoptions)
								(void)printf("Server agreed to do Remote Echo\r\n");
						}
						else	/*Request to do Remote Echo*/
						{
							if(showoptions)
								(void)printf("Server Requested Remote Echo\r\n");
							ni_image |= ECHO_OBJ;
							vt_set_nego(ni_image,ECHO_OBJ);/*Respond "WILL"*/
						}
						(void) tmode(1);
						nego_state |= ECHO_OBJ;
						cur_emode = ECHO_NOW;	/*Want Server to Echo*/
					}
				}
				else	/*Request from server for Local Echo*/
				{
					if(showoptions)
						(void)printf("NA--Local Echo\r\n");
					cur_emode = NOT_ECHO_NOW;
					na_image &= ~ECHO_OBJ;
					if(nego_state & ECHO_OBJ) /*If now in Remote Echo*/
					{
						if(ni_image & ECHO_OBJ) /*If no request pending*/
						/*Must be request from sender*/
						{
							if(showoptions)
								(void)printf("Server requested Local Echo -- O.K.\r\n");
							ni_image &= ~ECHO_OBJ;
							vt_set_nego(ni_image,ECHO_OBJ);/*Respond "WILL"*/
						}
						else
						{
							if(showoptions)
								(void)printf("User request for Local Echo Accepted\r\n");
						}
						nego_state &= ~ECHO_OBJ;
						/*			    sb = ottyb;
		/*			    sb.sg_flags |= ECHO|CRMOD|CBREAK;
		/*			    ioctl(fileno(stdin),TIOCSETP,(char*)&sb);
		*/
						(void)tmode(2);
					}
					else	/*Else now in Local Echo*/
					{
						if(ni_image & ECHO_OBJ) /*If requeset pending*/
						/*Must be negative response*/
						{
							ni_image &= ~ECHO_OBJ;
							if(showoptions)
								(void)printf("Request for Remote Echo Denied by Server\r\n");
						}
						else /*Else no request pending*/
						{
							if(showoptions)
								(void)printf("Server Request Ignored--Now in Local Echo\r\n");
						}
					}
				}
			}
			if(active & SUP_GA)
			/*Update to Suppress Go Ahead Control Object*/
			{
				if(SUP_GA & *coptr->co_cmd.bool_update.value)
				{
					if(showoptions)
						(void)printf("Suppress Go Ahead\r\n");
					na_image |= SUP_GA;
					if((ni_image & SUP_GA) == (nego_state & SUP_GA))
					/*If no outstanding request from User*/
					{
						if(!(nego_state & SUP_GA))
						/*If not currently in Suppress Go Ahead*/
						{
							ni_image |= SUP_GA;
							vt_set_nego(ni_image,SUP_GA);/*Reply "Will"*/
						}
					}
					nego_state |= SUP_GA;/*Either here now or entering*/
				}
				else
				{
					if(showoptions)
						(void)printf("Go Ahead\r\n");
					na_image &= ~SUP_GA;
					if( (ni_image & SUP_GA) == (nego_state & SUP_GA) )
					/*Must be request from Server*/
					{
						ni_image |= SUP_GA;
						vt_set_nego(ni_image,SUP_GA);/*Reply "Won't"*/
					}
					else	/*Else response to my request to Suppress*/
					{
						if(showoptions)
							(void)printf("Server refuses to Suppress Go Ahead\r\n");
						ni_image &= ~SUP_GA;	/*Give Up*/
						/*May want to terminate Association here*/
					}
				}
			}
			if(active & DISP_BIN)
			/*Update to WACA Binary Repertoire*/
			{
				if(DISP_BIN & *coptr->co_cmd.bool_update.value)
				{
					if(showoptions)
						(void)printf("WACA requested Binary Repertoire on DI\r\n");
					if((ni_image & DISP_BIN) == (nego_state & DISP_BIN))
					/*No request outstanding from Initiator*/
					{
						if(!(nego_state & DISP_BIN)) /*If not now binary*/
						{
							ni_image |= DISP_BIN;
							vt_set_nego(ni_image,DISP_BIN); /*Send "Will"*/
						}
					}
					nego_state |= DISP_BIN;
					ni_image |= DISP_BIN;
				}
				else
				{
					if(showoptions)
						(void)printf("WACA requested ASCII Repertoire on DI\r\n");
					if((ni_image & DISP_BIN) == (nego_state & DISP_BIN))
					{
						if(nego_state & DISP_BIN) /*If not now ASCII*/
						{
							ni_image &= ~DISP_BIN;
							vt_set_nego(ni_image,DISP_BIN);
						}
					}
					nego_state &= ~DISP_BIN;
					ni_image &= ~DISP_BIN;
				}
			}
			if(active & KBD_BIN)
			/*Update to WACI Binary Repertoire*/
			{
				if(KBD_BIN & *coptr->co_cmd.bool_update.value)
				{
					if(showoptions)
						(void)printf("WACA requested Binary Repertoire on KB\r\n");
					if((ni_image & KBD_BIN) == (nego_state & KBD_BIN))
					/*If no initiator request outstanding*/
					{
						if(!(nego_state & KBD_BIN))/*If not now binary*/
						{
							ni_image |= KBD_BIN;
							vt_set_nego(ni_image,KBD_BIN); /*Reply "Will"*/
							switch_rep(2);
							/*Send Attribute update to use Binary Repertoire*/
						}
					}
					else	/*Else a response to Initiator Request*/
					{
						if(ni_image & KBD_BIN) /*Positive response*/
							switch_rep(2);
					}
					ni_image |= KBD_BIN;
					nego_state |= KBD_BIN;
				}
				else
				{
					if(showoptions)
						(void)printf("Acceptor requested ASCII Repertoire on KB\r\n");
					if((ni_image & KBD_BIN) == (nego_state & KBD_BIN))
					/*Request from Acceptor*/
					{
						if(nego_state & KBD_BIN) /*If not now ASCII*/
						{
							ni_image &= ~KBD_BIN;
							vt_set_nego(ni_image,KBD_BIN); /*Reply "Will"*/
							switch_rep(1);/*Send Attr to ASCII*/
						}
					}
					else	/*Else response to Initiator Request*/
					{
						if( !(ni_image & KBD_BIN))/*Positive response*/
							switch_rep(1);
					}
					ni_image &= ~KBD_BIN;
					nego_state &= ~KBD_BIN;
				}
			}
		}
	}
	else	/*Else Server (Display) side*/
	{
		if(!strcmp(coptr->co_name,"KB") )
		/*Server receives updates to the Keyboard*/
		{
			if(active & AYT_OBJ)
			/*If This CO contains potential update to Are You There bit*/
			{
				if( (kb_image & AYT_OBJ) != 
				    (AYT_OBJ & *coptr->co_cmd.bool_update.value))
				/*If this bit was toggled*/
				{
					if(debug)
						advise(LLOG_DEBUG,NULLCP,  "Toggled AYT in KB");
					kb_image ^= AYT_OBJ;	/*Save the new value*/
					if (vt_text("[associated with terminal service on ", strlen("[associated with terminal service on ")) != OK)
						advise(LLOG_NOTICE,NULLCP,  "vt_text failed");
					if (vt_text(myhostname,strlen(myhostname)) != OK)
						advise(LLOG_NOTICE,NULLCP,  "vt_text failed");
					if (vt_text("]\r\n",3) != OK)
						advise(LLOG_NOTICE,NULLCP,  "vt_text failed");
					vtsend();
				}
			}
			if(active & AO_OBJ)
			/*If potential update to Abort Output bit*/
			{
				if( (kb_image & AO_OBJ) !=
				    (AO_OBJ & *coptr->co_cmd.bool_update.value))
				/*Toggled AO bit*/
				{
					if(debug) 
						advise(LLOG_DEBUG,NULLCP,  "Toggled AO in KB");
					kb_image ^= AO_OBJ;	/*Record it*/
				}
			}
			if(active & IP_OBJ)
			/*If potential update to Interrupt Process bit*/
			{
				if( (kb_image & IP_OBJ) !=
				    (IP_OBJ & *coptr->co_cmd.bool_update.value))
				/*Toggled IP bit*/
				{
					if(debug)
						advise(LLOG_DEBUG,NULLCP,  "Toggled IP in KB");
					kb_image ^= IP_OBJ;
					kill_proc();
				}
			}
			if(active & DM_OBJ)
			{
				if( (kb_image & DM_OBJ) !=
				    (DM_OBJ & *coptr->co_cmd.bool_update.value))
				{
					/*Toggled DM BIt*/
					if(debug)
						advise(LLOG_DEBUG,NULLCP,  "Toggled DM in KB");
					kb_image ^= DM_OBJ;
				}
			}
			if(active & BRK_OBJ)
			/*If potential update to Break Bit*/
			{
				if( (kb_image & BRK_OBJ) !=
				    (BRK_OBJ & *coptr->co_cmd.bool_update.value))
				/*Toggled BREAK bit*/
				{
					if(debug)
						advise(LLOG_DEBUG,NULLCP,  "Toggled BREAK in KB");
					kb_image ^= BRK_OBJ;
					kill_proc();
				}
			}
		}
		else if( !strcmp(coptr->co_name,"NI") )
		{
			if(active & ECHO_OBJ)
			/*Update to Echo Control Object*/
			{
				if(ECHO_OBJ & *coptr->co_cmd.bool_update.value)
				/*Request from User for Remote Echo*/
				{
					ni_image |= ECHO_OBJ;
					if(showoptions)
						(void)printf("Remote Echo Update Received\n");
					if(ECHO_OBJ & nego_state) /*If now in Remote Echo*/
					{
						if(na_image & ECHO_OBJ) /*No request outstatnding*/
							advise(LLOG_NOTICE,NULLCP,  "User Request ignored--Now in Remote echo");
						else /*Must be user's response to a request*/
						{
							if(showoptions)
								(void)printf("Request for Local Echo Denied by User\n");
							na_image |= ECHO_OBJ;
						}
					}
					else	/*Else Not in Remote Echo*/
					{
						if(na_image & ECHO_OBJ) /*I Requested Remote Echo*/
						/*This must be confirmation*/
						{
							if(showoptions)
								(void)printf("User agreed to do Remote Echo\n");
						}
						else	/*Request to do Remote Echo*/
						{
							if(showoptions)
								(void)printf("User Requested Remote Echo--O.K.\n");
							na_image |= ECHO_OBJ;
							vt_set_nego(na_image,ECHO_OBJ);/*Respond "WILL"*/
						}
						if (ioctl(pty,TIOCGETP,(char*)&sb) == -1) {
							perror("ioctl");
							adios(NULLCP, "ioctl failed");
						}
						sb.sg_flags |= ECHO;	/*Turn on Echo*/
						if (ioctl(pty,TIOCSETP,(char*)&sb) == -1) {
							perror("ioctl");
							adios(NULLCP, "ioctl failed");
						}
						nego_state |= ECHO_OBJ;
						cur_emode = NOT_ECHO_NOW;	/*Don't Want user to Echo*/
					}
				}
				else	/*Request from user for Local Echo*/
				{
					if(showoptions)
						(void)printf("NI--Local Echo\n");
					cur_emode = NOT_ECHO_NOW;
					ni_image &= ~ECHO_OBJ;
					if(nego_state & ECHO_OBJ) /*If now in Remote Echo*/
					{
						if(na_image & ECHO_OBJ) /*If no request pending*/
						/*Must be request from user*/
						{

#ifdef DO_LOCAL_ECHO
							if(showoptions)
								(void)printf("User requested Local Echo -- O.K.\n");

							na_image &= ~ECHO_OBJ;
							nego_state &= ~ECHO_OBJ;
							setmode(0,ECHO);
#else
							na_image |= ECHO_OBJ;
							if(showoptions)
								(void)printf("User requested Local Echo -- Denied\n");
#endif

							vt_set_nego(na_image,ECHO_OBJ);	/*Respond "WILL"*/
						}
						else 
						{
							if(showoptions)
								(void)printf("Server request for Local Echo Accepted\n");
							nego_state &= ~ECHO_OBJ;
							setmode(0,ECHO);
						}
					}
					else	/*Else now in Local Echo*/
					{
						if(na_image & ECHO_OBJ) /*If requeset pending*/
						/*Must be negative response*/
						{
							na_image &= ~ECHO_OBJ;
							if(showoptions)
								(void)printf("Request for Remote Echo Denied by User\n");
						}
						else /*Else no request pending*/
						{
							if(showoptions)
								(void)printf("User Request Ignored--Now in Local Echo\n");
						}
					}
				}
			}
			if(active & SUP_GA)
			/*Update to Suppress Go Ahead Control Object*/
			{
				if(SUP_GA & *coptr->co_cmd.bool_update.value)
				{
					if(showoptions)
						(void)printf("Suppress Go Ahead\n");
					ni_image |= SUP_GA;
					if((na_image & SUP_GA) == (nego_state &SUP_GA))
					/*If no request from Acceptor outstanding*/
					{
						if(!(nego_state & SUP_GA))
						/*If not currently in Supress Go Ahead*/
						{
							na_image |= SUP_GA;
							vt_set_nego(na_image,SUP_GA);/*Reply "Will"*/
						}
					}
					nego_state |= SUP_GA; /*Entering or already there*/
				}
				else
				{
					if(showoptions) 
						(void)printf("Don't Suppress Go Ahead\n");
					ni_image &= ~SUP_GA;
					if((na_image & SUP_GA) == (nego_state & SUP_GA))
					/*Must be request from Initiator*/
					{
						na_image |= SUP_GA;
						vt_set_nego(na_image,SUP_GA);/*Reply "Won't"*/
					}
					else /*Else reply to my request*/
					{
						if(showoptions)
							(void)printf("User refuses to Suppress Go Ahead\n");
						na_image &= ~SUP_GA;	/*Give up*/
					}
				}
			}
			if(active & DISP_BIN)
			/*Update to WACI Binary Repertoire*/
			{
				if(DISP_BIN & *coptr->co_cmd.bool_update.value)
				{
					if(showoptions)
						(void)printf("Initiator requested Binary Repertoire on DI\n");
					if((na_image & DISP_BIN) == (nego_state & DISP_BIN))
					/*No request outstanding from Acceptor*/
					{
						if(!(nego_state & DISP_BIN)) /*If not now binary*/
						{
							na_image |= DISP_BIN;
							vt_set_nego(na_image,DISP_BIN); /*Send "Will"*/
							switch_rep(2);
						}
					}
					else	/*Else a response to Acceptor request*/
					{
						if(na_image & KBD_BIN) /*Positive Response*/
							switch_rep(2);
					}
					nego_state |= DISP_BIN;
					na_image |= DISP_BIN;
				}
				else
				{
					if(showoptions)
						(void)printf("Initiator requested ASCII Repertoire on DI\n");
					if((na_image & DISP_BIN) == (nego_state & DISP_BIN))
					{
						if(nego_state & DISP_BIN) /*If not now ASCII*/
						{
							na_image &= ~DISP_BIN;
							vt_set_nego(na_image,DISP_BIN);
							switch_rep(1);
						}
					}
					else
					{
						if(!(na_image & KBD_BIN)) /*Positive Response*/
							switch_rep(1);
					}
					nego_state &= ~DISP_BIN;
					na_image &= ~DISP_BIN;
				}
			}
			if(active & KBD_BIN)
			/*Update to WACI Binary Repertoire*/
			{
				if(KBD_BIN & *coptr->co_cmd.bool_update.value)
				{
					if(showoptions)
						(void)printf("Initiator requested Binary Repertoire on KB\n");
					if((na_image & KBD_BIN) == (nego_state & KBD_BIN))
					/*If no Acceptor request outstanding*/
					{
						if(!(nego_state & KBD_BIN))/*If not now binary*/
						{
							na_image |= KBD_BIN;
							vt_set_nego(na_image,KBD_BIN); /*Reply "Will"*/
						}
					}
					na_image |= KBD_BIN;
					nego_state |= KBD_BIN;
				}
				else
				{
					if(showoptions)
						(void)printf("Initiator requested ASCII Repertoire on KB\n");
					if((na_image & KBD_BIN) == (nego_state & KBD_BIN))
					/*Request from Initator*/
					{
						if(nego_state & KBD_BIN) /*If not now ASCII*/
						{
							na_image &= ~KBD_BIN;
							vt_set_nego(na_image,KBD_BIN); /*Reply "Will"*/
						}
					}
					na_image &= ~KBD_BIN;
					nego_state &= ~KBD_BIN;
				}
			}
		}
	}
	if( !strcmp(coptr->co_name,"SY") ) /*SYNCHRONIZE CO can be written
							by Initiator or Acceptor*/
	{
		if(active & SYNC)
		/*Potential Update to Synch*/
		{
			if( (SYNC & *coptr->co_cmd.bool_update.value) !=
			    (SYNC & sync_image) )
			{
				advise(LLOG_NOTICE,NULLCP,  "Toggled SYNC");
				sync_image ^= SYNC;
			}
		}
	}
	if( !strcmp(coptr->co_name,"GA") )
	{
		if(active & GO_AHEAD)
		/*Potential Update to Go Ahead*/
		{
			if( (GO_AHEAD & *coptr->co_cmd.bool_update.value) !=
			    (GO_AHEAD & ga_image) )
			{
				if(debug) 
					advise(LLOG_DEBUG,NULLCP,  "Toggled Go Ahead");
				ga_image  ^= GO_AHEAD;
			}
		}
	}

}
\f


attrib_hdlr(doptr)	/*Handle Write Attribute Display Object Update*/
DO_UPDATE *doptr;
{


	if(doptr->do_cmd.wrt_attrib.attr_id == 0)
	/*If switching repertoires*/
	{
		if(doptr->do_cmd.wrt_attrib.attr_ext == 2)
		/*If Modal extent*/
		{
			if(doptr->do_cmd.wrt_attrib.attr_val == 1)
			{
			    if(showoptions)
				if(my_right == INITIATOR)
					(void)printf("Switching to ASCII Repertoire\r\n");
			    transparent = 0;
			}
			else if(doptr->do_cmd.wrt_attrib.attr_val == 2)
			{
			    if(showoptions)
				if(my_right == INITIATOR)
					(void)printf("Switching to Transparent profile.\r\n");
			    transparent = 1;
			}
			else (void)printf("Attribute for unavailable repertoire\n");
		}
		else (void)printf("Attribute update with invalid extent (%d)\n",
		    doptr->do_cmd.wrt_attrib.attr_ext);
	}
	else 
		advise(LLOG_NOTICE,NULLCP,  "Attribute Update with invalid I.D. (%d)\n", doptr->do_cmd.wrt_attrib.attr_id);
}

/* \f

   TTY */

extern struct	tchars otc;
extern struct	ltchars oltc;
extern struct	sgttyb ottyb;

/* struct	tchars notc =	{ -1, 3, -1, -1, -1, -1 };*/
struct	tchars notc =	{ 
	-1, -1, -1, -1, -1, -1 };
struct	ltchars noltc =	{ 
	-1, -1, -1, -1, -1, -1 };

int
tmode(f)
register int f;
{
	static int prevmode = 0;
	struct tchars *tc;
	struct ltchars *ltc;
	struct sgttyb sb;
	int onoff, old;

	if (prevmode == f)
		return (f);
	old = prevmode;
	prevmode = f;
	sb = ottyb;
	switch (f) {

	case 0:
		onoff = 0;
		tc = &otc;
		ltc = &oltc;
		break;

	case 1:
	case 2:
		if (f == 1)
		{
			sb.sg_flags |= CBREAK;
			sb.sg_flags &= ~(ECHO|CRMOD);
			sb.sg_erase = sb.sg_kill = -1;
		}
		else
		{
			sb.sg_flags &= CBREAK;
			sb.sg_flags |= ECHO|CRMOD;
		}
		tc = &notc;
		notc.t_stopc = otc.t_stopc;
		notc.t_startc = otc.t_startc;
		ltc = &noltc;
		onoff = 1;
		break;

	default:
		return old;
	}
	if (ioctl(fileno(stdin), TIOCSLTC, (char *)ltc) == -1) {
		perror("ioctl");
		adios(NULLCP, "ioctl failed");
	}
	if (ioctl(fileno(stdin), TIOCSETC, (char *)tc) == -1) {
		perror("ioctl");
		adios(NULLCP, "ioctl failed");
	}
	if (ioctl(fileno(stdin), TIOCSETP, (char *)&sb) == -1) {
		perror("ioctl");
		adios(NULLCP, "ioctl failed");
	}
	if (ioctl(fileno(stdin), FIONBIO, (char*)&onoff) == -1) {
		perror("ioctl");
		adios(NULLCP, "ioctl failed");
	}
	if (ioctl(fileno(stdout), FIONBIO, (char*)&onoff) == -1) {
		perror("ioctl");
		adios(NULLCP, "ioctl failed");
	}
	return (old);
}

kill_proc()	/*Terminate current UNIX process using UNIX interrupt char*/
{
	if(ioctl(pty,TIOCGETC,(char *)&otc) == -1)
	{
		perror("ioctl");
		adios(NULLCP, "ioctl failed");
	}
	(void) putch(otc.t_intrc);
}

def_echo(coptr)	/*Handle Default Profile Echo Ctrl Object*/
CO_UPDATE *coptr;
{

	char active = 0;

	if(coptr->co_cmd.bool_update.mask_count == 0) active = 0xff;
	else active = *coptr->co_cmd.bool_update.mask;

	if (active & ECHO_OBJ) {
	    if(*coptr->co_cmd.bool_update.value & ECHO_OBJ)
		/*True means do local echo*/
		(void) tmode(2);
	    else
		(void) tmode(1);
	}
}