Add function to cleanup and free the loaded config Signed-off-by: Justin Mitchell <jumitche@xxxxxxxxx> --- support/include/conffile.h | 1 + support/nfs/conffile.c | 51 +++++++++++++++++++++++++++++++++++++++------- 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/support/include/conffile.h b/support/include/conffile.h index 20b1a32..2d11a52 100644 --- a/support/include/conffile.h +++ b/support/include/conffile.h @@ -60,6 +60,7 @@ extern _Bool conf_get_bool(char *, char *, _Bool); extern char *conf_get_str(char *, char *); extern char *conf_get_section(char *, char *, char *); extern void conf_init(const char *); +extern void conf_cleanup(void); extern int conf_match_num(char *, char *, int); extern int conf_remove(int, char *, char *); extern int conf_remove_section(int, char *); diff --git a/support/nfs/conffile.c b/support/nfs/conffile.c index a76c7e3..7c607c0 100644 --- a/support/nfs/conffile.c +++ b/support/nfs/conffile.c @@ -414,13 +414,32 @@ conf_load(int trans, const char *path) return -1; } +/* remove and free up any existing config state */ +static void conf_free_bindings(void) +{ + unsigned int i; + for (i = 0; i < sizeof conf_bindings / sizeof conf_bindings[0]; i++) { + struct conf_binding *cb, *next; + + cb = LIST_FIRST(&conf_bindings[i]); + for (; cb; cb = next) { + next = LIST_NEXT(cb, link); + LIST_REMOVE(cb, link); + free(cb->section); + free(cb->arg); + free(cb->tag); + free(cb->value); + free(cb); + } + LIST_INIT(&conf_bindings[i]); + } +} + /* Open the config file and map it into our address space, then parse it. */ static void conf_reinit(const char *conf_file) { - struct conf_binding *cb = 0; int trans; - unsigned int i; trans = conf_begin(); if (conf_load(trans, conf_file) < 0) @@ -430,12 +449,9 @@ conf_reinit(const char *conf_file) conf_load_defaults(); /* Free potential existing configuration. */ - for (i = 0; i < sizeof conf_bindings / sizeof conf_bindings[0]; i++) { - cb = LIST_FIRST (&conf_bindings[i]); - for (; cb; cb = LIST_FIRST (&conf_bindings[i])) - conf_remove_now(cb->section, cb->tag); - } + conf_free_bindings(); + /* Apply the new configuration values */ conf_end(trans, 1); return; } @@ -454,6 +470,27 @@ conf_init (const char *conf_file) conf_reinit(conf_file); } +/* + * Empty the config and free up any used memory + */ +void +conf_cleanup(void) +{ + conf_free_bindings(); + + struct conf_trans *node, *next; + for (node = TAILQ_FIRST(&conf_trans_queue); node; node = next) { + next = TAILQ_NEXT(node, link); + TAILQ_REMOVE (&conf_trans_queue, node, link); + if (node->section) free(node->section); + if (node->arg) free(node->arg); + if (node->tag) free(node->tag); + if (node->value) free(node->value); + free (node); + } + TAILQ_INIT(&conf_trans_queue); +} + /* * Return the numeric value denoted by TAG in section SECTION or DEF * if that tag does not exist. -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html