/[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.38 by sysadm, Tue May 13 02:21:39 2025 UTC Revision 1.40 by sysadm, Wed May 14 04:22:45 2025 UTC
# Line 67  int load_bbsnet_conf(const char *file_co Line 67  int load_bbsnet_conf(const char *file_co
67                  return -1;                  return -1;
68          }          }
69    
70          p_menu = bbsnet_menu.p_menu[0] = malloc(sizeof(MENU));          bbsnet_menu.p_menu_name_dict = trie_dict_create();
71    
72            p_menu = malloc(sizeof(MENU));
73            bbsnet_menu.p_menu[0] = p_menu;
74          strncpy(p_menu->name, "BBSNET", sizeof(p_menu->name) - 1);          strncpy(p_menu->name, "BBSNET", sizeof(p_menu->name) - 1);
75          p_menu->name[sizeof(p_menu->name) - 1] = '\0';          p_menu->name[sizeof(p_menu->name) - 1] = '\0';
76          p_menu->title.show = 0;          p_menu->title.show = 0;
77          p_menu->screen.show = 0;          p_menu->screen.show = 0;
78    
79            if (trie_dict_set(bbsnet_menu.p_menu_name_dict, p_menu->name, (int64_t)p_menu) != 1)
80            {
81                    log_error("Error set BBSNET menu dict [%s]\n", p_menu->name);
82            }
83    
84          while (fgets(t, 255, fp) && item_count < MAXSTATION)          while (fgets(t, 255, fp) && item_count < MAXSTATION)
85          {          {
86                  t1 = strtok_r(t, MENU_CONF_DELIM, &saveptr);                  t1 = strtok_r(t, MENU_CONF_DELIM, &saveptr);
# Line 121  int load_bbsnet_conf(const char *file_co Line 129  int load_bbsnet_conf(const char *file_co
129          return 0;          return 0;
130  }  }
131    
132  static void process_bar(int n, int len)  void unload_bbsnet_conf(void)
133    {
134            unload_menu(&bbsnet_menu);
135    }
136    
137    void process_bar(int n, int len)
138  {  {
139          char buf[LINE_BUFFER_LEN];          char buf[LINE_BUFFER_LEN];
140          char buf2[LINE_BUFFER_LEN];          char buf2[LINE_BUFFER_LEN];
# Line 226  int bbsnet_connect(int n) Line 239  int bbsnet_connect(int n)
239          prints("\033[1;32m穿梭进度条提示您当前已使用的时间,按\033[1;33mCtrl+C\033[1;32m中断。\033[m\r\n");          prints("\033[1;32m穿梭进度条提示您当前已使用的时间,按\033[1;33mCtrl+C\033[1;32m中断。\033[m\r\n");
240          process_bar(0, MAX_PROCESS_BAR_LEN);          process_bar(0, MAX_PROCESS_BAR_LEN);
241    
242            // Set socket as non-blocking
243            flags_sock = fcntl(sock, F_GETFL, 0);
244            fcntl(sock, F_SETFL, flags_sock | O_NONBLOCK);
245    
246            // Set STDIN/STDOUT as non-blocking
247            flags_stdin = fcntl(STDIN_FILENO, F_GETFL, 0);
248            flags_stdout = fcntl(STDOUT_FILENO, F_GETFL, 0);
249            fcntl(STDIN_FILENO, F_SETFL, flags_stdin | O_NONBLOCK);
250            fcntl(STDOUT_FILENO, F_SETFL, flags_stdout | O_NONBLOCK);
251    
252          epollfd = epoll_create1(0);          epollfd = epoll_create1(0);
253          if (epollfd < 0)          if (epollfd < 0)
254          {          {
# Line 238  int bbsnet_connect(int n) Line 261  int bbsnet_connect(int n)
261          if (epoll_ctl(epollfd, EPOLL_CTL_ADD, sock, &ev) == -1)          if (epoll_ctl(epollfd, EPOLL_CTL_ADD, sock, &ev) == -1)
262          {          {
263                  log_error("epoll_ctl(socket) error (%d)\n", errno);                  log_error("epoll_ctl(socket) error (%d)\n", errno);
264                  return -1;                  goto cleanup;
265          }          }
266    
267          ev.events = EPOLLIN;          ev.events = EPOLLIN;
# Line 246  int bbsnet_connect(int n) Line 269  int bbsnet_connect(int n)
269          if (epoll_ctl(epollfd, EPOLL_CTL_ADD, STDIN_FILENO, &ev) == -1)          if (epoll_ctl(epollfd, EPOLL_CTL_ADD, STDIN_FILENO, &ev) == -1)
270          {          {
271                  log_error("epoll_ctl(STDIN_FILENO) error (%d)\n", errno);                  log_error("epoll_ctl(STDIN_FILENO) error (%d)\n", errno);
272                  return -1;                  goto cleanup;
273          }          }
274    
         // Set socket as non-blocking  
         flags_sock = fcntl(sock, F_GETFL, 0);  
         fcntl(sock, F_SETFL, flags_sock | O_NONBLOCK);  
   
275          while (!SYS_server_exit)          while (!SYS_server_exit)
276          {          {
277                  if ((ret = connect(sock, (struct sockaddr *)&sin, sizeof(sin))) < 0)                  if ((ret = connect(sock, (struct sockaddr *)&sin, sizeof(sin))) < 0)
278                  {                  {
279                          if (errno == EAGAIN || errno == EALREADY || errno == EINPROGRESS)                          if (errno == EAGAIN || errno == EALREADY || errno == EINPROGRESS)
280                          {                          {
                                 log_std("Debug: %d\n", errno);  
281                                  // Use select / epoll to check writability of the socket,                                  // Use select / epoll to check writability of the socket,
282                                  // then use getsockopt to check the status of the socket.                                  // then use getsockopt to check the status of the socket.
283                                  // See man connect(2)                                  // See man connect(2)
# Line 272  int bbsnet_connect(int n) Line 290  int bbsnet_connect(int n)
290                          else                          else
291                          {                          {
292                                  log_error("connect(socket) error (%d)\n", errno);                                  log_error("connect(socket) error (%d)\n", errno);
293    
294                                  prints("\033[1;31m连接失败!\033[m\r\n");                                  prints("\033[1;31m连接失败!\033[m\r\n");
295                                  press_any_key();                                  press_any_key();
296                                  return -1;  
297                                    goto cleanup;
298                          }                          }
299                  }                  }
300          }          }
# Line 288  int bbsnet_connect(int n) Line 308  int bbsnet_connect(int n)
308                          if (errno != EINTR)                          if (errno != EINTR)
309                          {                          {
310                                  log_error("epoll_wait() error (%d)\n", errno);                                  log_error("epoll_wait() error (%d)\n", errno);
311                                  return -1;                                  break;
312                          }                          }
313                  }                  }
314                  else if (nfds == 0) // timeout                  else if (nfds == 0) // timeout
# Line 305  int bbsnet_connect(int n) Line 325  int bbsnet_connect(int n)
325                                          if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len) < 0)                                          if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len) < 0)
326                                          {                                          {
327                                                  log_error("getsockopt() error (%d) !\n", error);                                                  log_error("getsockopt() error (%d) !\n", error);
328                                                  return -1;                                                  goto cleanup;
329                                          }                                          }
330                                          if (error == 0)                                          if (error == 0)
331                                          {                                          {
# Line 317  int bbsnet_connect(int n) Line 337  int bbsnet_connect(int n)
337                                          ch = igetch(0);                                          ch = igetch(0);
338                                          if (ch == Ctrl('C'))                                          if (ch == Ctrl('C'))
339                                          {                                          {
340                                                  return 0;                                                  goto cleanup;
341                                          }                                          }
342                                  }                                  }
343                          }                          }
# Line 325  int bbsnet_connect(int n) Line 345  int bbsnet_connect(int n)
345          }          }
346          if (SYS_server_exit)          if (SYS_server_exit)
347          {          {
348                  return 0;                  goto cleanup;
349          }          }
350          if (!sock_connected)          if (!sock_connected)
351          {          {
352                  prints("\033[1;31m连接超时!\033[m\r\n");                  prints("\033[1;31m连接失败!\033[m\r\n");
353                  press_any_key();                  press_any_key();
354                  return -1;  
355                    goto cleanup;
356          }          }
357    
358          tos = IPTOS_LOWDELAY;          tos = IPTOS_LOWDELAY;
# Line 349  int bbsnet_connect(int n) Line 370  int bbsnet_connect(int n)
370          if (epoll_ctl(epollfd, EPOLL_CTL_MOD, sock, &ev) == -1)          if (epoll_ctl(epollfd, EPOLL_CTL_MOD, sock, &ev) == -1)
371          {          {
372                  log_error("epoll_ctl(socket) error (%d)\n", errno);                  log_error("epoll_ctl(socket) error (%d)\n", errno);
373                  return -1;                  goto cleanup;
374          }          }
375    
376          ev.events = EPOLLOUT;          ev.events = EPOLLOUT;
# Line 357  int bbsnet_connect(int n) Line 378  int bbsnet_connect(int n)
378          if (epoll_ctl(epollfd, EPOLL_CTL_ADD, STDOUT_FILENO, &ev) == -1)          if (epoll_ctl(epollfd, EPOLL_CTL_ADD, STDOUT_FILENO, &ev) == -1)
379          {          {
380                  log_error("epoll_ctl(STDOUT_FILENO) error (%d)\n", errno);                  log_error("epoll_ctl(STDOUT_FILENO) error (%d)\n", errno);
381                  return -1;                  goto cleanup;
382          }          }
383    
         // Set STDIN/STDOUT as non-blocking  
         flags_stdin = fcntl(STDIN_FILENO, F_GETFL, 0);  
         flags_stdout = fcntl(STDOUT_FILENO, F_GETFL, 0);  
         fcntl(STDIN_FILENO, F_SETFL, flags_stdin | O_NONBLOCK);  
         fcntl(STDOUT_FILENO, F_SETFL, flags_stdout | O_NONBLOCK);  
   
