Return-Path: Received: from mx1.redhat.com ([209.132.183.28]:64076 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752455AbdEVPuG (ORCPT ); Mon, 22 May 2017 11:50:06 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 17B9B7F7A6 for ; Mon, 22 May 2017 15:50:06 +0000 (UTC) Received: from jumitche.remote.csb (unknown [10.33.36.38]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 94FF67C430 for ; Mon, 22 May 2017 15:50:05 +0000 (UTC) Message-ID: <1495468204.4169.10.camel@redhat.com> Subject: [PATCH 2/3] nfs.conf tidy ups From: Justin Mitchell To: "linux-nfs@vger.kernel.org" Date: Mon, 22 May 2017 16:50:04 +0100 Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org List-ID: Add function to cleanup and free the loaded config Signed-off-by: Justin Mitchell --- 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