/* ARGSUSED */ int vt_ayt ( /*Send Are You There*/ char **vec ) { TEXT_UPDATE ud; char mask; char image; if(!telnet_profile) { advise(LLOG_NOTICE,NULLCP, "not using TELNET profile"); return NOTOK; } mask = AYT_OBJ; kb_image ^= AYT_OBJ; /*Can only be called by User side*/ image = kb_image; bzero ((char *) &ud, sizeof ud); ud.echo_sw = cur_emode; ud.type_sw = CTRL_OBJ; ud.updates.co_list.co_name = my_signal_obj; ud.updates.co_list.co_type = 1; /*Boolean Update*/ ud.updates.co_list.co_cmd.bool_update.value = ℑ ud.updates.co_list.co_cmd.bool_update.val_count = KB_SIZE; ud.updates.co_list.co_cmd.bool_update.mask = &mask; ud.updates.co_list.co_cmd.bool_update.mask_count = KB_SIZE; send_queue(ud); vtsend(); return OK; }
int switch_rep (/*Change to specified repertoire. Switching is done by sending a Write Attribute NDQ. */ int rep_num ) { TEXT_UPDATE ud; if(rep_num == 1) transparent = 0; else transparent = 1; bzero ((char *) &ud, sizeof ud); ud.echo_sw = cur_emode; ud.type_sw = DISPLAY_OBJ; ud.updates.do_list.do_name = my_displayobj; ud.updates.do_list.do_type = DO_ATTR; ud.updates.do_list.do_cmd.wrt_attrib.attr_id = 0; ud.updates.do_list.do_cmd.wrt_attrib.attr_val = rep_num; /*Rep Number*/ ud.updates.do_list.do_cmd.wrt_attrib.attr_ext = 2; /*Modal Extent*/ send_queue(ud); vtsend(); }
/* ARGSUSED */ int vt_break (char **vec) { #ifdef VT_BREAK if(!do_break) { advise(LLOG_NOTICE,NULLCP,"VT-BREAK Functional Unit Not Chosen"); return OK; } tmode(2); vt_clr_obj(); /*Initialize all control objects*/ vbrkreq(); #else TEXT_UPDATE ud; mask = BRK_OBJ; kb_image ^= BRK_OBJ; /*Can Only be called by User side*/ image = kb_image; bzero ((char *) ud, sizeof *ud); ud.echo_sw = cur_emode; ud.type_sw = CTRL_OBJ; ud.updates.co_list.co_name = my_signal_obj; ud.updates.co_list.co_type = 1; /*Boolean Update*/ ud.updates.co_list.co_cmd.bool_update.value = ℑ ud.updates.co_list.co_cmd.bool_update.val_count = KB_SIZE; ud.updates.co_list.co_cmd.bool_update.mask = &mask; ud.updates.co_list.co_cmd.bool_update.mask_count = KB_SIZE; send_queue(ud); vtsend(); #endif return OK; }
void vtrespond(VtReq *r) { Packet *p; VtSconn *sc; sc = r->sc; if(r->rx.tag != r->tx.tag) abort(); if(r->rx.msgtype != r->tx.msgtype+1 && r->rx.msgtype != VtRerror) abort(); if(chattyventi) fprint(2, "%s -> %F\n", argv0, &r->rx); if((p = vtfcallpack(&r->rx)) == nil){ vtlog(VtServerLog, "%s: vtfcallpack %F: %r<br>\n", sc->c->addr, &r->rx); fprint(2, "fcallpack on %s: %r\n", sc->dir); packetfree(p); vtfcallclear(&r->rx); return; } vtlog(VtServerLog, "<font size=-1>%T %s:</font> send packet %p (%F)<br>\n", sc->c->addr, p, &r->rx); if(vtsend(sc->c, p) < 0) fprint(2, "vtsend %F: %r\n", &r->rx); scdecref(sc); vtfcallclear(&r->tx); vtfcallclear(&r->rx); vtfree(r); }
int vtsrvhello(VtConn *z) { VtFcall tx, rx; Packet *p; if((p = vtrecv(z)) == nil) return -1; if(vtfcallunpack(&tx, p) < 0){ packetfree(p); return -1; } packetfree(p); if(tx.msgtype != VtThello){ vtfcallclear(&tx); werrstr("bad packet type %d; want Thello %d", tx.msgtype, VtThello); return -1; } if(tx.tag != 0){ vtfcallclear(&tx); werrstr("bad tag in hello"); return -1; } if(strcmp(tx.version, z->version) != 0){ vtfcallclear(&tx); werrstr("bad version in hello"); return -1; } vtfree(z->uid); z->uid = tx.uid; tx.uid = nil; vtfcallclear(&tx); memset(&rx, 0, sizeof rx); rx.msgtype = VtRhello; rx.tag = tx.tag; rx.sid = "anonymous"; if((p = vtfcallpack(&rx)) == nil) return -1; if(vtsend(z, p) < 0) return -1; return 0; }
int vt_set_nego ( /*Update NA/NI control object as in image*/ int image, int mask ) { TEXT_UPDATE ud; char e_image; bzero ((char *) &ud, sizeof ud); ud.echo_sw = cur_emode; ud.type_sw = CTRL_OBJ; ud.updates.co_list.co_name = my_echo_obj; ud.updates.co_list.co_type = 1; /*Boolean*/ e_image = image; ud.updates.co_list.co_cmd.bool_update.value = &e_image; ud.updates.co_list.co_cmd.bool_update.val_count = NA_SIZE; ud.updates.co_list.co_cmd.bool_update.mask = &mask; ud.updates.co_list.co_cmd.bool_update.mask_count = NA_SIZE; send_queue(ud); vtsend(); /*Since we're bypassing normal keyboard entry*/ }
Packet* _vtrpc(VtConn *z, Packet *p, VtFcall *tx) { int i; uchar tag, buf[2], *top; Rwait *r, *rr; /* must malloc because stack could be private */ r = vtmallocz(sizeof(Rwait)); qlock(&z->lk); r->r.l = &z->lk; tag = gettag(z, r); if(tx){ /* vtfcallrpc can't print packet because it doesn't have tag */ tx->tag = tag; if(chattyventi) fprint(2, "%s -> %F\n", argv0, tx); } /* slam tag into packet */ top = packetpeek(p, buf, 0, 2); if(top == nil){ packetfree(p); return nil; } if(top == buf){ werrstr("first two bytes must be in same packet fragment"); packetfree(p); vtfree(r); return nil; } top[1] = tag; qunlock(&z->lk); if(vtsend(z, p) < 0){ vtfree(r); return nil; } qlock(&z->lk); /* wait for the muxer to give us our packet */ r->sleeping = 1; z->nsleep++; while(z->muxer && !r->done) rsleep(&r->r); z->nsleep--; r->sleeping = 0; /* if not done, there's no muxer: start muxing */ if(!r->done){ if(z->muxer) abort(); z->muxer = 1; while(!r->done){ qunlock(&z->lk); if((p = vtrecv(z)) == nil){ werrstr("unexpected eof on venti connection"); z->muxer = 0; vtfree(r); return nil; } qlock(&z->lk); muxrpc(z, p); } z->muxer = 0; /* if there is anyone else sleeping, wake first unfinished to mux */ if(z->nsleep) for(i=0; i<256; i++){ rr = z->wait[i]; if(rr && rr->sleeping && !rr->done){ rwakeup(&rr->r); break; } } } p = r->p; puttag(z, r, tag); vtfree(r); qunlock(&z->lk); return p; }