[settings] Add fetchf_setting_copy()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
parent
72fb55e437
commit
a5be7c4f29
|
@ -726,7 +726,7 @@ int fetch_setting_len ( struct settings *settings, struct setting *setting ) {
|
||||||
int fetch_setting_copy ( struct settings *settings, struct setting *setting,
|
int fetch_setting_copy ( struct settings *settings, struct setting *setting,
|
||||||
void **data ) {
|
void **data ) {
|
||||||
int len;
|
int len;
|
||||||
int check_len = 0;
|
int check_len;
|
||||||
|
|
||||||
/* Avoid returning uninitialised data on error */
|
/* Avoid returning uninitialised data on error */
|
||||||
*data = NULL;
|
*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 settings Settings block, or NULL to search all blocks
|
||||||
* @v setting Setting to fetch
|
* @v setting Setting to fetch
|
||||||
|
@ -1064,6 +1064,43 @@ int fetchf_setting ( struct settings *settings, struct setting *setting,
|
||||||
return ret;
|
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
|
* Store formatted value of setting
|
||||||
*
|
*
|
||||||
|
|
|
@ -310,6 +310,8 @@ extern int setting_name ( struct settings *settings, struct setting *setting,
|
||||||
char *buf, size_t len );
|
char *buf, size_t len );
|
||||||
extern int fetchf_setting ( struct settings *settings, struct setting *setting,
|
extern int fetchf_setting ( struct settings *settings, struct setting *setting,
|
||||||
char *buf, size_t len );
|
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,
|
extern int storef_setting ( struct settings *settings,
|
||||||
struct setting *setting,
|
struct setting *setting,
|
||||||
const char *value );
|
const char *value );
|
||||||
|
|
Reference in New Issue