|
|
1.1 root 1: /* vt_telnet.c - VT telnet profile */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/vt/RCS/vt_telnet.c,v 7.0 89/11/23 22:31:53 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/vt/RCS/vt_telnet.c,v 7.0 89/11/23 22:31:53 mrose Rel $
9: *
10: *
11: * $Log: vt_telnet.c,v $
12: * Revision 7.0 89/11/23 22:31:53 mrose
13: * Release 6.0
14: *
15: */
16:
17: /*
18: * NOTICE
19: *
20: * Acquisition, use, and distribution of this module and related
21: * materials are subject to the restrictions of a license agreement.
22: * Consult the Preface in the User's Manual for the full terms of
23: * this agreement.
24: *
25: */
26:
27:
28: #include "vtpm.h"
29: #include "sector1.h"
30: #include <sys/ioctl.h>
31:
32: #define VT_BREAK
33: #undef PEPYPARM
34: #define PEPYPARM int *
35:
36: extern struct sgttyb ottyb;
37: extern int cur_emode;
38: extern char *my_displayobj;
39: extern char *my_signal_obj;
40: extern char *my_echo_obj;
41: extern char kb_image;
42: extern char di_image;
43: extern char ni_image;
44: extern char na_image;
45: extern char sync_image;
46: extern char ga_image;
47: extern char nego_state;
48: extern int my_right;
49: extern transparent;
50: extern do_break;
51: extern telnet_profile;
52: extern int connected;
53:
54: vt_newline() /*Produce Newline update*/
55: {
56:
57: TEXT_UPDATE ud;
58:
59: bzero ((char *) &ud, sizeof ud);
60: ud.echo_sw = cur_emode;
61: ud.type_sw = DISPLAY_OBJ;
62: ud.updates.do_list.do_name = my_displayobj;
63: ud.updates.do_list.do_type = DO_NEXT_X; /*Next X-Array*/
64: send_queue(ud);
65: }
66:
67: vt_char_erase() /*Pointer Relative (x=x-1) & erase current*/
68: {
69:
70: TEXT_UPDATE ud;
71:
72: bzero ((char *) &ud, sizeof ud);
73: ud.echo_sw = cur_emode;
74: ud.type_sw = DISPLAY_OBJ;
75: ud.updates.do_list.do_name = my_displayobj;
76: ud.updates.do_list.do_type = DO_PTR_REL;
77: ud.updates.do_list.do_cmd.ptr_rel.x_true = 1;
78: ud.updates.do_list.do_cmd.ptr_rel.y_true = 0;
79: ud.updates.do_list.do_cmd.ptr_rel.z_true = 0;
80: ud.updates.do_list.do_cmd.ptr_rel.x_value = -1;
81:
82: send_queue(ud);
83:
84: ud.updates.do_list.do_type = DO_ERASE;
85: ud.updates.do_list.do_cmd.erase.start_erase.ptr_type = 0; /*Current*/
86: ud.updates.do_list.do_cmd.erase.end_erase.ptr_type = 0; /*Current*/
87: ud.updates.do_list.do_cmd.erase.erase_attr = 0;
88:
89: send_queue(ud);
90: }
91:
92: vt_line_erase() /*Erase full x-array & pointer to x = 1*/
93: {
94:
95: TEXT_UPDATE ud;
96:
97: bzero ((char *) &ud, sizeof ud);
98: ud.echo_sw = cur_emode;
99: ud.type_sw = DISPLAY_OBJ;
100: ud.updates.do_list.do_name = my_displayobj;
101: ud.updates.do_list.do_type = DO_ERASE;
102: ud.updates.do_list.do_cmd.erase.start_erase.ptr_type = 3; /*Start X*/
103: ud.updates.do_list.do_cmd.erase.end_erase.ptr_type = 6; /*End X*/
104: ud.updates.do_list.do_cmd.erase.erase_attr = 0;
105:
106: send_queue(ud);
107:
108: ud.updates.do_list.do_type = DO_PTR_ABS;
109: ud.updates.do_list.do_cmd.ptr_abs.ptr_type = 3; /*Start X*/
110:
111: send_queue(ud);
112: }
113:
114: vt_interrupt() /*Toggle Bit 1 of DI/KB control object*/
115: {
116:
117: TEXT_UPDATE ud;
118: char int_mask;
119: char image;
120:
121: int_mask = IP_OBJ;
122: if(my_right == INITIATOR)
123: {
124: kb_image ^= IP_OBJ;
125: image = kb_image;
126: }
127: else
128: {
129: di_image ^= IP_OBJ; /*Toggle the Interrupt Process bit*/
130: image = di_image;
131: }
132: bzero ((char *) &ud, sizeof ud);
133: ud.echo_sw = cur_emode;
134: ud.type_sw = CTRL_OBJ;
135: ud.updates.co_list.co_name = my_signal_obj;
136: ud.updates.co_list.co_type = 1; /*Boolean Update*/
137: ud.updates.co_list.co_cmd.bool_update.value = ℑ
138: ud.updates.co_list.co_cmd.bool_update.val_count = KB_SIZE;
139: ud.updates.co_list.co_cmd.bool_update.mask = &int_mask;
140: ud.updates.co_list.co_cmd.bool_update.mask_count = KB_SIZE;
141: send_queue(ud);
142: }
143:
144: vt_set_nego(image,mask) /*Update NA/NI control object as in image*/
145: char image;
146: char mask;
147: {
148:
149: TEXT_UPDATE ud;
150: char e_image;
151:
152: bzero ((char *) &ud, sizeof ud);
153: ud.echo_sw = cur_emode;
154: ud.type_sw = CTRL_OBJ;
155: ud.updates.co_list.co_name = my_echo_obj;
156: ud.updates.co_list.co_type = 1; /*Boolean*/
157: e_image = image;
158: ud.updates.co_list.co_cmd.bool_update.value = &e_image;
159: ud.updates.co_list.co_cmd.bool_update.val_count = NA_SIZE;
160: ud.updates.co_list.co_cmd.bool_update.mask = &mask;
161: ud.updates.co_list.co_cmd.bool_update.mask_count = NA_SIZE;
162: send_queue(ud);
163: vtsend(); /*Since we're bypassing normal keyboard entry*/
164: }
165:
166: vt_echo(echo)
167: int echo;
168: {
169:
170: if (!telnet_profile) {
171: advise (LLOG_NOTICE,NULLCP, "not using TELNET profile");
172: return;
173: }
174: if ((ni_image & ECHO_OBJ) != (nego_state & ECHO_OBJ)) {
175: advise (LLOG_NOTICE,NULLCP,
176: "negotiation in progress, try again later...");
177: return;
178: }
179:
180: if (echo != ((nego_state & ECHO_OBJ) ? 1 : 0)) {
181: if (echo)
182: ni_image |= ECHO_OBJ;
183: else
184: ni_image &= ~ECHO_OBJ;
185:
186: vt_set_nego(ni_image,ECHO_OBJ);/*Set proper UNIX echo state when reponse
187: is received. */
188: }
189: else
190: advise (LLOG_NOTICE,NULLCP, "already using %s echoing",
191: echo ? "remote" : "local");
192: }
193:
194: vt_rem_echo(img_addr) /*Request Remote Echo Mode. Parameter is pointer
195: to image byte. */
196: char *img_addr;
197: {
198: *img_addr |= ECHO_OBJ;
199: vt_set_nego(*img_addr,ECHO_OBJ);
200: }
201:
202:
203: vt_sup_ga(img_addr) /*Request Suppress Go Ahead*/
204: char *img_addr;
205: {
206: *img_addr |= SUP_GA;
207: vt_set_nego(*img_addr,SUP_GA);
208: }
209:
210: /* ARGSUSED */
211: vt_break(vec)
212: char **vec;
213: {
214: #ifdef VT_BREAK
215: if(!do_break)
216: {
217: advise(LLOG_NOTICE,NULLCP,"VT-BREAK Functional Unit Not Chosen");
218: return OK;
219: }
220: (void)tmode(2);
221: vt_clr_obj(); /*Initialize all control objects*/
222: vbrkreq();
223: #else
224: TEXT_UPDATE ud;
225:
226: mask = BRK_OBJ;
227: kb_image ^= BRK_OBJ; /*Can Only be called by User side*/
228: image = kb_image;
229:
230: bzero ((char *) ud, sizeof *ud);
231: ud.echo_sw = cur_emode;
232: ud.type_sw = CTRL_OBJ;
233: ud.updates.co_list.co_name = my_signal_obj;
234: ud.updates.co_list.co_type = 1; /*Boolean Update*/
235: ud.updates.co_list.co_cmd.bool_update.value = ℑ
236: ud.updates.co_list.co_cmd.bool_update.val_count = KB_SIZE;
237: ud.updates.co_list.co_cmd.bool_update.mask = &mask;
238: ud.updates.co_list.co_cmd.bool_update.mask_count = KB_SIZE;
239: send_queue(ud);
240: vtsend();
241: #endif
242:
243: return OK;
244: }
245:
246: /* ARGSUSED */
247: vt_ayt(vec) /*Send Are You There*/
248: char **vec;
249: {
250:
251: TEXT_UPDATE ud;
252: char mask;
253: char image;
254:
255: if(!telnet_profile)
256: {
257: advise(LLOG_NOTICE,NULLCP, "not using TELNET profile");
258: return NOTOK;
259: }
260: mask = AYT_OBJ;
261: kb_image ^= AYT_OBJ; /*Can only be called by User side*/
262: image = kb_image;
263: bzero ((char *) &ud, sizeof ud);
264: ud.echo_sw = cur_emode;
265: ud.type_sw = CTRL_OBJ;
266: ud.updates.co_list.co_name = my_signal_obj;
267: ud.updates.co_list.co_type = 1; /*Boolean Update*/
268: ud.updates.co_list.co_cmd.bool_update.value = ℑ
269: ud.updates.co_list.co_cmd.bool_update.val_count = KB_SIZE;
270: ud.updates.co_list.co_cmd.bool_update.mask = &mask;
271: ud.updates.co_list.co_cmd.bool_update.mask_count = KB_SIZE;
272: send_queue(ud);
273: vtsend();
274:
275: return OK;
276: }
277:
278: switch_rep(rep_num)/*Change to specified repertoire.
279: Switching is done by sending
280: a Write Attribute NDQ.
281: */
282: int rep_num;
283: {
284:
285: TEXT_UPDATE ud;
286:
287: if(rep_num == 1) transparent = 0;
288: else transparent = 1;
289:
290: bzero ((char *) &ud, sizeof ud);
291: ud.echo_sw = cur_emode;
292: ud.type_sw = DISPLAY_OBJ;
293: ud.updates.do_list.do_name = my_displayobj;
294: ud.updates.do_list.do_type = DO_ATTR;
295: ud.updates.do_list.do_cmd.wrt_attrib.attr_id = 0;
296: ud.updates.do_list.do_cmd.wrt_attrib.attr_val = rep_num; /*Rep Number*/
297: ud.updates.do_list.do_cmd.wrt_attrib.attr_ext = 2; /*Modal Extent*/
298: send_queue(ud);
299: vtsend();
300: }
301:
302: vt_repertoire (repertoire)
303: int repertoire;
304: {
305: if (!telnet_profile) {
306: advise (LLOG_NOTICE,NULLCP, "not using TELNET profile");
307: return;
308: }
309:
310: if (repertoire != transparent) {
311: if (repertoire)
312: ni_image |= (DISP_BIN|KBD_BIN);
313: else
314: ni_image &= ~(DISP_BIN|KBD_BIN);
315: vt_set_nego(ni_image,DISP_BIN|KBD_BIN);
316: }
317: else
318: advise (LLOG_NOTICE,NULLCP, "already using %s repertoire",
319: transparent ? "BINARY" : "ASCII");
320: }
321:
322: vt_clr_obj() /*Set TELNET Profile Control Objects to 0*/
323: {
324: kb_image = di_image = 0;
325: nego_state = ni_image = na_image = 0;
326: sync_image = ga_image = 0;
327: }
328:
329: /*ARGSUSED*/
330: vt_sync(vec) /*Send TELNET SYNC signal (test for UDQ & typed data)*/
331: char **vec;
332: {
333:
334: PE udqp;
335: TEXT_UPDATE ud;
336: char mask, image;
337:
338: mask = SYNC;
339: sync_image ^= SYNC;
340: image = sync_image;
341: bzero( (char *) &ud, sizeof ud);
342: ud.echo_sw = cur_emode;
343: ud.type_sw = CTRL_OBJ;
344: ud.updates.co_list.co_name = "SY";
345: ud.updates.co_list.co_type = 1;
346: ud.updates.co_list.co_cmd.bool_update.value = ℑ
347: ud.updates.co_list.co_cmd.bool_update.val_count = SYNC_SIZE;
348: ud.updates.co_list.co_cmd.bool_update.mask = &mask;
349: ud.updates.co_list.co_cmd.bool_update.mask_count = SYNC_SIZE;
350: if(build_UDQPDU_UDQpdu(&udqp,1,NULL,NULLCP,(PEPYPARM) &ud) == NOTOK)
351: adios(NULLCP,"UDQ build failure");
352: udqp->pe_context = 1;
353: (void) do_event(VDATreq_u,udqp);
354: pe_free(udqp);
355: return OK;
356: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.