/[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.2 by sysadm, Mon Mar 21 17:10:51 2005 UTC Revision 1.7 by sysadm, Tue Mar 22 08:19:11 2005 UTC
# Line 30  Line 30 
30  #include <unistd.h>  #include <unistd.h>
31  #include <netdb.h>  #include <netdb.h>
32    
33  #define TIME_OUT        15  #define TIME_OUT                15
34  #define MAX_PROCESS_BAR_LEN 30  #define MAX_PROCESS_BAR_LEN     30
35  #define MAXSTATION  26*2  #define MAXSTATION              26*2
36    #define STATION_PER_LINE        4
37    
38  struct _bbsnet_conf  struct _bbsnet_conf
39  {  {
# Line 81  load_bbsnet_conf (const char *file_confi Line 82  load_bbsnet_conf (const char *file_confi
82        bbsnet_conf[item_count].port = t4 ? atoi (t4) : 23;        bbsnet_conf[item_count].port = t4 ? atoi (t4) : 23;
83    
84        p_menuitem = p_menu->items[item_count] = malloc (sizeof (MENU_ITEM));        p_menuitem = p_menu->items[item_count] = malloc (sizeof (MENU_ITEM));
85        p_menuitem->row = 2 + item_count / 3;        p_menuitem->row = 2 + item_count / STATION_PER_LINE;
86        p_menuitem->col = 5 + item_count % 3 * 20;        p_menuitem->col = 5 + item_count % STATION_PER_LINE * 20;
87        sprintf (p_menuitem->action, "%d", item_count);        sprintf (p_menuitem->action, "%d", item_count);
88        p_menuitem->submenu = 0;        p_menuitem->submenu = 0;
89        p_menuitem->priv = 0;        p_menuitem->priv = 0;
# Line 91  load_bbsnet_conf (const char *file_confi Line 92  load_bbsnet_conf (const char *file_confi
92        p_menuitem->name[0] =        p_menuitem->name[0] =
93          (item_count < MAXSTATION / 2 ? 'A' + item_count : 'a' + item_count);          (item_count < MAXSTATION / 2 ? 'A' + item_count : 'a' + item_count);
94        p_menuitem->name[1] = '\0';        p_menuitem->name[1] = '\0';
95        sprintf (p_menuitem->text, "1;36m%c. %s",        sprintf (p_menuitem->text, "%c. %s",
96                 p_menuitem->name[0], bbsnet_conf[item_count].host2);                 p_menuitem->name[0], bbsnet_conf[item_count].host1);
97    
98        item_count++;        item_count++;
99      }      }
# Line 216  bbsnet_connect (int n) Line 217  bbsnet_connect (int n)
217    int sock, ch, result, len, loop;    int sock, ch, result, len, loop;
218    struct sockaddr_in sin;    struct sockaddr_in sin;
219    char buf[256];    char buf[256];
   time_t now, t_last_action;  
220    fd_set inputs, testfds;    fd_set inputs, testfds;
221    struct timeval timeout;    struct timeval timeout;
222    struct hostent *pHost = NULL;    struct hostent *pHost = NULL;
# Line 298  bbsnet_connect (int n) Line 298  bbsnet_connect (int n)
298    setsockopt (sock, IPPROTO_IP, IP_TOS, &tos, sizeof (int));    setsockopt (sock, IPPROTO_IP, IP_TOS, &tos, sizeof (int));
299    prints ("\033[1;31m连接成功!\033[m\n");    prints ("\033[1;31m连接成功!\033[m\n");
300    
 /*  
   if (connect (sock, (struct sockaddr *) &sin, sizeof (struct sockaddr)) < 0)  
     {  
       log_error ("Socket connect failed\n");  
       return -3;  
     }  
 */  
   
301    FD_ZERO (&inputs);    FD_ZERO (&inputs);
302    FD_SET (0, &inputs);    FD_SET (0, &inputs);
303    FD_SET (sock, &inputs);    FD_SET (sock, &inputs);
304    
305    t_last_action = time (0);    BBS_last_access_tm = time (0);
306    
307    loop = 1;    loop = 1;
308    
309    while (loop)    while (loop)
310      {      {
311        testfds = inputs;        testfds = inputs;
312        timeout.tv_sec = 0;        timeout.tv_sec = TIME_OUT;
313        timeout.tv_usec = 100000;        timeout.tv_usec = 0;
314    
315        result = select (FD_SETSIZE, &testfds, (fd_set *) NULL,        result = select (FD_SETSIZE, &testfds, (fd_set *) NULL,
316                         (fd_set *) NULL, &timeout);                         (fd_set *) NULL, &timeout);
# Line 326  bbsnet_connect (int n) Line 318  bbsnet_connect (int n)
318        switch (result)        switch (result)
319          {          {
320          case 0:          case 0:
321              if (time (0) - BBS_last_access_tm >= MAX_DELAY_TIME)
322                {
323                  loop = 0;
324                }
325            break;            break;
326          case -1:          case -1:
327            log_error ("select() error!\n");            log_error ("select() error!\n");
# Line 352  bbsnet_connect (int n) Line 348  bbsnet_connect (int n)
348                write (1, buf, len);                write (1, buf, len);
349              }              }
350            break;            break;
351          }            BBS_last_access_tm = time (0);
       if (time (0) - t_last_action >= 10)  
         {  
           t_last_action = time (0);  
352          }          }
353      }      }
354    
# Line 390  bbsnet_refresh () Line 383  bbsnet_refresh ()
383    prints    prints
384      ("╰══════════════════════════════════════╯");      ("╰══════════════════════════════════════╯");
385    moveto (23, 0);    moveto (23, 0);
386    prints    prints (" [\x1b[1;32mCtrl+C\x1b[m]退出");
     (" [\x1b[1;32mCtrl+C\x1b[m]退出 [\x1b[1;32m^\x1b[m]第一个 [\x1b[1;32m$\x1b[m]最后一个\033[0;37m\033[m");  
