/[LeafOK_CVS]/lbbs/src/bbs_net.c
ViewVC logotype

Diff of /lbbs/src/bbs_net.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.97 by sysadm, Thu Dec 18 07:58:23 2025 UTC Revision 1.104 by sysadm, Fri Dec 19 06:16:26 2025 UTC
# Line 87  static int load_bbsnet_conf(const char * Line 87  static int load_bbsnet_conf(const char *
87          bbsnet_menu.p_menu_pool = calloc(1, sizeof(MENU));          bbsnet_menu.p_menu_pool = calloc(1, sizeof(MENU));
88          if (bbsnet_menu.p_menu_pool == NULL)          if (bbsnet_menu.p_menu_pool == NULL)
89          {          {
90                  log_error("calloc(p_menu_pool) error\n");                  log_error("calloc(p_menu_pool) error");
91                  return -1;                  return -1;
92          }          }
93          bbsnet_menu.menu_count = 1;          bbsnet_menu.menu_count = 1;
# Line 95  static int load_bbsnet_conf(const char * Line 95  static int load_bbsnet_conf(const char *
95          bbsnet_menu.p_menu_item_pool = calloc(MAXSTATION, sizeof(MENU_ITEM));          bbsnet_menu.p_menu_item_pool = calloc(MAXSTATION, sizeof(MENU_ITEM));
96          if (bbsnet_menu.p_menu_item_pool == NULL)          if (bbsnet_menu.p_menu_item_pool == NULL)
97          {          {
98                  log_error("calloc(p_menu_item_pool) error\n");                  log_error("calloc(p_menu_item_pool) error");
99                  unload_bbsnet_conf();                  unload_bbsnet_conf();
100                  return -1;                  return -1;
101          }          }
# Line 140  static int load_bbsnet_conf(const char * Line 140  static int load_bbsnet_conf(const char *
140                  port = strtol(t4, &endptr, 10);                  port = strtol(t4, &endptr, 10);
141                  if (*endptr != '\0' || port <= 0 || port > 65535)                  if (*endptr != '\0' || port <= 0 || port > 65535)
142                  {                  {
143                          log_error("Invalid port value %d of menu item %d\n", port, menu_item_id);                          log_error("Invalid port value %ld of menu item %d", port, menu_item_id);
144                          fclose(fp);                          fclose(fp);
145                          unload_bbsnet_conf();                          unload_bbsnet_conf();
146                          return -3;                          return -3;
# Line 154  static int load_bbsnet_conf(const char * Line 154  static int load_bbsnet_conf(const char *
154                  p_menu_item = get_menu_item_by_id(&bbsnet_menu, menu_item_id);                  p_menu_item = get_menu_item_by_id(&bbsnet_menu, menu_item_id);
155                  if (p_menu_item == NULL)                  if (p_menu_item == NULL)
156                  {                  {
157                          log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id);                          log_error("get_menu_item_by_id(%d) return NULL pointer", menu_item_id);
158                          fclose(fp);                          fclose(fp);
159                          unload_bbsnet_conf();                          unload_bbsnet_conf();
160                          return -3;                          return -3;
# Line 212  static void progress_bar(int percent, in Line 212  static void progress_bar(int percent, in
212          char buf2[LINE_BUFFER_LEN];          char buf2[LINE_BUFFER_LEN];
213          int pos;          int pos;
214    
215          if (len <= 0)          if (len < 4)
216          {          {
217                  len = 1;                  len = 4;
218          }          }
219          else if (len > LINE_BUFFER_LEN)          else if (len + 2 > LINE_BUFFER_LEN)
220          {          {
221                  len = LINE_BUFFER_LEN - 1;                  len = LINE_BUFFER_LEN - 3;
222          }          }
223          if (percent < 0)          if (percent < 0)
224          {          {
# Line 310  static int bbsnet_connect(int n) Line 310  static int bbsnet_connect(int n)
310    
311          if (user_online_update("BBS_NET") < 0)          if (user_online_update("BBS_NET") < 0)
312          {          {
313                  log_error("user_online_update(BBS_NET) error\n");                  log_error("user_online_update(BBS_NET) error");
314          }          }
315    
316          if (bbsnet_conf[n].use_ssh)          if (bbsnet_conf[n].use_ssh)
# Line 366  static int bbsnet_connect(int n) Line 366  static int bbsnet_connect(int n)
366    
367          if ((ret = getaddrinfo(BBS_address, NULL, &hints, &res)) != 0)          if ((ret = getaddrinfo(BBS_address, NULL, &hints, &res)) != 0)
368          {          {
369                  log_error("getaddrinfo() error (%d): %s\n", ret, gai_strerror(ret));                  log_error("getaddrinfo() error (%d): %s", ret, gai_strerror(ret));
370                  ret = -1;                  ret = -1;
371                  goto cleanup;                  goto cleanup;
372          }          }
373    
374          if (inet_ntop(AF_INET, &(((struct sockaddr_in *)res->ai_addr)->sin_addr), local_addr, sizeof(local_addr)) == NULL)          if (inet_ntop(AF_INET, &(((struct sockaddr_in *)res->ai_addr)->sin_addr), local_addr, sizeof(local_addr)) == NULL)
375          {          {
376                  log_error("inet_ntop() error (%d)\n", errno);                  log_error("inet_ntop() error (%d)", errno);
377                  ret = -1;                  ret = -1;
378                  goto cleanup;                  goto cleanup;
379          }          }
# Line 382  static int bbsnet_connect(int n) Line 382  static int bbsnet_connect(int n)
382          sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);          sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
383          if (sock < 0)          if (sock < 0)
384          {          {
385                  log_error("socket() error (%d)\n", errno);                  log_error("socket() error (%d)", errno);
386                  ret = -1;                  ret = -1;
387                  goto cleanup;                  goto cleanup;
388          }          }
389    
390          if (bind(sock, res->ai_addr, res->ai_addrlen) < 0)          if (bind(sock, res->ai_addr, res->ai_addrlen) < 0)
391          {          {
392                  log_error("bind(%s:%u) error (%d)\n", local_addr, local_port, errno);                  log_error("bind(%s:%u) error (%d)", local_addr, local_port, errno);
393                  ret = -1;                  ret = -1;
394                  goto cleanup;                  goto cleanup;
395          }          }
# Line 405  static int bbsnet_connect(int n) Line 405  static int bbsnet_connect(int n)
405    
406          if ((ret = getaddrinfo(bbsnet_conf[n].host_name, bbsnet_conf[n].port, &hints, &res)) != 0)          if ((ret = getaddrinfo(bbsnet_conf[n].host_name, bbsnet_conf[n].port, &hints, &res)) != 0)
407          {          {
408                  log_error("getaddrinfo() error (%d): %s\n", ret, gai_strerror(ret));                  log_error("getaddrinfo() error (%d): %s", ret, gai_strerror(ret));
409                  prints("\033[1;31m查找主机名失败!\033[m\r\n");                  prints("\033[1;31m查找主机名失败!\033[m\r\n");
410                  press_any_key();                  press_any_key();
411                  ret = -1;                  ret = -1;
# Line 414  static int bbsnet_connect(int n) Line 414  static int bbsnet_connect(int n)
414    
415          if (inet_ntop(AF_INET, &(((struct sockaddr_in *)res->ai_addr)->sin_addr), remote_addr, sizeof(remote_addr)) == NULL)          if (inet_ntop(AF_INET, &(((struct sockaddr_in *)res->ai_addr)->sin_addr), remote_addr, sizeof(remote_addr)) == NULL)
416          {          {
417                  log_error("inet_ntop() error (%d)\n", errno);                  log_error("inet_ntop() error (%d)", errno);
418                  ret = -1;                  ret = -1;
419                  goto cleanup;                  goto cleanup;
420          }          }
# Line 423  static int bbsnet_connect(int n) Line 423  static int bbsnet_connect(int n)
423          // Set socket as non-blocking          // Set socket as non-blocking
424          if ((flags_sock = fcntl(sock, F_GETFL, 0)) == -1)          if ((flags_sock = fcntl(sock, F_GETFL, 0)) == -1)
425          {          {
426                  log_error("fcntl(F_GETFL) error (%d)\n", errno);                  log_error("fcntl(F_GETFL) error (%d)", errno);
427                  ret = -1;                  ret = -1;
428                  goto cleanup;                  goto cleanup;
429          }          }
430          if ((fcntl(sock, F_SETFL, flags_sock | O_NONBLOCK)) == -1)          if ((fcntl(sock, F_SETFL, flags_sock | O_NONBLOCK)) == -1)
431          {          {
432                  log_error("fcntl(F_SETFL) error (%d)\n", errno);                  log_error("fcntl(F_SETFL) error (%d)", errno);
433                  ret = -1;                  ret = -1;
434                  goto cleanup;                  goto cleanup;
435          }          }
# Line 437  static int bbsnet_connect(int n) Line 437  static int bbsnet_connect(int n)
437          // Set STDIN/STDOUT as non-blocking          // Set STDIN/STDOUT as non-blocking
438          if ((flags_stdin = fcntl(STDIN_FILENO, F_GETFL, 0)) == -1)          if ((flags_stdin = fcntl(STDIN_FILENO, F_GETFL, 0)) == -1)
439          {          {
440                  log_error("fcntl(F_GETFL) error (%d)\n", errno);                  log_error("fcntl(F_GETFL) error (%d)", errno);
441                  ret = -1;                  ret = -1;
442                  goto cleanup;                  goto cleanup;
443          }          }
444          if ((flags_stdout = fcntl(STDOUT_FILENO, F_GETFL, 0)) == -1)          if ((flags_stdout = fcntl(STDOUT_FILENO, F_GETFL, 0)) == -1)
445          {          {
446                  log_error("fcntl(F_GETFL) error (%d)\n", errno);                  log_error("fcntl(F_GETFL) error (%d)", errno);
447                  ret = -1;                  ret = -1;
448                  goto cleanup;                  goto cleanup;
449          }          }
450          if ((fcntl(STDIN_FILENO, F_SETFL, flags_stdin | O_NONBLOCK)) == -1)          if ((fcntl(STDIN_FILENO, F_SETFL, flags_stdin | O_NONBLOCK)) == -1)
451          {          {
452                  log_error("fcntl(F_SETFL) error (%d)\n", errno);                  log_error("fcntl(F_SETFL) error (%d)", errno);
453                  ret = -1;                  ret = -1;
454                  goto cleanup;                  goto cleanup;
455          }          }
456          if ((fcntl(STDOUT_FILENO, F_SETFL, flags_stdout | O_NONBLOCK)) == -1)          if ((fcntl(STDOUT_FILENO, F_SETFL, flags_stdout | O_NONBLOCK)) == -1)
457          {          {
458                  log_error("fcntl(F_SETFL) error (%d)\n", errno);                  log_error("fcntl(F_SETFL) error (%d)", errno);
459                  ret = -1;                  ret = -1;
460                  goto cleanup;                  goto cleanup;
461          }          }
# Line 464  static int bbsnet_connect(int n) Line 464  static int bbsnet_connect(int n)
464          epollfd = epoll_create1(0);          epollfd = epoll_create1(0);
465          if (epollfd < 0)          if (epollfd < 0)
466          {          {
467                  log_error("epoll_create1() error (%d)\n", errno);                  log_error("epoll_create1() error (%d)", errno);
468                  ret = -1;                  ret = -1;
469                  goto cleanup;                  goto cleanup;
470          }          }
# Line 473  static int bbsnet_connect(int n) Line 473  static int bbsnet_connect(int n)
473          ev.data.fd = sock;          ev.data.fd = sock;
474          if (epoll_ctl(epollfd, EPOLL_CTL_ADD, sock, &ev) == -1)          if (epoll_ctl(epollfd, EPOLL_CTL_ADD, sock, &ev) == -1)
475          {          {
476                  log_error("epoll_ctl(socket) error (%d)\n", errno);                  log_error("epoll_ctl(socket) error (%d)", errno);
477                  ret = -1;                  ret = -1;
478                  goto cleanup;                  goto cleanup;
479          }          }
# Line 482  static int bbsnet_connect(int n) Line 482  static int bbsnet_connect(int n)
482          ev.data.fd = STDIN_FILENO;          ev.data.fd = STDIN_FILENO;
483          if (epoll_ctl(epollfd, EPOLL_CTL_ADD, STDIN_FILENO, &ev) == -1)          if (epoll_ctl(epollfd, EPOLL_CTL_ADD, STDIN_FILENO, &ev) == -1)
484          {          {
485                  log_error("epoll_ctl(STDIN_FILENO) error (%d)\n", errno);                  log_error("epoll_ctl(STDIN_FILENO) error (%d)", errno);
486                  ret = -1;                  ret = -1;
487                  goto cleanup;                  goto cleanup;
488          }          }
# Line 510  static int bbsnet_connect(int n) Line 510  static int bbsnet_connect(int n)
510                          }                          }
511                          else                          else
512                          {                          {
513                                  log_error("connect(socket) error (%d)\n", errno);                                  log_error("connect(socket) error (%d)", errno);
514                                  prints("\033[1;31m连接失败!\033[m\r\n");                                  prints("\033[1;31m连接失败!\033[m\r\n");
515                                  press_any_key();                                  press_any_key();
516                                  ret = -1;                                  ret = -1;
# Line 525  static int bbsnet_connect(int n) Line 525  static int bbsnet_connect(int n)
525    
526          if (clock_gettime(CLOCK_REALTIME, &ts_begin) == -1)          if (clock_gettime(CLOCK_REALTIME, &ts_begin) == -1)
527          {          {
528                  log_error("clock_gettime() error (%d)\n", errno);                  log_error("clock_gettime() error (%d)", errno);
529                  ret = -1;                  ret = -1;
530                  goto cleanup;                  goto cleanup;
531          }          }
532          ts_now = ts_begin;          ts_now = ts_begin;
533    
534          while ((ts_now.tv_sec - ts_begin.tv_sec) +          while ((ts_now.tv_sec - ts_begin.tv_sec) * 1000 +
535                                     (ts_now.tv_nsec - ts_begin.tv_nsec) / 1000 / 1000 / 1000 <                                     (ts_now.tv_nsec - ts_begin.tv_nsec) / 1000 / 1000 <
536                             REMOTE_CONNECT_TIMEOUT &&                             REMOTE_CONNECT_TIMEOUT * 1000 &&
537                     !sock_connected && !SYS_server_exit)                     !sock_connected && !SYS_server_exit)
538          {          {
539  #ifdef HAVE_SYS_EPOLL_H  #ifdef HAVE_SYS_EPOLL_H
# Line 553  static int bbsnet_connect(int n) Line 553  static int bbsnet_connect(int n)
553                          if (errno != EINTR)                          if (errno != EINTR)
554                          {                          {
555  #ifdef HAVE_SYS_EPOLL_H  #ifdef HAVE_SYS_EPOLL_H
556                                  log_error("epoll_wait() error (%d)\n", errno);                                  log_error("epoll_wait() error (%d)", errno);
557  #else  #else
558                                  log_error("poll() error (%d)\n", errno);                                  log_error("poll() error (%d)", errno);
559  #endif  #endif
560                                  break;                                  break;
561                          }                          }
# Line 564  static int bbsnet_connect(int n) Line 564  static int bbsnet_connect(int n)
564                  {                  {
565                          if (clock_gettime(CLOCK_REALTIME, &ts_now) == -1)                          if (clock_gettime(CLOCK_REALTIME, &ts_now) == -1)
566                          {                          {
567                                  log_error("clock_gettime() error (%d)\n", errno);                                  log_error("clock_gettime() error (%d)", errno);
568                                  ret = -1;                                  ret = -1;
569                                  goto cleanup;                                  goto cleanup;
570                          }                          }
# Line 573  static int bbsnet_connect(int n) Line 573  static int bbsnet_connect(int n)
573                                                           (ts_now.tv_nsec - ts_begin.tv_nsec) / 1000 / 1000) /                                                           (ts_now.tv_nsec - ts_begin.tv_nsec) / 1000 / 1000) /
574                                                     REMOTE_CONNECT_TIMEOUT / 10 +                                                     REMOTE_CONNECT_TIMEOUT / 10 +
575                                             1;                                             1;
576                            if (progress < 0)
577                            {
578                                    progress = 0;
579                            }
580                            if (progress > 100)
581                            {
582                                    progress = 100;
583                            }
584    
585                          if (progress > progress_last)                          if (progress > progress_last)
586                          {                          {
# Line 593  static int bbsnet_connect(int n) Line 601  static int bbsnet_connect(int n)
601                                          socklen_t len = sizeof(error);                                          socklen_t len = sizeof(error);
602                                          if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &len) < 0)                                          if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
603                                          {                                          {
604                                                  log_error("getsockopt() error (%d) !\n", errno);                                                  log_error("getsockopt() error (%d) !", errno);
605                                                  ret = -1;                                                  ret = -1;
606                                                  goto cleanup;                                                  goto cleanup;
607                                          }                                          }
# Line 639  static int bbsnet_connect(int n) Line 647  static int bbsnet_connect(int n)
647          tos = IPTOS_LOWDELAY;          tos = IPTOS_LOWDELAY;
648          if (setsockopt(sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) < 0)          if (setsockopt(sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) < 0)
649          {          {
650                  log_error("setsockopt IP_TOS=%d error (%d)\n", tos, errno);                  log_error("setsockopt IP_TOS=%d error (%d)", tos, errno);
651          }          }
652    
653          sock_len = sizeof(sin);          sock_len = sizeof(sin);
# Line 652  static int bbsnet_connect(int n) Line 660  static int bbsnet_connect(int n)
660    
661          if (inet_ntop(AF_INET, &(sin.sin_addr), local_addr, sizeof(local_addr)) == NULL)          if (inet_ntop(AF_INET, &(sin.sin_addr), local_addr, sizeof(local_addr)) == NULL)
662          {          {
663                  log_error("inet_ntop() error (%d)\n", errno);                  log_error("inet_ntop() error (%d)", errno);
664                  ret = -1;                  ret = -1;
665                  goto cleanup;                  goto cleanup;
666          }          }
# Line 663  static int bbsnet_connect(int n) Line 671  static int bbsnet_connect(int n)
671                  outbound_session = ssh_new();                  outbound_session = ssh_new();
672                  if (outbound_session == NULL)                  if (outbound_session == NULL)
673                  {                  {
674                          log_error("ssh_new() error\n");                          log_error("ssh_new() error");
675                          ret = -1;                          ret = -1;
676                          goto cleanup;                          goto cleanup;
677                  }                  }
# Line 676  static int bbsnet_connect(int n) Line 684  static int bbsnet_connect(int n)
684                          ssh_options_set(outbound_session, SSH_OPTIONS_HOSTKEYS, "+ssh-ed25519,ecdsa-sha2-nistp256,ssh-rsa") < 0 ||                          ssh_options_set(outbound_session, SSH_OPTIONS_HOSTKEYS, "+ssh-ed25519,ecdsa-sha2-nistp256,ssh-rsa") < 0 ||
685                          ssh_options_set(outbound_session, SSH_OPTIONS_LOG_VERBOSITY, &ssh_log_level) < 0)                          ssh_options_set(outbound_session, SSH_OPTIONS_LOG_VERBOSITY, &ssh_log_level) < 0)
686                  {                  {
687                          log_error("Error setting SSH options: %s\n", ssh_get_error(outbound_session));                          log_error("Error setting SSH options: %s", ssh_get_error(outbound_session));
688                          ret = -1;                          ret = -1;
689                          goto cleanup;                          goto cleanup;
690                  }                  }
# Line 694  static int bbsnet_connect(int n) Line 702  static int bbsnet_connect(int n)
702                          }                          }
703                          else if (ret == SSH_AGAIN)                          else if (ret == SSH_AGAIN)
704                          {                          {
705                                  // log_debug("ssh_connect() error: SSH_AGAIN\n");                                  // log_debug("ssh_connect() error: SSH_AGAIN");
706                          }                          }
707                          else // if (ret == SSH_ERROR)                          else // if (ret == SSH_ERROR)
708                          {                          {
709                                  log_error("ssh_connect() error: SSH_ERROR\n");                                  log_error("ssh_connect() error: SSH_ERROR");
710                                  ret = -1;                                  ret = -1;
711                                  goto cleanup;                                  goto cleanup;
712                          }                          }
# Line 718  static int bbsnet_connect(int n) Line 726  static int bbsnet_connect(int n)
726                  case SSH_KNOWN_HOSTS_UNKNOWN:                  case SSH_KNOWN_HOSTS_UNKNOWN:
727                          if (ssh_session_update_known_hosts(outbound_session) != SSH_OK)                          if (ssh_session_update_known_hosts(outbound_session) != SSH_OK)
728                          {                          {
729                                  log_error("ssh_session_update_known_hosts(%s) error\n", bbsnet_conf[n].host_name);                                  log_error("ssh_session_update_known_hosts(%s) error", bbsnet_conf[n].host_name);
730                                  prints("\033[1;31m无法添加服务器证书\033[m\r\n");                                  prints("\033[1;31m无法添加服务器证书\033[m\r\n");
731                                  press_any_key();                                  press_any_key();
732                                  ret = -1;                                  ret = -1;
733                                  goto cleanup;                                  goto cleanup;
734                          }                          }
735                          log_common("SSH key of (%s) is added into %s\n", bbsnet_conf[n].host_name, SSH_KNOWN_HOSTS_FILE);                          log_common("SSH key of (%s) is added into %s", bbsnet_conf[n].host_name, SSH_KNOWN_HOSTS_FILE);
736                  case SSH_KNOWN_HOSTS_OK:                  case SSH_KNOWN_HOSTS_OK:
737                          break;                          break;
738                  case SSH_KNOWN_HOSTS_CHANGED:                  case SSH_KNOWN_HOSTS_CHANGED:
739                  case SSH_KNOWN_HOSTS_OTHER:                  case SSH_KNOWN_HOSTS_OTHER:
740                          log_error("ssh_session_is_known_server(%s) error: %d\n", bbsnet_conf[n].host_name, ret);                          log_error("ssh_session_is_known_server(%s) error: %d", bbsnet_conf[n].host_name, ret);
741                          prints("\033[1;31m服务器证书已变更\033[m\r\n");                          prints("\033[1;31m服务器证书已变更\033[m\r\n");
742                          press_any_key();                          press_any_key();
743                          ret = -1;                          ret = -1;
# Line 746  static int bbsnet_connect(int n) Line 754  static int bbsnet_connect(int n)
754                          }                          }
755                          else if (ret == SSH_AUTH_AGAIN)                          else if (ret == SSH_AUTH_AGAIN)
756                          {                          {
757                                  // log_debug("ssh_userauth_password() error: SSH_AUTH_AGAIN\n");                                  // log_debug("ssh_userauth_password() error: SSH_AUTH_AGAIN");
758                          }                          }
759                          else if (ret == SSH_AUTH_ERROR)                          else if (ret == SSH_AUTH_ERROR)
760                          {                          {
761                                  log_error("ssh_userauth_password() error: SSH_AUTH_ERROR\n");                                  log_error("ssh_userauth_password() error: SSH_AUTH_ERROR");
762                                  ret = -1;                                  ret = -1;
763                                  goto cleanup;                                  goto cleanup;
764                          }                          }
765                          else // if (ret == SSH_AUTH_DENIED)                          else // if (ret == SSH_AUTH_DENIED)
766                          {                          {
767                                  log_error("ssh_userauth_password() error: SSH_AUTH_DENIED\n");                                  log_error("ssh_userauth_password() error: SSH_AUTH_DENIED");
768                                  prints("\033[1;31m身份验证失败!\033[m\r\n");                                  prints("\033[1;31m身份验证失败!\033[m\r\n");
769                                  press_any_key();                                  press_any_key();
770                                  ret = -1;                                  ret = -1;
# Line 774  static int bbsnet_connect(int n) Line 782  static int bbsnet_connect(int n)
782                  outbound_channel = ssh_channel_new(outbound_session);                  outbound_channel = ssh_channel_new(outbound_session);
783                  if (outbound_channel == NULL)                  if (outbound_channel == NULL)
784                  {                  {
785                          log_error("ssh_channel_new() error\n");                          log_error("ssh_channel_new() error");
786                          ret = -1;                          ret = -1;
787                          goto cleanup;                          goto cleanup;
788                  }                  }
# Line 789  static int bbsnet_connect(int n) Line 797  static int bbsnet_connect(int n)
797                          }                          }
798                          else if (ret == SSH_AGAIN)                          else if (ret == SSH_AGAIN)
799                          {                          {
800                                  // log_debug("ssh_channel_open_session() error: SSH_AGAIN\n");                                  // log_debug("ssh_channel_open_session() error: SSH_AGAIN");
801                          }                          }
802                          else // if (ret == SSH_ERROR)                          else // if (ret == SSH_ERROR)
803                          {                          {
804                                  log_error("ssh_channel_open_session() error: SSH_ERROR\n");                                  log_error("ssh_channel_open_session() error: SSH_ERROR");
805                                  ret = -1;                                  ret = -1;
806                                  goto cleanup;                                  goto cleanup;
807                          }                          }
# Line 816  static int bbsnet_connect(int n) Line 824  static int bbsnet_connect(int n)
824                          }                          }
825                          else if (ret == SSH_AGAIN)                          else if (ret == SSH_AGAIN)
826                          {                          {
827                                  // log_debug("ssh_channel_request_pty() error: SSH_AGAIN\n");                                  // log_debug("ssh_channel_request_pty() error: SSH_AGAIN");
828                          }                          }
829                          else // if (ret == SSH_ERROR)                          else // if (ret == SSH_ERROR)
830                          {                          {
831                                  log_error("ssh_channel_request_pty() error: SSH_ERROR\n");                                  log_error("ssh_channel_request_pty() error: SSH_ERROR");
832                                  ret = -1;                                  ret = -1;
833                                  goto cleanup;                                  goto cleanup;
834                          }                          }
# Line 843  static int bbsnet_connect(int n) Line 851  static int bbsnet_connect(int n)
851                          }                          }
852                          else if (ret == SSH_AGAIN)                          else if (ret == SSH_AGAIN)
853                          {                          {
854                                  // log_debug("ssh_channel_request_shell() error: SSH_AGAIN\n");                                  // log_debug("ssh_channel_request_shell() error: SSH_AGAIN");
855                          }                          }
856                          else // if (ret == SSH_ERROR)                          else // if (ret == SSH_ERROR)
857                          {                          {
858                                  log_error("ssh_channel_request_shell() error: SSH_ERROR\n");                                  log_error("ssh_channel_request_shell() error: SSH_ERROR");
859                                  ret = -1;                                  ret = -1;
860                                  goto cleanup;                                  goto cleanup;
861                          }                          }
# Line 863  static int bbsnet_connect(int n) Line 871  static int bbsnet_connect(int n)
871    
872          prints("\033[1;31m连接成功!\033[m\r\n");          prints("\033[1;31m连接成功!\033[m\r\n");
873          iflush();          iflush();
874          log_common("BBSNET connect to %s:%d from %s:%d by [%s]\n",          log_common("BBSNET connect to %s:%d from %s:%d by [%s]",
875                             remote_addr, remote_port, local_addr, local_port, BBS_username);                             remote_addr, remote_port, local_addr, local_port, BBS_username);
876    
877          snprintf(tocode, sizeof(tocode), "%s%s", bbsnet_conf[n].charset,          snprintf(tocode, sizeof(tocode), "%s%s", bbsnet_conf[n].charset,
# Line 871  static int bbsnet_connect(int n) Line 879  static int bbsnet_connect(int n)
879          input_cd = iconv_open(tocode, stdio_charset);          input_cd = iconv_open(tocode, stdio_charset);
880          if (input_cd == (iconv_t)(-1))          if (input_cd == (iconv_t)(-1))
881          {          {
882                  log_error("iconv_open(%s->%s) error: %d\n", stdio_charset, tocode, errno);                  log_error("iconv_open(%s->%s) error: %d", stdio_charset, tocode, errno);
883                  ret = -1;                  ret = -1;
884                  goto cleanup;                  goto cleanup;
885          }          }
# Line 881  static int bbsnet_connect(int n) Line 889  static int bbsnet_connect(int n)
889          output_cd = iconv_open(tocode, bbsnet_conf[n].charset);          output_cd = iconv_open(tocode, bbsnet_conf[n].charset);
890          if (output_cd == (iconv_t)(-1))          if (output_cd == (iconv_t)(-1))
891          {          {
892                  log_error("iconv_open(%s->%s) error: %d\n", bbsnet_conf[n].charset, tocode, errno);                  log_error("iconv_open(%s->%s) error: %d", bbsnet_conf[n].charset, tocode, errno);
893                  ret = -1;                  ret = -1;
894                  goto cleanup;                  goto cleanup;
895          }          }
# Line 891  static int bbsnet_connect(int n) Line 899  static int bbsnet_connect(int n)
899          ev.data.fd = sock;          ev.data.fd = sock;
900          if (epoll_ctl(epollfd, EPOLL_CTL_MOD, sock, &ev) == -1)          if (epoll_ctl(epollfd, EPOLL_CTL_MOD, sock, &ev) == -1)
901          {          {
902                  log_error("epoll_ctl(socket) error (%d)\n", errno);                  log_error("epoll_ctl(socket) error (%d)", errno);
903                  ret = -1;                  ret = -1;
904                  goto cleanup;                  goto cleanup;
905          }          }
# Line 900  static int bbsnet_connect(int n) Line 908  static int bbsnet_connect(int n)
908          ev.data.fd = STDOUT_FILENO;          ev.data.fd = STDOUT_FILENO;
909          if (epoll_ctl(epollfd, EPOLL_CTL_ADD, STDOUT_FILENO, &ev) == -1)          if (epoll_ctl(epollfd, EPOLL_CTL_ADD, STDOUT_FILENO, &ev) == -1)
910          {          {
911                  log_error("epoll_ctl(STDOUT_FILENO) error (%d)\n", errno);                  log_error("epoll_ctl(STDOUT_FILENO) error (%d)", errno);
912                  ret = -1;                  ret = -1;
913                  goto cleanup;                  goto cleanup;
914          }          }
# Line 913  static int bbsnet_connect(int n) Line 921  static int bbsnet_connect(int n)
921          {          {
922                  if (SSH_v2 && ssh_channel_is_closed(SSH_channel))                  if (SSH_v2 && ssh_channel_is_closed(SSH_channel))
923                  {                  {
924                          log_debug("SSH channel is closed\n");                          log_debug("SSH channel is closed");
925                          loop = 0;                          loop = 0;
926                          break;                          break;
927                  }                  }
928    
929                  if (bbsnet_conf[n].use_ssh && ssh_channel_is_closed(outbound_channel))                  if (bbsnet_conf[n].use_ssh && ssh_channel_is_closed(outbound_channel))
930                  {                  {
931                          log_debug("Outbound channel is closed\n");                          log_debug("Outbound channel is closed");
932                          loop = 0;                          loop = 0;
933                          break;                          break;
934                  }                  }
# Line 944  static int bbsnet_connect(int n) Line 952  static int bbsnet_connect(int n)
952                          if (errno != EINTR)                          if (errno != EINTR)
953                          {                          {
954  #ifdef HAVE_SYS_EPOLL_H  #ifdef HAVE_SYS_EPOLL_H
955                                  log_error("epoll_wait() error (%d)\n", errno);                                  log_error("epoll_wait() error (%d)", errno);
956  #else  #else
957                                  log_error("poll() error (%d)\n", errno);                                  log_error("poll() error (%d)", errno);
958  #endif  #endif
959                                  break;                                  break;
960                          }                          }
# Line 956  static int bbsnet_connect(int n) Line 964  static int bbsnet_connect(int n)
964                  {                  {
965                          if (time(NULL) - BBS_last_access_tm >= BBS_max_user_idle_time)                          if (time(NULL) - BBS_last_access_tm >= BBS_max_user_idle_time)
966                          {                          {
967                                    log_debug("User input timeout");
968                                  break;                                  break;
969                          }                          }
970                  }                  }
# Line 969  static int bbsnet_connect(int n) Line 978  static int bbsnet_connect(int n)
978  #endif  #endif
979                          {                          {
980  #ifdef HAVE_SYS_EPOLL_H  #ifdef HAVE_SYS_EPOLL_H
981                                  log_debug("FD (%d) error events (%d)\n", events[i].data.fd, events[i].events);                                  log_debug("FD (%d) error events (%d)", events[i].data.fd, events[i].events);
982  #else  #else
983                                  log_debug("FD (%d) error events (%d)\n", pfds[i].fd, pfds[i].revents);                                  log_debug("FD (%d) error events (%d)", pfds[i].fd, pfds[i].revents);
984  #endif  #endif
985                                  loop = 0;                                  loop = 0;
986                                  break;                                  break;
# Line 1030  static int bbsnet_connect(int n) Line 1039  static int bbsnet_connect(int n)
1039                                          ret = ssh_channel_read_nonblocking(SSH_channel, input_buf + input_buf_len, sizeof(input_buf) - (uint32_t)input_buf_len, 0);                                          ret = ssh_channel_read_nonblocking(SSH_channel, input_buf + input_buf_len, sizeof(input_buf) - (uint32_t)input_buf_len, 0);
1040                                          if (ret == SSH_ERROR)                                          if (ret == SSH_ERROR)
1041                                          {                                          {
1042                                                  log_debug("ssh_channel_read_nonblocking() error: %s\n", ssh_get_error(SSH_session));                                                  log_debug("ssh_channel_read_nonblocking() error: %s", ssh_get_error(SSH_session));
1043                                                  loop = 0;                                                  loop = 0;
1044                                                  break;                                                  break;
1045                                          }                                          }
# Line 1068  static int bbsnet_connect(int n) Line 1077  static int bbsnet_connect(int n)
1077                                          }                                          }
1078                                          else                                          else
1079                                          {                                          {
1080                                                  log_error("read(STDIN) error (%d)\n", errno);                                                  log_error("read(STDIN) error (%d)", errno);
1081                                                  loop = 0;                                                  loop = 0;
1082                                                  break;                                                  break;
1083                                          }                                          }
1084                                  }                                  }
1085                                  else if (ret == 0) // broken pipe                                  else if (ret == 0) // broken pipe
1086                                  {                                  {
1087                                          log_debug("read(STDIN) EOF\n");                                          log_debug("read(STDIN) EOF");
1088                                          stdin_read_wait = 0;                                          stdin_read_wait = 0;
1089                                          loop = 0;                                          loop = 0;
1090                                          break;                                          break;
# Line 1088  static int bbsnet_connect(int n) Line 1097  static int bbsnet_connect(int n)
1097                                          // Refresh current action while user input                                          // Refresh current action while user input
1098                                          if (user_online_update("BBS_NET") < 0)                                          if (user_online_update("BBS_NET") < 0)
1099                                          {                                          {
1100                                                  log_error("user_online_update(BBS_NET) error\n");                                                  log_error("user_online_update(BBS_NET) error");
1101                                          }                                          }
1102    
1103                                          continue;                                          continue;
# Line 1104  static int bbsnet_connect(int n) Line 1113  static int bbsnet_connect(int n)
1113  #ifdef _DEBUG  #ifdef _DEBUG
1114                                  for (int j = input_buf_offset; j < input_buf_len; j++)                                  for (int j = input_buf_offset; j < input_buf_len; j++)
1115                                  {                                  {
1116                                          log_debug("input: <--[%u]\n", (input_buf[j] + 256) % 256);                                          log_debug("input: <--[%u]", (input_buf[j] + 256) % 256);
1117                                  }                                  }
1118  #endif  #endif
1119    
1120                                  ret = io_buf_conv(input_cd, input_buf, &input_buf_len, &input_buf_offset, input_conv, sizeof(input_conv), &input_conv_len);                                  ret = io_buf_conv(input_cd, input_buf, &input_buf_len, &input_buf_offset, input_conv, sizeof(input_conv), &input_conv_len);
1121                                  if (ret < 0)                                  if (ret < 0)
1122                                  {                                  {
1123                                          log_error("io_buf_conv(input, %d, %d, %d) error\n", input_buf_len, input_buf_offset, input_conv_len);                                          log_error("io_buf_conv(input, %d, %d, %d) error", input_buf_len, input_buf_offset, input_conv_len);
1124                                          input_buf_len = input_buf_offset; // Discard invalid sequence                                          input_buf_len = input_buf_offset; // Discard invalid sequence
1125                                  }                                  }
1126    
# Line 1119  static int bbsnet_connect(int n) Line 1128  static int bbsnet_connect(int n)
1128  #ifdef _DEBUG  #ifdef _DEBUG
1129                                  for (int j = input_conv_offset; j < input_conv_len; j++)                                  for (int j = input_conv_offset; j < input_conv_len; j++)
1130                                  {                                  {
1131                                          log_debug("input_conv: <--[%u]\n", (input_conv[j] + 256) % 256);                                          log_debug("input_conv: <--[%u]", (input_conv[j] + 256) % 256);
1132                                  }                                  }
1133  #endif  #endif
1134                          }                          }
# Line 1131  static int bbsnet_connect(int n) Line 1140  static int bbsnet_connect(int n)
1140                                          ret = ssh_channel_write(outbound_channel, input_conv + input_conv_offset, (uint32_t)(input_conv_len - input_conv_offset));                                          ret = ssh_channel_write(outbound_channel, input_conv + input_conv_offset, (uint32_t)(input_conv_len - input_conv_offset));
1141                                          if (ret == SSH_ERROR)                                          if (ret == SSH_ERROR)
1142                                          {                                          {
1143                                                  log_debug("ssh_channel_write() error: %s\n", ssh_get_error(outbound_session));                                                  log_debug("ssh_channel_write() error: %s", ssh_get_error(outbound_session));
1144                                                  loop = 0;                                                  loop = 0;
1145                                                  break;                                                  break;
1146                                          }                                          }
# Line 1153  static int bbsnet_connect(int n) Line 1162  static int bbsnet_connect(int n)
1162                                          }                                          }
1163                                          else                                          else
1164                                          {                                          {
1165                                                  log_debug("write(socket) error (%d)\n", errno);                                                  log_debug("write(socket) error (%d)", errno);
1166                                                  loop = 0;                                                  loop = 0;
1167                                                  break;                                                  break;
1168                                          }                                          }
1169                                  }                                  }
1170                                  else if (ret == 0) // broken pipe                                  else if (ret == 0) // broken pipe
1171                                  {                                  {
1172                                          log_debug("write(socket) EOF\n");                                          log_debug("write(socket) EOF");
1173                                          sock_write_wait = 0;                                          sock_write_wait = 0;
1174                                          loop = 0;                                          loop = 0;
1175                                          break;                                          break;
# Line 1189  static int bbsnet_connect(int n) Line 1198  static int bbsnet_connect(int n)
1198                                                                                                             (uint32_t)(sizeof(output_buf) - (size_t)output_buf_len), 0);                                                                                                             (uint32_t)(sizeof(output_buf) - (size_t)output_buf_len), 0);
1199                                          if (ret == SSH_ERROR)                                          if (ret == SSH_ERROR)
1200                                          {                                          {
1201                                                  log_debug("ssh_channel_read_nonblocking() error: %s\n", ssh_get_error(outbound_session));                                                  log_debug("ssh_channel_read_nonblocking() error: %s", ssh_get_error(outbound_session));
1202                                                  loop = 0;                                                  loop = 0;
1203                                                  break;                                                  break;
1204                                          }                                          }
# Line 1222  static int bbsnet_connect(int n) Line 1231  static int bbsnet_connect(int n)
1231                                          }                                          }
1232                                          else                                          else
1233                                          {                                          {
1234                                                  log_debug("read(socket) error (%d)\n", errno);                                                  log_debug("read(socket) error (%d)", errno);
1235                                                  loop = 0;                                                  loop = 0;
1236                                                  break;                                                  break;
1237                                          }                                          }
1238                                  }                                  }
1239                                  else if (ret == 0) // broken pipe                                  else if (ret == 0) // broken pipe
1240                                  {                                  {
1241                                          log_debug("read(socket) EOF\n");                                          log_debug("read(socket) EOF");
1242                                          sock_read_wait = 0;                                          sock_read_wait = 0;
1243                                          loop = 0;                                          loop = 0;
1244                                          break;                                          break;
# Line 1249  static int bbsnet_connect(int n) Line 1258  static int bbsnet_connect(int n)
1258                                  ret = io_buf_conv(output_cd, output_buf, &output_buf_len, &output_buf_offset, output_conv, sizeof(output_conv), &output_conv_len);                                  ret = io_buf_conv(output_cd, output_buf, &output_buf_len, &output_buf_offset, output_conv, sizeof(output_conv), &output_conv_len);
1259                                  if (ret < 0)                                  if (ret < 0)
1260                                  {                                  {
1261                                          log_error("io_buf_conv(output, %d, %d, %d) error\n", output_buf_len, output_buf_offset, output_conv_len);                                          log_error("io_buf_conv(output, %d, %d, %d) error", output_buf_len, output_buf_offset, output_conv_len);
1262                                          output_buf_len = output_buf_offset; // Discard invalid sequence                                          output_buf_len = output_buf_offset; // Discard invalid sequence
1263                                  }                                  }
1264                          }                          }
# Line 1261  static int bbsnet_connect(int n) Line 1270  static int bbsnet_connect(int n)
1270                                          ret = ssh_channel_write(SSH_channel, output_conv + output_conv_offset, (uint32_t)(output_conv_len - output_conv_offset));                                          ret = ssh_channel_write(SSH_channel, output_conv + output_conv_offset, (uint32_t)(output_conv_len - output_conv_offset));
1271                                          if (ret == SSH_ERROR)                                          if (ret == SSH_ERROR)
1272                                          {                                          {
1273                                                  log_debug("ssh_channel_write() error: %s\n", ssh_get_error(SSH_session));                                                  log_debug("ssh_channel_write() error: %s", ssh_get_error(SSH_session));
1274                                                  loop = 0;                                                  loop = 0;
1275                                                  break;                                                  break;
1276                                          }                                          }
# Line 1283  static int bbsnet_connect(int n) Line 1292  static int bbsnet_connect(int n)
1292                                          }                                          }
1293                                          else                                          else
1294                                          {                                          {
1295                                                  log_debug("write(STDOUT) error (%d)\n", errno);                                                  log_debug("write(STDOUT) error (%d)", errno);
1296                                                  loop = 0;                                                  loop = 0;
1297                                                  break;                                                  break;
1298                                          }                                          }
1299                                  }                                  }
1300                                  else if (ret == 0) // broken pipe                                  else if (ret == 0) // broken pipe
1301                                  {                                  {
1302                                          log_debug("write(STDOUT) EOF\n");                                          log_debug("write(STDOUT) EOF");
1303                                          stdout_write_wait = 0;                                          stdout_write_wait = 0;
1304                                          loop = 0;                                          loop = 0;
1305                                          break;                                          break;
# Line 1313  static int bbsnet_connect(int n) Line 1322  static int bbsnet_connect(int n)
1322          ret = 1; // Normal disconnect          ret = 1; // Normal disconnect
1323          BBS_last_access_tm = time(NULL);          BBS_last_access_tm = time(NULL);
1324          t_used = BBS_last_access_tm - t_begin;          t_used = BBS_last_access_tm - t_begin;
1325          log_common("BBSNET disconnect, %d days %d hours %d minutes %d seconds used\n",          log_common("BBSNET disconnect, %ld days %ld hours %ld minutes %ld seconds used",
1326                             t_used / 86400, t_used % 86400 / 3600, t_used % 3600 / 60, t_used % 60);                             t_used / 86400, t_used % 86400 / 3600, t_used % 3600 / 60, t_used % 60);
1327    
1328  cleanup:  cleanup:
# Line 1333  cleanup: Line 1342  cleanup:
1342  #ifdef HAVE_SYS_EPOLL_H  #ifdef HAVE_SYS_EPOLL_H
1343          if (epollfd != -1 && close(epollfd) < 0)          if (epollfd != -1 && close(epollfd) < 0)
1344          {          {
1345                  log_error("close(epoll) error (%d)\n");                  log_error("close(epoll) error (%d)");
1346          }          }
1347  #endif  #endif
1348    
# Line 1355  cleanup: Line 1364  cleanup:
1364          // Restore STDIN/STDOUT flags          // Restore STDIN/STDOUT flags
1365          if (flags_stdin != -1 && fcntl(STDIN_FILENO, F_SETFL, flags_stdin) == -1)          if (flags_stdin != -1 && fcntl(STDIN_FILENO, F_SETFL, flags_stdin) == -1)
1366          {          {
1367                  log_error("fcntl(F_SETFL) error (%d)\n", errno);                  log_error("fcntl(F_SETFL) error (%d)", errno);
1368          }          }
1369          if (flags_stdout != -1 && fcntl(STDOUT_FILENO, F_SETFL, flags_stdout) == -1)          if (flags_stdout != -1 && fcntl(STDOUT_FILENO, F_SETFL, flags_stdout) == -1)
1370          {          {
1371                  log_error("fcntl(F_SETFL) error (%d)\n", errno);                  log_error("fcntl(F_SETFL) error (%d)", errno);
1372          }          }
1373    
1374          if (sock != -1 && close(sock) == -1)          if (sock != -1 && close(sock) == -1)
1375          {          {
1376                  log_error("Close socket failed\n");                  log_error("close(socket) error (%d)", errno);
1377          }          }
1378    
1379          if (res)          if (res)
# Line 1425  static int bbsnet_selchange() Line 1434  static int bbsnet_selchange()
1434    
1435  int bbs_net()  int bbs_net()
1436  {  {
1437          int ch, i;          int ch;
1438    
1439          if (load_bbsnet_conf(CONF_BBSNET) < 0)          if (load_bbsnet_conf(CONF_BBSNET) < 0)
1440          {          {
# Line 1452  int bbs_net() Line 1461  int bbs_net()
1461                  switch (ch)                  switch (ch)
1462                  {                  {
1463                  case KEY_NULL: // broken pipe                  case KEY_NULL: // broken pipe
1464                          log_debug("KEY_NULL\n");                          log_debug("KEY_NULL");
1465                          goto cleanup;                          goto cleanup;
1466                  case KEY_TIMEOUT:                  case KEY_TIMEOUT:
1467                          if (time(NULL) - BBS_last_access_tm >= BBS_max_user_idle_time)                          if (time(NULL) - BBS_last_access_tm >= BBS_max_user_idle_time)
1468                          {                          {
1469                                  log_error("User input timeout\n");                                  log_debug("User input timeout");
1470                                  goto cleanup;                                  goto cleanup;
1471                          }                          }
1472                          continue;                          continue;
# Line 1465  int bbs_net() Line 1474  int bbs_net()
1474                  case Ctrl('C'): // user cancel                  case Ctrl('C'): // user cancel
1475                          goto cleanup;                          goto cleanup;
1476                  case CR:                  case CR:
1477                          bbsnet_connect(bbsnet_menu.menu_item_pos[0]);                          if (bbsnet_connect(bbsnet_menu.menu_item_pos[0]) < 0)
1478                            {
1479                                    log_debug("bbsnet_connect() error");
1480                            }
1481                          // Force cleanup anything remaining in the output buffer                          // Force cleanup anything remaining in the output buffer
1482                          clearscr();                          clearscr();
1483                          iflush();                          iflush();
# Line 1475  int bbs_net() Line 1487  int bbs_net()
1487                          bbsnet_selchange();                          bbsnet_selchange();
1488                          break;                          break;
1489                  case KEY_UP:                  case KEY_UP:
1490                          for (i = 0; i < STATION_PER_LINE; i++)                          for (int i = 0; i < STATION_PER_LINE; i++)
1491                          {                          {
1492                                  menu_control(&bbsnet_menu, KEY_UP);                                  menu_control(&bbsnet_menu, KEY_UP);
1493                          }                          }
1494                          bbsnet_selchange();                          bbsnet_selchange();
1495                          break;                          break;
1496                  case KEY_DOWN:                  case KEY_DOWN:
1497                          for (i = 0; i < STATION_PER_LINE; i++)                          for (int i = 0; i < STATION_PER_LINE; i++)
1498                          {                          {
1499                                  menu_control(&bbsnet_menu, KEY_DOWN);                                  menu_control(&bbsnet_menu, KEY_DOWN);
1500                          }                          }


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1