384          BBS_last_access_tm = t_used = time(0);          BBS_last_access_tm = t_used = time(0);
385          loop = 1;          loop = 1;
386    
# Line 564  int bbsnet_connect(int n) Line 579  int bbsnet_connect(int n)
579                  }                  }
580          }          }
581    
582    cleanup:
583            if (close(epollfd) < 0)
584            {
585                    log_error("close(epoll) error (%d)\n");
586            }
587    
588          // Restore STDIN/STDOUT flags          // Restore STDIN/STDOUT flags
589          fcntl(STDIN_FILENO, F_SETFL, flags_stdin);          fcntl(STDIN_FILENO, F_SETFL, flags_stdin);
590          fcntl(STDOUT_FILENO, F_SETFL, flags_stdout);          fcntl(STDOUT_FILENO, F_SETFL, flags_stdout);
# Line 650  int bbs_net() Line 671  int bbs_net()
671    
672          while (!SYS_server_exit)          while (!SYS_server_exit)
673          {          {
674                  ch = igetch(0);                  ch = igetch(100);
675                  switch (ch)                  switch (ch)
676                  {                  {
677                  case KEY_NULL:  // broken pipe                  case KEY_NULL:  // broken pipe
678                  case Ctrl('C'): // user cancel                  case Ctrl('C'): // user cancel
679                          return 0;                          goto cleanup;
680                  case KEY_TIMEOUT:                  case KEY_TIMEOUT:
681                          if (time(0) - BBS_last_access_tm >= MAX_DELAY_TIME)                          if (time(0) - BBS_last_access_tm >= MAX_DELAY_TIME)
682                          {                          {
683                                  return 0;                                  goto cleanup;
684                          }                          }
685                          continue;                          continue;
686                  case CR:                  case CR:
# Line 704  int bbs_net() Line 725  int bbs_net()
725                  BBS_last_access_tm = time(0);                  BBS_last_access_tm = time(0);
726          }          }
727    
728    cleanup:
729            unload_bbsnet_conf();
730    
731          return 0;          return 0;
732  }  }


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

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