summaryrefslogtreecommitdiffstats
path: root/src/core/settings.c
diff options
context:
space:
mode:
authorMichael Brown2012-04-19 17:09:31 +0200
committerMichael Brown2012-04-19 17:10:07 +0200
commit31e60de6760d5094f1ac662b877bb85b83aa1a53 (patch)
tree11038fe35795f98beeefe2a3a024d6fc8cf89891 /src/core/settings.c
parent[multiboot] Place multiboot modules low in memory (diff)
downloadipxe-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.c40
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