diff options
author | Michael Brown <mcb30@ipxe.org> | 2012-10-24 20:41:39 -0700 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2012-10-24 20:42:42 -0700 |
commit | c86790df5cd50b47b8a6b69a3c2367bd28f6cf3c (patch) | |
tree | b07012afb92966917e9bdbe1ec1493bc451dc205 /src | |
parent | 947976da0caa929434775d978f2dcc7c9aee69f9 (diff) | |
download | ipxe-c86790df5cd50b47b8a6b69a3c2367bd28f6cf3c.zip ipxe-c86790df5cd50b47b8a6b69a3c2367bd28f6cf3c.tar.gz ipxe-c86790df5cd50b47b8a6b69a3c2367bd28f6cf3c.tar.bz2 |
[settings] Add fetchf_named_setting_copy()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/settings.c | 39 | ||||
-rw-r--r-- | src/include/ipxe/settings.h | 1 |
2 files changed, 40 insertions, 0 deletions
diff --git a/src/core/settings.c b/src/core/settings.c index 1b19c8f..656ae19 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -1332,6 +1332,45 @@ int fetchf_named_setting ( const char *name, return len; } +/** + * Fetch and format copy of value of named setting + * + * @v name Name of setting + * @v data 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. + * + * 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 fetchf_named_setting_copy ( const char *name, char **data ) { + int len; + int check_len; + + /* Avoid returning uninitialised data on error */ + *data = NULL; + + /* Fetch formatted value length, and return success if non-existent */ + len = fetchf_named_setting ( name, NULL, 0, NULL, 0 ); + if ( len < 0 ) + return 0; + + /* Allocate buffer */ + *data = malloc ( len + 1 /* NUL */ ); + if ( ! *data ) + return -ENOMEM; + + /* Fetch formatted value */ + check_len = fetchf_named_setting ( name, NULL, 0, *data, + ( len + 1 /* NUL */ ) ); + assert ( check_len == len ); + return len; +} + /****************************************************************************** * * Setting types diff --git a/src/include/ipxe/settings.h b/src/include/ipxe/settings.h index 68987bd..3f88760 100644 --- a/src/include/ipxe/settings.h +++ b/src/include/ipxe/settings.h @@ -291,6 +291,7 @@ extern int storef_named_setting ( const char *name, extern int fetchf_named_setting ( const char *name, char *name_buf, size_t name_len, char *value_buf, size_t value_len ); +extern int fetchf_named_setting_copy ( const char *name, char **data ); extern char * expand_settings ( const char *string ); extern struct setting_type setting_type_string __setting_type; |