--- lbbs/src/bbs_net.c 2005/03/21 18:01:49 1.5 +++ lbbs/src/bbs_net.c 2005/05/07 12:08:28 1.13 @@ -92,7 +92,7 @@ load_bbsnet_conf (const char *file_confi p_menuitem->name[0] = (item_count < MAXSTATION / 2 ? 'A' + item_count : 'a' + item_count); p_menuitem->name[1] = '\0'; - sprintf (p_menuitem->text, "1;36m%c. %s", + sprintf (p_menuitem->text, "%c. %s", p_menuitem->name[0], bbsnet_conf[item_count].host1); item_count++; @@ -109,79 +109,6 @@ load_bbsnet_conf (const char *file_confi return 0; } -// from Maple-hightman -// added by flyriver, 2001.3.3 -int -telnetopt (int fd, char *buf, int max) -{ - unsigned char c, d, e; - int pp = 0; - unsigned char tmp[30]; - - while (pp < max) - { - c = buf[pp++]; - if (c == 255) - { - d = buf[pp++]; - e = buf[pp++]; - iflush (); - if ((d == 253) && (e == 3 || e == 24)) - { - tmp[0] = 255; - tmp[1] = 251; - tmp[2] = e; - write (fd, tmp, 3); - continue; - } - if ((d == 251 || d == 252) && (e == 1 || e == 3 || e == 24)) - { - tmp[0] = 255; - tmp[1] = 253; - tmp[2] = e; - write (fd, tmp, 3); - continue; - } - if (d == 251 || d == 252) - { - tmp[0] = 255; - tmp[1] = 254; - tmp[2] = e; - write (fd, tmp, 3); - continue; - } - if (d == 253 || d == 254) - { - tmp[0] = 255; - tmp[1] = 252; - tmp[2] = e; - write (fd, tmp, 3); - continue; - } - if (d == 250) - { - while (e != 240 && pp < max) - e = buf[pp++]; - tmp[0] = 255; - tmp[1] = 250; - tmp[2] = 24; - tmp[3] = 0; - tmp[4] = 65; - tmp[5] = 78; - tmp[6] = 83; - tmp[7] = 73; - tmp[8] = 255; - tmp[9] = 240; - write (fd, tmp, 10); - } - } - else - outc (c); - } - iflush (); - return 0; -} - static void process_bar (int n, int len) { @@ -192,7 +119,7 @@ process_bar (int n, int len) char *ptr3; moveto (4, 0); - prints ("┌───────────────┐\n"); + prints ("┌───────────────┐\r\n"); sprintf (buf2, " %3d%% ", n * 100 / len); ptr = buf; ptr2 = buf2; @@ -207,8 +134,9 @@ process_bar (int n, int len) while (*ptr2 != '\0') *ptr++ = *ptr2++; *ptr++ = '\0'; - prints ("│\033[46m%s\033[m│\n", buf); - prints ("└───────────────┘\n"); + prints ("│\033[46m%s\033[m│\r\n", buf); + prints ("└───────────────┘\r\n"); + iflush (); } int @@ -217,22 +145,29 @@ bbsnet_connect (int n) int sock, ch, result, len, loop; struct sockaddr_in sin; char buf[256]; - time_t now, t_last_action; fd_set inputs, testfds; struct timeval timeout; struct hostent *pHost = NULL; int rc, rv, tos = 020, i; + char remote_addr[256]; + int remote_port; + time_t t_used; + struct tm *tm_used; + + clearscr (); - prints ("\033[1;32m正在测试往 %s (%s) 的连接,请稍候... \033[m\n", + moveto (0, 0); + prints ("\033[1;32m正在测试往 %s (%s) 的连接,请稍候... \033[m\r\n", bbsnet_conf[n].host1, bbsnet_conf[n].ip); - prints ("\033[1;32m如果在 %d 秒内无法连上,穿梭程序将放弃连接。\033[m\n", + prints ("\033[1;32m如果在 %d 秒内无法连上,穿梭程序将放弃连接。\033[m\r\n", TIME_OUT); + iflush (); pHost = gethostbyname (bbsnet_conf[n].ip); if (pHost == NULL) { - prints ("\033[1;31m查找主机名失败!\033[m\n"); + prints ("\033[1;31m查找主机名失败!\033[m\r\n"); press_any_key (); return -1; } @@ -241,7 +176,7 @@ bbsnet_connect (int n) if (sock < 0) { - prints ("\033[1;31m无法创建socket!\033[m\n"); + prints ("\033[1;31m无法创建socket!\033[m\r\n"); press_any_key (); return -1; } @@ -260,11 +195,13 @@ bbsnet_connect (int n) bzero (&sin, sizeof (sin)); sin.sin_family = AF_INET; - sin.sin_port = htons (bbsnet_conf[n].port); sin.sin_addr = *(struct in_addr *) pHost->h_addr_list[0]; + sin.sin_port = htons (bbsnet_conf[n].port); + strcpy (remote_addr, inet_ntoa (sin.sin_addr)); + remote_port = ntohs (sin.sin_port); - prints ("\033[1;32m穿梭进度条提示您当前已使用的时间。\033[m\n"); + prints ("\033[1;32m穿梭进度条提示您当前已使用的时间。\033[m\r\n"); process_bar (0, MAX_PROCESS_BAR_LEN); for (i = 0; i < MAX_PROCESS_BAR_LEN; i++) { @@ -285,52 +222,59 @@ bbsnet_connect (int n) break; else { - prints ("\033[1;31m连接失败!\033[m\n"); + prints ("\033[1;31m连接失败!\033[m\r\n"); press_any_key (); return -1; } } if (i == MAX_PROCESS_BAR_LEN) { - prints ("\033[1;31m连接超时!\033[m\n"); + prints ("\033[1;31m连接超时!\033[m\r\n"); press_any_key (); return -1; } setsockopt (sock, IPPROTO_IP, IP_TOS, &tos, sizeof (int)); - prints ("\033[1;31m连接成功!\033[m\n"); + + prints ("\033[1;31m连接成功!\033[m\r\n"); + log_std ("BBSNET connect to %s:%d\n", remote_addr, remote_port); FD_ZERO (&inputs); FD_SET (0, &inputs); FD_SET (sock, &inputs); - t_last_action = time (0); + BBS_last_access_tm = t_used = time (0); loop = 1; while (loop) { testfds = inputs; - timeout.tv_sec = 0; - timeout.tv_usec = 100000; + timeout.tv_sec = TIME_OUT; + timeout.tv_usec = 0; - result = select (FD_SETSIZE, &testfds, (fd_set *) NULL, + result = SignalSafeSelect (FD_SETSIZE, &testfds, (fd_set *) NULL, (fd_set *) NULL, &timeout); - switch (result) + if (result == 0) + { + if (time (0) - BBS_last_access_tm >= MAX_DELAY_TIME) + { + loop = 0; + } + } + if (result < 0) + { + log_error ("select() error (%d) !\n", result); + loop = 0; + } + if (result > 0) { - case 0: - break; - case -1: - log_error ("select() error!\n"); - break; - default: if (FD_ISSET (0, &testfds)) { len = read (0, buf, 255); if (len == 0) { loop = 0; - break; } write (sock, buf, len); } @@ -340,15 +284,10 @@ bbsnet_connect (int n) if (len == 0) { loop = 0; - break; } write (1, buf, len); } - break; - } - if (time (0) - t_last_action >= 10) - { - t_last_action = time (0); + BBS_last_access_tm = time (0); } } @@ -357,6 +296,13 @@ bbsnet_connect (int n) log_error ("Close socket failed\n"); } + t_used = time (0) - t_used; + tm_used = gmtime (&t_used); + + log_std ("BBSNET disconnect, %d days %d hours %d minutes %d seconds used\n", + tm_used->tm_mday - 1, tm_used->tm_hour, tm_used->tm_min, + tm_used->tm_sec); + return 0; } @@ -383,8 +329,8 @@ bbsnet_refresh () prints ("╰══════════════════════════════════════╯"); moveto (23, 0); - prints - (" [\x1b[1;32mCtrl+C\x1b[m]退出"); + prints (" [\x1b[1;32mCtrl+C\x1b[m]退出"); + iflush (); return 0; @@ -415,21 +361,15 @@ bbsnet_selchange (int new_pos) int bbs_net () { - int ch, result, pos, i; + int ch, pos, i; char file_config[256]; - time_t t_last_action; - fd_set inputs, testfds; - struct timeval timeout; strcpy (file_config, app_home_dir); strcat (file_config, "conf/bbsnet.conf"); load_bbsnet_conf (file_config); - FD_ZERO (&inputs); - FD_SET (0, &inputs); - - t_last_action = time (0); + BBS_last_access_tm = time (0); clearscr (); bbsnet_refresh (); @@ -439,70 +379,54 @@ bbs_net () while (1) { - testfds = inputs; - timeout.tv_sec = 0; - timeout.tv_usec = 100000; - - result = select (FD_SETSIZE, &testfds, (fd_set *) NULL, - (fd_set *) NULL, &timeout); - switch (result) + ch = igetch (); + switch (ch) { - case 0: + case KEY_NULL: + case Ctrl ('C'): + return 0; + case KEY_TIMEOUT: + if (time (0) - BBS_last_access_tm >= MAX_DELAY_TIME) + { + return -1; + } + continue; + case CR: + pos = bbsnet_menu.p_menu[0]->item_cur_pos; + bbsnet_connect (pos); + bbsnet_refresh (); + display_current_menu (&bbsnet_menu); + bbsnet_selchange (pos); + break; + case KEY_UP: + for (i = 0; i < STATION_PER_LINE; i++) + menu_control (&bbsnet_menu, KEY_UP); + pos = bbsnet_menu.p_menu[0]->item_cur_pos; + bbsnet_selchange (pos); + break; + case KEY_DOWN: + for (i = 0; i < STATION_PER_LINE; i++) + menu_control (&bbsnet_menu, KEY_DOWN); + pos = bbsnet_menu.p_menu[0]->item_cur_pos; + bbsnet_selchange (pos); break; - case -1: - log_error ("select() error!\n"); + case KEY_LEFT: + menu_control (&bbsnet_menu, KEY_UP); + pos = bbsnet_menu.p_menu[0]->item_cur_pos; + bbsnet_selchange (pos); + break; + case KEY_RIGHT: + menu_control (&bbsnet_menu, KEY_DOWN); + pos = bbsnet_menu.p_menu[0]->item_cur_pos; + bbsnet_selchange (pos); break; default: - if (FD_ISSET (0, &testfds)) - { - ch = igetch (); - switch (ch) - { - case KEY_NULL: - case Ctrl ('C'): - return 0; - case CR: - pos = bbsnet_menu.p_menu[0]->item_cur_pos; - bbsnet_connect (pos); - bbsnet_refresh (); - display_current_menu (&bbsnet_menu); - bbsnet_selchange (pos); - break; - case KEY_UP: - for (i = 0; i < STATION_PER_LINE; i++) - menu_control (&bbsnet_menu, KEY_UP); - pos = bbsnet_menu.p_menu[0]->item_cur_pos; - bbsnet_selchange (pos); - break; - case KEY_DOWN: - for (i = 0; i < STATION_PER_LINE; i++) - menu_control (&bbsnet_menu, KEY_DOWN); - pos = bbsnet_menu.p_menu[0]->item_cur_pos; - bbsnet_selchange (pos); - break; - case KEY_LEFT: - menu_control (&bbsnet_menu, KEY_UP); - pos = bbsnet_menu.p_menu[0]->item_cur_pos; - bbsnet_selchange (pos); - break; - case KEY_RIGHT: - menu_control (&bbsnet_menu, KEY_DOWN); - pos = bbsnet_menu.p_menu[0]->item_cur_pos; - bbsnet_selchange (pos); - break; - default: - menu_control (&bbsnet_menu, ch); - pos = bbsnet_menu.p_menu[0]->item_cur_pos; - bbsnet_selchange (pos); - break; - } - } + menu_control (&bbsnet_menu, ch); + pos = bbsnet_menu.p_menu[0]->item_cur_pos; + bbsnet_selchange (pos); break; } - if (time (0) - t_last_action >= 10) - { - t_last_action = time (0); - } + BBS_last_access_tm = time (0); } return 0;