diff options
author | Michael Brown | 2012-04-19 17:09:31 +0200 |
---|---|---|
committer | Michael Brown | 2012-04-19 17:10:07 +0200 |
commit | 31e60de6760d5094f1ac662b877bb85b83aa1a53 (patch) | |
tree | 11038fe35795f98beeefe2a3a024d6fc8cf89891 /src/core/settings.c | |
parent | [multiboot] Place multiboot modules low in memory (diff) | |
download | ipxe-31e60de6760d5094f1ac662b877bb85b83aa1a53.tar.gz ipxe-31e60de6760d5094f1ac662b877bb85b83aa1a53.tar.xz ipxe-31e60de6760d5094f1ac662b877bb85b83aa1a53.zip |
[settings] Add fetch_setting_copy()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core/settings.c')
-rw-r--r-- | src/core/settings.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/core/settings.c b/src/core/settings.c index e80355c7..c84e1bc2 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -677,6 +677,46 @@ int fetch_setting_len ( struct settings *settings, struct setting *setting ) { } /** + * Fetch copy of setting + * + * @v settings Settings block, or NULL to search all blocks + * @v setting Setting to fetch + * @v data Buffer to allocate and fill with setting data + * @ret len Length of setting, or negative error + * + * The caller is responsible for eventually freeing the allocated + * buffer. + * + * To allow the caller to distinguish between a non-existent setting + * and an error in allocating memory for the copy, this function will + * return success (and a NULL buffer pointer) for a non-existent + * setting. + */ +int fetch_setting_copy ( struct settings *settings, struct setting *setting, + void **data ) { + int len; + int check_len = 0; + + /* Avoid returning uninitialised data on error */ + *data = NULL; + + /* Fetch setting length, and return success if non-existent */ + len = fetch_setting_len ( settings, setting ); + if ( len < 0 ) + return 0; + + /* Allocate buffer */ + *data = malloc ( len ); + if ( ! *data ) + return -ENOMEM; + + /* Fetch setting */ + check_len = fetch_setting ( settings, setting, *data, len ); + assert ( check_len == len ); + return len; +} + +/** * Fetch value of string setting * * @v settings Settings block, or NULL to search all blocks |