[gPXE-devel] [PATCH 2/6] [settings] Add optionally-recursive fetch_setting_ex().

Glenn Brown glenn at myri.com
Wed Jul 21 01:22:29 EDT 2010


Extend fetch_setting() to make recursion optional, and call the result
fetch_setting_ex().  fetch_setting() becomes a shim over the new function.

Non-recursive fetches allow the caller to determine if a setting is set
directly in the current scope, or is inheritted from a child setting.
Knowing this can help create a more informative user interface.
---
 src/core/settings.c         |   22 ++++++++++++++++++++++
 src/include/gpxe/settings.h |    2 ++
 2 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/src/core/settings.c b/src/core/settings.c
index 7d83101..52ff0cc 100644
--- a/src/core/settings.c
+++ b/src/core/settings.c
@@ -538,6 +538,24 @@ int store_setting ( struct settings *settings, struct setting *setting,
  */
 int fetch_setting ( struct settings *settings, struct setting *setting,
 		    void *data, size_t len ) {
+	return fetch_setting_ex ( settings, setting, data, len, 1);
+}
+
+/**
+ * Fetch value of setting
+ *
+ * @v settings		Settings block, or NULL to search all blocks
+ * @v setting		Setting to fetch
+ * @v data		Buffer to fill with setting data
+ * @v len		Length of buffer
+ * @v recurse		Enable setting in children, if necessary.
+ * @ret len		Length of setting data, or negative error
+ *
+ * The actual length of the setting will be returned even if
+ * the buffer was too small.
+ */
+int fetch_setting_ex ( struct settings *settings, struct setting *setting,
+		       void *data, size_t len, int recurse ) {
 	struct settings *child;
 	int ret;
 
@@ -557,6 +575,10 @@ int fetch_setting ( struct settings *settings, struct setting *setting,
 					   data, len ) ) >= 0 )
 		return ret;
 
+	/* Return if recursion is disabled. */
+	if ( ! recurse )
+		return -ENOENT;
+
 	/* Recurse into each child block in turn */
 	list_for_each_entry ( child, &settings->children, siblings ) {
 		if ( ( ret = fetch_setting ( child, setting,
diff --git a/src/include/gpxe/settings.h b/src/include/gpxe/settings.h
index 17c9b49..0abc322 100644
--- a/src/include/gpxe/settings.h
+++ b/src/include/gpxe/settings.h
@@ -205,6 +205,8 @@ extern int store_setting ( struct settings *settings, struct setting *setting,
 			   const void *data, size_t len );
 extern int fetch_setting ( struct settings *settings, struct setting *setting,
 			   void *data, size_t len );
+extern int fetch_setting_ex ( struct settings *settings, struct setting *setting,
+			      void *data, size_t len, int recurse );
 extern int fetch_setting_len ( struct settings *settings,
 			       struct setting *setting );
 extern int fetch_string_setting ( struct settings *settings,
-- 
1.7.0.4



More information about the gPXE-devel mailing list