mirror of https://github.com/ipxe/ipxe.git
[settings] Provide fetch_setting_origin()
Inspired-by: Glenn Brown <glenn@myri.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/1/head
parent
f732fa28c8
commit
ba8dd80487
|
@ -552,10 +552,11 @@ int store_setting ( struct settings *settings, struct setting *setting,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch value of setting
|
* Fetch value and origin 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
|
||||||
|
* @v origin Origin of setting to fill in
|
||||||
* @v data Buffer to fill with setting data
|
* @v data Buffer to fill with setting data
|
||||||
* @v len Length of buffer
|
* @v len Length of buffer
|
||||||
* @ret len Length of setting data, or negative error
|
* @ret len Length of setting data, or negative error
|
||||||
|
@ -563,13 +564,17 @@ int store_setting ( struct settings *settings, struct setting *setting,
|
||||||
* The actual length of the setting will be returned even if
|
* The actual length of the setting will be returned even if
|
||||||
* the buffer was too small.
|
* the buffer was too small.
|
||||||
*/
|
*/
|
||||||
int fetch_setting ( struct settings *settings, struct setting *setting,
|
static int fetch_setting_and_origin ( struct settings *settings,
|
||||||
void *data, size_t len ) {
|
struct setting *setting,
|
||||||
|
struct settings **origin,
|
||||||
|
void *data, size_t len ) {
|
||||||
struct settings *child;
|
struct settings *child;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Avoid returning uninitialised data on error */
|
/* Avoid returning uninitialised data on error */
|
||||||
memset ( data, 0, len );
|
memset ( data, 0, len );
|
||||||
|
if ( origin )
|
||||||
|
*origin = NULL;
|
||||||
|
|
||||||
/* NULL settings implies starting at the global settings root */
|
/* NULL settings implies starting at the global settings root */
|
||||||
if ( ! settings )
|
if ( ! settings )
|
||||||
|
@ -583,19 +588,56 @@ int fetch_setting ( struct settings *settings, struct setting *setting,
|
||||||
if ( setting_applies ( settings, setting ) &&
|
if ( setting_applies ( settings, setting ) &&
|
||||||
( ( ret = settings->op->fetch ( settings, setting,
|
( ( ret = settings->op->fetch ( settings, setting,
|
||||||
data, len ) ) >= 0 ) ) {
|
data, len ) ) >= 0 ) ) {
|
||||||
|
if ( origin )
|
||||||
|
*origin = settings;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Recurse into each child block in turn */
|
/* Recurse into each child block in turn */
|
||||||
list_for_each_entry ( child, &settings->children, siblings ) {
|
list_for_each_entry ( child, &settings->children, siblings ) {
|
||||||
if ( ( ret = fetch_setting ( child, setting,
|
if ( ( ret = fetch_setting_and_origin ( child, setting, origin,
|
||||||
data, len ) ) >= 0 )
|
data, len ) ) >= 0 )
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch value of setting
|
||||||
|
*
|
||||||
|
* @v settings Settings block, or NULL to search all blocks
|
||||||
|
* @v setting Setting to fetch
|
||||||
|
* @v data Buffer to fill with setting data
|
||||||
|
* @v len Length of buffer
|
||||||
|
* @ret len Length of setting data, or negative error
|
||||||
|
*
|
||||||
|
* The actual length of the setting will be returned even if
|
||||||
|
* the buffer was too small.
|
||||||
|
*/
|
||||||
|
int fetch_setting ( struct settings *settings, struct setting *setting,
|
||||||
|
void *data, size_t len ) {
|
||||||
|
return fetch_setting_and_origin ( settings, setting, NULL, data, len );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch origin of setting
|
||||||
|
*
|
||||||
|
* @v settings Settings block, or NULL to search all blocks
|
||||||
|
* @v setting Setting to fetch
|
||||||
|
* @ret origin Origin of setting, or NULL if not found
|
||||||
|
*
|
||||||
|
* This function can also be used as an existence check for the
|
||||||
|
* setting.
|
||||||
|
*/
|
||||||
|
struct settings * fetch_setting_origin ( struct settings *settings,
|
||||||
|
struct setting *setting ) {
|
||||||
|
struct settings *origin;
|
||||||
|
|
||||||
|
fetch_setting_and_origin ( settings, setting, &origin, NULL, 0 );
|
||||||
|
return origin;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch length of setting
|
* Fetch length of setting
|
||||||
*
|
*
|
||||||
|
|
|
@ -217,6 +217,8 @@ extern int store_setting ( struct settings *settings, struct setting *setting,
|
||||||
const void *data, size_t len );
|
const void *data, size_t len );
|
||||||
extern int fetch_setting ( struct settings *settings, struct setting *setting,
|
extern int fetch_setting ( struct settings *settings, struct setting *setting,
|
||||||
void *data, size_t len );
|
void *data, size_t len );
|
||||||
|
extern struct settings * fetch_setting_origin ( struct settings *settings,
|
||||||
|
struct setting *setting );
|
||||||
extern int fetch_setting_len ( struct settings *settings,
|
extern int fetch_setting_len ( struct settings *settings,
|
||||||
struct setting *setting );
|
struct setting *setting );
|
||||||
extern int fetch_string_setting ( struct settings *settings,
|
extern int fetch_string_setting ( struct settings *settings,
|
||||||
|
|
Loading…
Reference in New Issue