summaryrefslogtreecommitdiffstats
path: root/src/core/settings.c
diff options
context:
space:
mode:
authorMichael Brown2013-07-18 15:46:20 +0200
committerMichael Brown2013-07-19 16:23:54 +0200
commita5be7c4f2902502c6eea5edf6bcfbfe90eb5537d (patch)
tree116a901f0e391e9416edf5b2e1872b3fde46ac82 /src/core/settings.c
parent[settings] Change "not-found" semantics of fetch_setting_copy() (diff)
downloadipxe-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.c41
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