diff options
author | Michael Brown | 2013-07-18 15:46:20 +0200 |
---|---|---|
committer | Michael Brown | 2013-07-19 16:23:54 +0200 |
commit | a5be7c4f2902502c6eea5edf6bcfbfe90eb5537d (patch) | |
tree | 116a901f0e391e9416edf5b2e1872b3fde46ac82 /src/core/settings.c | |
parent | [settings] Change "not-found" semantics of fetch_setting_copy() (diff) | |
download | ipxe-a5be7c4f2902502c6eea5edf6bcfbfe90eb5537d.tar.gz ipxe-a5be7c4f2902502c6eea5edf6bcfbfe90eb5537d.tar.xz ipxe-a5be7c4f2902502c6eea5edf6bcfbfe90eb5537d.zip |
[settings] Add fetchf_setting_copy()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core/settings.c')
-rw-r--r-- | src/core/settings.c | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/src/core/settings.c b/src/core/settings.c index 0be1a2dd..d3d15155 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -726,7 +726,7 @@ int fetch_setting_len ( struct settings *settings, struct setting *setting ) { int fetch_setting_copy ( struct settings *settings, struct setting *setting, void **data ) { int len; - int check_len = 0; + int check_len; /* Avoid returning uninitialised data on error */ *data = NULL; @@ -1028,7 +1028,7 @@ int setting_cmp ( struct setting *a, struct setting *b ) { */ /** - * Fetch and format value of setting + * Fetch formatted value of setting * * @v settings Settings block, or NULL to search all blocks * @v setting Setting to fetch @@ -1065,6 +1065,43 @@ int fetchf_setting ( struct settings *settings, struct setting *setting, } /** + * Fetch copy of formatted value of setting + * + * @v settings Settings block, or NULL to search all blocks + * @v setting Setting to fetch + * @v type Settings type + * @v value Buffer to allocate and fill with formatted value + * @ret len Length of formatted value, or negative error + * + * The caller is responsible for eventually freeing the allocated + * buffer. + */ +int fetchf_setting_copy ( struct settings *settings, struct setting *setting, + char **value ) { + int len; + int check_len; + + /* Avoid returning uninitialised data on error */ + *value = NULL; + + /* Check existence, and fetch formatted value length */ + len = fetchf_setting ( settings, setting, NULL, 0 ); + if ( len < 0 ) + return len; + + /* Allocate buffer */ + *value = zalloc ( len + 1 /* NUL */ ); + if ( ! *value ) + return -ENOMEM; + + /* Fetch formatted value */ + check_len = fetchf_setting ( settings, setting, *value, + ( len + 1 /* NUL */ ) ); + assert ( check_len == len ); + return len; +} + +/** * Store formatted value of setting * * @v settings Settings block |