Annotation of 43BSDReno/contrib/isode-beta/vt/vt_telnet.c, revision 1.1.1.1

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 = &image;
                    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 = &image;
                    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 = &image;
                    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 = &image;
                    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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.