|
|
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.