summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/proto.h1
-rw-r--r--mbbsd/io.c57
-rw-r--r--mbbsd/mbbsd.c28
-rw-r--r--mbbsd/term.c57
-rw-r--r--sample/pttbbs.conf3
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);
diff --git a/mbbsd/io.c b/mbbsd/io.c
index 3282b041..584faa29 100644
--- a/mbbsd/io.c
+++ b/mbbsd/io.c
@@ -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
/* 若定義, 在使用者註冊之前, 會先顯示出該檔案, 經使用者確認後才能註冊 */