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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (hide annotations) (vendor branch)
Tue Jun 6 03:41:38 2006 UTC (19 years, 9 months ago) by sysadm
Branch: GNU, MAIN
CVS Tags: pvpgn_1-7-4-0_MIL, arelease, HEAD
Changes since 1.1: +0 -0 lines
Content type: text/x-csrc
no message

1 sysadm 1.1 /*
2     * Copyright (C) 2000,2001 Onlyer (onlyer@263.net)
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     #include "common/setup_before.h"
19     #include "setup.h"
20    
21     #ifdef HAVE_STDDEF_H
22     # include <stddef.h>
23     #else
24     # ifndef NULL
25     # define NULL ((void *)0)
26     # endif
27     #endif
28     #include <stdio.h>
29     #ifdef STDC_HEADERS
30     # include <stdlib.h>
31     #else
32     # ifdef HAVE_MALLOC_H
33     # include <malloc.h>
34     # endif
35     #endif
36     #ifdef TIME_WITH_SYS_TIME
37     # include <time.h>
38     # include <sys/time.h>
39     #else
40     # ifdef HAVE_SYS_TIME_H
41     # include <sys/time.h>
42     # else
43     # include <time.h>
44     # endif
45     #endif
46     #ifdef HAVE_STRING_H
47     # include <string.h>
48     #else
49     # ifdef HAVE_STRINGS_H
50     # include <strings.h>
51     # endif
52     # ifdef HAVE_MEMORY_H
53     # include <memory.h>
54     # endif
55     #endif
56     #include "compat/strcasecmp.h"
57     #include "compat/strtoul.h"
58     #include "compat/memset.h"
59     #include "compat/strdup.h"
60     #include <errno.h>
61     #include "compat/strerror.h"
62    
63     #include "xstring.h"
64     #include "conf.h"
65     #include "common/util.h"
66     #include "common/eventlog.h"
67     #include "common/xalloc.h"
68     #include "common/setup_after.h"
69    
70     static int conf_set_default(t_conf_table * conf_table, void * param_data, int datalen);
71     static int conf_set_value(t_conf_table * conf, void * param_data, char * value);
72     static int conf_int_set(void * data, int value);
73     static int conf_bool_set(void * data, int value);
74     static int conf_str_set(void * data, char const * value);
75     static int conf_hexstr_set(void * data, char const * value);
76     static int conf_type_get_size(e_conf_type type);
77     static int timestr_to_time(char const * timestr);
78    
79     static int conf_int_set(void * data, int value)
80     {
81     int * p;
82    
83     p=(int *)data;
84     *p=value;
85     return 0;
86     }
87    
88     static int conf_bool_set(void * data, int value)
89     {
90     char * p;
91    
92     p=(char *)data;
93     *p=tf(value);
94     return 0;
95     }
96    
97     static int conf_str_set(void * data, char const * value)
98     {
99     char * * p;
100    
101     p=(char * *)data;
102     if (*p) xfree(*p);
103     if (value) *p=xstrdup(value);
104     else *p=NULL;
105    
106     return 0;
107     }
108    
109     static int conf_hexstr_set(void * data, char const * value)
110     {
111     char * * p;
112    
113     p=(char * *)data;
114     if (*p) xfree(*p);
115     if (value) *p=hexstrdup(value);
116     else *p=NULL;
117     return 0;
118     }
119    
120    
121     static int conf_set_default(t_conf_table * conf_table, void * param_data, int datalen)
122     {
123     unsigned int i;
124     char * p;
125    
126     ASSERT(conf_table,-1);
127     ASSERT(param_data,-1);
128     memset(param_data,0,datalen);
129     for (i=0; conf_table[i].name; i++) {
130     if (conf_table[i].offset + conf_type_get_size(conf_table[i].type) > datalen) {
131     eventlog(eventlog_level_error,__FUNCTION__,"conf table item %d bad offset %d exceed %d",i,conf_table[i].offset,datalen);
132     return -1;
133     }
134     p=(char *)param_data+conf_table[i].offset;
135     switch (conf_table[i].type) {
136     CASE(conf_type_bool, conf_bool_set(p, conf_table[i].def_intval));
137     CASE(conf_type_int, conf_int_set(p, conf_table[i].def_intval));
138     CASE(conf_type_str, conf_str_set(p, conf_table[i].def_strval));
139     CASE(conf_type_hexstr, conf_hexstr_set(p, conf_table[i].def_strval));
140     CASE(conf_type_timestr, conf_int_set(p, conf_table[i].def_intval));
141     default:
142     eventlog(eventlog_level_error,__FUNCTION__,"conf table item %d bad type %d",i,conf_table[i].type);
143     return -1;
144     }
145     }
146     return 0;
147     }
148    
149     static int conf_set_value(t_conf_table * conf, void * param_data, char * value)
150     {
151     char * p;
152    
153     ASSERT(conf,-1);
154     ASSERT(param_data,-1);
155     ASSERT(value,-1);
156     p=(char *)param_data+conf->offset;
157     switch (conf->type) {
158     CASE(conf_type_bool, conf_bool_set(p, strtoul(value,NULL,0)));
159     CASE(conf_type_int, conf_int_set(p, strtoul(value,NULL,0)));
160     CASE(conf_type_str, conf_str_set(p, value));
161     CASE(conf_type_hexstr, conf_hexstr_set(p, value));
162     CASE(conf_type_timestr, conf_int_set(p, timestr_to_time(value)));
163     default:
164     eventlog(eventlog_level_error,__FUNCTION__,"got bad conf type %d",conf->type);
165     return -1;
166     }
167     return 0;
168     }
169    
170     static int conf_type_get_size(e_conf_type type)
171     {
172     switch (type) {
173     case conf_type_bool:
174     return sizeof(char);
175     case conf_type_int:
176     return sizeof(int);
177     case conf_type_str:
178     case conf_type_hexstr:
179     return sizeof(char *);
180     case conf_type_timestr:
181     return sizeof(int);
182     default:
183     eventlog(eventlog_level_error,__FUNCTION__,"got bad conf type %d",type);
184     return 0;
185     }
186     }
187    
188     extern int conf_parse_param(int argc, char ** argv, t_conf_table * conf_table, void * data, int datalen)
189     {
190     int i;
191     unsigned int j;
192     char * p;
193     int match;
194    
195     ASSERT(argc,-1);
196     ASSERT(argv,-1);
197     ASSERT(data, -1);
198     if (conf_set_default(conf_table, data, datalen)<0) {
199     eventlog(eventlog_level_error,__FUNCTION__,"error setting default values");
200     return -1;
201     }
202     for (i=1; i< argc; i++) {
203     match=0;
204     for (j=0; conf_table[j].name; j++) {
205     if (!strcmp(conf_table[j].name,argv[i])) {
206     match=1;
207     p=(char *)data + conf_table[j].offset;
208     switch (conf_table[j].type) {
209     case conf_type_bool:
210     conf_bool_set(p,1);
211     break;
212     case conf_type_int:
213     if (i+1>=argc) {
214     eventlog(eventlog_level_error,__FUNCTION__,"got bad int conf %s without value",argv[i]);
215     break;
216     }
217     i++;
218     conf_int_set(p,strtoul(argv[i],NULL,0));
219     break;
220     case conf_type_str:
221     if (i+1>=argc) {
222     eventlog(eventlog_level_error,__FUNCTION__,"got bad str conf %s without value",argv[i]);
223     break;
224     }
225     i++;
226     conf_str_set(p,argv[i]);
227     break;
228     case conf_type_hexstr:
229     if (i+1>=argc) {
230     eventlog(eventlog_level_error,__FUNCTION__,"got bad hexstr conf %s without value",argv[i]);
231     break;
232     }
233     i++;
234     conf_hexstr_set(p,argv[i]);
235     break;
236     case conf_type_timestr:
237     if (i+1>=argc) {
238     eventlog(eventlog_level_error,__FUNCTION__,argv[i]);
239     break;
240     }
241     i++;
242     conf_int_set(p,timestr_to_time(argv[i]));
243     default:
244     eventlog(eventlog_level_error,__FUNCTION__,"got bad conf type %d",conf_table[i].type);
245     break;
246     }
247     break;
248     }
249     }
250     if (!match) {
251     eventlog(eventlog_level_error,__FUNCTION__,"bad option \"%s\"",argv[i]);
252     return -1;
253     }
254     }
255     return 0;
256     }
257    
258     extern int conf_load_file(char const * filename, t_conf_table * conf_table, void * param_data, int datalen)
259     {
260     FILE * fp;
261     unsigned int i, line, count, match;
262     char * buff;
263     char * * item;
264    
265     ASSERT(conf_table,-1);
266     ASSERT(param_data,-1);
267     if (conf_set_default(conf_table, param_data, datalen)<0) {
268     eventlog(eventlog_level_error,__FUNCTION__,"error setting default values");
269     return -1;
270     }
271     if (!filename) return 0;
272     if (!(fp=fopen(filename,"r"))) {
273     eventlog(eventlog_level_error,__FUNCTION__,"could not open configuration file \"%s\" for reading (fopen: %s)",filename,pstrerror(errno));
274     return -1;
275     }
276     for (line=1; (buff=file_get_line(fp)); line++) {
277     if (buff[0]=='#') {
278     continue;
279     }
280     if (!(item=strtoargv(buff,&count))) {
281     continue;
282     }
283     if (!count) {
284     xfree(item);
285     continue;
286     }
287     if (count!=3) {
288     eventlog(eventlog_level_error,__FUNCTION__,"bad item count %d in file %s line %d",count,filename,line);
289     xfree(item);
290     continue;
291     }
292     if (strcmp(item[1],"=")) {
293     eventlog(eventlog_level_error,__FUNCTION__,"missing '=' in file %s line %d",filename,line);
294     xfree(item);
295     continue;
296     }
297     match=0;
298     for (i=0; conf_table[i].name; i++) {
299     if (!strcasecmp(conf_table[i].name,item[0])) {
300     conf_set_value(conf_table+i, param_data, item[2]);
301     match=1;
302     }
303     }
304     if (!match) {
305     eventlog(eventlog_level_warn,__FUNCTION__,"got unknown field \"%s\" in line %d,(ignored)",item[0],line);
306     }
307     xfree(item);
308     }
309     file_get_line(NULL); // clear file_get_line_buffer
310     fclose(fp);
311     return 0;
312     }
313    
314     extern int conf_cleanup(t_conf_table * conf_table, void * param_data, int datalen)
315     {
316     unsigned int i;
317     char * p;
318    
319     ASSERT(conf_table,-1);
320     ASSERT(param_data,-1);
321     for (i=0; conf_table[i].name; i++) {
322     if (conf_table[i].offset + conf_type_get_size(conf_table[i].type) > datalen) {
323     eventlog(eventlog_level_error,__FUNCTION__,"conf table item %d bad offset %d exceed %d",i,conf_table[i].offset,datalen);
324     return -1;
325     }
326    
327     p=(char *)param_data+conf_table[i].offset;
328     switch (conf_table[i].type) {
329     CASE(conf_type_bool, conf_bool_set(p, 0));
330     CASE(conf_type_int, conf_int_set(p, 0));
331     CASE(conf_type_str, conf_str_set(p, NULL));
332     CASE(conf_type_hexstr, conf_hexstr_set(p, NULL));
333     CASE(conf_type_timestr, conf_int_set(p,0));
334     default:
335     eventlog(eventlog_level_error,__FUNCTION__,"conf table item %d bad type %d",i,conf_table[i].type);
336     return -1;
337     }
338     }
339     memset(param_data,0,datalen);
340     return 0;
341     }
342    
343    
344     /* convert a time string to time_t
345     time string format is:
346     yyyy/mm/dd or yyyy-mm-dd or yyyy.mm.dd
347     hh:mm:ss
348     */
349     static int timestr_to_time(char const * timestr)
350     {
351     char const * p;
352     char ch;
353     struct tm when;
354     int day_s, time_s, last;
355    
356     if (!timestr) return -1;
357     if (!timestr[0]) return 0;
358     p = timestr;
359     day_s = time_s = 0;
360     last = 0;
361     memset(&when, 0, sizeof(when));
362     when.tm_mday = 1;
363     when.tm_isdst = -1;
364     while (1) {
365     ch = *timestr;
366     timestr++;
367     switch (ch) {
368     case '/':
369     case '-':
370     case '.':
371     if (day_s == 0) {
372     when.tm_year = atoi(p) - 1900;
373     } else if (day_s == 1) {
374     when.tm_mon = atoi(p) - 1;
375     } else if (day_s == 2) {
376     when.tm_mday = atoi(p);
377     }
378     time_s = 0;
379     day_s++;
380     p = timestr;
381     last = 1;
382     break;
383     case ':':
384     if (time_s == 0) {
385     when.tm_hour = atoi(p);
386     } else if (time_s == 1) {
387     when.tm_min = atoi(p);
388     } else if (time_s == 2) {
389     when.tm_sec = atoi(p);
390     }
391     day_s = 0;
392     time_s++;
393     p = timestr;
394     last = 2;
395     break;
396     case ' ':
397     case '\t':
398     case '\x0':
399     if (last == 1) {
400     if (day_s == 0) {
401     when.tm_year = atoi(p) - 1900;
402     } else if (day_s == 1) {
403     when.tm_mon = atoi(p) - 1;
404     } else if (day_s == 2) {
405     when.tm_mday = atoi(p);
406     }
407     } else if (last == 2) {
408     if (time_s == 0) {
409     when.tm_hour = atoi(p);
410     } else if (time_s == 1) {
411     when.tm_min = atoi(p);
412     } else if (time_s == 2) {
413     when.tm_sec = atoi(p);
414     }
415     }
416     time_s = day_s = 0;
417     p = timestr;
418     last = 0;
419     break;
420     default:
421     break;
422     }
423     if (!ch) break;
424     }
425     return mktime(&when);
426     }
427    

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