📄 ckctel.c
字号:
if (tn_init) /* tn_ini() might be called recursively */ return(0); if (!TELOPT_ME(TELOPT_AUTHENTICATION) && TELOPT_ME_MODE(TELOPT_AUTHENTICATION) >= TN_NG_RQ) { if (tn_sopt(WILL, TELOPT_AUTHENTICATION) < 0) return(-1); TELOPT_UNANSWERED_WILL(TELOPT_AUTHENTICATION) = 1; wait = 1; } if (!TELOPT_U(TELOPT_AUTHENTICATION) && TELOPT_U_MODE(TELOPT_AUTHENTICATION) >= TN_NG_RQ) { if (tn_sopt(DO, TELOPT_AUTHENTICATION) < 0) return(-1); TELOPT_UNANSWERED_DO(TELOPT_AUTHENTICATION) = 1; wait = 1; }#ifdef CK_ENCRYPTION if (TELOPT_U_MODE(TELOPT_AUTHENTICATION) == TN_NG_RF && TELOPT_ME_MODE(TELOPT_AUTHENTICATION) == TN_NG_RF) { TELOPT_ME_MODE(TELOPT_ENCRYPTION) = TN_NG_RF; TELOPT_U_MODE(TELOPT_ENCRYPTION) = TN_NG_RF; }#endif /* CK_ENCRYPTION */#endif /* CK_AUTHENTICATION */#ifdef CK_NAWS if (!sstelnet) { /* Console terminal screen rows and columns */#ifdef OS2 debug(F101, "tn_ini tt_rows 1", "", VscrnGetHeight(VTERM)-(tt_status?1:0) ); debug(F101,"tn_ini tt_cols 1","",VscrnGetWidth(VTERM)); /* Not known yet */ if (VscrnGetWidth(VTERM) < 0 || VscrnGetHeight(VTERM)-(tt_status?1:0) < 0) { ttgwsiz(); /* Try to find out */ } debug(F101, "tn_ini tt_rows 2", "", VscrnGetHeight(VTERM)-(tt_status?1:0) ); debug(F101,"tn_ini tt_cols 2","",VscrnGetWidth(VTERM)); /* Now do we know? */ if (VscrnGetWidth(VTERM) > 0 && VscrnGetHeight(VTERM)-(tt_status?1:0) > 0) { if (!TELOPT_ME(TELOPT_NAWS) && TELOPT_ME_MODE(TELOPT_NAWS) >= TN_NG_RQ) { if (tn_sopt(WILL, TELOPT_NAWS) < 0) return(-1); TELOPT_UNANSWERED_WILL(TELOPT_NAWS) = 1; wait = 1; } }#else /* OS2 */ debug(F101,"tn_ini tt_rows 1","",tt_rows); debug(F101,"tn_ini tt_cols 1","",tt_cols); if (tt_rows < 0 || tt_cols < 0) { /* Not known yet */ ttgwsiz(); /* Try to find out */ } debug(F101,"tn_ini tt_rows 2","",tt_rows); debug(F101,"tn_ini tt_cols 2","",tt_cols); if (tt_rows > 0 && tt_cols > 0) { /* Now do we know? */ if (!TELOPT_ME(TELOPT_NAWS) && TELOPT_ME_MODE(TELOPT_NAWS) >= TN_NG_RQ) { if (tn_sopt(WILL, TELOPT_NAWS) < 0) return(-1); TELOPT_UNANSWERED_WILL(TELOPT_NAWS) = 1; wait = 1; } }#endif /* OS2 */ } else { if (!TELOPT_U(TELOPT_NAWS) && TELOPT_U_MODE(TELOPT_NAWS) >= TN_NG_RQ) { if (tn_sopt(DO, TELOPT_NAWS) < 0) return(-1); TELOPT_UNANSWERED_DO(TELOPT_NAWS) = 1; wait = 1; } }#endif /* CK_NAWS */ if (!TELOPT_ME(TELOPT_SGA) && TELOPT_ME_MODE(TELOPT_SGA) >= TN_NG_RQ) { if (tn_sopt(WILL, TELOPT_SGA) < 0) return(-1); TELOPT_UNANSWERED_WILL(TELOPT_SGA) = 1; wait = 1; } if (!TELOPT_U(TELOPT_SGA) && TELOPT_U_MODE(TELOPT_SGA) >= TN_NG_RQ) { if (tn_sopt(DO, TELOPT_SGA) < 0) return(-1); TELOPT_UNANSWERED_DO(TELOPT_SGA) = 1; wait = 1; } if (!tn_duplex) { if (!TELOPT_U(TELOPT_ECHO) && TELOPT_U_MODE(TELOPT_ECHO) >= TN_NG_RQ) { if (tn_sopt(DO, TELOPT_ECHO) < 0) return(-1); TELOPT_UNANSWERED_DO(TELOPT_ECHO) = 1; wait = 1; } } if (!TELOPT_ME(TELOPT_ECHO) && TELOPT_ME_MODE(TELOPT_ECHO) >= TN_NG_RQ) { if (tn_sopt(WILL, TELOPT_ECHO) < 0) return(-1); TELOPT_UNANSWERED_WILL(TELOPT_ECHO) = 1; wait = 1; } debug(F100,"tn_ini about to send WILL TTYPE if requested","",0);/* Talking to TELNET port, so send WILL TERMINAL TYPE and DO SGA. Also send WILL NAWS if we know our screen dimensions.*/ if (!TELOPT_ME(TELOPT_TTYPE) && TELOPT_ME_MODE(TELOPT_TTYPE) >= TN_NG_RQ) { if ((x = tn_sopt(WILL,TELOPT_TTYPE)) < 0) { debug(F101,"tn_ini tn_sopt WILL TTYPE failed","",x); return(-1); } TELOPT_UNANSWERED_WILL(TELOPT_TTYPE) = 1; wait = 1; debug(F100,"tn_ini sent WILL TTYPE ok","",0); } if (!TELOPT_U(TELOPT_TTYPE) && TELOPT_U_MODE(TELOPT_TTYPE) >= TN_NG_RQ) { if ((x = tn_sopt(DO,TELOPT_TTYPE)) < 0) { debug(F101,"tn_ini tn_sopt DO TTYPE failed","",x); return(-1); } TELOPT_UNANSWERED_DO(TELOPT_TTYPE) = 1; wait = 1; debug(F100,"tn_ini sent DO TTYPE ok","",0); } if (!TELOPT_ME(TELOPT_BINARY) && TELOPT_ME_MODE(TELOPT_BINARY) >= TN_NG_RQ) { if (tn_sopt(WILL, TELOPT_BINARY) < 0) return(-1); TELOPT_UNANSWERED_WILL(TELOPT_BINARY) = 1; wait = 1; } if (!TELOPT_U(TELOPT_BINARY) && TELOPT_U_MODE(TELOPT_BINARY) >= TN_NG_RQ) { if (tn_sopt(DO, TELOPT_BINARY) < 0) return(-1); TELOPT_UNANSWERED_DO(TELOPT_BINARY) = 1; wait = 1; }#ifdef CK_SNDLOC if (tn_loc) { if (!TELOPT_ME(TELOPT_SNDLOC) && TELOPT_ME_MODE(TELOPT_SNDLOC) >= TN_NG_RQ) { if (tn_sopt(WILL, TELOPT_SNDLOC) < 0) return(-1); TELOPT_UNANSWERED_WILL(TELOPT_SNDLOC) = 1; wait = 1; } }#endif /* CK_SNDLOC */#ifdef CK_ENVIRONMENT#ifdef CK_XDISPLOC if (!TELOPT_ME(TELOPT_XDISPLOC) && TELOPT_ME_MODE(TELOPT_XDISPLOC) >= TN_NG_RQ) { if (tn_sopt(WILL, TELOPT_XDISPLOC) < 0) return(-1); TELOPT_UNANSWERED_WILL(TELOPT_XDISPLOC) = 1; wait = 1; }#endif /* CK_XDISPLOC */ /* Will send terminal environment. */ if (!TELOPT_ME(TELOPT_NEWENVIRON) && TELOPT_ME_MODE(TELOPT_NEWENVIRON) >= TN_NG_RQ) { if (tn_sopt(WILL, TELOPT_NEWENVIRON) < 0) return(-1); TELOPT_UNANSWERED_WILL(TELOPT_NEWENVIRON) = 1; wait = 1; } if (!TELOPT_U(TELOPT_NEWENVIRON) && TELOPT_U_MODE(TELOPT_NEWENVIRON) >= TN_NG_RQ) { if (tn_sopt(DO, TELOPT_NEWENVIRON) < 0) return(-1); TELOPT_UNANSWERED_DO(TELOPT_NEWENVIRON) = 1; wait = 1; }#endif /* CK_ENVIRONMENT */ /* Take care of any other telnet options that require handling. */ for (opt = TELOPT_FIRST; opt <= TELOPT_LAST; opt++) { switch (opt) { case TELOPT_AUTHENTICATION: case TELOPT_ENCRYPTION: case TELOPT_TTYPE: case TELOPT_NAWS: case TELOPT_BINARY: case TELOPT_NEWENVIRON: case TELOPT_SNDLOC: case TELOPT_XDISPLOC: case TELOPT_SGA: case TELOPT_ECHO: case TELOPT_KERMIT: case TELOPT_START_TLS: break; default: if (TELOPT_OK(opt)) { if (!TELOPT_ME(opt) && TELOPT_ME_MODE(opt) >= TN_NG_RQ) { if (tn_sopt(WILL, opt) < 0) return(-1); TELOPT_UNANSWERED_WILL(opt) = 1; wait = 1; } if (!TELOPT_U(opt) && TELOPT_U_MODE(opt) >= TN_NG_RQ) { if (tn_sopt(DO, opt) < 0) return(-1); TELOPT_UNANSWERED_DO(opt) = 1; wait = 1; } } } } if (wait) { if (tn_wait("pre-encrypt") < 0) { tn_push(); return(-1); } wait = 0; }#ifdef CK_ENCRYPTION if (tn_init) /* tn_ini() may be called recursively */ return(0); if (!TELOPT_ME(TELOPT_ENCRYPTION) && TELOPT_ME_MODE(TELOPT_ENCRYPTION) >= TN_NG_RQ) { if (tn_sopt(WILL, TELOPT_ENCRYPTION) < 0) return(-1); TELOPT_UNANSWERED_WILL(TELOPT_ENCRYPTION) = 1; wait = 1; } if (!TELOPT_U(TELOPT_ENCRYPTION) && TELOPT_U_MODE(TELOPT_ENCRYPTION) >= TN_NG_RQ) { if (tn_sopt(DO, TELOPT_ENCRYPTION) < 0) return(-1); TELOPT_UNANSWERED_DO(TELOPT_ENCRYPTION) = 1; wait = 1; } /* If we are going to encrypt, we want to do it before we send any more */ /* data, especially the terminal type and environment variables. */ if (wait) { if (tn_wait("post-encrypt") < 0) { tn_push(); return(-1); } wait = 0; }#endif /* CK_ENCRYPTION */ tn_sdsb(); if (tn_init) /* tn_ini() may be called recursively */ return(0);#ifdef IKS_OPTION /* Kermit Server negotiation must go last */ /* Send U before ME */ if (!TELOPT_U(TELOPT_KERMIT) && TELOPT_U_MODE(TELOPT_KERMIT) >= TN_NG_RQ) { if (tn_sopt(DO, TELOPT_KERMIT) < 0) return(-1); TELOPT_UNANSWERED_DO(TELOPT_KERMIT) = 1; wait = 1; } if (!TELOPT_ME(TELOPT_KERMIT) && TELOPT_ME_MODE(TELOPT_KERMIT) >= TN_NG_RQ) { if (tn_sopt(WILL, TELOPT_KERMIT) < 0) return(-1); TELOPT_UNANSWERED_WILL(TELOPT_KERMIT) = 1; wait = 1; }#endif /* IKS_OPTION */ if (wait) { if (tn_wait("end of telnet negotiations") < 0) { tn_push(); return(-1); } wait = 0; } tn_sdsb(); /* Send delayed subnegotiations */ tn_push(); tn_init = 1; /* Remember successful completion. */ /* Don't send anything else! */ debug(F101,"tn_ini duplex","",duplex); debug(F101,"tn_ini done, tn_init","",tn_init); return(1);}VOIDtn_debug(s) char *s; {#ifdef OS2 void cwrite(unsigned short); char *p = s; _PROTOTYP (void os2bold, (void));#endif /* OS2 */ if (!(tn_deb || debses)) return; debug(F111,"tn_debug",s,what);#ifdef OS2 if ( what == W_COMMAND ) { extern unsigned char colorcmd; colorcmd ^= 0x8 ; printf("%s\r\n",s); colorcmd ^= 0x8 ; } if (!scrninitialized[VTERM]) { USHORT x,y; checkscreenmode(); GetCurPos(&y, &x); SaveCmdMode(x+1,y+1); scrninit(); RestoreCmdMode(); } os2bold(); /* Toggle boldness */ while (*p) cwrite((CHAR) *p++); /* Go boldly ... */ os2bold(); /* Toggle boldness back */ if (debses) { debses = 0; cwrite((CHAR) '\015'); cwrite((CHAR) '\012'); debses = 1; } else { cwrite((CHAR) '\015'); cwrite((CHAR) '\012'); }#else if (what != W_CONNECT && what != W_COMMAND) return; /* CONNECT/command must be active */ conoll(s);#endif /* OS2 */}/* Process in-band Telnet negotiation characters from the remote host. Call with the telnet IAC character and the current duplex setting (0 = remote echo, 1 = local echo), and a pointer to a function to call to read more characters. Returns: 6 if DO LOGOUT was received and accepted 5 if the Kermit start of packet character has changed 4 if state of remote Internet Kermit Service has changed 3 if a quoted IAC was received 2 if local echo must be changed to remote 1 if remote echo must be changed to local 0 if nothing happens or no action necessary -1 on failure (= internal or i/o error)*/#ifdef IKS_OPTIONinttn_siks(cmd) int cmd; { /* TELNET SEND IKS SUB */#ifndef NOXFER CHAR buf[8]; extern CHAR mystch; /* Outgoing Start of Packet Char */ int n,m; if (ttnet != NET_TCPB) return(0); /* Must be TCP/IP */ if (ttnproto != NP_TELNET) return(0); /* Must be telnet protocol */ if (cmd < KERMIT_START || cmd > KERMIT_RESP_STOP) /* Illegal subcommand */ return(-1);#ifdef CK_SSL if (TELOPT_SB(TELOPT_START_TLS).start_tls.me_follows) { return(0); }#endif /* CK_SSL */ if (cmd == KERMIT_START || cmd == KERMIT_RESP_START) { TELOPT_SB(TELOPT_KERMIT).kermit.me_start = 1; } else if (cmd == KERMIT_STOP || cmd == KERMIT_RESP_STOP) { TELOPT_SB(TELOPT_KERMIT).kermit.me_start = 0; } else if (cmd == KERMIT_REQ_STOP) TELOPT_SB(TELOPT_KERMIT).kermit.me_req_stop = 1; else if (cmd == KERMIT_REQ_START) TELOPT_SB(TELOPT_KERMIT).kermit.me_req_start = 1; if (cmd == KERMIT_SOP) { buf[0] = (CHAR) IAC; buf[1] = (CHAR) SB; b
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -