From ec1c94c5dd76df278b9d99e583c325c6baec989d Mon Sep 17 00:00:00 2001 From: scw Date: Tue, 29 Jun 2004 07:37:22 +0000 Subject: Parse a little TELNET control string. Support big screen on telnet connection. git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@2098 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- mbbsd/io.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) (limited to 'mbbsd/io.c') diff --git a/mbbsd/io.c b/mbbsd/io.c index 584faa29..3282b041 100644 --- a/mbbsd/io.c +++ b/mbbsd/io.c @@ -10,7 +10,7 @@ #define IBUFSIZE 256 #endif -static char outbuf[OBUFSIZE], inbuf[IBUFSIZE]; +static char outbuf[OBUFSIZE]; static int obufsize = 0, ibufsize = 0; static int icurrchar = 0; @@ -47,12 +47,15 @@ oflush() } } +#if 0 void init_buf() { memset(inbuf, 0, IBUFSIZE); } +#endif + void output(char *s, int len) { @@ -121,6 +124,7 @@ dogetch() { int len; static time_t lastact; + static unsigned char inbuf[IBUFSIZE]; if (ibufsize <= icurrchar) { if (flushf) @@ -177,7 +181,7 @@ dogetch() } #ifdef SKIP_TELNET_CONTROL_SIGNAL - } while( inbuf[0] == -1 ); + } while( inbuf[0] == IAC ); #endif ibufsize = len; icurrchar = 0; @@ -223,7 +227,56 @@ igetch() else // here is switch for default keys switch (ch) { case IAC: +#ifndef SKIP_TELNET_CONTROL_SIGNAL + { + unsigned char cmd[16]; + ch = dogetch(); + switch (ch) { + case IAC: + return IAC; /* escaped IAC */ + + case DO: + cmd[0] = IAC; + cmd[1] = WONT; /* this always work according to rfc 854 */ + cmd[2] = dogetch(); + if(cmd[1] != TELOPT_TTYPE && cmd[1] != TELOPT_NAWS && + cmd[1] != TELOPT_ECHO && cmd[1] != TELOPT_SGA) + write(1, cmd, 3); + break; + + case DONT: + cmd[0] = IAC; + cmd[1] = WONT; + cmd[2] = dogetch(); + write(1, cmd, 3); + break; + + case WILL: case WONT: + cmd[2] = dogetch(); + break; + + case SB: + { + int i; + ch = 0; /* use as mode */ + for (i = 2; i < 16; ++i) { + cmd[i] = dogetch(); + if (cmd[i] == IAC) + ch ^= 1; + else if (ch && cmd[i] == SE) + break; + else + mode = 0; + } + } + if (cmd[2] == TELOPT_NAWS) + telnet_parse_size(cmd); + + } /* switch first char after IAC */ + } +#endif /* ! defined SKIP_TELNET_CONTROL_SIGNAL */ continue; + #ifdef DEBUG case Ctrl('Q'):{ struct rusage ru; -- cgit v1.2.3