/[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.12 by sysadm, Sat May 7 09:28:12 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 108  load_bbsnet_conf (const char *file_confi Line 109  load_bbsnet_conf (const char *file_confi
109    return 0;    return 0;
110  }  }
111    
 // 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;  
 }  
   
112  static void  static void
113  process_bar (int n, int len)  process_bar (int n, int len)
114  {  {
# Line 191  process_bar (int n, int len) Line 119  process_bar (int n, int len)
119    char *ptr3;    char *ptr3;
120    
121    moveto (4, 0);    moveto (4, 0);
122    prints ("┌───────────────┐\n");    prints ("┌───────────────┐\r\n");
123    sprintf (buf2, "            %3d%%              ", n * 100 / len);    sprintf (buf2, "            %3d%%              ", n * 100 / len);
124    ptr = buf;    ptr = buf;
125    ptr2 = buf2;    ptr2 = buf2;
# Line 206  process_bar (int n, int len) Line 134  process_bar (int n, int len)
134    while (*ptr2 != '\0')    while (*ptr2 != '\0')
135      *ptr++ = *ptr2++;      *ptr++ = *ptr2++;
136    *ptr++ = '\0';    *ptr++ = '\0';
137    prints ("│\033[46m%s\033[m│\n", buf);    prints ("│\033[46m%s\033[m│\r\n", buf);
138    prints ("└───────────────┘\n");    prints ("└───────────────┘\r\n");
139      iflush ();
140  }  }
141    
142  int  int
# Line 216  bbsnet_connect (int n) Line 145  bbsnet_connect (int n)
145    int sock, ch, result, len, loop;    int sock, ch, result, len, loop;
146    struct sockaddr_in sin;    struct sockaddr_in sin;
147    char buf[256];    char buf[256];
   time_t now, t_last_action;  
148    fd_set inputs, testfds;    fd_set inputs, testfds;
149    struct timeval timeout;    struct timeval timeout;
150    struct hostent *pHost = NULL;    struct hostent *pHost = NULL;
151    int rc, rv, tos = 020, i;    int rc, rv, tos = 020, i;
152      char remote_addr[256];
153      int remote_port;
154      time_t t_used;
155      struct tm *tm_used;
156    
157      clearscr ();
158    
159    prints ("\033[1;32m正在测试往 %s (%s) 的连接,请稍候... \033[m\n",    moveto (0, 0);
160      prints ("\033[1;32m正在测试往 %s (%s) 的连接,请稍候... \033[m\r\n",
161            bbsnet_conf[n].host1, bbsnet_conf[n].ip);            bbsnet_conf[n].host1, bbsnet_conf[n].ip);
162    prints ("\033[1;32m如果在 %d 秒内无法连上,穿梭程序将放弃连接。\033[m\n",    prints ("\033[1;32m如果在 %d 秒内无法连上,穿梭程序将放弃连接。\033[m\r\n",
163            TIME_OUT);            TIME_OUT);
164      iflush ();
165    
166    pHost = gethostbyname (bbsnet_conf[n].ip);    pHost = gethostbyname (bbsnet_conf[n].ip);
167    
168    if (pHost == NULL)    if (pHost == NULL)
169      {      {
170        prints ("\033[1;31m查找主机名失败!\033[m\n");        prints ("\033[1;31m查找主机名失败!\033[m\r\n");
171        press_any_key ();        press_any_key ();
172        return -1;        return -1;
173      }      }
# Line 240  bbsnet_connect (int n) Line 176  bbsnet_connect (int n)
176    
177    if (sock < 0)    if (sock < 0)
178      {      {
179        prints ("\033[1;31m无法创建socket!\033[m\n");        prints ("\033[1;31m无法创建socket!\033[m\r\n");
180        press_any_key ();        press_any_key ();
181        return -1;        return -1;
182      }      }
# Line 259  bbsnet_connect (int n) Line 195  bbsnet_connect (int n)
195    
196    bzero (&sin, sizeof (sin));    bzero (&sin, sizeof (sin));
197    sin.sin_family = AF_INET;    sin.sin_family = AF_INET;
   sin.sin_port = htons (bbsnet_conf[n].port);  
