Date: Wed, 28 Sep 2005 15:35:02 GMT From: soc-bushman <soc-bushman@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 84439 for review Message-ID: <200509281535.j8SFZ2Xw026959@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=84439 Change 84439 by soc-bushman@soc-bushman_stinger on 2005/09/28 15:34:40 parser completely rewritten to be similar to the nscd.conf file parser some minor changes Affected files ... .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/Makefile#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.8#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.c#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf.5#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.c#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.h#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.c#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.h#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.c#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.h#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.c#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.h#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/hashtable.h#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.c#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.h#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.c#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.h#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.c#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.h#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.c#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.h#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/protocol.c#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/protocol.h#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/query.c#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/query.h#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/singletons.c#3 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/singletons.h#3 edit .. //depot/projects/soc2005/nsswitch_cached/src/include/nscache.h#5 edit .. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/gen/getpwent.c#8 edit .. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/gethostnamadr.c#4 edit .. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/nsdispatch.c#8 edit .. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/nsparser.y#4 edit .. //depot/projects/soc2005/nsswitch_cached/src/usr.sbin/pkg_install/info/show.c#2 integrate .. //depot/projects/soc2005/nsswitch_cached/src/usr.sbin/pkg_install/lib/match.c#2 integrate .. //depot/projects/soc2005/nsswitch_cached/tests/nsdispatch_test/nscache.c#8 edit .. //depot/projects/soc2005/nsswitch_cached/tests/nsdispatch_test/nscache.h#4 edit .. //depot/projects/soc2005/nsswitch_cached/tests/nsdispatch_test/nsdispatch.c#7 edit Differences ... ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/Makefile#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.8#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.c#3 (text+ko) ==== @@ -44,6 +44,7 @@ #include "config.h" #include "debug.h" #include "log.h" +#include "parser.h" #include "query.h" #include "singletons.h" @@ -576,6 +577,11 @@ pthread_rwlock_unlock(&s_time_lock); } +void +_nss_cache_cycle_prevention_function(void) +{ +} + int main(int argc, char *argv[]) { @@ -651,12 +657,16 @@ error_str = NULL; error_line = 0; config_file = CONFIG_PATH; - res = read_configuration(config_file, s_configuration, &error_str, +// res = read_configuration(config_file, s_configuration, &error_str, +// &error_line); + res = parse_config_file(s_configuration, config_file, &error_str, &error_line); if ((res != 0) && (error_str == NULL)) { config_file = DEFAULT_CONFIG_PATH; - res = read_configuration(config_file, s_configuration, - &error_str, &error_line); + res = parse_config_file(s_configuration, config_file, + &error_str, &error_line); +// res = read_configuration(config_file, s_configuration, +// &error_str, &error_line); } if (res != 0) { ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf.5#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.c#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.h#3 (text+ko) ==== @@ -34,7 +34,7 @@ #include "hashtable.h" #include "cacheplcs.h" -#define CACHE_HT_SIZE 256 +#define CACHE_HT_SIZE 257 enum cache_entry_t { CET_COMMON = 0, /* cache item is atomic */ @@ -86,10 +86,10 @@ /* unique fields */ char *entry_name; - size_t max_elemsize; /* if 0 then no check is made */ + size_t max_elemsize; /* if 0 then no check is made */ size_t satisf_elemsize; struct timeval max_lifetime; /* if 0 then no check is made */ - enum cache_policy_t policy; /* policy used for transformations */ + enum cache_policy_t policy; /* policy used for transformations */ }; /* params, used for multipart entries */ ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.c#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.h#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.c#3 (text+ko) ==== @@ -27,31 +27,40 @@ #include <assert.h> #include <math.h> +#include <stdio.h> #include <stdlib.h> #include <string.h> #include "config.h" #include "debug.h" -#include "parser.h" + +#define INITIAL_ENTRIES_CAPACITY 8 +#define DEFAULT_SOCKET_PATH "/var/run/cached" +#define DEFAULT_PIDFILE_PATH "/var/run/cached.pid" -#define INITIAL_ENTRIES_CAPACITY 8 -#define DEFAULT_SOCKET_PATH "/var/run/cached" -#define DEFAULT_PIDFILE_PATH "/var/run/cached.pid" +const char *c_default_entries[6] = { + NSDB_PASSWD, + NSDB_GROUP, + NSDB_HOSTS, + NSDB_SERVICES, + NSDB_PROTOCOLS, + NSDB_RPC + }; static int configuration_entry_cmp(const void *, const void *); static struct configuration_entry *create_configuration_entry(const char *, uid_t, int, struct timeval const *, struct cache_entry_params const *); -static void destroy_configuration_entry(struct configuration_entry *); +/*static void destroy_configuration_entry(struct configuration_entry *); static int add_configuration_entry(struct configuration *, - struct configuration_entry *); + struct configuration_entry *);*/ -static int process_root_parser_pair(struct configuration *, +/*static int process_root_parser_pair(struct configuration *, struct parser_pair_ *, char const **, int *); static int process_parser_common_group_pair(struct common_cache_entry_params *, struct parser_pair_ *, char const **, int *); static int process_parser_mp_group_pair(struct mp_cache_entry_params *, struct parser_pair_ *, char const **, int *); static int process_parser_group(struct configuration *, - struct parser_group_ *, char const **, int *); + struct parser_group_ *, char const **, int *);*/ static int configuration_entry_cmp(const void *e1, const void *e2) @@ -157,7 +166,58 @@ return (retval); } -static void +struct configuration_entry * +create_def_configuration_entry(const char *name, enum cache_entry_t type) +{ + struct common_cache_entry_params common_params; + struct mp_cache_entry_params mp_params; + struct timeval default_timeout; + + struct configuration_entry *res = NULL; + + TRACE_IN(create_def_configuration_entry); + memset(&default_timeout, 0, sizeof(struct timeval)); + switch (type) { + case CET_COMMON: + memset(&common_params, 0, + sizeof(struct common_cache_entry_params)); + common_params.entry_type = CET_COMMON; + common_params.entry_name = (char *)name; + common_params.max_elemsize = 2048; + common_params.satisf_elemsize = 1024; + common_params.max_lifetime.tv_sec = 60 * 60 * 12; + common_params.policy = CPT_LRU; + + default_timeout.tv_sec = DEFAULT_COMMON_ENTRY_TIMEOUT; + + res = create_configuration_entry(name, -1, 0, + &default_timeout, + (struct cache_entry_params *)&common_params); + break; + case CET_MULTIPART: + memset(&mp_params, 0, + sizeof(struct mp_cache_entry_params)); + mp_params.entry_type = CET_MULTIPART; + mp_params.entry_name = (char *)name; + mp_params.max_elemsize = 1024 * 8; + mp_params.max_sessions = 1024; + mp_params.max_lifetime.tv_sec = 60 * 60 * 12; + + default_timeout.tv_sec = DEFAULT_MP_ENTRY_TIMEOUT; + + res = create_configuration_entry(name, -1, 0, + &default_timeout, + (struct cache_entry_params *)&mp_params); + break; + default: + break; + } + + TRACE_OUT(create_def_configuration_entry); + return (res); +} + +void destroy_configuration_entry(struct configuration_entry *entry) { TRACE_IN(destroy_configuration_entry); @@ -171,7 +231,7 @@ TRACE_OUT(destroy_configuration_entry); } -static int +int add_configuration_entry(struct configuration *config, struct configuration_entry *entry) { @@ -207,7 +267,7 @@ return (0); } -static int +/*static int process_root_parser_pair(struct configuration *config, struct parser_pair_ *pair, char const **error_str, int *error_line) { @@ -486,7 +546,7 @@ free(params); TRACE_OUT(process_parser_group); return (res); -} +}*/ size_t configuration_get_entries_size(struct configuration *config) @@ -619,11 +679,12 @@ for (i = 0; i < config->entries_size; ++i) destroy_configuration_entry(config->entries[i]); - config->entries_size = 0; + config->entries_size = 0; +// config->entries_size = sizeof(c_default_entries) / sizeof(char *); TRACE_OUT(fill_configuration_defaults); } -int +/*int read_configuration(const char *fname, struct configuration *config, char const **error_str, int *error_line) { @@ -677,7 +738,7 @@ destroy_parser(config_parser); TRACE_OUT(read_configuration); return (res); -} +}*/ void destroy_configuration(struct configuration *config) ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.h#3 (text+ko) ==== @@ -31,9 +31,15 @@ #include <sys/stat.h> #include <sys/types.h> #include <pthread.h> +#include <nsswitch.h> #include <unistd.h> #include "cachelib.h" +#define DEFAULT_COMMON_ENTRY_TIMEOUT 10 +#define DEFAULT_MP_ENTRY_TIMEOUT 60 + +extern const char *c_default_entries[6]; + struct configuration_entry { struct timeval query_timeout; struct cache_entry_params *c_params; @@ -43,6 +49,9 @@ uid_t desired_euid; int use_desired_euid; + + int perform_actual_lookups; + int enabled; }; /* the cached configuration parameters */ @@ -64,11 +73,16 @@ }; extern struct configuration *init_configuration(void); +extern void destroy_configuration(struct configuration *); extern void fill_configuration_defaults(struct configuration *); -extern int read_configuration(const char *, struct configuration *, - char const **, int *); -extern void destroy_configuration(struct configuration *); +/*extern int read_configuration(const char *, struct configuration *, + char const **, int *);*/ +extern int add_configuration_entry(struct configuration *, + struct configuration_entry *); +extern struct configuration_entry *create_def_configuration_entry( + const char *, enum cache_entry_t); +extern void destroy_configuration_entry(struct configuration_entry *); extern size_t configuration_get_entries_size(struct configuration *); extern struct configuration_entry *configuration_get_entry( struct configuration *, size_t); ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.c#3 (text+ko) ==== @@ -28,19 +28,19 @@ #include <stdio.h> #include "debug.h" -static int trace_level=0; -static int trace_level_bk=0; +static int trace_level = 0; +static int trace_level_bk = 0; void __trace_in(const char *s, const char *f, int l) { int i; - if (trace_level<TRACE_WANTED) + if (trace_level < TRACE_WANTED) { - for (i=0;i<trace_level;++i) + for (i = 0; i < trace_level; ++i) printf("\t"); - printf("=> %s\n",s); + printf("=> %s\n", s); } ++trace_level; @@ -51,12 +51,12 @@ { int i; - if (trace_level<TRACE_WANTED) + if (trace_level < TRACE_WANTED) { - for (i=0;i<trace_level-1;++i) + for (i = 0; i < trace_level - 1; ++i) printf("\t"); - printf("= %s: %d\n",f,l); + printf("= %s: %d\n", f, l); } } @@ -65,12 +65,12 @@ { int i; - if (trace_level<TRACE_WANTED) + if (trace_level < TRACE_WANTED) { - for (i=0;i<trace_level-1;++i) + for (i = 0; i < trace_level - 1; ++i) printf("\t"); - printf("= MSG %s, %s: %d\n", msg, f,l); + printf("= MSG %s, %s: %d\n", msg, f, l); } } @@ -79,12 +79,12 @@ { int i; - if (trace_level<TRACE_WANTED) + if (trace_level < TRACE_WANTED) { - for (i=0;i<trace_level-1;++i) + for (i = 0; i < trace_level - 1; ++i) printf("\t"); - printf("= PTR %s: %p, %s: %d\n",desc,p,f,l); + printf("= PTR %s: %p, %s: %d\n", desc, p, f, l); } } @@ -93,12 +93,12 @@ { int j; - if (trace_level<TRACE_WANTED) + if (trace_level < TRACE_WANTED) { - for (j=0;j<trace_level-1;++j) + for (j = 0; j < trace_level - 1; ++j) printf("\t"); - printf("= INT %s: %i, %s: %d\n",desc,i,f,l); + printf("= INT %s: %i, %s: %d\n",desc, i, f, l); } } @@ -107,12 +107,12 @@ { int i; - if (trace_level<TRACE_WANTED) + if (trace_level < TRACE_WANTED) { - for (i=0;i<trace_level-1;++i) + for (i = 0; i < trace_level - 1; ++i) printf("\t"); - printf("= PTR %s: '%s', %s: %d\n",desc,s,f,l); + printf("= STR %s: '%s', %s: %d\n", desc, s, f, l); } } @@ -122,25 +122,25 @@ int i; --trace_level; - if (trace_level<TRACE_WANTED) + if (trace_level < TRACE_WANTED) { - for (i=0;i<trace_level;++i) + for (i = 0; i < trace_level; ++i) printf("\t"); - printf("<= %s\n",s); + printf("<= %s\n", s); } } void __trace_on() { - trace_level=trace_level_bk; - trace_level_bk=0; + trace_level = trace_level_bk; + trace_level_bk = 0; } void __trace_off() { - trace_level_bk=trace_level; - trace_level=1024; + trace_level_bk = trace_level; + trace_level = 1024; } ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.h#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/hashtable.h#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.c#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.h#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.c#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.h#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.c#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.h#3 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.c#3 (text+ko) ==== @@ -24,664 +24,476 @@ * SUCH DAMAGE. * */ - + #include <assert.h> -#include <limits.h> +#include <stdio.h> #include <string.h> +#include "config.h" #include "debug.h" +#include "log.h" #include "parser.h" -#define INITIAL_GROUPS_CAPACITY 8 -#define INITIAL_PAIRS_CAPACITY 8 +enum entry_use_type { + EUT_COMMON = 0, + EUT_MULTIPART = 1, + EUT_NEGATIVE = 2, + EUT_MAX = 3 +}; -static int add_parser_group(struct parser_ *, struct parser_group_ *); -static int add_parser_group_pair(struct parser_group_ *, - struct parser_pair_ *); -static void destroy_parser_group(struct parser_group_ *); -static void destroy_parser_pair(struct parser_pair_ *); -static struct parser_group_ *init_parser_group(const char *, int); -static struct parser_pair_ *init_parser_pair(const char *, const char *, int); +static void enable_cache(struct configuration *,const char *, int); +static struct configuration_entry *find_create_entry(struct configuration *, + const char *, enum entry_use_type); +static int get_number(const char *, int, int); +static enum cache_policy_t get_policy(const char *); +static int get_yesno(const char *); +static int check_cachename(const char *); +static void check_files(struct configuration *, const char *, int); +static void set_keep_hot_count(struct configuration *, const char *, int); +static void set_negative_policy(struct configuration *, const char *, + enum cache_policy_t); +static void set_negative_time_to_live(struct configuration *, + const char *, int); +static void set_positive_policy(struct configuration *, const char *, + enum cache_policy_t); +static void set_perform_actual_lookups(struct configuration *, const char *, + int); +static void set_positive_time_to_live(struct configuration *, + const char *, int); +static void set_suggested_size(struct configuration *, const char *, + enum cache_policy_t); +static int strbreak(char *, char **, int); -static int parser_expect_char(struct parser_ *, char); -static int parser_expect_string(struct parser_ *, char *); -static int parser_check_eof(struct parser_ *); -static int parser_read_group(struct parser_ *, struct parser_group_ **); -static int parser_read_pair(struct parser_ *, struct parser_pair_ **); -static int parser_read_quoted_string(struct parser_ *, char **, size_t *); -static int parser_read_string(struct parser_ *, char **, size_t *); -static void parser_skip_spaces(struct parser_ *); - - -static void -parser_skip_spaces(struct parser_ *the_parser) +static int +strbreak(char *str, char **fields, int fields_size) { - int comment_flag; - size_t advance; + char *c = str; + int i, num; + + TRACE_IN(strbreak); + num = 0; + for (i = 0; + ((*fields = + strsep(i < fields_size ? &c : NULL, "\n\t ")) != NULL); + ++i) + if ((*(*fields)) != '\0') { + ++fields; + ++num; + } - TRACE_IN(parser_skip_spaces); - comment_flag = 0; - do { - if (comment_flag == 0) - advance = strspn(the_parser->cur_pos, " \t"); - else - advance = strcspn(the_parser->cur_pos, "\r\n"); - TRACE_INT(advance); - the_parser->cur_pos += advance; - switch (*the_parser->cur_pos) { - case '#': - comment_flag = 1; - ++advance; - break; - case '\r': - case '\n': - TRACE_INT(the_parser->cur_line); - comment_flag = 0; - ++the_parser->cur_line; - ++the_parser->cur_pos; - ++advance; - break; - default: - advance = 0; - break; - } - } while (advance > 0); - TRACE_OUT(parser_skip_spaces); + TRACE_OUT(strbreak); + return (num); } -static int -parser_expect_char(struct parser_ *the_parser, char model) +static struct configuration_entry * +find_create_entry(struct configuration *config, + const char *entry_name, enum entry_use_type use_type) { + struct configuration_entry *entry = NULL; + struct configuration_entry model; + enum cache_entry_t entry_type; int res; - TRACE_IN(parser_expect_char); - if (*the_parser->cur_pos == '\0') { - TRACE_OUT(parser_expect_char); - return (PARSER_ERROR_UNEXPECTED_EOF); - } - - if (*the_parser->cur_pos == model) { - res = PARSER_SUCCESS; - ++the_parser->cur_pos; - } else - res = PARSER_ERROR_UNEXPECTED_CHAR; - TRACE_OUT(parser_expect_char); - return (res); -} - -static int -parser_read_quoted_string(struct parser_ *the_parser, char **result, - size_t *result_size) -{ - char *end_quote_pos; - - TRACE_IN(parser_read_quoted_string); - if (*the_parser->cur_pos == '\0') { - TRACE_OUT(parser_read_quoted_string); - return (PARSER_ERROR_UNEXPECTED_EOF); + TRACE_IN(find_create_entry); + memset(&model, 0, sizeof(struct configuration_entry)); + switch (use_type) { + case EUT_COMMON: + model.name = (char *)entry_name; + break; + case EUT_MULTIPART: + asprintf(&model.name, "%s_mp", entry_name); + assert(model.name != NULL); + break; + case EUT_NEGATIVE: + asprintf(&model.name, "%s_neg", entry_name); + assert(model.name != NULL); + break; + default: + /* should be unreachable */ + break; } - if (*the_parser->cur_pos != '"') { - *result = NULL; - *result_size = 0; - TRACE_OUT(parser_read_quoted_string); - return (PARSER_ERROR_FIRST_QUOTE_NOT_FOUND); - } - end_quote_pos = the_parser->cur_pos + 1 + - strcspn(the_parser->cur_pos + 1, - "\r\n\""); - if (*end_quote_pos != '\"') { - TRACE_OUT(parser_read_quoted_string); - return (PARSER_ERROR_SECOND_QUOTE_NOT_FOUND); + entry = configuration_find_entry(config, &model); + if (entry == NULL) { + switch (use_type) { + case EUT_COMMON: + case EUT_NEGATIVE: + entry_type = CET_COMMON; + break; + case EUT_MULTIPART: + entry_type = CET_MULTIPART; + break; + default: + /* should be unreachable */ + break; + } + entry = create_def_configuration_entry(model.name, entry_type); + assert( entry != NULL); + res = add_configuration_entry(config, entry); + assert(res == 0); } - *result = the_parser->cur_pos + 1; - *end_quote_pos = '\0'; - *result_size = end_quote_pos - *result - 1; - - the_parser->cur_pos = end_quote_pos + 1; - TRACE_OUT(parser_read_quoted_string); - return (PARSER_SUCCESS); + switch (use_type) { + case EUT_MULTIPART: + case EUT_NEGATIVE: + free(model.name); + break; + default: + break; + } + TRACE_OUT(find_create_entry); + return (entry); } -static int -parser_read_string(struct parser_ *the_parser, char **result, - size_t *result_size) +static void +enable_cache(struct configuration *config, const char *entry_name, int flag) { - char *last_char_pos; - - TRACE_IN(parser_read_string); - if (*the_parser->cur_pos == '\0') { - TRACE_OUT(parser_read_string); - return (PARSER_ERROR_UNEXPECTED_EOF); - } - - last_char_pos = the_parser->cur_pos + strcspn(the_parser->cur_pos, - " \r\n\t\"'"); - - if ((*last_char_pos == '\n') || (*last_char_pos == '\r')) - ++the_parser->cur_line; - *last_char_pos = '\0'; - *result = the_parser->cur_pos; - *result_size = last_char_pos - *result - 1; - - the_parser->cur_pos = last_char_pos + 1; - TRACE_OUT(parser_read_string); - return (PARSER_SUCCESS); -} + struct configuration_entry *entry; + int i; -static int -parser_expect_string(struct parser_ *the_parser, char *model) -{ - char *last_char_pos; - char last_char_backup; - - TRACE_IN(parser_expect_string); - if (*the_parser->cur_pos == '\0') { - TRACE_OUT(parser_expect_string); - return (PARSER_ERROR_UNEXPECTED_EOF); + TRACE_IN(enable_cache); + for (i = 0; i < EUT_MAX; ++i) { + entry = find_create_entry(config, entry_name, i); + assert(entry != NULL); + entry->enabled = flag; } - - last_char_pos = the_parser->cur_pos + strcspn(the_parser->cur_pos, - " \r\n\t\"'"); - - last_char_backup = *last_char_pos; - if ((*last_char_pos == '\n') || (*last_char_pos == '\r')) - ++the_parser->cur_line; - *last_char_pos = '\0'; - - if (strcmp(the_parser->cur_pos, model) == 0) { - the_parser->cur_pos = last_char_pos + 1; - TRACE_OUT(parser_expect_string); - return (PARSER_SUCCESS); - } else { - *last_char_pos = last_char_backup; - TRACE_OUT(parser_expect_string); - return (PARSER_ERROR_UNEXPECTED_STRING); - } + TRACE_OUT(enable_cache); } -static int -parser_check_eof(struct parser_ *the_parser) +static void +set_positive_time_to_live(struct configuration *config, + const char *entry_name, int ttl) { - TRACE_IN(parser_check_eof); - TRACE_OUT(parser_check_eof); - return (*the_parser->cur_pos == '\0' ? 1 : 0); -} + struct configuration_entry *entry; + struct timeval lifetime; -static int -parser_read_pair(struct parser_ *the_parser, struct parser_pair_ **pair) -{ - char *token1, *token2; - size_t token1_size, token2_size; - int res; + TRACE_IN(set_positive_time_to_live); + assert(ttl >= 0); + assert(entry_name != NULL); + memset(&lifetime, 0, sizeof(struct timeval)); + lifetime.tv_sec = ttl; - TRACE_IN(parser_read_pair); - parser_skip_spaces(the_parser); - res = parser_read_string(the_parser, &token1, &token1_size); - if (res != PARSER_SUCCESS) - goto fin; + entry = find_create_entry(config, entry_name, EUT_COMMON); + assert(entry->c_params->entry_type == CET_COMMON); + memcpy(&((struct common_cache_entry_params *) + entry->c_params)->max_lifetime, + &lifetime, sizeof(struct timeval)); + + entry = find_create_entry(config, entry_name, EUT_MULTIPART); + assert(entry->c_params->entry_type == CET_MULTIPART); + memcpy(&((struct mp_cache_entry_params *)entry->c_params)->max_lifetime, + &lifetime, sizeof(struct timeval)); - parser_skip_spaces(the_parser); - res = parser_expect_char(the_parser, '='); - if (res != PARSER_SUCCESS) { - res = PARSER_ERROR_EQUALITY_EXPECTED; - goto fin; - } - - parser_skip_spaces(the_parser); - res = parser_read_quoted_string(the_parser, &token2, &token2_size); - if (res == PARSER_ERROR_FIRST_QUOTE_NOT_FOUND) - res = parser_read_string(the_parser, &token2, &token2_size); - - if (res == PARSER_SUCCESS) - *pair = init_parser_pair(token1, token2, the_parser->cur_line); - -fin: - TRACE_OUT(parser_read_pair); - return (res); + TRACE_OUT(set_positive_time_to_live); } -static int -parser_read_group(struct parser_ *the_parser, struct parser_group_ **group) +static void +set_negative_time_to_live(struct configuration *config, + const char *entry_name, int nttl) { - struct parser_pair_ *pair; - char *token; - size_t token_size; - int res; + struct configuration_entry *entry; + struct timeval lifetime; - TRACE_IN(parser_read_group); - parser_skip_spaces(the_parser); - res = parser_expect_string(the_parser, "entry"); - if (res != PARSER_SUCCESS) { - TRACE_OUT(parser_read_group); - return (res); - } + TRACE_IN(set_negative_time_to_live); + assert(nttl > 0); + assert(entry_name != NULL); + memset(&lifetime, 0, sizeof(struct timeval)); + lifetime.tv_sec = nttl; - parser_skip_spaces(the_parser); - res = parser_read_quoted_string(the_parser, &token, &token_size); - if (res != PARSER_SUCCESS) - goto fin; - - parser_skip_spaces(the_parser); - res = parser_expect_char(the_parser, '{'); - if (res != PARSER_SUCCESS) { - res = PARSER_ERROR_FIRST_FIGURE_BRACE_EXPECTED; - goto fin; - } - - *group = init_parser_group(token, the_parser->cur_line); - pair = NULL; - do { - if (pair != NULL) - add_parser_group_pair(*group, pair); - - parser_skip_spaces(the_parser); - res = parser_expect_char(the_parser, '}'); - if (res == PARSER_SUCCESS) - break; - - res = parser_read_pair(the_parser, &pair); - TRACE_INT(res); - } while (res == PARSER_SUCCESS); - - if (res != PARSER_SUCCESS) - destroy_parser_group(*group); - -fin: - TRACE_OUT(parser_read_group); - return (res); + entry = find_create_entry(config, entry_name, EUT_NEGATIVE); + assert(entry != NULL); + assert(entry->c_params->entry_type == CET_COMMON); + memcpy(&((struct common_cache_entry_params *) + entry->c_params)->max_lifetime, + &lifetime, sizeof(struct timeval)); + + TRACE_OUT(set_negative_time_to_live); } -void -parser_pair_dump(struct parser_pair_ *pair) +static void +set_keep_hot_count(struct configuration *config, + const char *entry_name, int count) { - TRACE_IN(parser_pair_dump); - assert(pair != NULL); - TRACE_STR(pair->key); - TRACE_STR(pair->value); - TRACE_INT(pair->fline); - TRACE_OUT(parser_pair_dump); -} + struct configuration_entry *entry; -void -parser_group_dump(struct parser_group_ *group) -{ - int i; - TRACE_IN(parser_group_dump); - assert(group != NULL); - TRACE_STR(group->name); - for (i = 0; i < group->pairs_size; ++i) - parser_pair_dump(group->pairs[i]); - TRACE_INT(group->fline); - TRACE_OUT(parser_group_dump); -} - -void -parser_dump(struct parser_ *the_parser) -{ - int i; - TRACE_IN(parser_dump); - assert(the_parser != NULL); - parser_group_dump(the_parser->root_group); + TRACE_IN(set_keep_hot_count); + assert(count >= 0); + assert(entry_name != NULL); + + entry = find_create_entry(config, entry_name, EUT_COMMON); + assert(entry != NULL); + assert(entry->c_params->entry_type == CET_COMMON); + ((struct common_cache_entry_params *) + entry->c_params)->max_elemsize = count; - for (i = 0; i < the_parser->groups_size; ++i) - parser_group_dump(the_parser->groups[i]); - TRACE_OUT(parser_dump); -} + entry = find_create_entry(config, entry_name, EUT_NEGATIVE); + assert(entry != NULL); + assert(entry->c_params->entry_type == CET_COMMON); + ((struct common_cache_entry_params *) + entry->c_params)->max_elemsize = count; -static struct parser_group_ * -init_parser_group(const char *group_name, int fline) -{ - struct parser_group_ *group; - size_t group_name_len; - - TRACE_IN(init_parser_group); >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200509281535.j8SFZ2Xw026959>