Annotation of 43BSDReno/contrib/isode-beta/vt/vt_telnet.c, revision 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.