198    sin.sin_addr = *(struct in_addr *) pHost->h_addr_list[0];    sin.sin_addr = *(struct in_addr *) pHost->h_addr_list[0];
199      sin.sin_port = htons (bbsnet_conf[n].port);
200    
201      strcpy (remote_addr, inet_ntoa (sin.sin_addr));
202      remote_port = ntohs (sin.sin_port);
203    
204    prints ("\033[1;32m穿梭进度条提示您当前已使用的时间。\033[m\n");    prints ("\033[1;32m穿梭进度条提示您当前已使用的时间。\033[m\r\n");
205    process_bar (0, MAX_PROCESS_BAR_LEN);    process_bar (0, MAX_PROCESS_BAR_LEN);
206    for (i = 0; i < MAX_PROCESS_BAR_LEN; i++)    for (i = 0; i < MAX_PROCESS_BAR_LEN; i++)
207      {      {
# Line 284  bbsnet_connect (int n) Line 222  bbsnet_connect (int n)
222          break;          break;
223        else        else
224          {          {
225            prints ("\033[1;31m连接失败!\033[m\n");            prints ("\033[1;31m连接失败!\033[m\r\n");
226            press_any_key ();            press_any_key ();
227            return -1;            return -1;
228          }          }
229      }      }
230    if (i == MAX_PROCESS_BAR_LEN)    if (i == MAX_PROCESS_BAR_LEN)
231      {      {
232        prints ("\033[1;31m连接超时!\033[m\n");        prints ("\033[1;31m连接超时!\033[m\r\n");
233        press_any_key ();        press_any_key ();
234        return -1;        return -1;
235      }      }
236    setsockopt (sock, IPPROTO_IP, IP_TOS, &tos, sizeof (int));    setsockopt (sock, IPPROTO_IP, IP_TOS, &tos, sizeof (int));
   prints ("\033[1;31m连接成功!\033[m\n");  
237    
238  /*    prints ("\033[1;31m连接成功!\033[m\r\n");
239    if (connect (sock, (struct sockaddr *) &sin, sizeof (struct sockaddr)) < 0)    log_std ("BBSNET connect to %s:%d\n", remote_addr, remote_port);
     {  
       log_error ("Socket connect failed\n");  
       return -3;  
     }  
 */  
