From 93511df0124fe053678a627f2ed1de1b28e407af Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Fri, 15 Oct 2004 00:56:19 +0000 Subject: [PATCH] Added support for Telnet NAWS (Negotiate About Window Size) and Terminal Speed options. The NAWS option is particularlly nice as we don't need ANSI cursor posistion reports to auto-detect screen size. If the user's account is configured for auto-screen length detection and using a telnet client that supports NAWS, the screen length will be dynamically updated (!). --- src/sbbs3/main.cpp | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp index 631757242f..b954ff30b1 100644 --- a/src/sbbs3/main.cpp +++ b/src/sbbs3/main.cpp @@ -1066,7 +1066,34 @@ static BYTE* telnet_interpret(sbbs_t* sbbs, BYTE* inbuf, int inlen, ,sbbs->cfg.node_num ,sbbs->telnet_mode&TELNET_MODE_GATE ? "passed-through" : "received" ,sbbs->terminal); - } + + } else if(option==TELNET_TERM_SPEED + && sbbs->telnet_cmd[3]==TELNET_TERM_IS) { + char speed[128]; + sprintf(speed,"%.*s",(int)sbbs->telnet_cmdlen-6,sbbs->telnet_cmd+4); + lprintf(LOG_DEBUG,"Node %d %s telnet terminal speed: %s" + ,sbbs->cfg.node_num + ,sbbs->telnet_mode&TELNET_MODE_GATE ? "passed-through" : "received" + ,speed); + + } else if(option==TELNET_NEGOTIATE_WINDOW_SIZE) { + long cols = (sbbs->telnet_cmd[3]<<8) | sbbs->telnet_cmd[4]; + long rows = (sbbs->telnet_cmd[5]<<8) | sbbs->telnet_cmd[6]; + lprintf(LOG_DEBUG,"Node %d %s telnet window size: %ux%u" + ,sbbs->cfg.node_num + ,sbbs->telnet_mode&TELNET_MODE_GATE ? "passed-through" : "received" + ,sbbs->cols + ,sbbs->rows); + if(rows && !sbbs->useron.rows) /* auto-detect rows */ + sbbs->rows=rows; + if(cols) + sbbs->cols=cols; + + } else if(startup->options&BBS_OPT_DEBUG_TELNET) + lprintf(LOG_DEBUG,"Node %d %s unsupported telnet sub-negotiation cmd: %s" + ,sbbs->cfg.node_num + ,sbbs->telnet_mode&TELNET_MODE_GATE ? "passed-through" : "received" + ,telnet_opt_desc(option)); sbbs->telnet_cmdlen=0; } } @@ -1099,7 +1126,9 @@ static BYTE* telnet_interpret(sbbs_t* sbbs, BYTE* inbuf, int inlen, case TELNET_BINARY_TX: case TELNET_ECHO: case TELNET_TERM_TYPE: + case TELNET_TERM_SPEED: case TELNET_SUP_GA: + case TELNET_NEGOTIATE_WINDOW_SIZE: sbbs->telnet_remote_option[option]=command; sbbs->send_telnet_cmd(telnet_opt_ack(command),option); break; @@ -1122,6 +1151,19 @@ static BYTE* telnet_interpret(sbbs_t* sbbs, BYTE* inbuf, int inlen, ,TELNET_IAC,TELNET_SE); sbbs->putcom(buf,6); } + else if(command==TELNET_WILL && option==TELNET_TERM_SPEED) { + if(startup->options&BBS_OPT_DEBUG_TELNET) + lprintf(LOG_DEBUG,"Node %d requesting telnet terminal speed" + ,sbbs->cfg.node_num); + + char buf[64]; + sprintf(buf,"%c%c%c%c%c%c" + ,TELNET_IAC,TELNET_SB + ,TELNET_TERM_SPEED,TELNET_TERM_SEND + ,TELNET_IAC,TELNET_SE); + sbbs->putcom(buf,6); + } + } sbbs->telnet_cmdlen=0; -- GitLab