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. Signed-off-by: Glenn Brown <[email protected]> --- 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 _______________________________________________ gPXE-devel mailing list [email protected] http://etherboot.org/mailman/listinfo/gpxe-devel