240    
241    FD_ZERO (&inputs);    FD_ZERO (&inputs);
242    FD_SET (0, &inputs);    FD_SET (0, &inputs);
243    FD_SET (sock, &inputs);    FD_SET (sock, &inputs);
244    
245    t_last_action = time (0);    BBS_last_access_tm = t_used = time (0);
246    
247    loop = 1;    loop = 1;
248    
249    while (loop)    while (loop)
250      {      {
251        testfds = inputs;        testfds = inputs;
252        timeout.tv_sec = 0;        timeout.tv_sec = TIME_OUT;
253        timeout.tv_usec = 100000;        timeout.tv_usec = 0;
254    
255        result = select (FD_SETSIZE, &testfds, (fd_set *) NULL,        result = SignalSafeSelect (FD_SETSIZE, &testfds, (fd_set *) NULL,
256                         (fd_set *) NULL, &timeout);                         (fd_set *) NULL, &timeout);
257    
258        switch (result)        if (result == 0)
259            {
260              if (time (0) - BBS_last_access_tm >= MAX_DELAY_TIME)
261                {
262                  loop = 0;
263                }
264            }
265          if (result < 0)
266          {          {
         case 0:  
           break;  
         case -1:  
267            log_error ("select() error!\n");            log_error ("select() error!\n");
268            break;            loop = 0;
269          default:          }
270          if (result > 0)
271            {
272            if (FD_ISSET (0, &testfds))            if (FD_ISSET (0, &testfds))
273              {              {
274                len = read (0, buf, 255);                len = read (0, buf, 255);
275                if (len == 0)                if (len == 0)
276                  {                  {
277                    loop = 0;                    loop = 0;
                   break;  
278                  }                  }
279                write (sock, buf, len);                write (sock, buf, len);
280              }              }
# Line 347  bbsnet_connect (int n) Line 284  bbsnet_connect (int n)
284                if (len == 0)                if (len == 0)
285                  {                  {
286                    loop = 0;                    loop = 0;
                   break;  
287                  }                  }
288                write (1, buf, len);                write (1, buf, len);
289              }              }
290            break;            BBS_last_access_tm = time (0);
         }  
       if (time (0) - t_last_action >= 10)  
         {  
           t_last_action = time (0);  
291          }          }
292      }      }
293    
# Line 364  bbsnet_connect (int n) Line 296  bbsnet_connect (int n)
296        log_error ("Close socket failed\n");        log_error ("Close socket failed\n");
297      }      }
298    
299      t_used = time (0) - t_used;
300      tm_used = gmtime (&t_used);
301    
302      log_std ("BBSNET disconnect, %d days %d hours %d minutes %d seconds used\n",
303               tm_used->tm_mday - 1, tm_used->tm_hour, tm_used->tm_min,
304               tm_used->tm_sec);
305    
306    return 0;    return 0;
307  }  }
308    
# Line 375  bbsnet_refresh () Line 314  bbsnet_refresh ()
314    clearscr ();    clearscr ();
315    moveto (1, 0);    moveto (1, 0);
316    prints    prints
317      ("╭══════════════════════════════════════╮");      ("?q?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?r");
318    for (i = 2; i < 19; i++)    for (i = 2; i < 19; i++)
319      {      {
320        moveto (i, 0);        moveto (i, 0);
321        prints ("║");        prints ("?U");
322        moveto (i, 79);        moveto (i, 79);
323        prints ("║");        prints ("?U");
324      }      }
325    moveto (19, 0);    moveto (19, 0);
326    prints    prints
327      ("║——————————————————————————————————————║");      ("?U——————————————————————————————————————?U");
328    moveto (22, 0);    moveto (22, 0);
329    prints    prints
330      ("╰══════════════════════════════════════╯");      ("?t?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?T?s");
331    moveto (23, 0);    moveto (23, 0);
332    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");  
333    iflush ();    iflush ();
334    
335    return 0;    return 0;
# Line 402  bbsnet_selchange (int new_pos) Line 340  bbsnet_selchange (int new_pos)
340  {  {
341    moveto (20, 0);    moveto (20, 0);
342    clrtoeol ();    clrtoeol ();
343    prints ("║\x1b[1m单位:\x1b[1;33m%-18s\x1b[m  站名:\x1b[1;33m%s\x1b[m",    prints ("?U\x1b[1m单位:\x1b[1;33m%-18s\x1b[m  站名:\x1b[1;33m%s\x1b[m",
344            bbsnet_conf[new_pos].host1, bbsnet_conf[new_pos].host2);            bbsnet_conf[new_pos].host2, bbsnet_conf[new_pos].host1);
345    moveto (20, 79);    moveto (20, 79);
346    prints ("║");    prints ("?U");
347    moveto (21, 0);    moveto (21, 0);
348    clrtoeol ();    clrtoeol ();
349    prints ("║\x1b[1m连往:\x1b[1;33m%-20s", bbsnet_conf[new_pos].ip);    prints ("?U\x1b[1m连往:\x1b[1;33m%-20s", bbsnet_conf[new_pos].ip);
350    if (bbsnet_conf[new_pos].port != 23)    if (bbsnet_conf[new_pos].port != 23)
351      prints ("  %d", bbsnet_conf[new_pos].port);      prints ("  %d", bbsnet_conf[new_pos].port);
352    prints ("\x1b[m");    prints ("\x1b[m");
353    moveto (21, 79);    moveto (21, 79);
354    prints ("║");    prints ("?U");
355    iflush ();    iflush ();
356    
357    return 0;    return 0;
# Line 422  bbsnet_selchange (int new_pos) Line 360  bbsnet_selchange (int new_pos)
360  int  int
361  bbs_net ()  bbs_net ()
362  {  {
363    int ch, result, pos;    int ch, pos, i;
364    char file_config[256];    char file_config[256];
   time_t t_last_action;  
   fd_set inputs, testfds;  
   struct timeval timeout;  
365    
366    strcpy (file_config, app_home_dir);    strcpy (file_config, app_home_dir);
367    strcat (file_config, "conf/bbsnet.conf");    strcat (file_config, "conf/bbsnet.conf");
368    
369    load_bbsnet_conf (file_config);    load_bbsnet_conf (file_config);
370    
371    FD_ZERO (&inputs);    BBS_last_access_tm = time (0);
   FD_SET (0, &inputs);  
   
   t_last_action = time (0);  
372    
373    clearscr ();    clearscr ();
374    bbsnet_refresh ();    bbsnet_refresh ();
# Line 446  bbs_net () Line 378  bbs_net ()
378    
379    while (1)    while (1)
380      {      {
381        testfds = inputs;        ch = igetch ();
382        timeout.tv_sec = 0;        switch (ch)
       timeout.tv_usec = 100000;  
   
       result = select (FD_SETSIZE, &testfds, (fd_set *) NULL,  
                        (fd_set *) NULL, &timeout);  
       switch (result)  
383          {          {
384          case 0:          case KEY_NULL:
385            case Ctrl ('C'):
386              return 0;
387            case KEY_TIMEOUT:
388              if (time (0) - BBS_last_access_tm >= MAX_DELAY_TIME)
389                {
390                  return -1;
391                }
392              continue;
393            case CR:
394              pos = bbsnet_menu.p_menu[0]->item_cur_pos;
395              bbsnet_connect (pos);
396              bbsnet_refresh ();
397              display_current_menu (&bbsnet_menu);
398              bbsnet_selchange (pos);
399            break;            break;
400          case -1:          case KEY_UP:
401            log_error ("select() error!\n");            for (i = 0; i < STATION_PER_LINE; i++)
402                menu_control (&bbsnet_menu, KEY_UP);
403              pos = bbsnet_menu.p_menu[0]->item_cur_pos;
404              bbsnet_selchange (pos);
405              break;
406            case KEY_DOWN:
407              for (i = 0; i < STATION_PER_LINE; i++)
408                menu_control (&bbsnet_menu, KEY_DOWN);
409              pos = bbsnet_menu.p_menu[0]->item_cur_pos;
410              bbsnet_selchange (pos);
411              break;
412            case KEY_LEFT:
413              menu_control (&bbsnet_menu, KEY_UP);
414              pos = bbsnet_menu.p_menu[0]->item_cur_pos;
415              bbsnet_selchange (pos);
416              break;
417            case KEY_RIGHT:
418              menu_control (&bbsnet_menu, KEY_DOWN);
419              pos = bbsnet_menu.p_menu[0]->item_cur_pos;
420              bbsnet_selchange (pos);
421            break;            break;
422          default:          default:
423            if (FD_ISSET (0, &testfds))            menu_control (&bbsnet_menu, ch);
424              {            pos = bbsnet_menu.p_menu[0]->item_cur_pos;
425                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;  
                 }  
             }  
426            break;            break;
427          }          }
428        if (time (0) - t_last_action >= 10)        BBS_last_access_tm = time (0);
         {  
           t_last_action = time (0);  
         }  
429      }      }
430    
431    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