/[LeafOK_CVS]/pvpgn-1.7.4/src/d2cs/gs_scope.c
ViewVC logotype

Annotation of /pvpgn-1.7.4/src/d2cs/gs_scope.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (hide annotations)
Tue Sep 5 17:16:46 2006 UTC (19 years, 6 months ago) by sysadm
Branch: MAIN
CVS Tags: pvpgn_1-7-4-0_MIL, HEAD
Changes since 1.1: +2 -0 lines
Content type: text/x-csrc
Fix bug

1 sysadm 1.1 #include "common/setup_before.h"
2     #include "setup.h"
3    
4     #ifdef HAVE_STDDEF_H
5     # include <stddef.h>
6     #else
7     # ifndef NULL
8     # define NULL ((void *)0)
9     # endif
10     #endif
11     #ifdef STDC_HEADERS
12     # include <stdlib.h>
13     #else
14     # ifdef HAVE_MALLOC_H
15     # include <malloc.h>
16     # endif
17     #endif
18     #ifdef HAVE_STRING_H
19     # include <string.h>
20     #else
21     # ifdef HAVE_STRINGS_H
22     # include <strings.h>
23     # endif
24     #endif
25     #include "compat/strsep.h"
26     #include "compat/char_bit.h"
27     #ifdef HAVE_SYS_TYPES_H
28     # include <sys/types.h> /* needed to include netinet/in.h */
29     #endif
30     #ifdef HAVE_SYS_SOCKET_H
31     # include <sys/socket.h>
32     #endif
33     #include "compat/socket.h"
34     #ifdef HAVE_SYS_PARAM_H
35     # include <sys/param.h>
36     #endif
37     #ifdef HAVE_NETINET_IN_H
38     # include <netinet/in.h>
39     #endif
40     #include "compat/netinet_in.h"
41     #ifdef HAVE_ARPA_INET_H
42     # include <arpa/inet.h> /* FIXME: probably not needed... do some systems put types in here or something? */
43     #endif
44     #ifdef TIME_WITH_SYS_TIME
45     # include <sys/time.h>
46     # include <time.h>
47     #else
48     # ifdef HAVE_SYS_TIME_H
49     # include <sys/time.h>
50     # else
51     # include <time.h>
52     # endif
53     #endif
54     #include "compat/psock.h"
55     #include <regex.h>
56    
57     #include "d2gs.h"
58     #include "game.h"
59     #include "net.h"
60     #include "bit.h"
61     #include "prefs.h"
62     #include "gs_scope.h"
63     #include "connection.h"
64     #include "common/introtate.h"
65     #include "common/addr.h"
66     #include "common/list.h"
67     #include "common/eventlog.h"
68     #include "common/xalloc.h"
69     #include "common/setup_after.h"
70    
71     /* Added by Leaflet at 2006-06-05 Begin */
72     // TODO: Rewriting these code is requied
73     // All these configuration should be put into a seperate configuration file
74    
75     struct serve_scope_addr {
76     regex_t *preg;
77     unsigned short deny;
78     struct serve_scope_addr *next;
79     };
80    
81     struct serve_scope_addr_list {
82     unsigned int ip;
83     struct serve_scope_addr *head;
84     struct serve_scope_addr_list *next;
85     };
86    
87     static struct serve_scope_addr_list *serve_scope_list = NULL;
88    
89     extern int serve_scope_list_load(const char *filename)
90     {
91     FILE *fp;
92     char temp[256], buffer[256];
93     int section_begin = 0;
94     struct serve_scope_addr_list *current_list, *new_list;
95     struct serve_scope_addr *current_addr, *new_addr;
96    
97     unsigned int ip;
98    
99     if ((fp=fopen(filename, "r"))== NULL)
100     {
101     eventlog(eventlog_level_error, __FUNCTION__, "unable to read file %s", filename);
102     return -1;
103     }
104    
105     while(fgets(buffer, 255, fp))
106     {
107     switch(buffer[0])
108     {
109     case '!': // Begin of new server section
110     new_list = (struct serve_scope_addr_list *)malloc(sizeof(struct serve_scope_addr_list));
111     if (sscanf(buffer, "%*c %s", temp) == EOF)
112     continue;
113     if ((ip=net_inet_addr(temp))==~0U) {
114     eventlog(eventlog_level_error,__FUNCTION__,"got bad ip address %s",temp);
115     serve_scope_list_unload();
116     return -2;
117     }
118    
119     if (!serve_scope_list)
120     serve_scope_list = new_list;
121     else
122     current_list->next = new_list;
123     current_list = new_list;
124     current_list->head = NULL;
125     current_list->next = NULL;
126    
127     current_list->ip = ntohl(ip);
128     break;
129     case '@':
130     case '~':
131     new_addr = (struct serve_scope_addr *)malloc(sizeof(struct serve_scope_addr));
132     if (sscanf(buffer, "%*c %s", temp) == EOF)
133     continue;
134    
135     if (!current_list->head)
136     current_list->head = new_addr;
137     else
138     current_addr->next = new_addr;
139     current_addr = new_addr;
140     current_addr->next = NULL;
141    
142     current_addr->preg = (regex_t *) malloc (sizeof (regex_t));
143     if (regcomp (current_addr->preg, temp, REG_EXTENDED|REG_NOSUB) != 0)
144     {
145     eventlog(eventlog_level_error,__FUNCTION__,"Compile regular expression pattern failed %s",temp);
146     free (current_addr->preg);
147     serve_scope_list_unload();
148     return -3;
149     }
150     current_addr->deny = (buffer[0]=='~');
151    
152     break;
153     }
154     }
155    
156 sysadm 1.2 fclose(fp);
157    
158 sysadm 1.1 return 0;
159     }
160    
161     extern void serve_scope_list_unload(void)
162     {
163     struct serve_scope_addr_list *current_list;
164     struct serve_scope_addr *current_addr;
165    
166     while(serve_scope_list)
167     {
168     current_list = serve_scope_list;
169     serve_scope_list = serve_scope_list->next;
170     while(current_list->head)
171     {
172     current_addr = current_list->head;
173     current_list->head = current_list->head->next;
174     regfree(current_addr->preg);
175     free(current_addr->preg);
176     free(current_addr);
177     }
178     free(current_list);
179     }
180     }
181    
182     extern int serve_scope_list_reload(const char *filename)
183     {
184     serve_scope_list_unload();
185     return serve_scope_list_load(filename);
186     }
187    
188     extern int serve_scope_list_validate(unsigned int ip, t_connection *c)
189     {
190     struct serve_scope_addr_list *current_list;
191     struct serve_scope_addr *current_addr;
192     regmatch_t pmatch[10];
193    
194     struct sockaddr_in tsa;
195    
196     memset(&tsa,0,sizeof(tsa));
197     tsa.sin_family = PSOCK_AF_INET;
198     tsa.sin_port = htons((unsigned short)0);
199     tsa.sin_addr.s_addr = htonl(c->addr);
200    
201     current_list = serve_scope_list;
202     while(current_list)
203     {
204     if (current_list->ip == ip)
205     {
206     current_addr = current_list->head;
207     while(current_addr)
208     {
209     if (!regexec (current_addr->preg, inet_ntoa(tsa.sin_addr), 0, pmatch, 0))
210     return current_addr->deny; // Match
211     current_addr = current_addr->next;
212     }
213     return 1; // No match serve scope
214     }
215     current_list = current_list->next;
216     }
217    
218     return 0; // No match game server
219     }
220    
221     /* End */

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