[PATCH 2/3] nfs.conf tidy ups

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux