]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[settings] Add fetch_setting_copy()
authorMichael Brown <mcb30@ipxe.org>
Thu, 19 Apr 2012 15:09:31 +0000 (16:09 +0100)
committerMichael Brown <mcb30@ipxe.org>
Thu, 19 Apr 2012 15:10:07 +0000 (16:10 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/settings.c
src/include/ipxe/settings.h

index e80355c70e02aef807b2aad56cd97ed8bb051656..c84e1bc26d76ccc207d8b2faf755fb1ea9d5d489 100644 (file)
@@ -676,6 +676,46 @@ int fetch_setting_len ( struct settings *settings, struct setting *setting ) {
        return fetch_setting ( settings, setting, NULL, 0 );
 }
 
+/**
+ * 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
  *
index 1f4af17f5444a6fdf6d91e824d3d925e4c187efa..34c0ed477028ca91b664a43c10131f4cdb63b9b7 100644 (file)
@@ -240,6 +240,8 @@ extern struct settings * fetch_setting_origin ( struct settings *settings,
                                                struct setting *setting );
 extern int fetch_setting_len ( struct settings *settings,
                               struct setting *setting );
+extern int fetch_setting_copy ( struct settings *settings,
+                               struct setting *setting, void **data );
 extern int fetch_string_setting ( struct settings *settings,
                                  struct setting *setting,
                                  char *data, size_t len );