aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2012-10-24 20:41:39 -0700
committerMichael Brown <mcb30@ipxe.org>2012-10-24 20:42:42 -0700
commitc86790df5cd50b47b8a6b69a3c2367bd28f6cf3c (patch)
treeb07012afb92966917e9bdbe1ec1493bc451dc205 /src
parent947976da0caa929434775d978f2dcc7c9aee69f9 (diff)
downloadipxe-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.c39
-rw-r--r--src/include/ipxe/settings.h1
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;