]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[settings] Add fetchf_setting_copy()
authorMichael Brown <mcb30@ipxe.org>
Thu, 18 Jul 2013 13:46:20 +0000 (14:46 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 19 Jul 2013 14:23:54 +0000 (15:23 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/settings.c
src/include/ipxe/settings.h

index 0be1a2dd0983208a5db8a07df821fcd04efecb11..d3d15155691e4aee8944eb910627138430111198 100644 (file)
@@ -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
@@ -1064,6 +1064,43 @@ int fetchf_setting ( struct settings *settings, struct setting *setting,
        return ret;
 }
 
+/**
+ * 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
  *
index 81ee90f3e8dd01e99fd15d7134c5d7b0b0f9646c..8f919bbedeb16dd14fe5432b0e9484bb7ec1a1be 100644 (file)
@@ -310,6 +310,8 @@ extern int setting_name ( struct settings *settings, struct setting *setting,
                          char *buf, size_t len );
 extern int fetchf_setting ( struct settings *settings, struct setting *setting,
                            char *buf, size_t len );
+extern int fetchf_setting_copy ( struct settings *settings,
+                                struct setting *setting, char **value );
 extern int storef_setting ( struct settings *settings,
                            struct setting *setting,
                            const char *value );