d2gstrans.c
上传用户:tany51
上传日期:2013-06-12
资源大小:1397k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2002
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  */
  18. #define D2GSTRANS_INTERNAL_ACCESS
  19. #include "common/setup_before.h"
  20. #include <stdio.h>
  21. #ifdef HAVE_STDDEF_H
  22. # include <stddef.h>
  23. #else
  24. # ifndef NULL
  25. #  define NULL ((void *)0)
  26. # endif
  27. #endif
  28. #ifdef STDC_HEADERS
  29. # include <stdlib.h>
  30. #else
  31. # ifdef HAVE_MALLOC_H
  32. #  include <malloc.h>
  33. # endif
  34. #endif
  35. #ifdef HAVE_STRING_H
  36. # include <string.h>
  37. #else
  38. # ifdef HAVE_STRINGS_H
  39. #  include <strings.h>
  40. # endif
  41. #endif
  42. #include "compat/strrchr.h"
  43. #include <errno.h>
  44. #include "compat/strerror.h"
  45. #include "common/eventlog.h"
  46. #include "common/list.h"
  47. #include "common/addr.h"
  48. #include "common/util.h"
  49. #include "d2gstrans.h"
  50. #include "common/setup_after.h"
  51. static t_list * d2gstrans_head=NULL;
  52. extern int d2gstrans_load(char const * filename)
  53. {
  54.     FILE *        fp;
  55.     unsigned int  line;
  56.     unsigned int  pos;
  57.     char *        buff;
  58.     char *        temp;
  59.     char const *  server;
  60.     char const *  output;
  61.     char const *  exclude;
  62.     t_d2gstrans * entry;
  63.     
  64.     if (!filename)
  65.     {
  66.         eventlog(eventlog_level_error,__FUNCTION__,"got NULL filename");
  67.         return -1;
  68.     }
  69.     
  70.     if (!(d2gstrans_head = list_create()))
  71.     {
  72.         eventlog(eventlog_level_error,__FUNCTION__,"could not create list");
  73.         return -1;
  74.     }
  75.     if (!(fp = fopen(filename,"r")))
  76.     {
  77.         eventlog(eventlog_level_error,__FUNCTION__,"could not open file "%s" for reading (fopen: %s)",filename,strerror(errno));
  78. list_destroy(d2gstrans_head);
  79. d2gstrans_head = NULL;
  80.         return -1;
  81.     }
  82.     
  83.     for (line=1; (buff = file_get_line(fp)); line++)
  84.     {
  85.         for (pos=0; buff[pos]=='t' || buff[pos]==' '; pos++);
  86.         if (buff[pos]=='' || buff[pos]=='#')
  87.         {
  88.             free(buff);
  89.             continue;
  90.         }
  91.         if ((temp = strrchr(buff,'#')))
  92.         {
  93.     unsigned int len;
  94.     unsigned int endpos;
  95.     
  96.             *temp = '';
  97.     len = strlen(buff)+1;
  98.             for (endpos=len-1; buff[endpos]=='t' || buff[endpos]==' '; endpos--);
  99.             buff[endpos+1] = '';
  100.         }
  101. if (!(server = strtok(buff," t"))) /* strtok modifies the string it is passed */
  102. {
  103.     eventlog(eventlog_level_error,__FUNCTION__,"missing server on line %u of file "%s"",line,filename);
  104.     free(buff);
  105.     continue;
  106. }
  107. if (!(output = strtok(NULL," t")))
  108. {
  109.     eventlog(eventlog_level_error,__FUNCTION__,"missing output on line %u of file "%s"",line,filename);
  110.     free(buff);
  111.     continue;
  112. }
  113. if (!(exclude = strtok(NULL," t")))
  114.     exclude = "0.0.0.0/0"; /* no excluded network address */
  115. if (!(entry = malloc(sizeof(t_d2gstrans))))
  116. {
  117.     eventlog(eventlog_level_error,__FUNCTION__,"could not allocate memory for entry");
  118.     free(buff);
  119.     continue;
  120. }
  121. if (!(entry->server = addr_create_str(server,0,4000)))
  122. {
  123.     eventlog(eventlog_level_error,__FUNCTION__,"could not allocate memory for server address");
  124.     free(entry);
  125.     free(buff);
  126.     continue;
  127. }
  128. if (!(entry->output = addr_create_str(output,0,4000)))
  129. {
  130.     eventlog(eventlog_level_error,__FUNCTION__,"could not allocate memory for output address");
  131.     addr_destroy(entry->server);
  132.     free(entry);
  133.     free(buff);
  134.     continue;
  135. }
  136. if (!(entry->exclude = netaddr_create_str(exclude)))
  137. {
  138.     eventlog(eventlog_level_error,__FUNCTION__,"could not allocate memory for exclude address");
  139.     addr_destroy(entry->output);
  140.     addr_destroy(entry->server);
  141.     free(entry);
  142.     free(buff);
  143.     continue;
  144. }
  145. free(buff);
  146. if (list_append_data(d2gstrans_head,entry)<0)
  147. {
  148.     eventlog(eventlog_level_error,__FUNCTION__,"could not append item");
  149.     netaddr_destroy(entry->exclude);
  150.     addr_destroy(entry->output);
  151.     addr_destroy(entry->server);
  152.     free(entry);
  153. }
  154.     }
  155.     fclose(fp);
  156.     eventlog(eventlog_level_info,__FUNCTION__,"d2gstrans file loaded");
  157.     return 0;
  158. }
  159. extern int d2gstrans_unload(void)
  160. {
  161.     t_elem *      curr;
  162.     t_d2gstrans * entry;
  163.     
  164.     if (d2gstrans_head)
  165.     {
  166. LIST_TRAVERSE(d2gstrans_head,curr)
  167. {
  168.     if (!(entry = elem_get_data(curr)))
  169. eventlog(eventlog_level_error,__FUNCTION__,"found NULL entry in list");
  170.     else
  171.     {
  172. netaddr_destroy(entry->exclude);
  173. addr_destroy(entry->output);
  174. addr_destroy(entry->server);
  175. free(entry);
  176.     }
  177.     list_remove_elem(d2gstrans_head,curr);
  178. }
  179. list_destroy(d2gstrans_head);
  180. d2gstrans_head = NULL;
  181.     }
  182.     
  183.     return 0;
  184. }
  185. extern int d2gstrans_reload(char const * filename)
  186. {
  187.     d2gstrans_unload();
  188.     if(d2gstrans_load(filename)<0) return -1;
  189.     return 0;
  190. }
  191. extern void d2gstrans_net(unsigned int clientaddr, unsigned int *gsaddr)
  192. {
  193.     t_elem const * curr;
  194.     t_d2gstrans *  entry;
  195.     char           temp1[32];
  196.     char           temp2[32];
  197.     char           temp3[32];
  198.     
  199.     eventlog(eventlog_level_debug,__FUNCTION__,"checking gameserver %s for client %s ...",
  200.      addr_num_to_ip_str(*gsaddr), // gameserver ip
  201.      addr_num_to_ip_str(clientaddr)); // client ip
  202.     if (d2gstrans_head)
  203.     {
  204. LIST_TRAVERSE_CONST(d2gstrans_head,curr)
  205. {
  206.     if (!(entry = elem_get_data(curr)))
  207.     {
  208. eventlog(eventlog_level_error,"__FUNCTION__","found NULL entry in list");
  209. continue;
  210.     }
  211.     eventlog(eventlog_level_debug,__FUNCTION__,"against entry gameserver %s output %s clientex %s",
  212.      addr_get_addr_str(entry->server,temp1,sizeof(temp1)), // gameserver
  213.      addr_get_addr_str(entry->output,temp2,sizeof(temp2)), // output
  214.      netaddr_get_addr_str(entry->exclude,temp3,sizeof(temp3))); // clientex
  215.     if (addr_get_ip(entry->server)!=*gsaddr)
  216.     {
  217. eventlog(eventlog_level_debug,"__FUNCTION__","entry not for right gameserver");
  218. continue;
  219.     }
  220.     if (netaddr_contains_addr_num(entry->exclude,clientaddr)==1)
  221.     {
  222. eventlog(eventlog_level_debug,__FUNCTION__,"client is in the excluded network");
  223. continue;
  224.     }
  225.     *gsaddr = addr_get_ip(entry->output);
  226.     return;
  227. }
  228.     }
  229. }