1*86d7f5d3SJohn Marino /*-
2*86d7f5d3SJohn Marino * Copyright (c) 2005 Michael Bushkov <bushman@rsu.ru>
3*86d7f5d3SJohn Marino * All rights reserved.
4*86d7f5d3SJohn Marino *
5*86d7f5d3SJohn Marino * Redistribution and use in source and binary forms, with or without
6*86d7f5d3SJohn Marino * modification, are permitted provided that the following conditions
7*86d7f5d3SJohn Marino * are met:
8*86d7f5d3SJohn Marino * 1. Redistributions of source code must retain the above copyright
9*86d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer.
10*86d7f5d3SJohn Marino * 2. Redistributions in binary form must reproduce the above copyright
11*86d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer in the
12*86d7f5d3SJohn Marino * documentation and/or other materials provided with the distribution.
13*86d7f5d3SJohn Marino *
14*86d7f5d3SJohn Marino * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*86d7f5d3SJohn Marino * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*86d7f5d3SJohn Marino * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*86d7f5d3SJohn Marino * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*86d7f5d3SJohn Marino * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*86d7f5d3SJohn Marino * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*86d7f5d3SJohn Marino * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*86d7f5d3SJohn Marino * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*86d7f5d3SJohn Marino * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*86d7f5d3SJohn Marino * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*86d7f5d3SJohn Marino * SUCH DAMAGE.
25*86d7f5d3SJohn Marino *
26*86d7f5d3SJohn Marino * $FreeBSD: src/usr.sbin/nscd/parser.c,v 1.2 2007/09/27 12:30:11 bushman Exp $
27*86d7f5d3SJohn Marino */
28*86d7f5d3SJohn Marino
29*86d7f5d3SJohn Marino #include <assert.h>
30*86d7f5d3SJohn Marino #include <stdio.h>
31*86d7f5d3SJohn Marino #include <string.h>
32*86d7f5d3SJohn Marino #include "config.h"
33*86d7f5d3SJohn Marino #include "debug.h"
34*86d7f5d3SJohn Marino #include "log.h"
35*86d7f5d3SJohn Marino #include "parser.h"
36*86d7f5d3SJohn Marino
37*86d7f5d3SJohn Marino static void enable_cache(struct configuration *,const char *, int);
38*86d7f5d3SJohn Marino static struct configuration_entry *find_create_entry(struct configuration *,
39*86d7f5d3SJohn Marino const char *);
40*86d7f5d3SJohn Marino static int get_number(const char *, int, int);
41*86d7f5d3SJohn Marino static enum cache_policy_t get_policy(const char *);
42*86d7f5d3SJohn Marino static int get_yesno(const char *);
43*86d7f5d3SJohn Marino static int check_cachename(const char *);
44*86d7f5d3SJohn Marino static void check_files(struct configuration *, const char *, int);
45*86d7f5d3SJohn Marino static void set_keep_hot_count(struct configuration *, const char *, int);
46*86d7f5d3SJohn Marino static void set_negative_policy(struct configuration *, const char *,
47*86d7f5d3SJohn Marino enum cache_policy_t);
48*86d7f5d3SJohn Marino static void set_negative_time_to_live(struct configuration *,
49*86d7f5d3SJohn Marino const char *, int);
50*86d7f5d3SJohn Marino static void set_positive_policy(struct configuration *, const char *,
51*86d7f5d3SJohn Marino enum cache_policy_t);
52*86d7f5d3SJohn Marino static void set_perform_actual_lookups(struct configuration *, const char *,
53*86d7f5d3SJohn Marino int);
54*86d7f5d3SJohn Marino static void set_positive_time_to_live(struct configuration *,
55*86d7f5d3SJohn Marino const char *, int);
56*86d7f5d3SJohn Marino static void set_suggested_size(struct configuration *, const char *,
57*86d7f5d3SJohn Marino int size);
58*86d7f5d3SJohn Marino static void set_threads_num(struct configuration *, int);
59*86d7f5d3SJohn Marino static int strbreak(char *, char **, int);
60*86d7f5d3SJohn Marino
61*86d7f5d3SJohn Marino static int
strbreak(char * str,char ** fields,int fields_size)62*86d7f5d3SJohn Marino strbreak(char *str, char **fields, int fields_size)
63*86d7f5d3SJohn Marino {
64*86d7f5d3SJohn Marino char *c = str;
65*86d7f5d3SJohn Marino int i, num;
66*86d7f5d3SJohn Marino
67*86d7f5d3SJohn Marino TRACE_IN(strbreak);
68*86d7f5d3SJohn Marino num = 0;
69*86d7f5d3SJohn Marino for (i = 0;
70*86d7f5d3SJohn Marino ((*fields =
71*86d7f5d3SJohn Marino strsep(i < fields_size ? &c : NULL, "\n\t ")) != NULL);
72*86d7f5d3SJohn Marino ++i)
73*86d7f5d3SJohn Marino if ((*(*fields)) != '\0') {
74*86d7f5d3SJohn Marino ++fields;
75*86d7f5d3SJohn Marino ++num;
76*86d7f5d3SJohn Marino }
77*86d7f5d3SJohn Marino
78*86d7f5d3SJohn Marino TRACE_OUT(strbreak);
79*86d7f5d3SJohn Marino return (num);
80*86d7f5d3SJohn Marino }
81*86d7f5d3SJohn Marino
82*86d7f5d3SJohn Marino /*
83*86d7f5d3SJohn Marino * Tries to find the configuration entry with the specified name. If search
84*86d7f5d3SJohn Marino * fails, the new entry with the default parameters will be created.
85*86d7f5d3SJohn Marino */
86*86d7f5d3SJohn Marino static struct configuration_entry *
find_create_entry(struct configuration * config,const char * entry_name)87*86d7f5d3SJohn Marino find_create_entry(struct configuration *config,
88*86d7f5d3SJohn Marino const char *entry_name)
89*86d7f5d3SJohn Marino {
90*86d7f5d3SJohn Marino struct configuration_entry *entry = NULL;
91*86d7f5d3SJohn Marino int res;
92*86d7f5d3SJohn Marino
93*86d7f5d3SJohn Marino TRACE_IN(find_create_entry);
94*86d7f5d3SJohn Marino entry = configuration_find_entry(config, entry_name);
95*86d7f5d3SJohn Marino if (entry == NULL) {
96*86d7f5d3SJohn Marino entry = create_def_configuration_entry(entry_name);
97*86d7f5d3SJohn Marino assert( entry != NULL);
98*86d7f5d3SJohn Marino res = add_configuration_entry(config, entry);
99*86d7f5d3SJohn Marino assert(res == 0);
100*86d7f5d3SJohn Marino }
101*86d7f5d3SJohn Marino
102*86d7f5d3SJohn Marino TRACE_OUT(find_create_entry);
103*86d7f5d3SJohn Marino return (entry);
104*86d7f5d3SJohn Marino }
105*86d7f5d3SJohn Marino
106*86d7f5d3SJohn Marino /*
107*86d7f5d3SJohn Marino * The vast majority of the functions below corresponds to the particular
108*86d7f5d3SJohn Marino * keywords in the configuration file.
109*86d7f5d3SJohn Marino */
110*86d7f5d3SJohn Marino static void
enable_cache(struct configuration * config,const char * entry_name,int flag)111*86d7f5d3SJohn Marino enable_cache(struct configuration *config, const char *entry_name, int flag)
112*86d7f5d3SJohn Marino {
113*86d7f5d3SJohn Marino struct configuration_entry *entry;
114*86d7f5d3SJohn Marino
115*86d7f5d3SJohn Marino TRACE_IN(enable_cache);
116*86d7f5d3SJohn Marino entry = find_create_entry(config, entry_name);
117*86d7f5d3SJohn Marino entry->enabled = flag;
118*86d7f5d3SJohn Marino TRACE_OUT(enable_cache);
119*86d7f5d3SJohn Marino }
120*86d7f5d3SJohn Marino
121*86d7f5d3SJohn Marino static void
set_positive_time_to_live(struct configuration * config,const char * entry_name,int ttl)122*86d7f5d3SJohn Marino set_positive_time_to_live(struct configuration *config,
123*86d7f5d3SJohn Marino const char *entry_name, int ttl)
124*86d7f5d3SJohn Marino {
125*86d7f5d3SJohn Marino struct configuration_entry *entry;
126*86d7f5d3SJohn Marino struct timeval lifetime;
127*86d7f5d3SJohn Marino
128*86d7f5d3SJohn Marino TRACE_IN(set_positive_time_to_live);
129*86d7f5d3SJohn Marino assert(ttl >= 0);
130*86d7f5d3SJohn Marino assert(entry_name != NULL);
131*86d7f5d3SJohn Marino memset(&lifetime, 0, sizeof(struct timeval));
132*86d7f5d3SJohn Marino lifetime.tv_sec = ttl;
133*86d7f5d3SJohn Marino
134*86d7f5d3SJohn Marino entry = find_create_entry(config, entry_name);
135*86d7f5d3SJohn Marino memcpy(&entry->positive_cache_params.max_lifetime,
136*86d7f5d3SJohn Marino &lifetime, sizeof(struct timeval));
137*86d7f5d3SJohn Marino memcpy(&entry->mp_cache_params.max_lifetime,
138*86d7f5d3SJohn Marino &lifetime, sizeof(struct timeval));
139*86d7f5d3SJohn Marino
140*86d7f5d3SJohn Marino TRACE_OUT(set_positive_time_to_live);
141*86d7f5d3SJohn Marino }
142*86d7f5d3SJohn Marino
143*86d7f5d3SJohn Marino static void
set_negative_time_to_live(struct configuration * config,const char * entry_name,int nttl)144*86d7f5d3SJohn Marino set_negative_time_to_live(struct configuration *config,
145*86d7f5d3SJohn Marino const char *entry_name, int nttl)
146*86d7f5d3SJohn Marino {
147*86d7f5d3SJohn Marino struct configuration_entry *entry;
148*86d7f5d3SJohn Marino struct timeval lifetime;
149*86d7f5d3SJohn Marino
150*86d7f5d3SJohn Marino TRACE_IN(set_negative_time_to_live);
151*86d7f5d3SJohn Marino assert(nttl > 0);
152*86d7f5d3SJohn Marino assert(entry_name != NULL);
153*86d7f5d3SJohn Marino memset(&lifetime, 0, sizeof(struct timeval));
154*86d7f5d3SJohn Marino lifetime.tv_sec = nttl;
155*86d7f5d3SJohn Marino
156*86d7f5d3SJohn Marino entry = find_create_entry(config, entry_name);
157*86d7f5d3SJohn Marino assert(entry != NULL);
158*86d7f5d3SJohn Marino memcpy(&entry->negative_cache_params.max_lifetime,
159*86d7f5d3SJohn Marino &lifetime, sizeof(struct timeval));
160*86d7f5d3SJohn Marino
161*86d7f5d3SJohn Marino TRACE_OUT(set_negative_time_to_live);
162*86d7f5d3SJohn Marino }
163*86d7f5d3SJohn Marino
164*86d7f5d3SJohn Marino /*
165*86d7f5d3SJohn Marino * Hot count is actually the elements size limit.
166*86d7f5d3SJohn Marino */
167*86d7f5d3SJohn Marino static void
set_keep_hot_count(struct configuration * config,const char * entry_name,int count)168*86d7f5d3SJohn Marino set_keep_hot_count(struct configuration *config,
169*86d7f5d3SJohn Marino const char *entry_name, int count)
170*86d7f5d3SJohn Marino {
171*86d7f5d3SJohn Marino struct configuration_entry *entry;
172*86d7f5d3SJohn Marino
173*86d7f5d3SJohn Marino TRACE_IN(set_keep_hot_count);
174*86d7f5d3SJohn Marino assert(count >= 0);
175*86d7f5d3SJohn Marino assert(entry_name != NULL);
176*86d7f5d3SJohn Marino
177*86d7f5d3SJohn Marino entry = find_create_entry(config, entry_name);
178*86d7f5d3SJohn Marino assert(entry != NULL);
179*86d7f5d3SJohn Marino entry->positive_cache_params.max_elemsize = count;
180*86d7f5d3SJohn Marino
181*86d7f5d3SJohn Marino entry = find_create_entry(config, entry_name);
182*86d7f5d3SJohn Marino assert(entry != NULL);
183*86d7f5d3SJohn Marino entry->negative_cache_params.max_elemsize = count;
184*86d7f5d3SJohn Marino
185*86d7f5d3SJohn Marino TRACE_OUT(set_keep_hot_count);
186*86d7f5d3SJohn Marino }
187*86d7f5d3SJohn Marino
188*86d7f5d3SJohn Marino static void
set_positive_policy(struct configuration * config,const char * entry_name,enum cache_policy_t policy)189*86d7f5d3SJohn Marino set_positive_policy(struct configuration *config,
190*86d7f5d3SJohn Marino const char *entry_name, enum cache_policy_t policy)
191*86d7f5d3SJohn Marino {
192*86d7f5d3SJohn Marino struct configuration_entry *entry;
193*86d7f5d3SJohn Marino
194*86d7f5d3SJohn Marino TRACE_IN(set_positive_policy);
195*86d7f5d3SJohn Marino assert(entry_name != NULL);
196*86d7f5d3SJohn Marino
197*86d7f5d3SJohn Marino entry = find_create_entry(config, entry_name);
198*86d7f5d3SJohn Marino assert(entry != NULL);
199*86d7f5d3SJohn Marino entry->positive_cache_params.policy = policy;
200*86d7f5d3SJohn Marino
201*86d7f5d3SJohn Marino TRACE_OUT(set_positive_policy);
202*86d7f5d3SJohn Marino }
203*86d7f5d3SJohn Marino
204*86d7f5d3SJohn Marino static void
set_negative_policy(struct configuration * config,const char * entry_name,enum cache_policy_t policy)205*86d7f5d3SJohn Marino set_negative_policy(struct configuration *config,
206*86d7f5d3SJohn Marino const char *entry_name, enum cache_policy_t policy)
207*86d7f5d3SJohn Marino {
208*86d7f5d3SJohn Marino struct configuration_entry *entry;
209*86d7f5d3SJohn Marino
210*86d7f5d3SJohn Marino TRACE_IN(set_negative_policy);
211*86d7f5d3SJohn Marino assert(entry_name != NULL);
212*86d7f5d3SJohn Marino
213*86d7f5d3SJohn Marino entry = find_create_entry(config, entry_name);
214*86d7f5d3SJohn Marino assert(entry != NULL);
215*86d7f5d3SJohn Marino entry->negative_cache_params.policy = policy;
216*86d7f5d3SJohn Marino
217*86d7f5d3SJohn Marino TRACE_OUT(set_negative_policy);
218*86d7f5d3SJohn Marino }
219*86d7f5d3SJohn Marino
220*86d7f5d3SJohn Marino static void
set_perform_actual_lookups(struct configuration * config,const char * entry_name,int flag)221*86d7f5d3SJohn Marino set_perform_actual_lookups(struct configuration *config,
222*86d7f5d3SJohn Marino const char *entry_name, int flag)
223*86d7f5d3SJohn Marino {
224*86d7f5d3SJohn Marino struct configuration_entry *entry;
225*86d7f5d3SJohn Marino
226*86d7f5d3SJohn Marino TRACE_IN(set_perform_actual_lookups);
227*86d7f5d3SJohn Marino assert(entry_name != NULL);
228*86d7f5d3SJohn Marino
229*86d7f5d3SJohn Marino entry = find_create_entry(config, entry_name);
230*86d7f5d3SJohn Marino assert(entry != NULL);
231*86d7f5d3SJohn Marino entry->perform_actual_lookups = flag;
232*86d7f5d3SJohn Marino
233*86d7f5d3SJohn Marino TRACE_OUT(set_perform_actual_lookups);
234*86d7f5d3SJohn Marino }
235*86d7f5d3SJohn Marino
236*86d7f5d3SJohn Marino static void
set_suggested_size(struct configuration * config,const char * entry_name,int size)237*86d7f5d3SJohn Marino set_suggested_size(struct configuration *config,
238*86d7f5d3SJohn Marino const char *entry_name, int size)
239*86d7f5d3SJohn Marino {
240*86d7f5d3SJohn Marino struct configuration_entry *entry;
241*86d7f5d3SJohn Marino
242*86d7f5d3SJohn Marino TRACE_IN(set_suggested_size);
243*86d7f5d3SJohn Marino assert(config != NULL);
244*86d7f5d3SJohn Marino assert(entry_name != NULL);
245*86d7f5d3SJohn Marino assert(size > 0);
246*86d7f5d3SJohn Marino
247*86d7f5d3SJohn Marino entry = find_create_entry(config, entry_name);
248*86d7f5d3SJohn Marino assert(entry != NULL);
249*86d7f5d3SJohn Marino entry->positive_cache_params.cache_entries_size = size;
250*86d7f5d3SJohn Marino entry->negative_cache_params.cache_entries_size = size;
251*86d7f5d3SJohn Marino
252*86d7f5d3SJohn Marino TRACE_OUT(set_suggested_size);
253*86d7f5d3SJohn Marino }
254*86d7f5d3SJohn Marino
255*86d7f5d3SJohn Marino static void
check_files(struct configuration * config,const char * entry_name,int flag)256*86d7f5d3SJohn Marino check_files(struct configuration *config, const char *entry_name, int flag)
257*86d7f5d3SJohn Marino {
258*86d7f5d3SJohn Marino
259*86d7f5d3SJohn Marino TRACE_IN(check_files);
260*86d7f5d3SJohn Marino assert(entry_name != NULL);
261*86d7f5d3SJohn Marino TRACE_OUT(check_files);
262*86d7f5d3SJohn Marino }
263*86d7f5d3SJohn Marino
264*86d7f5d3SJohn Marino static int
get_yesno(const char * str)265*86d7f5d3SJohn Marino get_yesno(const char *str)
266*86d7f5d3SJohn Marino {
267*86d7f5d3SJohn Marino
268*86d7f5d3SJohn Marino if (strcmp(str, "yes") == 0)
269*86d7f5d3SJohn Marino return (1);
270*86d7f5d3SJohn Marino else if (strcmp(str, "no") == 0)
271*86d7f5d3SJohn Marino return (0);
272*86d7f5d3SJohn Marino else
273*86d7f5d3SJohn Marino return (-1);
274*86d7f5d3SJohn Marino }
275*86d7f5d3SJohn Marino
276*86d7f5d3SJohn Marino static int
get_number(const char * str,int low,int max)277*86d7f5d3SJohn Marino get_number(const char *str, int low, int max)
278*86d7f5d3SJohn Marino {
279*86d7f5d3SJohn Marino
280*86d7f5d3SJohn Marino char *end = NULL;
281*86d7f5d3SJohn Marino int res = 0;
282*86d7f5d3SJohn Marino
283*86d7f5d3SJohn Marino if (str[0] == '\0')
284*86d7f5d3SJohn Marino return (-1);
285*86d7f5d3SJohn Marino
286*86d7f5d3SJohn Marino res = strtol(str, &end, 10);
287*86d7f5d3SJohn Marino if (*end != '\0')
288*86d7f5d3SJohn Marino return (-1);
289*86d7f5d3SJohn Marino else
290*86d7f5d3SJohn Marino if (((res >= low) || (low == -1)) &&
291*86d7f5d3SJohn Marino ((res <= max) || (max == -1)))
292*86d7f5d3SJohn Marino return (res);
293*86d7f5d3SJohn Marino else
294*86d7f5d3SJohn Marino return (-2);
295*86d7f5d3SJohn Marino }
296*86d7f5d3SJohn Marino
297*86d7f5d3SJohn Marino static enum cache_policy_t
get_policy(const char * str)298*86d7f5d3SJohn Marino get_policy(const char *str)
299*86d7f5d3SJohn Marino {
300*86d7f5d3SJohn Marino
301*86d7f5d3SJohn Marino if (strcmp(str, "fifo") == 0)
302*86d7f5d3SJohn Marino return (CPT_FIFO);
303*86d7f5d3SJohn Marino else if (strcmp(str, "lru") == 0)
304*86d7f5d3SJohn Marino return (CPT_LRU);
305*86d7f5d3SJohn Marino else if (strcmp(str, "lfu") == 0)
306*86d7f5d3SJohn Marino return (CPT_LFU);
307*86d7f5d3SJohn Marino
308*86d7f5d3SJohn Marino return (-1);
309*86d7f5d3SJohn Marino }
310*86d7f5d3SJohn Marino
311*86d7f5d3SJohn Marino static int
check_cachename(const char * str)312*86d7f5d3SJohn Marino check_cachename(const char *str)
313*86d7f5d3SJohn Marino {
314*86d7f5d3SJohn Marino
315*86d7f5d3SJohn Marino assert(str != NULL);
316*86d7f5d3SJohn Marino return ((strlen(str) > 0) ? 0 : -1);
317*86d7f5d3SJohn Marino }
318*86d7f5d3SJohn Marino
319*86d7f5d3SJohn Marino static void
set_threads_num(struct configuration * config,int value)320*86d7f5d3SJohn Marino set_threads_num(struct configuration *config, int value)
321*86d7f5d3SJohn Marino {
322*86d7f5d3SJohn Marino
323*86d7f5d3SJohn Marino assert(config != NULL);
324*86d7f5d3SJohn Marino config->threads_num = value;
325*86d7f5d3SJohn Marino }
326*86d7f5d3SJohn Marino
327*86d7f5d3SJohn Marino /*
328*86d7f5d3SJohn Marino * The main configuration routine. Its implementation is hugely inspired by the
329*86d7f5d3SJohn Marino * the same routine implementation in Solaris NSCD.
330*86d7f5d3SJohn Marino */
331*86d7f5d3SJohn Marino int
parse_config_file(struct configuration * config,const char * fname,char const ** error_str,int * error_line)332*86d7f5d3SJohn Marino parse_config_file(struct configuration *config,
333*86d7f5d3SJohn Marino const char *fname, char const **error_str, int *error_line)
334*86d7f5d3SJohn Marino {
335*86d7f5d3SJohn Marino FILE *fin;
336*86d7f5d3SJohn Marino char buffer[255];
337*86d7f5d3SJohn Marino char *fields[128];
338*86d7f5d3SJohn Marino int field_count, line_num, value;
339*86d7f5d3SJohn Marino int res;
340*86d7f5d3SJohn Marino
341*86d7f5d3SJohn Marino TRACE_IN(parse_config_file);
342*86d7f5d3SJohn Marino assert(config != NULL);
343*86d7f5d3SJohn Marino assert(fname != NULL);
344*86d7f5d3SJohn Marino
345*86d7f5d3SJohn Marino fin = fopen(fname, "r");
346*86d7f5d3SJohn Marino if (fin == NULL) {
347*86d7f5d3SJohn Marino TRACE_OUT(parse_config_file);
348*86d7f5d3SJohn Marino return (-1);
349*86d7f5d3SJohn Marino }
350*86d7f5d3SJohn Marino
351*86d7f5d3SJohn Marino res = 0;
352*86d7f5d3SJohn Marino line_num = 0;
353*86d7f5d3SJohn Marino memset(buffer, 0, sizeof(buffer));
354*86d7f5d3SJohn Marino while ((res == 0) && (fgets(buffer, sizeof(buffer) - 1, fin) != NULL)) {
355*86d7f5d3SJohn Marino field_count = strbreak(buffer, fields, sizeof(fields));
356*86d7f5d3SJohn Marino ++line_num;
357*86d7f5d3SJohn Marino
358*86d7f5d3SJohn Marino if (field_count == 0)
359*86d7f5d3SJohn Marino continue;
360*86d7f5d3SJohn Marino
361*86d7f5d3SJohn Marino switch (fields[0][0]) {
362*86d7f5d3SJohn Marino case '#':
363*86d7f5d3SJohn Marino case '\0':
364*86d7f5d3SJohn Marino continue;
365*86d7f5d3SJohn Marino case 'e':
366*86d7f5d3SJohn Marino if ((field_count == 3) &&
367*86d7f5d3SJohn Marino (strcmp(fields[0], "enable-cache") == 0) &&
368*86d7f5d3SJohn Marino (check_cachename(fields[1]) == 0) &&
369*86d7f5d3SJohn Marino ((value = get_yesno(fields[2])) != -1)) {
370*86d7f5d3SJohn Marino enable_cache(config, fields[1], value);
371*86d7f5d3SJohn Marino continue;
372*86d7f5d3SJohn Marino }
373*86d7f5d3SJohn Marino break;
374*86d7f5d3SJohn Marino case 'd':
375*86d7f5d3SJohn Marino if ((field_count == 2) &&
376*86d7f5d3SJohn Marino (strcmp(fields[0], "debug-level") == 0) &&
377*86d7f5d3SJohn Marino ((value = get_number(fields[1], 0, 10)) != -1)) {
378*86d7f5d3SJohn Marino continue;
379*86d7f5d3SJohn Marino }
380*86d7f5d3SJohn Marino break;
381*86d7f5d3SJohn Marino case 'p':
382*86d7f5d3SJohn Marino if ((field_count == 3) &&
383*86d7f5d3SJohn Marino (strcmp(fields[0], "positive-time-to-live") == 0) &&
384*86d7f5d3SJohn Marino (check_cachename(fields[1]) == 0) &&
385*86d7f5d3SJohn Marino ((value = get_number(fields[2], 0, -1)) != -1)) {
386*86d7f5d3SJohn Marino set_positive_time_to_live(config,
387*86d7f5d3SJohn Marino fields[1], value);
388*86d7f5d3SJohn Marino continue;
389*86d7f5d3SJohn Marino } else if ((field_count == 3) &&
390*86d7f5d3SJohn Marino (strcmp(fields[0], "positive-policy") == 0) &&
391*86d7f5d3SJohn Marino (check_cachename(fields[1]) == 0) &&
392*86d7f5d3SJohn Marino ((value = get_policy(fields[2])) != -1)) {
393*86d7f5d3SJohn Marino set_positive_policy(config, fields[1], value);
394*86d7f5d3SJohn Marino continue;
395*86d7f5d3SJohn Marino } else if ((field_count == 3) &&
396*86d7f5d3SJohn Marino (strcmp(fields[0], "perform-actual-lookups") == 0) &&
397*86d7f5d3SJohn Marino (check_cachename(fields[1]) == 0) &&
398*86d7f5d3SJohn Marino ((value = get_yesno(fields[2])) != -1)) {
399*86d7f5d3SJohn Marino set_perform_actual_lookups(config, fields[1],
400*86d7f5d3SJohn Marino value);
401*86d7f5d3SJohn Marino continue;
402*86d7f5d3SJohn Marino }
403*86d7f5d3SJohn Marino break;
404*86d7f5d3SJohn Marino case 'n':
405*86d7f5d3SJohn Marino if ((field_count == 3) &&
406*86d7f5d3SJohn Marino (strcmp(fields[0], "negative-time-to-live") == 0) &&
407*86d7f5d3SJohn Marino (check_cachename(fields[1]) == 0) &&
408*86d7f5d3SJohn Marino ((value = get_number(fields[2], 0, -1)) != -1)) {
409*86d7f5d3SJohn Marino set_negative_time_to_live(config,
410*86d7f5d3SJohn Marino fields[1], value);
411*86d7f5d3SJohn Marino continue;
412*86d7f5d3SJohn Marino } else if ((field_count == 3) &&
413*86d7f5d3SJohn Marino (strcmp(fields[0], "negative-policy") == 0) &&
414*86d7f5d3SJohn Marino (check_cachename(fields[1]) == 0) &&
415*86d7f5d3SJohn Marino ((value = get_policy(fields[2])) != -1)) {
416*86d7f5d3SJohn Marino set_negative_policy(config,
417*86d7f5d3SJohn Marino fields[1], value);
418*86d7f5d3SJohn Marino continue;
419*86d7f5d3SJohn Marino }
420*86d7f5d3SJohn Marino break;
421*86d7f5d3SJohn Marino case 's':
422*86d7f5d3SJohn Marino if ((field_count == 3) &&
423*86d7f5d3SJohn Marino (strcmp(fields[0], "suggested-size") == 0) &&
424*86d7f5d3SJohn Marino (check_cachename(fields[1]) == 0) &&
425*86d7f5d3SJohn Marino ((value = get_number(fields[2], 1, -1)) != -1)) {
426*86d7f5d3SJohn Marino set_suggested_size(config, fields[1], value);
427*86d7f5d3SJohn Marino continue;
428*86d7f5d3SJohn Marino }
429*86d7f5d3SJohn Marino break;
430*86d7f5d3SJohn Marino case 't':
431*86d7f5d3SJohn Marino if ((field_count == 2) &&
432*86d7f5d3SJohn Marino (strcmp(fields[0], "threads") == 0) &&
433*86d7f5d3SJohn Marino ((value = get_number(fields[1], 1, -1)) != -1)) {
434*86d7f5d3SJohn Marino set_threads_num(config, value);
435*86d7f5d3SJohn Marino continue;
436*86d7f5d3SJohn Marino }
437*86d7f5d3SJohn Marino break;
438*86d7f5d3SJohn Marino case 'k':
439*86d7f5d3SJohn Marino if ((field_count == 3) &&
440*86d7f5d3SJohn Marino (strcmp(fields[0], "keep-hot-count") == 0) &&
441*86d7f5d3SJohn Marino (check_cachename(fields[1]) == 0) &&
442*86d7f5d3SJohn Marino ((value = get_number(fields[2], 0, -1)) != -1)) {
443*86d7f5d3SJohn Marino set_keep_hot_count(config,
444*86d7f5d3SJohn Marino fields[1], value);
445*86d7f5d3SJohn Marino continue;
446*86d7f5d3SJohn Marino }
447*86d7f5d3SJohn Marino break;
448*86d7f5d3SJohn Marino case 'c':
449*86d7f5d3SJohn Marino if ((field_count == 3) &&
450*86d7f5d3SJohn Marino (strcmp(fields[0], "check-files") == 0) &&
451*86d7f5d3SJohn Marino (check_cachename(fields[1]) == 0) &&
452*86d7f5d3SJohn Marino ((value = get_yesno(fields[2])) != -1)) {
453*86d7f5d3SJohn Marino check_files(config,
454*86d7f5d3SJohn Marino fields[1], value);
455*86d7f5d3SJohn Marino continue;
456*86d7f5d3SJohn Marino }
457*86d7f5d3SJohn Marino break;
458*86d7f5d3SJohn Marino default:
459*86d7f5d3SJohn Marino break;
460*86d7f5d3SJohn Marino }
461*86d7f5d3SJohn Marino
462*86d7f5d3SJohn Marino LOG_ERR_2("config file parser", "error in file "
463*86d7f5d3SJohn Marino "%s on line %d", fname, line_num);
464*86d7f5d3SJohn Marino *error_str = "syntax error";
465*86d7f5d3SJohn Marino *error_line = line_num;
466*86d7f5d3SJohn Marino res = -1;
467*86d7f5d3SJohn Marino }
468*86d7f5d3SJohn Marino fclose(fin);
469*86d7f5d3SJohn Marino
470*86d7f5d3SJohn Marino TRACE_OUT(parse_config_file);
471*86d7f5d3SJohn Marino return (res);
472*86d7f5d3SJohn Marino }
473