From a7933bdd3646d6be114eb5c68093918997840d9b Mon Sep 17 00:00:00 2001 From: John van der Kamp Date: Tue, 1 Jun 2010 07:54:25 +0530 Subject: [BB#89] Don't recompile regular expressions This is a modification of a patch originally written by John van der Kamp at The modification was done by the committer. --- src/conf.c | 28 ++++++++++++++++++++++++++-- src/conf.h | 2 ++ src/main.c | 5 +++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/conf.c b/src/conf.c index c089fc7..269941e 100644 --- a/src/conf.c +++ b/src/conf.c @@ -163,6 +163,8 @@ static HANDLE_FUNC (handle_upstream); static HANDLE_FUNC (handle_upstream_no); #endif +static void config_free_regex (void); + /* * This macro can be used to make standard directives in the form: * directive arguments [arguments ...] @@ -317,7 +319,8 @@ static void free_config (struct config_s *conf) * * Returns 0 on success; negative upon failure. */ -static int config_compile (void) +int +config_compile_regex (void) { unsigned int i, r; @@ -335,9 +338,30 @@ static int config_compile (void) if (r) return r; } + + atexit (config_free_regex); + return 0; } +/* + * Frees pre-compiled regular expressions used by the configuration + * file. This function is registered to be automatically called at exit. + */ +static void +config_free_regex (void) +{ + unsigned int i; + + for (i = 0; i < ndirectives; i++) { + if (directives[i].cre) { + regfree (directives[i].cre); + safefree (directives[i].cre); + directives[i].cre = NULL; + } + } +} + /* * Attempt to match the supplied line with any of the configuration * regexes defined above. If a match is found, call the handler @@ -397,7 +421,7 @@ static int load_config_file (const char *config_fname, struct config_s *conf) goto done; } - if (config_compile () || config_parse (conf, config_file)) { + if (config_parse (conf, config_file)) { fprintf (stderr, "Unable to parse config file. " "Not starting.\n"); goto done; diff --git a/src/conf.h b/src/conf.h index 9a53adf..f62a854 100644 --- a/src/conf.h +++ b/src/conf.h @@ -115,4 +115,6 @@ struct config_s { extern int reload_config_file (const char *config_fname, struct config_s *conf, struct config_s *defaults); +int config_compile_regex (void); + #endif diff --git a/src/main.c b/src/main.c index 064b440..228b381 100644 --- a/src/main.c +++ b/src/main.c @@ -383,6 +383,11 @@ main (int argc, char **argv) log_message (LOG_INFO, "Initializing " PACKAGE " ..."); + ret = config_compile_regex(); + if (ret != 0) { + exit (EX_SOFTWARE); + } + initialize_config_defaults (&config_defaults); process_cmdline (argc, argv, &config_defaults); -- cgit v1.2.3