Skip to content

Commit

Permalink
[settings] Add fetchf_named_setting_copy()
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Oct 25, 2012
1 parent 947976d commit c86790d
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
39 changes: 39 additions & 0 deletions src/core/settings.c
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions src/include/ipxe/settings.h
Expand Up @@ -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;
Expand Down

0 comments on commit c86790d

Please sign in to comment.