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