387    iflush ();    iflush ();
388    
389    return 0;    return 0;
# Line 403  bbsnet_selchange (int new_pos) Line 395  bbsnet_selchange (int new_pos)
395    moveto (20, 0);    moveto (20, 0);
396    clrtoeol ();    clrtoeol ();
397    prints ("║\x1b[1m单位:\x1b[1;33m%-18s\x1b[m  站名:\x1b[1;33m%s\x1b[m",    prints ("║\x1b[1m单位:\x1b[1;33m%-18s\x1b[m  站名:\x1b[1;33m%s\x1b[m",
398            bbsnet_conf[new_pos].host1, bbsnet_conf[new_pos].host2);            bbsnet_conf[new_pos].host2, bbsnet_conf[new_pos].host1);
399    moveto (20, 79);    moveto (20, 79);
400    prints ("║");    prints ("║");
401    moveto (21, 0);    moveto (21, 0);
# Line 422  bbsnet_selchange (int new_pos) Line 414  bbsnet_selchange (int new_pos)
414  int  int
415  bbs_net ()  bbs_net ()
416  {  {
417    int ch, result, pos;    int ch, pos, i;
418    char file_config[256];    char file_config[256];
   time_t t_last_action;  
   fd_set inputs, testfds;  
   struct timeval timeout;  
419    
420    strcpy (file_config, app_home_dir);    strcpy (file_config, app_home_dir);
421    strcat (file_config, "conf/bbsnet.conf");    strcat (file_config, "conf/bbsnet.conf");
422    
423    load_bbsnet_conf (file_config);    load_bbsnet_conf (file_config);
424    
425    FD_ZERO (&inputs);    BBS_last_access_tm = time (0);
   FD_SET (0, &inputs);  
   
   t_last_action = time (0);  
426    
427    clearscr ();    clearscr ();
428    bbsnet_refresh ();    bbsnet_refresh ();
# Line 446  bbs_net () Line 432  bbs_net ()
432    
433    while (1)    while (1)
434      {      {
435        testfds = inputs;        ch = igetch ();
436        timeout.tv_sec = 0;        switch (ch)
       timeout.tv_usec = 100000;  
   
       result = select (FD_SETSIZE, &testfds, (fd_set *) NULL,  
                        (fd_set *) NULL, &timeout);  
       switch (result)  
437          {          {
438          case 0:          case KEY_NULL:
439            case Ctrl ('C'):
440              return 0;
441            case KEY_TIMEOUT:
442              if (time (0) - BBS_last_access_tm >= MAX_DELAY_TIME)
443                {
444                  return -1;
445                }
446              continue;
447            case CR:
448              pos = bbsnet_menu.p_menu[0]->item_cur_pos;
449              bbsnet_connect (pos);
450              bbsnet_refresh ();
451              display_current_menu (&bbsnet_menu);
452              bbsnet_selchange (pos);
453            break;            break;
454          case -1:          case KEY_UP:
455            log_error ("select() error!\n");            for (i = 0; i < STATION_PER_LINE; i++)
456                menu_control (&bbsnet_menu, KEY_UP);
457              pos = bbsnet_menu.p_menu[0]->item_cur_pos;
458              bbsnet_selchange (pos);
459              break;
460            case KEY_DOWN:
461              for (i = 0; i < STATION_PER_LINE; i++)
462                menu_control (&bbsnet_menu, KEY_DOWN);
463              pos = bbsnet_menu.p_menu[0]->item_cur_pos;
464              bbsnet_selchange (pos);
465              break;
466            case KEY_LEFT:
467              menu_control (&bbsnet_menu, KEY_UP);
468              pos = bbsnet_menu.p_menu[0]->item_cur_pos;
469              bbsnet_selchange (pos);
470              break;
471            case KEY_RIGHT:
472              menu_control (&bbsnet_menu, KEY_DOWN);
473              pos = bbsnet_menu.p_menu[0]->item_cur_pos;
474              bbsnet_selchange (pos);
475            break;            break;
476          default:          default:
477            if (FD_ISSET (0, &testfds))            menu_control (&bbsnet_menu, ch);
478              {            pos = bbsnet_menu.p_menu[0]->item_cur_pos;
479                ch = igetch ();            bbsnet_selchange (pos);
               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:  
                   menu_control (&bbsnet_menu, KEY_UP);  
                   menu_control (&bbsnet_menu, KEY_UP);  
                   menu_control (&bbsnet_menu, KEY_UP);  
                   pos = bbsnet_menu.p_menu[0]->item_cur_pos;  
                   bbsnet_selchange (pos);  
                   break;  
                 case KEY_DOWN:  
                   menu_control (&bbsnet_menu, KEY_DOWN);  
                   menu_control (&bbsnet_menu, KEY_DOWN);  
                   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;  
                 case '^':  
                   pos = bbsnet_menu.p_menu[0]->item_cur_pos = 0;  
                   bbsnet_selchange (pos);  
                   break;  
                 case '$':  
                   pos = bbsnet_menu.p_menu[0]->item_cur_pos  
                     = bbsnet_menu.p_menu[0]->item_count - 1;  
                   if (pos < 0)  
                     pos = 0;  
                   bbsnet_selchange (pos);  
                   break;  
                 default:  
                   break;  
                 }  
             }  
480            break;            break;
481          }          }
482        if (time (0) - t_last_action >= 10)        BBS_last_access_tm = time (0);
         {  
           t_last_action = time (0);  
         }  
483      }      }
484    
485    return 0;    return 0;


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

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