david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[settings] Add fetchf_named_setting_copy()

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2012-10-24 20:41:39 -07:00
parent 947976da0c
commit c86790df5c
2 changed files with 40 additions and 0 deletions

View File

@ -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

View File

@ -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;