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

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2000 Ross Combs (rocombs@cs.nmsu.edu)
  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 GAMETRANS_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 "gametrans.h"
  50. #include "common/setup_after.h"
  51. #define DEBUGGAMETRANS 1
  52. static t_list * gametrans_head=NULL;
  53. static FILE * fp = NULL;
  54. extern int gametrans_load(char const * filename)
  55. {
  56.     unsigned int  line;
  57.     unsigned int  pos;
  58.     char *        buff;
  59.     char *        temp;
  60.     char const *  viewer;
  61.     char const *  client;
  62.     char const *  output;
  63.     char const *  exclude;
  64.     t_gametrans * entry;
  65.     
  66.     if (!filename)
  67.     {
  68.         eventlog(eventlog_level_error,"gametrans_load","got NULL filename");
  69.         return -1;
  70.     }
  71.     
  72.     if (!(gametrans_head = list_create()))
  73.     {
  74.         eventlog(eventlog_level_error,"gametrans_load","could not create list");
  75.         return -1;
  76.     }
  77.     if (!(fp = fopen(filename,"r")))
  78.     {
  79.         eventlog(eventlog_level_error,"gametrans_load","could not open file "%s" for reading (fopen: %s)",filename,strerror(errno));
  80. list_destroy(gametrans_head);
  81. gametrans_head = NULL;
  82.         return -1;
  83.     }
  84.     
  85.     for (line=1; (buff = file_get_line(fp)); line++)
  86.     {
  87.         for (pos=0; buff[pos]=='t' || buff[pos]==' '; pos++);
  88.         if (buff[pos]=='' || buff[pos]=='#')
  89.         {
  90.             free(buff);
  91.             continue;
  92.         }
  93.         if ((temp = strrchr(buff,'#')))
  94.         {
  95.     unsigned int len;
  96.     unsigned int endpos;
  97.     
  98.             *temp = '';
  99.     len = strlen(buff)+1;
  100.             for (endpos=len-1; buff[endpos]=='t' || buff[endpos]==' '; endpos--);
  101.             buff[endpos+1] = '';
  102.         }
  103. if (!(viewer = strtok(buff," t"))) /* strtok modifies the string it is passed */
  104. {
  105.     eventlog(eventlog_level_error,"gametrans_load","missing viewer on line %u of file "%s"",line,filename);
  106.     free(buff);
  107.     continue;
  108. }
  109. if (!(client = strtok(NULL," t")))
  110. {
  111.     eventlog(eventlog_level_error,"gametrans_load","missing client on line %u of file "%s"",line,filename);
  112.     free(buff);
  113.     continue;
  114. }
  115. if (!(output = strtok(NULL," t")))
  116. {
  117.     eventlog(eventlog_level_error,"gametrans_load","missing output on line %u of file "%s"",line,filename);
  118.     free(buff);
  119.     continue;
  120. }
  121. if (!(exclude = strtok(NULL," t")))
  122.     exclude = "0.0.0.0/0"; /* no excluded network address */
  123. if (!(entry = malloc(sizeof(t_gametrans))))
  124. {
  125.     eventlog(eventlog_level_error,"gametrans_load","could not allocate memory for entry");
  126.     free(buff);
  127.     continue;
  128. }
  129. if (!(entry->viewer = addr_create_str(viewer,0,0)))
  130. {
  131.     eventlog(eventlog_level_error,"gametrans_load","could not allocate memory for viewer address");
  132.     free(entry);
  133.     free(buff);
  134.     continue;
  135. }
  136. if (!(entry->client = addr_create_str(client,0,6112)))
  137. {
  138.     eventlog(eventlog_level_error,"gametrans_load","could not allocate memory for client address");
  139.     addr_destroy(entry->viewer);
  140.     free(entry);
  141.     free(buff);
  142.     continue;
  143. }
  144. if (!(entry->output = addr_create_str(output,0,6112)))
  145. {
  146.     eventlog(eventlog_level_error,"gametrans_load","could not allocate memory for output address");
  147.     addr_destroy(entry->client);
  148.     addr_destroy(entry->viewer);
  149.     free(entry);
  150.     free(buff);
  151.     continue;
  152. }
  153. if (!(entry->exclude = netaddr_create_str(exclude)))
  154. {
  155.     eventlog(eventlog_level_error,"gametrans_load","could not allocate memory for exclude address");
  156.     addr_destroy(entry->output);
  157.     addr_destroy(entry->client);
  158.     addr_destroy(entry->viewer);
  159.     free(entry);
  160.     free(buff);
  161.     continue;
  162. }
  163. free(buff);
  164. if (list_append_data(gametrans_head,entry)<0)
  165. {
  166.     eventlog(eventlog_level_error,"gametrans_load","could not append item");
  167.     netaddr_destroy(entry->exclude);
  168.     addr_destroy(entry->output);
  169.     addr_destroy(entry->client);
  170.     addr_destroy(entry->viewer);
  171.     free(entry);
  172. }
  173.     }
  174.     
  175.     return 0;
  176. }
  177. extern int gametrans_unload(void)
  178. {
  179.     t_elem *      curr;
  180.     t_gametrans * entry;
  181.     
  182.     if (gametrans_head)
  183.     {
  184. LIST_TRAVERSE(gametrans_head,curr)
  185. {
  186.     if (!(entry = elem_get_data(curr)))
  187. eventlog(eventlog_level_error,"gametrans_unload","found NULL entry in list");
  188.     else
  189.     {
  190. netaddr_destroy(entry->exclude);
  191. addr_destroy(entry->output);
  192. addr_destroy(entry->client);
  193. addr_destroy(entry->viewer);
  194. free(entry);
  195.     }
  196.     list_remove_elem(gametrans_head,curr);
  197. }
  198. list_destroy(gametrans_head);
  199. gametrans_head = NULL;
  200.     }
  201.     // aaron: and now... just close the file we opened...
  202.     fclose(fp);
  203.     
  204.     return 0;
  205. }
  206. extern void gametrans_net(unsigned int vaddr, unsigned short vport, unsigned int laddr, unsigned short lport, unsigned int * addr, unsigned short * port)
  207. {
  208.     t_elem const * curr;
  209.     t_gametrans *  entry;
  210. #ifdef DEBUGGAMETRANS
  211.     char           temp1[32];
  212.     char           temp2[32];
  213.     char           temp3[32];
  214.     char           temp4[32];
  215. #endif
  216.     
  217. #ifdef DEBUGGAMETRANS
  218.     eventlog(eventlog_level_debug,"gametrans_net","checking client %s (viewer on %s connected to %s)...",
  219.      addr_num_to_addr_str(*addr,*port),
  220.      addr_num_to_addr_str(vaddr,vport),
  221.      addr_num_to_addr_str(laddr,lport));
  222. #endif
  223.     if (gametrans_head)
  224.     {
  225. LIST_TRAVERSE_CONST(gametrans_head,curr)
  226. {
  227.     if (!(entry = elem_get_data(curr)))
  228.     {
  229. eventlog(eventlog_level_error,"gametrans_net","found NULL entry in list");
  230. continue;
  231.     }
  232.     
  233. #ifdef DEBUGGAMETRANS
  234.     eventlog(eventlog_level_debug,"gametrans_net","against entry viewerint=%s client=%s output=%s viewerex=%s",
  235.      addr_get_addr_str(entry->viewer,temp1,sizeof(temp1)),
  236.      addr_get_addr_str(entry->client,temp2,sizeof(temp2)),
  237.      addr_get_addr_str(entry->output,temp3,sizeof(temp3)),
  238.      netaddr_get_addr_str(entry->exclude,temp4,sizeof(temp4)));
  239. #endif
  240.     
  241.     if (addr_get_ip(entry->viewer)!=0 && addr_get_ip(entry->viewer)!=laddr)
  242.     {
  243. #ifdef DEBUGGAMETRANS
  244. eventlog(eventlog_level_debug,"gametrans_net","viewer is not on right interface IP");
  245. #endif
  246. continue;
  247.     }
  248.     if (addr_get_port(entry->viewer)!=0 && addr_get_port(entry->viewer)!=lport)
  249.     {
  250. #ifdef DEBUGGAMETRANS
  251. eventlog(eventlog_level_debug,"gametrans_net","view is not on right interface port");
  252. #endif
  253. continue;
  254.     }
  255.     
  256.     if (addr_get_ip(entry->client)!=0 && addr_get_ip(entry->client)!=*addr)
  257.     {
  258. #ifdef DEBUGGAMETRANS
  259. eventlog(eventlog_level_debug,"gametrans_net","client is not on the right IP");
  260. #endif
  261. continue;
  262.     }
  263.     if (addr_get_port(entry->client)!=0 && addr_get_port(entry->client)!=*port)
  264.     {
  265. #ifdef DEBUGGAMETRANS
  266. eventlog(eventlog_level_debug,"gametrans_net","client is not on the right port");
  267. #endif
  268. continue;
  269.     }
  270.     
  271.     if (netaddr_contains_addr_num(entry->exclude,vaddr)==1)
  272.     {
  273. #ifdef DEBUGGAMETRANS
  274. eventlog(eventlog_level_debug,"gametrans_net","viewer is in the excluded network");
  275. #endif
  276. continue;
  277.     }
  278.     
  279.     *addr = addr_get_ip(entry->output);
  280.     *port = addr_get_port(entry->output);
  281.     
  282. #ifdef DEBUGGAMETRANS
  283.     eventlog(eventlog_level_debug,"gametrans_net","did translation");
  284. #endif
  285.     
  286.     return;
  287. }
  288.     }
  289. }