diff options
author | scw <scw@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-06-29 22:17:59 +0800 |
---|---|---|
committer | scw <scw@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-06-29 22:17:59 +0800 |
commit | c0a22dee78c1470d62d658e1b2beacb84ffb5cc5 (patch) | |
tree | 463fbd38518dffa479767dfc59a8cc69225da29e | |
parent | 3cbefc4792908b0b0f7433f6565958032e01b241 (diff) | |
download | pttbbs-c0a22dee78c1470d62d658e1b2beacb84ffb5cc5.tar pttbbs-c0a22dee78c1470d62d658e1b2beacb84ffb5cc5.tar.gz pttbbs-c0a22dee78c1470d62d658e1b2beacb84ffb5cc5.tar.bz2 pttbbs-c0a22dee78c1470d62d658e1b2beacb84ffb5cc5.tar.lz pttbbs-c0a22dee78c1470d62d658e1b2beacb84ffb5cc5.tar.xz pttbbs-c0a22dee78c1470d62d658e1b2beacb84ffb5cc5.tar.zst pttbbs-c0a22dee78c1470d62d658e1b2beacb84ffb5cc5.zip |
Reverting revision 2098 and 2100. These make kernel panic due to out of swap.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@2101 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r-- | include/proto.h | 1 | ||||
-rw-r--r-- | mbbsd/io.c | 57 | ||||
-rw-r--r-- | mbbsd/mbbsd.c | 28 | ||||
-rw-r--r-- | mbbsd/term.c | 57 | ||||
-rw-r--r-- | sample/pttbbs.conf | 3 |
5 files changed, 28 insertions, 118 deletions
diff --git a/include/proto.h b/include/proto.h index ae4d94a0..c439b708 100644 --- a/include/proto.h +++ b/include/proto.h @@ -575,7 +575,6 @@ int j_ticket_main(void); /* term */ void init_tty(void); int term_init(void); -void telnet_parse_size(const unsigned char*); void save_cursor(void); void restore_cursor(void); void do_move(int destcol, int destline); @@ -10,7 +10,7 @@ #define IBUFSIZE 256 #endif -static char outbuf[OBUFSIZE]; +static char outbuf[OBUFSIZE], inbuf[IBUFSIZE]; static int obufsize = 0, ibufsize = 0; static int icurrchar = 0; @@ -47,15 +47,12 @@ oflush() } } -#if 0 void init_buf() { memset(inbuf, 0, IBUFSIZE); } -#endif - void output(char *s, int len) { @@ -124,7 +121,6 @@ dogetch() { int len; static time_t lastact; - static unsigned char inbuf[IBUFSIZE]; if (ibufsize <= icurrchar) { if (flushf) @@ -181,7 +177,7 @@ dogetch() } #ifdef SKIP_TELNET_CONTROL_SIGNAL - } while( inbuf[0] == IAC ); + } while( inbuf[0] == -1 ); #endif ibufsize = len; icurrchar = 0; @@ -227,56 +223,7 @@ 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; diff --git a/mbbsd/mbbsd.c b/mbbsd/mbbsd.c index 8c5ac52d..c202e786 100644 --- a/mbbsd/mbbsd.c +++ b/mbbsd/mbbsd.c @@ -1076,41 +1076,29 @@ start_client() static void telnet_init() { - const static unsigned char svr[] = { + const static char svr[] = { IAC, DO, TELOPT_TTYPE, IAC, SB, TELOPT_TTYPE, TELQUAL_SEND, IAC, SE, IAC, WILL, TELOPT_ECHO, - IAC, WILL, TELOPT_SGA, -#ifndef SKIP_TELNET_CONTROL_SIGNAL - IAC, DO, TELOPT_NAWS, -#endif - 0 + IAC, WILL, TELOPT_SGA }; - const unsigned char *cmd; + const char *cmd; int n, len; struct timeval to; - unsigned char buf[64]; + char buf[64]; fd_set ReadSet, r; - int recvlen; FD_ZERO(&ReadSet); FD_SET(0, &ReadSet); - for (n = 0, cmd = svr; *cmd == IAC; n++) { - len = (cmd[1] == SB ? 6 : 3); + for (n = 0, cmd = svr; n < 4; n++) { + len = (n == 1 ? 6 : 3); write(0, cmd, len); cmd += len; to.tv_sec = 3; to.tv_usec = 0; r = ReadSet; - if (select(1, &r, NULL, NULL, &to) > 0){ - recvlen = recv(0, buf, sizeof(buf), 0); -#ifndef SKIP_TELNET_CONTROL_SIGNAL - if (recvlen && len == 3 && *(cmd - 1) == TELOPT_NAWS){ - if (buf[0] == IAC && buf[1] == WILL && buf[2] == TELOPT_NAWS) - telnet_parse_size(buf + 3); - } -#endif - } + if (select(1, &r, NULL, NULL, &to) > 0) + recv(0, buf, sizeof(buf), 0); } } diff --git a/mbbsd/term.c b/mbbsd/term.c index 3d9fd793..555840d1 100644 --- a/mbbsd/term.c +++ b/mbbsd/term.c @@ -52,16 +52,22 @@ outcf(int ch) } #endif -static inline void -term_resize(int row, int col){ +static void +term_resize(int sig) +{ + struct winsize newsize; screenline_t *new_picture; + signal(SIGWINCH, SIG_IGN); /* Don't bother me! */ + ioctl(0, TIOCGWINSZ, &newsize); + /* make sure reasonable size */ - row = MAX(24, MIN(100, row)); - col = MAX(80, MIN(200, col)); + newsize.ws_row = MAX(24, MIN(100, newsize.ws_row)); + newsize.ws_col = MAX(80, MIN(200, newsize.ws_col)); - if (big_picture != NULL && row > t_lines) { - new_picture = (screenline_t *) calloc(row, sizeof(screenline_t)); + if (newsize.ws_row > t_lines) { + new_picture = (screenline_t *) calloc(newsize.ws_row, + sizeof(screenline_t)); if (new_picture == NULL) { syslog(LOG_ERR, "calloc(): %m"); return; @@ -70,48 +76,19 @@ term_resize(int row, int col){ free(big_picture); big_picture = new_picture; } - t_lines = row; - t_columns = col; + t_lines = newsize.ws_row; + t_columns = newsize.ws_col; + scr_lns = t_lines; /* XXX: scr_lns 跟 t_lines 有什麼不同, 為何分成兩個 */ b_lines = t_lines - 1; p_lines = t_lines - 4; -} -static void -term_resize_catch(int sig) -{ - struct winsize newsize; - - signal(SIGWINCH, SIG_IGN); /* Don't bother me! */ - ioctl(0, TIOCGWINSZ, &newsize); - - term_resize(newsize.ws_row, newsize.ws_col); - - signal(SIGWINCH, term_resize_catch); + signal(SIGWINCH, term_resize); } -#ifndef SKIP_TELNET_CONTROL_SIGNAL -void -telnet_parse_size(const unsigned char* msg){ - /* msg[0] == IAC, msg[1] == SB, msg[2] = TELOPT_NAWS */ - int i = 4, row, col; - - col = msg[3] << 8; - if(msg[i] == 0xff) - ++i; /* avoid escaped 0xff */ - col |= msg[i++]; - - row = msg[i++] << 8; - if(msg[i] == 0xff) - ++i; - row |= msg[i]; - term_resize(row, col); -} -#endif - int term_init() { - signal(SIGWINCH, term_resize_catch); + signal(SIGWINCH, term_resize); return YEA; } diff --git a/sample/pttbbs.conf b/sample/pttbbs.conf index 0501d113..e034a321 100644 --- a/sample/pttbbs.conf +++ b/sample/pttbbs.conf @@ -112,8 +112,7 @@ //#define COLORDATE /* 若定義, 則會在 read socket的時候, 則會跳過讀入時第一個 byte 是 -1 - (即 telnet 的 control packet), 可避免循環錯誤 (似乎已解決) - 但若定義即不啟用 telnet 大螢幕支援 */ + (即 telnet 的 control packet), 可避免循環錯誤 */ //#define SKIP_TELNET_CONTROL_SIGNAL /* 若定義, 在使用者註冊之前, 會先顯示出該檔案, 經使用者確認後才能註冊 */ |