summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/arch/i386/interface/vmware/guestinfo.c2
-rw-r--r--src/arch/x86/core/cpuid_settings.c6
-rw-r--r--src/core/memmap_settings.c6
-rw-r--r--src/core/nvo.c4
-rw-r--r--src/core/settings.c440
-rw-r--r--src/crypto/clientcert.c8
-rw-r--r--src/crypto/rootcert.c4
-rw-r--r--src/drivers/block/ibft.c10
-rw-r--r--src/drivers/bus/pci_settings.c4
-rw-r--r--src/drivers/net/phantom/phantom.c11
-rw-r--r--src/hci/commands/nvo_cmd.c23
-rw-r--r--src/hci/commands/pci_cmd.c4
-rw-r--r--src/hci/tui/settings_ui.c59
-rw-r--r--src/include/ipxe/net80211.h2
-rw-r--r--src/include/ipxe/nvo.h3
-rw-r--r--src/include/ipxe/settings.h180
-rw-r--r--src/interface/efi/efi_snp_hii.c8
-rw-r--r--src/interface/smbios/smbios_settings.c8
-rw-r--r--src/net/80211/net80211.c6
-rw-r--r--src/net/80211/wep.c8
-rw-r--r--src/net/dhcppkt.c4
-rw-r--r--src/net/fakedhcp.c18
-rw-r--r--src/net/ipv4.c6
-rw-r--r--src/net/ipv6.c6
-rw-r--r--src/net/netdev_settings.c15
-rw-r--r--src/net/tcp/iscsi.c61
-rw-r--r--src/net/tcp/oncrpc.c4
-rw-r--r--src/net/tcp/syslogs.c10
-rw-r--r--src/net/udp/dhcp.c44
-rw-r--r--src/net/udp/dhcpv6.c6
-rw-r--r--src/net/udp/dns.c8
-rw-r--r--src/net/udp/syslog.c14
-rw-r--r--src/net/validator.c12
-rw-r--r--src/tests/settings_test.c107
-rw-r--r--src/usr/autoboot.c45
-rw-r--r--src/usr/nslookup.c2
-rw-r--r--src/usr/pxemenu.c15
37 files changed, 610 insertions, 563 deletions
diff --git a/src/arch/i386/interface/vmware/guestinfo.c b/src/arch/i386/interface/vmware/guestinfo.c
index aa10fc01..a0530c8d 100644
--- a/src/arch/i386/interface/vmware/guestinfo.c
+++ b/src/arch/i386/interface/vmware/guestinfo.c
@@ -51,7 +51,7 @@ static int guestinfo_channel;
*/
static int guestinfo_fetch_type ( struct settings *settings,
struct setting *setting,
- struct setting_type *type,
+ const struct setting_type *type,
void *data, size_t len, int *found ) {
const char *parent_name = settings->parent->name;
char command[ 24 /* "info-get guestinfo.ipxe." */ +
diff --git a/src/arch/x86/core/cpuid_settings.c b/src/arch/x86/core/cpuid_settings.c
index e2ec9bde..2da859ee 100644
--- a/src/arch/x86/core/cpuid_settings.c
+++ b/src/arch/x86/core/cpuid_settings.c
@@ -117,7 +117,7 @@ enum cpuid_registers {
#define CPUID_NUM_REGISTERS( tag ) ( ( ( (tag) >> 16 ) & 0x3 ) + 1 )
/** CPUID settings scope */
-static struct settings_scope cpuid_settings_scope;
+static const struct settings_scope cpuid_settings_scope;
/**
* Check applicability of CPUID setting
@@ -127,7 +127,7 @@ static struct settings_scope cpuid_settings_scope;
* @ret applies Setting applies within this settings block
*/
static int cpuid_settings_applies ( struct settings *settings __unused,
- struct setting *setting ) {
+ const struct setting *setting ) {
return ( setting->scope == &cpuid_settings_scope );
}
@@ -252,7 +252,7 @@ struct init_fn cpuid_settings_init_fn __init_fn ( INIT_NORMAL ) = {
};
/** CPUID predefined settings */
-struct setting cpuid_predefined_settings[] __setting ( SETTING_HOST_EXTRA ) = {
+const struct setting cpuid_predefined_settings[] __setting ( SETTING_HOST_EXTRA ) = {
{
.name = "cpuvendor",
.description = "CPU vendor",
diff --git a/src/core/memmap_settings.c b/src/core/memmap_settings.c
index f06b8750..906fba12 100644
--- a/src/core/memmap_settings.c
+++ b/src/core/memmap_settings.c
@@ -108,7 +108,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#define MEMMAP_SCALE( tag ) ( (tag) & 0x3f )
/** Memory map settings scope */
-static struct settings_scope memmap_settings_scope;
+static const struct settings_scope memmap_settings_scope;
/**
* Check applicability of memory map setting
@@ -118,7 +118,7 @@ static struct settings_scope memmap_settings_scope;
* @ret applies Setting applies within this settings block
*/
static int memmap_settings_applies ( struct settings *settings __unused,
- struct setting *setting ) {
+ const struct setting *setting ) {
return ( setting->scope == &memmap_settings_scope );
}
@@ -231,7 +231,7 @@ struct init_fn memmap_settings_init_fn __init_fn ( INIT_NORMAL ) = {
};
/** Memory map predefined settings */
-struct setting memmap_predefined_settings[] __setting ( SETTING_MISC ) = {
+const struct setting memmap_predefined_settings[] __setting ( SETTING_MISC ) = {
{
.name = "memsize",
.description = "Memory size (in MB)",
diff --git a/src/core/nvo.c b/src/core/nvo.c
index 4c871b2f..e135d2b4 100644
--- a/src/core/nvo.c
+++ b/src/core/nvo.c
@@ -193,7 +193,7 @@ static int nvo_save ( struct nvo_block *nvo ) {
* @ret applies Setting applies within this settings block
*/
int nvo_applies ( struct settings *settings __unused,
- struct setting *setting ) {
+ const struct setting *setting ) {
return ( ( setting->scope == NULL ) &&
dhcpopt_applies ( setting->tag ) );
@@ -208,7 +208,7 @@ int nvo_applies ( struct settings *settings __unused,
* @v len Length of setting data
* @ret rc Return status code
*/
-static int nvo_store ( struct settings *settings, struct setting *setting,
+static int nvo_store ( struct settings *settings, const struct setting *setting,
const void *data, size_t len ) {
struct nvo_block *nvo =
container_of ( settings, struct nvo_block, settings );
diff --git a/src/core/settings.c b/src/core/settings.c
index 03ef084a..e6cfc0d2 100644
--- a/src/core/settings.c
+++ b/src/core/settings.c
@@ -96,7 +96,7 @@ static inline void * generic_setting_data ( struct generic_setting *generic ) {
*/
static struct generic_setting *
find_generic_setting ( struct generic_settings *generics,
- struct setting *setting ) {
+ const struct setting *setting ) {
struct generic_setting *generic;
list_for_each_entry ( generic, &generics->list, list ) {
@@ -116,7 +116,7 @@ find_generic_setting ( struct generic_settings *generics,
* @ret rc Return status code
*/
int generic_settings_store ( struct settings *settings,
- struct setting *setting,
+ const struct setting *setting,
const void *data, size_t len ) {
struct generic_settings *generics =
container_of ( settings, struct generic_settings, settings );
@@ -551,7 +551,8 @@ struct settings * settings_target ( struct settings *settings ) {
* @v setting Setting
* @ret applies Setting applies within this settings block
*/
-int setting_applies ( struct settings *settings, struct setting *setting ) {
+int setting_applies ( struct settings *settings,
+ const struct setting *setting ) {
/* Find target settings block */
settings = settings_target ( settings );
@@ -570,7 +571,7 @@ int setting_applies ( struct settings *settings, struct setting *setting ) {
* @v len Length of setting data
* @ret rc Return status code
*/
-int store_setting ( struct settings *settings, struct setting *setting,
+int store_setting ( struct settings *settings, const struct setting *setting,
const void *data, size_t len ) {
int rc;
@@ -609,11 +610,12 @@ int store_setting ( struct settings *settings, struct setting *setting,
}
/**
- * Fetch value and origin of setting
+ * Fetch setting
*
* @v settings Settings block, or NULL to search all blocks
* @v setting Setting to fetch
- * @v origin Origin of setting to fill in
+ * @v origin Origin of setting to fill in, or NULL
+ * @v fetched Fetched setting to fill in, or NULL
* @v data Buffer to fill with setting data
* @v len Length of buffer
* @ret len Length of setting data, or negative error
@@ -621,17 +623,19 @@ int store_setting ( struct settings *settings, struct setting *setting,
* The actual length of the setting will be returned even if
* the buffer was too small.
*/
-static int fetch_setting_and_origin ( struct settings *settings,
- struct setting *setting,
- struct settings **origin,
- void *data, size_t len ) {
+int fetch_setting ( struct settings *settings, const struct setting *setting,
+ struct settings **origin, struct setting *fetched,
+ void *data, size_t len ) {
struct settings *child;
+ struct setting tmp;
int ret;
/* Avoid returning uninitialised data on error */
memset ( data, 0, len );
if ( origin )
*origin = NULL;
+ if ( fetched )
+ memcpy ( fetched, setting, sizeof ( *fetched ) );
/* Find target settings block */
settings = settings_target ( settings );
@@ -641,22 +645,33 @@ static int fetch_setting_and_origin ( struct settings *settings,
return -ENOTSUP;
/* Try this block first, if applicable */
- if ( setting_applies ( settings, setting ) &&
- ( ( ret = settings->op->fetch ( settings, setting,
- data, len ) ) >= 0 ) ) {
- /* Record origin, if applicable */
- if ( origin )
- *origin = settings;
- /* Default to string setting type, if not yet specified */
- if ( ! setting->type )
- setting->type = &setting_type_string;
- return ret;
+ if ( setting_applies ( settings, setting ) ) {
+
+ /* Create modifiable copy of setting */
+ memcpy ( &tmp, setting, sizeof ( tmp ) );
+ if ( ( ret = settings->op->fetch ( settings, &tmp,
+ data, len ) ) >= 0 ) {
+
+ /* Default to string type, if not yet specified */
+ if ( ! tmp.type )
+ tmp.type = &setting_type_string;
+
+ /* Record origin, if applicable */
+ if ( origin )
+ *origin = settings;
+
+ /* Record fetched setting, if applicable */
+ if ( fetched )
+ memcpy ( fetched, &tmp, sizeof ( *fetched ) );
+
+ return ret;
+ }
}
/* Recurse into each child block in turn */
list_for_each_entry ( child, &settings->children, siblings ) {
- if ( ( ret = fetch_setting_and_origin ( child, setting, origin,
- data, len ) ) >= 0 )
+ if ( ( ret = fetch_setting ( child, setting, origin, fetched,
+ data, len ) ) >= 0 )
return ret;
}
@@ -664,56 +679,95 @@ static int fetch_setting_and_origin ( struct settings *settings,
}
/**
- * Fetch value of setting
+ * Fetch allocated copy 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
+ * @v origin Origin of setting to fill in, or NULL
+ * @v fetched Fetched setting to fill in, or NULL
+ * @v data Buffer to allocate and fill with setting data
+ * @v alloc Allocation function
+ * @ret len Length of setting, or negative error
*
- * The actual length of the setting will be returned even if
- * the buffer was too small.
+ * The caller is responsible for eventually freeing the allocated
+ * buffer.
*/
-int fetch_setting ( struct settings *settings, struct setting *setting,
- void *data, size_t len ) {
- return fetch_setting_and_origin ( settings, setting, NULL, data, len );
+static int fetch_setting_alloc ( struct settings *settings,
+ const struct setting *setting,
+ struct settings **origin,
+ struct setting *fetched,
+ void **data,
+ void * ( * alloc ) ( size_t len ) ) {
+ struct settings *tmp_origin;
+ struct setting tmp_fetched;
+ int len;
+ int check_len;
+
+ /* Use local buffers if necessary */
+ if ( ! origin )
+ origin = &tmp_origin;
+ if ( ! fetched )
+ fetched = &tmp_fetched;
+
+ /* Avoid returning uninitialised data on error */
+ *data = NULL;
+
+ /* Check existence, and fetch setting length */
+ len = fetch_setting ( settings, setting, origin, fetched, NULL, 0 );
+ if ( len < 0 )
+ return len;
+
+ /* Allocate buffer */
+ *data = alloc ( len );
+ if ( ! *data )
+ return -ENOMEM;
+
+ /* Fetch setting value */
+ check_len = fetch_setting ( *origin, fetched, NULL, NULL, *data, len );
+ assert ( check_len == len );
+ return len;
}
/**
- * Fetch origin of setting
+ * Fetch copy 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
+ * @v origin Origin of setting to fill in, or NULL
+ * @v fetched Fetched setting to fill in, or NULL
+ * @v data Buffer to allocate and fill with setting data
+ * @ret len Length of setting, or negative error
*
- * This function can also be used as an existence check for the
- * setting.
+ * The caller is responsible for eventually freeing the allocated
+ * buffer.
*/
-struct settings * fetch_setting_origin ( struct settings *settings,
- struct setting *setting ) {
- struct settings *origin;
+int fetch_setting_copy ( struct settings *settings,
+ const struct setting *setting,
+ struct settings **origin, struct setting *fetched,
+ void **data ) {
- fetch_setting_and_origin ( settings, setting, &origin, NULL, 0 );
- return origin;
+ return fetch_setting_alloc ( settings, setting, origin, fetched,
+ data, malloc );
}
/**
- * Fetch length of setting
+ * Fetch value of setting
*
* @v settings Settings block, or NULL to search all blocks
* @v setting Setting to fetch
- * @ret len Length of setting data, or negative error
- *
- * This function can also be used as an existence check for the
- * setting.
+ * @v data Buffer to fill with setting string data
+ * @v len Length of buffer
+ * @ret len Length of setting, or negative error
*/
-int fetch_setting_len ( struct settings *settings, struct setting *setting ) {
- return fetch_setting ( settings, setting, NULL, 0 );
+int fetch_raw_setting ( struct settings *settings,
+ const struct setting *setting,
+ void *data, size_t len ) {
+
+ return fetch_setting ( settings, setting, NULL, NULL, data, len );
}
/**
- * Fetch copy of setting
+ * Fetch value of setting
*
* @v settings Settings block, or NULL to search all blocks
* @v setting Setting to fetch
@@ -723,28 +777,11 @@ int fetch_setting_len ( struct settings *settings, struct setting *setting ) {
* The caller is responsible for eventually freeing the allocated
* buffer.
*/
-int fetch_setting_copy ( struct settings *settings, struct setting *setting,
- void **data ) {
- int len;
- int check_len;
-
- /* Avoid returning uninitialised data on error */
- *data = NULL;
-
- /* Check existence, and fetch setting length */
- len = fetch_setting_len ( settings, setting );
- if ( len < 0 )
- return len;
-
- /* Allocate buffer */
- *data = malloc ( len );
- if ( ! *data )
- return -ENOMEM;
+int fetch_raw_setting_copy ( struct settings *settings,
+ const struct setting *setting,
+ void **data ) {
- /* Fetch setting */
- check_len = fetch_setting ( settings, setting, *data, len );
- assert ( check_len == len );
- return len;
+ return fetch_setting_copy ( settings, setting, NULL, NULL, data );
}
/**
@@ -760,11 +797,23 @@ int fetch_setting_copy ( struct settings *settings, struct setting *setting,
* The returned length will be the length of the underlying setting
* data.
*/
-int fetch_string_setting ( struct settings *settings, struct setting *setting,
+int fetch_string_setting ( struct settings *settings,
+ const struct setting *setting,
char *data, size_t len ) {
+
memset ( data, 0, len );
- return fetch_setting ( settings, setting, data,
- ( ( len > 0 ) ? ( len - 1 ) : 0 ) );
+ return fetch_raw_setting ( settings, setting, data,
+ ( ( len > 0 ) ? ( len - 1 ) : 0 ) );
+}
+
+/**
+ * Allocate memory for copy of string setting
+ *
+ * @v len Length of setting
+ * @ret ptr Allocated memory
+ */
+static void * fetch_string_setting_copy_alloc ( size_t len ) {
+ return zalloc ( len + 1 /* NUL */ );
}
/**
@@ -779,36 +828,13 @@ int fetch_string_setting ( struct settings *settings, struct setting *setting,
* The returned length will be the length of the underlying setting
* data. 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 fetch_string_setting_copy ( struct settings *settings,
- struct setting *setting,
- char **data ) {
- int len;
- int check_len = 0;
-
- /* Avoid returning uninitialised data on error */
- *data = NULL;
-
- /* Fetch setting length, and return success if non-existent */
- len = fetch_setting_len ( settings, setting );
- if ( len < 0 )
- return 0;
-
- /* Allocate string buffer */
- *data = malloc ( len + 1 );
- if ( ! *data )
- return -ENOMEM;
+ const struct setting *setting, char **data ) {
- /* Fetch setting */
- check_len = fetch_string_setting ( settings, setting, *data,
- ( len + 1 ) );
- assert ( check_len == len );
- return len;
+ return fetch_setting_alloc ( settings, setting, NULL, NULL,
+ ( ( void ** ) data ),
+ fetch_string_setting_copy_alloc );
}
/**
@@ -821,12 +847,12 @@ int fetch_string_setting_copy ( struct settings *settings,
* @ret len Length of setting, or negative error
*/
int fetch_ipv4_array_setting ( struct settings *settings,
- struct setting *setting,
+ const struct setting *setting,
struct in_addr *inp, unsigned int count ) {
int len;
- len = fetch_setting ( settings, setting, inp,
- ( sizeof ( *inp ) * count ) );
+ len = fetch_raw_setting ( settings, setting, inp,
+ ( sizeof ( *inp ) * count ) );
if ( len < 0 )
return len;
if ( ( len % sizeof ( *inp ) ) != 0 )
@@ -842,8 +868,10 @@ int fetch_ipv4_array_setting ( struct settings *settings,
* @v inp IPv4 address to fill in
* @ret len Length of setting, or negative error
*/
-int fetch_ipv4_setting ( struct settings *settings, struct setting *setting,
+int fetch_ipv4_setting ( struct settings *settings,
+ const struct setting *setting,
struct in_addr *inp ) {
+
return fetch_ipv4_array_setting ( settings, setting, inp, 1 );
}
@@ -887,7 +915,8 @@ static int numeric_setting_value ( int is_signed, const void *raw, size_t len,
* @v value Integer value to fill in
* @ret len Length of setting, or negative error
*/
-int fetch_numeric_setting ( struct settings *settings, struct setting *setting,
+int fetch_numeric_setting ( struct settings *settings,
+ const struct setting *setting,
unsigned long *value, int is_signed ) {
unsigned long tmp;
int len;
@@ -896,7 +925,7 @@ int fetch_numeric_setting ( struct settings *settings, struct setting *setting,
*value = 0;
/* Fetch raw (network-ordered, variable-length) setting */
- len = fetch_setting ( settings, setting, &tmp, sizeof ( tmp ) );
+ len = fetch_raw_setting ( settings, setting, &tmp, sizeof ( tmp ) );
if ( len < 0 )
return len;
@@ -912,7 +941,8 @@ int fetch_numeric_setting ( struct settings *settings, struct setting *setting,
* @v value Integer value to fill in
* @ret len Length of setting, or negative error
*/
-int fetch_int_setting ( struct settings *settings, struct setting *setting,
+int fetch_int_setting ( struct settings *settings,
+ const struct setting *setting,
long *value ) {
return fetch_numeric_setting ( settings, setting,
@@ -927,7 +957,8 @@ int fetch_int_setting ( struct settings *settings, struct setting *setting,
* @v value Integer value to fill in
* @ret len Length of setting, or negative error
*/
-int fetch_uint_setting ( struct settings *settings, struct setting *setting,
+int fetch_uint_setting ( struct settings *settings,
+ const struct setting *setting,
unsigned long *value ) {
return fetch_numeric_setting ( settings, setting, value, 0 );
@@ -940,7 +971,8 @@ int fetch_uint_setting ( struct settings *settings, struct setting *setting,
* @v setting Setting to fetch
* @ret value Setting value, or zero
*/
-long fetch_intz_setting ( struct settings *settings, struct setting *setting ){
+long fetch_intz_setting ( struct settings *settings,
+ const struct setting *setting ) {
unsigned long value;
fetch_numeric_setting ( settings, setting, &value, 1 );
@@ -955,7 +987,7 @@ long fetch_intz_setting ( struct settings *settings, struct setting *setting ){
* @ret value Setting value, or zero
*/
unsigned long fetch_uintz_setting ( struct settings *settings,
- struct setting *setting ) {
+ const struct setting *setting ) {
unsigned long value;
fetch_numeric_setting ( settings, setting, &value, 0 );
@@ -970,11 +1002,12 @@ unsigned long fetch_uintz_setting ( struct settings *settings,
* @v uuid UUID to fill in
* @ret len Length of setting, or negative error
*/
-int fetch_uuid_setting ( struct settings *settings, struct setting *setting,
+int fetch_uuid_setting ( struct settings *settings,
+ const struct setting *setting,
union uuid *uuid ) {
int len;
- len = fetch_setting ( settings, setting, uuid, sizeof ( *uuid ) );
+ len = fetch_raw_setting ( settings, setting, uuid, sizeof ( *uuid ) );
if ( len < 0 )
return len;
if ( len != sizeof ( *uuid ) )
@@ -1005,7 +1038,7 @@ void clear_settings ( struct settings *settings ) {
* @ret 0 Settings are the same
* @ret non-zero Settings are not the same
*/
-int setting_cmp ( struct setting *a, struct setting *b ) {
+int setting_cmp ( const struct setting *a, const struct setting *b ) {
/* If the settings have tags, compare them */
if ( a->tag && ( a->tag == b->tag ) && ( a->scope == b->scope ) )
@@ -1036,7 +1069,7 @@ int setting_cmp ( struct setting *a, struct setting *b ) {
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
-int setting_format ( struct setting_type *type, const void *raw,
+int setting_format ( const struct setting_type *type, const void *raw,
size_t raw_len, char *buf, size_t len ) {
/* Sanity check */
@@ -1055,7 +1088,7 @@ int setting_format ( struct setting_type *type, const void *raw,
* @v len Length of buffer
* @ret len Length of raw value, or negative error
*/
-int setting_parse ( struct setting_type *type, const char *value,
+int setting_parse ( const struct setting_type *type, const char *value,
void *buf, size_t len ) {
/* Sanity check */
@@ -1074,7 +1107,7 @@ int setting_parse ( struct setting_type *type, const char *value,
* @ret value Numeric value
* @ret rc Return status code
*/
-int setting_numerate ( struct setting_type *type, const void *raw,
+int setting_numerate ( const struct setting_type *type, const void *raw,
size_t raw_len, unsigned long *value ) {
/* Sanity check */
@@ -1093,7 +1126,7 @@ int setting_numerate ( struct setting_type *type, const void *raw,
* @v len Length of buffer
* @ret len Length of raw value, or negative error
*/
-int setting_denumerate ( struct setting_type *type, unsigned long value,
+int setting_denumerate ( const struct setting_type *type, unsigned long value,
void *buf, size_t len ) {
/* Sanity check */
@@ -1108,28 +1141,37 @@ int setting_denumerate ( struct setting_type *type, unsigned long value,
*
* @v settings Settings block, or NULL to search all blocks
* @v setting Setting to fetch
+ * @v origin Origin of setting to fill in, or NULL
+ * @v fetched Fetched setting to fill in, or NULL
* @v buf Buffer to contain formatted value
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
-int fetchf_setting ( struct settings *settings, struct setting *setting,
+int fetchf_setting ( struct settings *settings, const struct setting *setting,
+ struct settings **origin, struct setting *fetched,
char *buf, size_t len ) {
+ struct setting tmp_fetched;
void *raw;
int raw_len;
int ret;
+ /* Use local buffers if necessary */
+ if ( ! fetched )
+ fetched = &tmp_fetched;
+
/* Fetch raw value */
- raw_len = fetch_setting_copy ( settings, setting, &raw );
+ raw_len = fetch_setting_copy ( settings, setting, origin, fetched,
+ &raw );
if ( raw_len < 0 ) {
ret = raw_len;
goto err_fetch_copy;
}
/* Sanity check */
- assert ( setting->type != NULL );
+ assert ( fetched->type != NULL );
/* Format setting */
- if ( ( ret = setting_format ( setting->type, raw, raw_len, buf,
+ if ( ( ret = setting_format ( fetched->type, raw, raw_len, buf,
len ) ) < 0 )
goto err_format;
@@ -1144,22 +1186,34 @@ int fetchf_setting ( struct settings *settings, struct setting *setting,
*
* @v settings Settings block, or NULL to search all blocks
* @v setting Setting to fetch
+ * @v origin Origin of setting to fill in, or NULL
+ * @v fetched Fetched setting to fill in, or NULL
* @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,
+int fetchf_setting_copy ( struct settings *settings,
+ const struct setting *setting,
+ struct settings **origin, struct setting *fetched,
char **value ) {
+ struct settings *tmp_origin;
+ struct setting tmp_fetched;
int len;
int check_len;
+ /* Use local buffers if necessary */
+ if ( ! origin )
+ origin = &tmp_origin;
+ if ( ! fetched )
+ fetched = &tmp_fetched;
+
/* Avoid returning uninitialised data on error */
*value = NULL;
/* Check existence, and fetch formatted value length */
- len = fetchf_setting ( settings, setting, NULL, 0 );
+ len = fetchf_setting ( settings, setting, origin, fetched, NULL, 0 );
if ( len < 0 )
return len;
@@ -1169,7 +1223,7 @@ int fetchf_setting_copy ( struct settings *settings, struct setting *setting,
return -ENOMEM;
/* Fetch formatted value */
- check_len = fetchf_setting ( settings, setting, *value,
+ check_len = fetchf_setting ( *origin, fetched, NULL, NULL, *value,
( len + 1 /* NUL */ ) );
assert ( check_len == len );
return len;
@@ -1183,7 +1237,7 @@ int fetchf_setting_copy ( struct settings *settings, struct setting *setting,
* @v value Formatted setting data, or NULL
* @ret rc Return status code
*/
-int storef_setting ( struct settings *settings, struct setting *setting,
+int storef_setting ( struct settings *settings, const struct setting *setting,
const char *value ) {
void *raw;
int raw_len;
@@ -1231,27 +1285,36 @@ int storef_setting ( struct settings *settings, struct setting *setting,
*
* @v settings Settings block, or NULL to search all blocks
* @v setting Setting to fetch
+ * @v origin Origin of setting to fill in, or NULL
+ * @v fetched Fetched setting to fill in, or NULL
* @v value Numeric value to fill in
* @ret rc Return status code
*/
-int fetchn_setting ( struct settings *settings, struct setting *setting,
+int fetchn_setting ( struct settings *settings, const struct setting *setting,
+ struct settings **origin, struct setting *fetched,
unsigned long *value ) {
+ struct setting tmp_fetched;
void *raw;
int raw_len;
int rc;
+ /* Use local buffers if necessary */
+ if ( ! fetched )
+ fetched = &tmp_fetched;
+
/* Fetch raw value */
- raw_len = fetch_setting_copy ( settings, setting, &raw );
+ raw_len = fetch_setting_copy ( settings, setting, origin, fetched,
+ &raw );
if ( raw_len < 0 ) {
rc = raw_len;
goto err_fetch_copy;
}
/* Sanity check */
- assert ( setting->type != NULL );
+ assert ( fetched->type != NULL );
/* Numerate setting */
- if ( ( rc = setting_numerate ( setting->type, raw, raw_len,
+ if ( ( rc = setting_numerate ( fetched->type, raw, raw_len,
value ) ) < 0 )
goto err_numerate;
@@ -1269,7 +1332,7 @@ int fetchn_setting ( struct settings *settings, struct setting *setting,
* @v value Numeric value
* @ret rc Return status code
*/
-int storen_setting ( struct settings *settings, struct setting *setting,
+int storen_setting ( struct settings *settings, const struct setting *setting,
unsigned long value ) {
void *raw;
int raw_len;
@@ -1357,8 +1420,8 @@ static unsigned int parse_setting_tag ( const char *name ) {
* @v name Name
* @ret type Setting type, or NULL
*/
-static struct setting_type * find_setting_type ( const char *name ) {
- struct setting_type *type;
+static const struct setting_type * find_setting_type ( const char *name ) {
+ const struct setting_type *type;
for_each_table_entry ( type, SETTING_TYPES ) {
if ( strcmp ( name, type->name ) == 0 )
@@ -1461,7 +1524,7 @@ int parse_setting_name ( char *name, get_child_settings_t get_child,
* @v len Length of buffer
* @ret len Length of setting name, or negative error
*/
-int setting_name ( struct settings *settings, struct setting *setting,
+int setting_name ( struct settings *settings, const struct setting *setting,
char *buf, size_t len ) {
const char *name;
@@ -1487,7 +1550,7 @@ int setting_name ( struct settings *settings, struct setting *setting,
* @v len Length of buffer
* @ret len Length of raw value, or negative error
*/
-static int parse_string_setting ( struct setting_type *type __unused,
+static int parse_string_setting ( const struct setting_type *type __unused,
const char *value, void *buf, size_t len ) {
size_t raw_len = strlen ( value ); /* Exclude terminating NUL */
@@ -1509,7 +1572,7 @@ static int parse_string_setting ( struct setting_type *type __unused,
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
-static int format_string_setting ( struct setting_type *type __unused,
+static int format_string_setting ( const struct setting_type *type __unused,
const void *raw, size_t raw_len, char *buf,
size_t len ) {
@@ -1523,7 +1586,7 @@ static int format_string_setting ( struct setting_type *type __unused,
}
/** A string setting type */
-struct setting_type setting_type_string __setting_type = {
+const struct setting_type setting_type_string __setting_type = {
.name = "string",
.parse = parse_string_setting,
.format = format_string_setting,
@@ -1538,7 +1601,7 @@ struct setting_type setting_type_string __setting_type = {
* @v len Length of buffer
* @ret len Length of raw value, or negative error
*/
-static int parse_uristring_setting ( struct setting_type *type __unused,
+static int parse_uristring_setting ( const struct setting_type *type __unused,
const char *value, void *buf, size_t len ){
char tmp[ len + 1 /* NUL */ ];
size_t raw_len;
@@ -1564,7 +1627,7 @@ static int parse_uristring_setting ( struct setting_type *type __unused,
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
-static int format_uristring_setting ( struct setting_type *type __unused,
+static int format_uristring_setting ( const struct setting_type *type __unused,
const void *raw, size_t raw_len,
char *buf, size_t len ) {
char tmp[ raw_len + 1 /* NUL */ ];
@@ -1578,7 +1641,7 @@ static int format_uristring_setting ( struct setting_type *type __unused,
}
/** A URI-encoded string setting type */
-struct setting_type setting_type_uristring __setting_type = {
+const struct setting_type setting_type_uristring __setting_type = {
.name = "uristring",
.parse = parse_uristring_setting,
.format = format_uristring_setting,
@@ -1593,7 +1656,7 @@ struct setting_type setting_type_uristring __setting_type = {
* @v len Length of buffer
* @ret len Length of raw value, or negative error
*/
-static int parse_ipv4_setting ( struct setting_type *type __unused,
+static int parse_ipv4_setting ( const struct setting_type *type __unused,
const char *value, void *buf, size_t len ) {
struct in_addr ipv4;
@@ -1619,7 +1682,7 @@ static int parse_ipv4_setting ( struct setting_type *type __unused,
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
-static int format_ipv4_setting ( struct setting_type *type __unused,
+static int format_ipv4_setting ( const struct setting_type *type __unused,
const void *raw, size_t raw_len, char *buf,
size_t len ) {
const struct in_addr *ipv4 = raw;
@@ -1630,7 +1693,7 @@ static int format_ipv4_setting ( struct setting_type *type __unused,
}
/** An IPv4 address setting type */
-struct setting_type setting_type_ipv4 __setting_type = {
+const struct setting_type setting_type_ipv4 __setting_type = {
.name = "ipv4",
.parse = parse_ipv4_setting,
.format = format_ipv4_setting,
@@ -1685,7 +1748,7 @@ static const char setting_type_int_name[][8] = {
* @v type Setting type
* @ret index Integer setting type index
*/
-static unsigned int setting_type_int_index ( struct setting_type *type ) {
+static unsigned int setting_type_int_index ( const struct setting_type *type ) {
return ( ( type->name - setting_type_int_name[0] ) /
sizeof ( setting_type_int_name[0] ) );
@@ -1697,7 +1760,7 @@ static unsigned int setting_type_int_index ( struct setting_type *type ) {
* @v type Setting type
* @ret index Integer setting type width
*/
-static unsigned int setting_type_int_width ( struct setting_type *type ) {
+static unsigned int setting_type_int_width ( const struct setting_type *type ) {
return ( 1 << setting_type_int_index ( type ) );
}
@@ -1708,7 +1771,7 @@ static unsigned int setting_type_int_width ( struct setting_type *type ) {
* @v type Setting type
* @ret is_signed Integer setting type is signed
*/
-static int setting_type_int_is_signed ( struct setting_type *type ) {
+static int setting_type_int_is_signed ( const struct setting_type *type ) {
return ( ( type->name - setting_type_int_name[0] ) & 1 );
}
@@ -1721,7 +1784,7 @@ static int setting_type_int_is_signed ( struct setting_type *type ) {
* @v len Length of buffer
* @ret len Length of raw value, or negative error
*/
-static int denumerate_int_setting ( struct setting_type *type,
+static int denumerate_int_setting ( const struct setting_type *type,
unsigned long value, void *buf,
size_t len ) {
unsigned int size = setting_type_int_width ( type );
@@ -1747,7 +1810,7 @@ static int denumerate_int_setting ( struct setting_type *type,
* @v value Numeric value to fill in
* @ret rc Return status code
*/
-static int numerate_int_setting ( struct setting_type *type,
+static int numerate_int_setting ( const struct setting_type *type,
const void *raw, size_t raw_len,
unsigned long *value ) {
int is_signed = setting_type_int_is_signed ( type );
@@ -1771,8 +1834,8 @@ static int numerate_int_setting ( struct setting_type *type,
* @v len Length of buffer
* @ret len Length of raw value, or negative error
*/
-static int parse_int_setting ( struct setting_type *type, const char *value,
- void *buf, size_t len ) {
+static int parse_int_setting ( const struct setting_type *type,
+ const char *value, void *buf, size_t len ) {
char *endp;
unsigned long num_value;
@@ -1794,8 +1857,9 @@ static int parse_int_setting ( struct setting_type *type, const char *value,
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
-static int format_int_setting ( struct setting_type *type, const void *raw,
- size_t raw_len, char *buf, size_t len ) {
+static int format_int_setting ( const struct setting_type *type,
+ const void *raw, size_t raw_len,
+ char *buf, size_t len ) {
unsigned long value;
int ret;
@@ -1817,8 +1881,9 @@ static int format_int_setting ( struct setting_type *type, const void *raw,
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
-static int format_uint_setting ( struct setting_type *type, const void *raw,
- size_t raw_len, char *buf, size_t len ) {
+static int format_uint_setting ( const struct setting_type *type,
+ const void *raw, size_t raw_len,
+ char *buf, size_t len ) {
unsigned long value;
int ret;
@@ -1859,27 +1924,27 @@ static int format_uint_setting ( struct setting_type *type, const void *raw,
}
/** A signed 8-bit integer setting type */
-struct setting_type setting_type_int8 __setting_type =
+const struct setting_type setting_type_int8 __setting_type =
SETTING_TYPE_INT ( SETTING_TYPE_INT8 );
/** A signed 16-bit integer setting type */
-struct setting_type setting_type_int16 __setting_type =
+const struct setting_type setting_type_int16 __setting_type =
SETTING_TYPE_INT ( SETTING_TYPE_INT16 );
/** A signed 32-bit integer setting type */
-struct setting_type setting_type_int32 __setting_type =
+const struct setting_type setting_type_int32 __setting_type =
SETTING_TYPE_INT ( SETTING_TYPE_INT32 );
/** An unsigned 8-bit integer setting type */
-struct setting_type setting_type_uint8 __setting_type =
+const struct setting_type setting_type_uint8 __setting_type =
SETTING_TYPE_UINT ( SETTING_TYPE_INT8 );
/** An unsigned 16-bit integer setting type */
-struct setting_type setting_type_uint16 __setting_type =
+const struct setting_type setting_type_uint16 __setting_type =
SETTING_TYPE_UINT ( SETTING_TYPE_INT16 );
/** An unsigned 32-bit integer setting type */
-struct setting_type setting_type_uint32 __setting_type =
+const struct setting_type setting_type_uint32 __setting_type =
SETTING_TYPE_UINT ( SETTING_TYPE_INT32 );
/**
@@ -1918,7 +1983,7 @@ static int format_hex_setting ( const char *delimiter, const void *raw,
* @v size Integer size, in bytes
* @ret len Length of raw value, or negative error
*/
-static int parse_hex_setting ( struct setting_type *type __unused,
+static int parse_hex_setting ( const struct setting_type *type __unused,
const char *value, void *buf, size_t len ) {
return hex_decode ( value, ':', buf, len );
}
@@ -1933,7 +1998,7 @@ static int parse_hex_setting ( struct setting_type *type __unused,
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
-static int format_hex_colon_setting ( struct setting_type *type __unused,
+static int format_hex_colon_setting ( const struct setting_type *type __unused,
const void *raw, size_t raw_len,
char *buf, size_t len ) {
return format_hex_setting ( ":", raw, raw_len, buf, len );
@@ -1949,7 +2014,7 @@ static int format_hex_colon_setting ( struct setting_type *type __unused,
* @v size Integer size, in bytes
* @ret len Length of raw value, or negative error
*/
-static int parse_hex_hyphen_setting ( struct setting_type *type __unused,
+static int parse_hex_hyphen_setting ( const struct setting_type *type __unused,
const char *value, void *buf,
size_t len ) {
return hex_decode ( value, '-', buf, len );
@@ -1965,7 +2030,7 @@ static int parse_hex_hyphen_setting ( struct setting_type *type __unused,
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
-static int format_hex_hyphen_setting ( struct setting_type *type __unused,
+static int format_hex_hyphen_setting ( const struct setting_type *type __unused,
const void *raw, size_t raw_len,
char *buf, size_t len ) {
return format_hex_setting ( "-", raw, raw_len, buf, len );
@@ -1981,7 +2046,7 @@ static int format_hex_hyphen_setting ( struct setting_type *type __unused,
* @v size Integer size, in bytes
* @ret len Length of raw value, or negative error
*/
-static int parse_hex_raw_setting ( struct setting_type *type __unused,
+static int parse_hex_raw_setting ( const struct setting_type *type __unused,
const char *value, void *buf, size_t len ) {
return hex_decode ( value, 0, buf, len );
}
@@ -1996,28 +2061,28 @@ static int parse_hex_raw_setting ( struct setting_type *type __unused,
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
-static int format_hex_raw_setting ( struct setting_type *type __unused,
+static int format_hex_raw_setting ( const struct setting_type *type __unused,
const void *raw, size_t raw_len,
char *buf, size_t len ) {
return format_hex_setting ( "", raw, raw_len, buf, len );
}
/** A hex-string setting (colon-delimited) */
-struct setting_type setting_type_hex __setting_type = {
+const struct setting_type setting_type_hex __setting_type = {
.name = "hex",
.parse = parse_hex_setting,
.format = format_hex_colon_setting,
};
/** A hex-string setting (hyphen-delimited) */
-struct setting_type setting_type_hexhyp __setting_type = {
+const struct setting_type setting_type_hexhyp __setting_type = {
.name = "hexhyp",
.parse = parse_hex_hyphen_setting,
.format = format_hex_hyphen_setting,
};
/** A hex-string setting (non-delimited) */
-struct setting_type setting_type_hexraw __setting_type = {
+const struct setting_type setting_type_hexraw __setting_type = {
.name = "hexraw",
.parse = parse_hex_raw_setting,
.format = format_hex_raw_setting,
@@ -2033,7 +2098,7 @@ struct setting_type setting_type_hexraw __setting_type = {
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
-static int format_uuid_setting ( struct setting_type *type __unused,
+static int format_uuid_setting ( const struct setting_type *type __unused,
const void *raw, size_t raw_len, char *buf,
size_t len ) {
const union uuid *uuid = raw;
@@ -2047,7 +2112,7 @@ static int format_uuid_setting ( struct setting_type *type __unused,
}
/** UUID setting type */
-struct setting_type setting_type_uuid __setting_type = {
+const struct setting_type setting_type_uuid __setting_type = {
.name = "uuid",
.format = format_uuid_setting,
};
@@ -2062,7 +2127,7 @@ struct setting_type setting_type_uuid __setting_type = {
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
-static int format_busdevfn_setting ( struct setting_type *type __unused,
+static int format_busdevfn_setting ( const struct setting_type *type __unused,
const void *raw, size_t raw_len, char *buf,
size_t len ) {
unsigned long busdevfn;
@@ -2080,7 +2145,7 @@ static int format_busdevfn_setting ( struct setting_type *type __unused,
}
/** PCI bus:dev.fn setting type */
-struct setting_type setting_type_busdevfn __setting_type = {
+const struct setting_type setting_type_busdevfn __setting_type = {
.name = "busdevfn",
.format = format_busdevfn_setting,
};
@@ -2153,7 +2218,8 @@ char * expand_settings ( const char *string ) {
/* Fetch and format setting value. Ignore
* errors; treat non-existent settings as empty.
*/
- fetchf_setting_copy ( settings, &setting, &value );
+ fetchf_setting_copy ( settings, &setting, NULL, NULL,
+ &value );
}
/* Construct expanded string and discard old string */
@@ -2177,7 +2243,7 @@ char * expand_settings ( const char *string ) {
*/
/** Hostname setting */
-struct setting hostname_setting __setting ( SETTING_HOST ) = {
+const struct setting hostname_setting __setting ( SETTING_HOST ) = {
.name = "hostname",
.description = "Host name",
.tag = DHCP_HOST_NAME,
@@ -2185,7 +2251,7 @@ struct setting hostname_setting __setting ( SETTING_HOST ) = {
};
/** Domain name setting */
-struct setting domain_setting __setting ( SETTING_IPv4_EXTRA ) = {
+const struct setting domain_setting __setting ( SETTING_IPv4_EXTRA ) = {
.name = "domain",
.description = "DNS domain",
.tag = DHCP_DOMAIN_NAME,
@@ -2193,7 +2259,7 @@ struct setting domain_setting __setting ( SETTING_IPv4_EXTRA ) = {
};
/** TFTP server setting */
-struct setting next_server_setting __setting ( SETTING_BOOT ) = {
+const struct setting next_server_setting __setting ( SETTING_BOOT ) = {
.name = "next-server",
.description = "TFTP server",
.tag = DHCP_EB_SIADDR,
@@ -2201,7 +2267,7 @@ struct setting next_server_setting __setting ( SETTING_BOOT ) = {
};
/** Filename setting */
-struct setting filename_setting __setting ( SETTING_BOOT ) = {
+const struct setting filename_setting __setting ( SETTING_BOOT ) = {
.name = "filename",
.description = "Boot filename",
.tag = DHCP_BOOTFILE_NAME,
@@ -2209,7 +2275,7 @@ struct setting filename_setting __setting ( SETTING_BOOT ) = {
};
/** Root path setting */
-struct setting root_path_setting __setting ( SETTING_SANBOOT ) = {
+const struct setting root_path_setting __setting ( SETTING_SANBOOT ) = {
.name = "root-path",
.description = "SAN root path",
.tag = DHCP_ROOT_PATH,
@@ -2217,7 +2283,7 @@ struct setting root_path_setting __setting ( SETTING_SANBOOT ) = {
};
/** Username setting */
-struct setting username_setting __setting ( SETTING_AUTH ) = {
+const struct setting username_setting __setting ( SETTING_AUTH ) = {
.name = "username",
.description = "User name",
.tag = DHCP_EB_USERNAME,
@@ -2225,7 +2291,7 @@ struct setting username_setting __setting ( SETTING_AUTH ) = {
};
/** Password setting */
-struct setting password_setting __setting ( SETTING_AUTH ) = {
+const struct setting password_setting __setting ( SETTING_AUTH ) = {
.name = "password",
.description = "Password",
.tag = DHCP_EB_PASSWORD,
@@ -2233,7 +2299,7 @@ struct setting password_setting __setting ( SETTING_AUTH ) = {
};
/** Priority setting */
-struct setting priority_setting __setting ( SETTING_MISC ) = {
+const struct setting priority_setting __setting ( SETTING_MISC ) = {
.name = "priority",
.description = "Settings priority",
.tag = DHCP_EB_PRIORITY,
@@ -2241,7 +2307,7 @@ struct setting priority_setting __setting ( SETTING_MISC ) = {
};
/** DHCP user class setting */
-struct setting user_class_setting __setting ( SETTING_HOST_EXTRA ) = {
+const struct setting user_class_setting __setting ( SETTING_HOST_EXTRA ) = {
.name = "user-class",
.description = "DHCP user class",
.tag = DHCP_USER_CLASS_ID,
@@ -2256,7 +2322,7 @@ struct setting user_class_setting __setting ( SETTING_HOST_EXTRA ) = {
*/
/** Built-in setting scope */
-struct settings_scope builtin_scope;
+const struct settings_scope builtin_scope;
/**
* Fetch error number setting
@@ -2277,7 +2343,7 @@ static int errno_fetch ( void *data, size_t len ) {
}
/** Error number setting */
-struct setting errno_setting __setting ( SETTING_MISC ) = {
+const struct setting errno_setting __setting ( SETTING_MISC ) = {
.name = "errno",
.description = "Last error",
.type = &setting_type_uint32,
@@ -2305,7 +2371,7 @@ static int buildarch_fetch ( void *data, size_t len ) {
}
/** Build architecture setting */
-struct setting buildarch_setting __setting ( SETTING_MISC ) = {
+const struct setting buildarch_setting __setting ( SETTING_MISC ) = {
.name = "buildarch",
.description = "Build architecture",
.type = &setting_type_string,
@@ -2333,7 +2399,7 @@ static int platform_fetch ( void *data, size_t len ) {
}
/** Platform setting */
-struct setting platform_setting __setting ( SETTING_MISC ) = {
+const struct setting platform_setting __setting ( SETTING_MISC ) = {
.name = "platform",
.description = "Platform",
.type = &setting_type_string,
@@ -2359,7 +2425,7 @@ static int version_fetch ( void *data, size_t len ) {
}
/** Version setting */
-struct setting version_setting __setting ( SETTING_MISC ) = {
+const struct setting version_setting __setting ( SETTING_MISC ) = {
.name = "version",
.description = "Version",
.type = &setting_type_string,
@@ -2401,7 +2467,7 @@ static int builtin_fetch ( struct settings *settings __unused,
* @ret applies Setting applies within this settings block
*/
static int builtin_applies ( struct settings *settings __unused,
- struct setting *setting ) {
+ const struct setting *setting ) {
return ( setting->scope == &builtin_scope );
}
diff --git a/src/crypto/clientcert.c b/src/crypto/clientcert.c
index 6f6bf113..b09c880a 100644
--- a/src/crypto/clientcert.c
+++ b/src/crypto/clientcert.c
@@ -128,8 +128,8 @@ static int clientcert_apply_settings ( void ) {
/* Fetch new client certificate, if any */
free ( cert );
- if ( ( len = fetch_setting_copy ( NULL, &cert_setting,
- &cert ) ) >= 0 ) {
+ if ( ( len = fetch_raw_setting_copy ( NULL, &cert_setting,
+ &cert ) ) >= 0 ) {
client_certificate.data = cert;
client_certificate.len = len;
}
@@ -140,8 +140,8 @@ static int clientcert_apply_settings ( void ) {
/* Fetch new client private key, if any */
free ( key );
- if ( ( len = fetch_setting_copy ( NULL, &privkey_setting,
- &key ) ) >= 0 ) {
+ if ( ( len = fetch_raw_setting_copy ( NULL, &privkey_setting,
+ &key ) ) >= 0 ) {
client_private_key.data = key;
client_private_key.len = len;
}
diff --git a/src/crypto/rootcert.c b/src/crypto/rootcert.c
index 2aa31334..cfeabb81 100644
--- a/src/crypto/rootcert.c
+++ b/src/crypto/rootcert.c
@@ -100,8 +100,8 @@ static void rootcert_init ( void ) {
/* Fetch copy of "trust" setting, if it exists. This
* memory will never be freed.
*/
- if ( ( len = fetch_setting_copy ( NULL, &trust_setting,
- &external ) ) >= 0 ) {
+ if ( ( len = fetch_raw_setting_copy ( NULL, &trust_setting,
+ &external ) ) >= 0 ) {
root_certificates.fingerprints = external;
root_certificates.count = ( len / FINGERPRINT_LEN );
}
diff --git a/src/drivers/block/ibft.c b/src/drivers/block/ibft.c
index 75ca51a9..0700f8c4 100644
--- a/src/drivers/block/ibft.c
+++ b/src/drivers/block/ibft.c
@@ -107,7 +107,7 @@ static void ibft_set_ipaddr ( struct ibft_ipaddr *ipaddr, struct in_addr in ) {
* @v count Maximum number of IP addresses
*/
static void ibft_set_ipaddr_setting ( struct ibft_ipaddr *ipaddr,
- struct setting *setting,
+ const struct setting *setting,
unsigned int count ) {
struct in_addr in[count];
unsigned int i;
@@ -183,11 +183,13 @@ static int ibft_set_string ( struct ibft_strings *strings,
*/
static int ibft_set_string_setting ( struct ibft_strings *strings,
struct ibft_string *string,
- struct setting *setting ) {
+ const struct setting *setting ) {
+ struct settings *origin;
+ struct setting fetched;
int len;
char *dest;
- len = fetch_setting_len ( NULL, setting );
+ len = fetch_setting ( NULL, setting, &origin, &fetched, NULL, 0 );
if ( len < 0 ) {
string->offset = 0;
string->len = 0;
@@ -197,7 +199,7 @@ static int ibft_set_string_setting ( struct ibft_strings *strings,
dest = ibft_alloc_string ( strings, string, len );
if ( ! dest )
return -ENOBUFS;
- fetch_string_setting ( NULL, setting, dest, ( len + 1 ) );
+ fetch_string_setting ( origin, &fetched, dest, ( len + 1 ));
return 0;
}
diff --git a/src/drivers/bus/pci_settings.c b/src/drivers/bus/pci_settings.c
index a4d7b933..db20452e 100644
--- a/src/drivers/bus/pci_settings.c
+++ b/src/drivers/bus/pci_settings.c
@@ -32,7 +32,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
*/
/** PCI device settings scope */
-static struct settings_scope pci_settings_scope;
+static const struct settings_scope pci_settings_scope;
/**
* Check applicability of PCI device setting
@@ -42,7 +42,7 @@ static struct settings_scope pci_settings_scope;
* @ret applies Setting applies within this settings block
*/
static int pci_settings_applies ( struct settings *settings __unused,
- struct setting *setting ) {
+ const struct setting *setting ) {
return ( setting->scope == &pci_settings_scope );
}
diff --git a/src/drivers/net/phantom/phantom.c b/src/drivers/net/phantom/phantom.c
index 7f2fe0b6..e70ded08 100644
--- a/src/drivers/net/phantom/phantom.c
+++ b/src/drivers/net/phantom/phantom.c
@@ -1455,7 +1455,7 @@ static struct net_device_operations phantom_operations = {
*/
/** Phantom CLP settings scope */
-static struct settings_scope phantom_settings_scope;
+static const struct settings_scope phantom_settings_scope;
/** Phantom CLP data
*
@@ -1656,7 +1656,7 @@ static int phantom_clp_fetch ( struct phantom_nic *phantom, unsigned int port,
/** A Phantom CLP setting */
struct phantom_clp_setting {
/** iPXE setting */
- struct setting *setting;
+ const struct setting *setting;
/** Setting number */
unsigned int clp_setting;
};
@@ -1673,7 +1673,8 @@ static struct phantom_clp_setting clp_settings[] = {
* @v clp_setting Setting number, or 0 if not found
*/
static unsigned int
-phantom_clp_setting ( struct phantom_nic *phantom, struct setting *setting ) {
+phantom_clp_setting ( struct phantom_nic *phantom,
+ const struct setting *setting ) {
struct phantom_clp_setting *clp_setting;
unsigned int i;
@@ -1703,7 +1704,7 @@ phantom_clp_setting ( struct phantom_nic *phantom, struct setting *setting ) {
* @ret applies Setting applies within this settings block
*/
static int phantom_setting_applies ( struct settings *settings,
- struct setting *setting ) {
+ const struct setting *setting ) {
struct phantom_nic *phantom =
container_of ( settings, struct phantom_nic, settings );
unsigned int clp_setting;
@@ -1723,7 +1724,7 @@ static int phantom_setting_applies ( struct settings *settings,
* @ret rc Return status code
*/
static int phantom_store_setting ( struct settings *settings,
- struct setting *setting,
+ const struct setting *setting,
const void *data, size_t len ) {
struct phantom_nic *phantom =
container_of ( settings, struct phantom_nic, settings );
diff --git a/src/hci/commands/nvo_cmd.c b/src/hci/commands/nvo_cmd.c
index 3fd684d0..e63dab08 100644
--- a/src/hci/commands/nvo_cmd.c
+++ b/src/hci/commands/nvo_cmd.c
@@ -58,8 +58,10 @@ static int show_exec ( int argc, char **argv ) {
struct show_options opts;
struct named_setting setting;
struct settings *origin;
+ struct setting fetched;
char name_buf[32];
char *value;
+ int len;
int rc;
/* Parse options */
@@ -71,19 +73,16 @@ static int show_exec ( int argc, char **argv ) {
goto err_parse_setting;
/* Fetch formatted setting value */
- if ( ( rc = fetchf_setting_copy ( setting.settings, &setting.setting,
- &value ) ) < 0 ) {
+ if ( ( len = fetchf_setting_copy ( setting.settings, &setting.setting,
+ &origin, &fetched, &value ) ) < 0 ) {
+ rc = len;
printf ( "Could not find \"%s\": %s\n",
setting.setting.name, strerror ( rc ) );
goto err_fetchf;
}
- /* Fetch origin and format fully-qualified name */
- origin = fetch_setting_origin ( setting.settings, &setting.setting );
- assert ( origin != NULL );
- setting_name ( origin, &setting.setting, name_buf, sizeof ( name_buf ));
-
/* Print setting value */
+ setting_name ( origin, &fetched, name_buf, sizeof ( name_buf ) );
printf ( "%s = %s\n", name_buf, value );
/* Success */
@@ -234,7 +233,8 @@ static int read_value ( struct named_setting *setting, char **args __unused,
/* Read existing value, treating errors as equivalent to an
* empty initial setting.
*/
- fetchf_setting_copy ( setting->settings, &setting->setting, &existing );
+ fetchf_setting_copy ( setting->settings, &setting->setting,
+ NULL, &setting->setting, &existing );
/* Read new value */
if ( ( rc = readline_history ( NULL, existing, NULL, value ) ) != 0 )
@@ -294,12 +294,11 @@ static int inc_exec ( int argc, char **argv ) {
( ( rc = parse_integer ( argv[ optind + 1 ], &increment ) ) != 0))
goto err_parse_increment;
- /* Fetch existing setting value, if any, allowing for the fact
- * that numeric settings are big-endian and variable-length.
+ /* Read existing value, treating errors as equivalent to a
+ * zero-valued :int32 initial setting.
*/
if ( ( rc = fetchn_setting ( setting.settings, &setting.setting,
- &value ) ) != 0 ) {
- /* Treat as a non-existent :int32 setting with a zero value */
+ NULL, &setting.setting, &value ) ) != 0 ) {
value = 0;
if ( ! setting.setting.type )
setting.setting.type = &setting_type_int32;
diff --git a/src/hci/commands/pci_cmd.c b/src/hci/commands/pci_cmd.c
index f2d69569..f5145fb3 100644
--- a/src/hci/commands/pci_cmd.c
+++ b/src/hci/commands/pci_cmd.c
@@ -68,8 +68,8 @@ static int pciscan_exec ( int argc, char **argv ) {
goto err_parse_setting;
/* Determine starting bus:dev.fn address */
- if ( ( len = fetch_uint_setting ( setting.settings, &setting.setting,
- &prev ) ) < 0 ) {
+ if ( ( len = fetchn_setting ( setting.settings, &setting.setting,
+ NULL, &setting.setting, &prev ) ) < 0 ) {
/* Setting not yet defined: start searching from 00:00.0 */
prev = 0;
} else {
diff --git a/src/hci/tui/settings_ui.c b/src/hci/tui/settings_ui.c
index 77ef8108..8fe13ad8 100644
--- a/src/hci/tui/settings_ui.c
+++ b/src/hci/tui/settings_ui.c
@@ -72,11 +72,16 @@ struct setting_row_widget {
* Valid only for rows that lead to new settings blocks.
*/
struct settings *settings;
+ /** Configuration setting origin
+ *
+ * Valid only for rows that represent individual settings.
+ */
+ struct settings *origin;
/** Configuration setting
*
* Valid only for rows that represent individual settings.
*/
- struct setting *setting;
+ struct setting setting;
/** Screen row */
unsigned int row;
/** Screen column */
@@ -85,8 +90,6 @@ struct setting_row_widget {
struct edit_box editbox;
/** Editing in progress flag */
int editing;
- /** Setting originates from this block flag */
- int originates_here;
/** Buffer for setting's value */
char value[256]; /* enough size for a DHCP string */
};
@@ -115,7 +118,6 @@ struct setting_widget {
static unsigned int select_setting_row ( struct setting_widget *widget,
unsigned int index ) {
struct settings *settings;
- struct settings *origin;
struct setting *setting;
unsigned int count = 0;
@@ -147,18 +149,13 @@ static unsigned int select_setting_row ( struct setting_widget *widget,
if ( ! setting_applies ( widget->settings, setting ) )
continue;
if ( count++ == index ) {
- widget->row.setting = setting;
- /* Read current setting value */
- fetchf_setting ( widget->settings, widget->row.setting,
+ /* Read current setting value and origin */
+ fetchf_setting ( widget->settings, setting,
+ &widget->row.origin,
+ &widget->row.setting,
widget->row.value,
sizeof ( widget->row.value ) );
-
- /* Check setting's origin */
- origin = fetch_setting_origin ( widget->settings,
- widget->row.setting );
- widget->row.originates_here =
- ( origin == widget->settings );
}
}
@@ -209,7 +206,7 @@ static void draw_setting_row ( struct setting_widget *widget ) {
/* Construct dot-padded name */
memset ( text.name, '.', sizeof ( text.name ) );
- string_copy ( text.name, widget->row.setting->name,
+ string_copy ( text.name, widget->row.setting.name,
sizeof ( text.name ) );
/* Construct space-padded value */
@@ -222,8 +219,10 @@ static void draw_setting_row ( struct setting_widget *widget ) {
}
/* Print row */
- if ( widget->row.originates_here || widget->row.settings )
+ if ( ( widget->row.origin == widget->settings ) ||
+ ( widget->row.settings != NULL ) ) {
attron ( A_BOLD );
+ }
mvprintw ( widget->row.row, widget->row.col, "%s", text.start );
attroff ( A_BOLD );
move ( widget->row.row, widget->row.col + curs_offset );
@@ -237,7 +236,7 @@ static void draw_setting_row ( struct setting_widget *widget ) {
* @ret key Key returned to application, or zero
*/
static int edit_setting ( struct setting_widget *widget, int key ) {
- assert ( widget->row.setting != NULL );
+ assert ( widget->row.setting.name != NULL );
widget->row.editing = 1;
return edit_editbox ( &widget->row.editbox, key );
}
@@ -248,8 +247,8 @@ static int edit_setting ( struct setting_widget *widget, int key ) {
* @v widget Setting widget
*/
static int save_setting ( struct setting_widget *widget ) {
- assert ( widget->row.setting != NULL );
- return storef_setting ( widget->settings, widget->row.setting,
+ assert ( widget->row.setting.name != NULL );
+ return storef_setting ( widget->settings, &widget->row.setting,
widget->row.value );
}
@@ -344,28 +343,26 @@ static void draw_title_row ( struct setting_widget *widget ) {
* @v widget Setting widget
*/
static void draw_info_row ( struct setting_widget *widget ) {
- struct settings *origin;
char buf[32];
/* Draw nothing unless this row represents a setting */
clearmsg ( INFO_ROW );
clearmsg ( INFO_ROW + 1 );
- if ( ! widget->row.setting )
+ if ( ! widget->row.setting.name )
return;
/* Determine a suitable setting name */
- origin = fetch_setting_origin ( widget->settings, widget->row.setting );
- if ( ! origin )
- origin = widget->settings;
- setting_name ( origin, widget->row.setting, buf, sizeof ( buf ) );
+ setting_name ( ( widget->row.origin ?
+ widget->row.origin : widget->settings ),
+ &widget->row.setting, buf, sizeof ( buf ) );
/* Draw row */
attron ( A_BOLD );
- msg ( INFO_ROW, "%s - %s", buf, widget->row.setting->description );
+ msg ( INFO_ROW, "%s - %s", buf, widget->row.setting.description );
attroff ( A_BOLD );
color_set ( CPAIR_URL, NULL );
msg ( ( INFO_ROW + 1 ), "http://ipxe.org/cfg/%s",
- widget->row.setting->name );
+ widget->row.setting.name );
color_set ( CPAIR_NORMAL, NULL );
}
@@ -384,7 +381,7 @@ static void draw_instruction_row ( struct setting_widget *widget ) {
} else {
msg ( INSTRUCTION_ROW,
"%sCtrl-X - exit configuration utility",
- ( widget->row.originates_here ?
+ ( ( widget->row.origin == widget->settings ) ?
"Ctrl-D - delete setting" INSTRUCTION_PAD : "" ) );
}
}
@@ -479,7 +476,7 @@ static int main_loop ( struct settings *settings ) {
if ( widget.row.editing ) {
/* Sanity check */
- assert ( widget.row.setting != NULL );
+ assert ( widget.row.setting.name != NULL );
/* Redraw edit box */
color_set ( CPAIR_EDIT, NULL );
@@ -530,10 +527,10 @@ static int main_loop ( struct settings *settings ) {
move = +widget.num_rows;
break;
case CTRL_D:
- if ( ! widget.row.setting )
+ if ( ! widget.row.setting.name )
break;
if ( ( rc = delete_setting ( widget.settings,
- widget.row.setting ) ) != 0 ) {
+ &widget.row.setting ) ) != 0 ) {
alert ( " %s ", strerror ( rc ) );
}
select_setting_row ( &widget, widget.current );
@@ -550,7 +547,7 @@ static int main_loop ( struct settings *settings ) {
}
/* Fall through */
default:
- if ( widget.row.setting ) {
+ if ( widget.row.setting.name ) {
edit_setting ( &widget, key );
redraw = 1;
}
diff --git a/src/include/ipxe/net80211.h b/src/include/ipxe/net80211.h
index dd8bd228..d752382a 100644
--- a/src/include/ipxe/net80211.h
+++ b/src/include/ipxe/net80211.h
@@ -1093,7 +1093,7 @@ struct net80211_wlan
/** 802.11 encryption key setting */
-extern struct setting net80211_key_setting __setting ( SETTING_NETDEV_EXTRA );
+extern const struct setting net80211_key_setting __setting ( SETTING_NETDEV_EXTRA );
/**
diff --git a/src/include/ipxe/nvo.h b/src/include/ipxe/nvo.h
index 487f8b3f..1a629da7 100644
--- a/src/include/ipxe/nvo.h
+++ b/src/include/ipxe/nvo.h
@@ -45,7 +45,8 @@ struct nvo_block {
/** Name of non-volatile options settings block */
#define NVO_SETTINGS_NAME "nvo"
-extern int nvo_applies ( struct settings *settings, struct setting *setting );
+extern int nvo_applies ( struct settings *settings,
+ const struct setting *setting );
extern void nvo_init ( struct nvo_block *nvo, struct nvs_device *nvs,
size_t address, size_t len,
int ( * resize ) ( struct nvo_block *nvo, size_t len ),
diff --git a/src/include/ipxe/settings.h b/src/include/ipxe/settings.h
index a6dfd210..25665ca7 100644
--- a/src/include/ipxe/settings.h
+++ b/src/include/ipxe/settings.h
@@ -32,7 +32,7 @@ struct setting {
* This identifies the type of setting (e.g. string, IPv4
* address, etc.).
*/
- struct setting_type *type;
+ const struct setting_type *type;
/** Setting tag, if applicable
*
* The setting tag is a numerical description of the setting
@@ -45,7 +45,7 @@ struct setting {
* For historic reasons, a NULL scope with a non-zero tag
* indicates a DHCPv4 option setting.
*/
- struct settings_scope *scope;
+ const struct settings_scope *scope;
};
/** Configuration setting table */
@@ -90,7 +90,7 @@ struct settings_operations {
* @ret applies Setting applies within this settings block
*/
int ( * applies ) ( struct settings *settings,
- struct setting *setting );
+ const struct setting *setting );
/** Store value of setting
*
* @v settings Settings block
@@ -99,7 +99,8 @@ struct settings_operations {
* @v len Length of setting data
* @ret rc Return status code
*/
- int ( * store ) ( struct settings *settings, struct setting *setting,
+ int ( * store ) ( struct settings *settings,
+ const struct setting *setting,
const void *data, size_t len );
/** Fetch value of setting
*
@@ -136,7 +137,7 @@ struct settings {
/** Settings block operations */
struct settings_operations *op;
/** Default scope for numerical settings constructed for this block */
- struct settings_scope *default_scope;
+ const struct settings_scope *default_scope;
};
/**
@@ -193,7 +194,7 @@ struct setting_type {
* @v len Length of buffer
* @ret len Length of raw value, or negative error
*/
- int ( * parse ) ( struct setting_type *type, const char *value,
+ int ( * parse ) ( const struct setting_type *type, const char *value,
void *buf, size_t len );
/** Format setting value as a string
*
@@ -204,7 +205,7 @@ struct setting_type {
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
- int ( * format ) ( struct setting_type *type, const void *raw,
+ int ( * format ) ( const struct setting_type *type, const void *raw,
size_t raw_len, char *buf, size_t len );
/** Convert number to setting value
*
@@ -214,7 +215,8 @@ struct setting_type {
* @v len Length of buffer
* @ret len Length of raw value, or negative error
*/
- int ( * denumerate ) ( struct setting_type *type, unsigned long value,
+ int ( * denumerate ) ( const struct setting_type *type,
+ unsigned long value,
void *buf, size_t len );
/** Convert setting value to number
*
@@ -224,7 +226,7 @@ struct setting_type {
* @v value Numeric value to fill in
* @ret rc Return status code
*/
- int ( * numerate ) ( struct setting_type *type, const void *raw,
+ int ( * numerate ) ( const struct setting_type *type, const void *raw,
size_t raw_len, unsigned long *value );
};
@@ -256,7 +258,7 @@ struct settings_applicator {
/** A built-in setting */
struct builtin_setting {
/** Setting */
- struct setting *setting;
+ const struct setting *setting;
/** Fetch setting value
*
* @v data Buffer to fill with setting data
@@ -273,7 +275,7 @@ struct builtin_setting {
#define __builtin_setting __table_entry ( BUILTIN_SETTINGS, 01 )
/** Built-in setting scope */
-extern struct settings_scope builtin_scope;
+extern const struct settings_scope builtin_scope;
/**
* A generic settings block
@@ -291,7 +293,7 @@ typedef struct settings * ( *get_child_settings_t ) ( struct settings *settings,
const char *name );
extern struct settings_operations generic_settings_operations;
extern int generic_settings_store ( struct settings *settings,
- struct setting *setting,
+ const struct setting *setting,
const void *data, size_t len );
extern int generic_settings_fetch ( struct settings *settings,
struct setting *setting,
@@ -304,42 +306,50 @@ extern void unregister_settings ( struct settings *settings );
extern struct settings * settings_target ( struct settings *settings );
extern int setting_applies ( struct settings *settings,
- struct setting *setting );
-extern int store_setting ( struct settings *settings, struct setting *setting,
+ const struct setting *setting );
+extern int store_setting ( struct settings *settings,
+ const struct setting *setting,
const void *data, size_t len );
-extern int fetch_setting ( struct settings *settings, struct setting *setting,
+extern int fetch_setting ( struct settings *settings,
+ const struct setting *setting,
+ struct settings **origin, struct setting *fetched,
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,
- struct setting *setting );
extern int fetch_setting_copy ( struct settings *settings,
- struct setting *setting, void **data );
+ const struct setting *setting,
+ struct settings **origin,
+ struct setting *fetched, void **data );
+extern int fetch_raw_setting ( struct settings *settings,
+ const struct setting *setting,
+ void *data, size_t len );
+extern int fetch_raw_setting_copy ( struct settings *settings,
+ const struct setting *setting,
+ void **data );
extern int fetch_string_setting ( struct settings *settings,
- struct setting *setting,
+ const struct setting *setting,
char *data, size_t len );
extern int fetch_string_setting_copy ( struct settings *settings,
- struct setting *setting,
+ const struct setting *setting,
char **data );
extern int fetch_ipv4_array_setting ( struct settings *settings,
- struct setting *setting,
- struct in_addr *inp,
- unsigned int count );
+ const struct setting *setting,
+ struct in_addr *inp, unsigned int count );
extern int fetch_ipv4_setting ( struct settings *settings,
- struct setting *setting, struct in_addr *inp );
+ const struct setting *setting,
+ struct in_addr *inp );
extern int fetch_int_setting ( struct settings *settings,
- struct setting *setting, long *value );
+ const struct setting *setting, long *value );
extern int fetch_uint_setting ( struct settings *settings,
- struct setting *setting,
+ const struct setting *setting,
unsigned long *value );
extern long fetch_intz_setting ( struct settings *settings,
- struct setting *setting );
+ const struct setting *setting );
extern unsigned long fetch_uintz_setting ( struct settings *settings,
- struct setting *setting );
+ const struct setting *setting );
extern int fetch_uuid_setting ( struct settings *settings,
- struct setting *setting, union uuid *uuid );
+ const struct setting *setting,
+ union uuid *uuid );
extern void clear_settings ( struct settings *settings );
-extern int setting_cmp ( struct setting *a, struct setting *b );
+extern int setting_cmp ( const struct setting *a, const struct setting *b );
extern struct settings * find_child_settings ( struct settings *parent,
const char *name );
@@ -351,61 +361,68 @@ extern struct setting * find_setting ( const char *name );
extern int parse_setting_name ( char *name, get_child_settings_t get_child,
struct settings **settings,
struct setting *setting );
-extern int setting_name ( struct settings *settings, struct setting *setting,
+extern int setting_name ( struct settings *settings,
+ const struct setting *setting,
char *buf, size_t len );
-extern int setting_format ( struct setting_type *type, const void *raw,
+extern int setting_format ( const struct setting_type *type, const void *raw,
size_t raw_len, char *buf, size_t len );
-extern int setting_parse ( struct setting_type *type, const char *value,
+extern int setting_parse ( const struct setting_type *type, const char *value,
void *buf, size_t len );
-extern int setting_numerate ( struct setting_type *type, const void *raw,
+extern int setting_numerate ( const struct setting_type *type, const void *raw,
size_t raw_len, unsigned long *value );
-extern int setting_denumerate ( struct setting_type *type, unsigned long value,
- void *buf, size_t len );
-extern int fetchf_setting ( struct settings *settings, struct setting *setting,
+extern int setting_denumerate ( const struct setting_type *type,
+ unsigned long value, void *buf, size_t len );
+extern int fetchf_setting ( struct settings *settings,
+ const struct setting *setting,
+ struct settings **origin, struct setting *fetched,
char *buf, size_t len );
extern int fetchf_setting_copy ( struct settings *settings,
- struct setting *setting, char **value );
+ const struct setting *setting,
+ struct settings **origin,
+ struct setting *fetched, char **value );
extern int storef_setting ( struct settings *settings,
- struct setting *setting,
- const char *value );
-extern int fetchn_setting ( struct settings *settings, struct setting *setting,
+ const struct setting *setting, const char *value );
+extern int fetchn_setting ( struct settings *settings,
+ const struct setting *setting,
+ struct settings **origin, struct setting *fetched,
unsigned long *value );
-extern int storen_setting ( struct settings *settings, struct setting *setting,
+extern int storen_setting ( struct settings *settings,
+ const struct setting *setting,
unsigned long value );
extern char * expand_settings ( const char *string );
-extern struct setting_type setting_type_string __setting_type;
-extern struct setting_type setting_type_uristring __setting_type;
-extern struct setting_type setting_type_ipv4 __setting_type;
-extern struct setting_type setting_type_ipv6 __setting_type;
-extern struct setting_type setting_type_int8 __setting_type;
-extern struct setting_type setting_type_int16 __setting_type;
-extern struct setting_type setting_type_int32 __setting_type;
-extern struct setting_type setting_type_uint8 __setting_type;
-extern struct setting_type setting_type_uint16 __setting_type;
-extern struct setting_type setting_type_uint32 __setting_type;
-extern struct setting_type setting_type_hex __setting_type;
-extern struct setting_type setting_type_hexhyp __setting_type;
-extern struct setting_type setting_type_hexraw __setting_type;
-extern struct setting_type setting_type_uuid __setting_type;
-extern struct setting_type setting_type_busdevfn __setting_type;
-
-extern struct setting ip_setting __setting ( SETTING_IPv4 );
-extern struct setting netmask_setting __setting ( SETTING_IPv4 );
-extern struct setting gateway_setting __setting ( SETTING_IPv4 );
-extern struct setting dns_setting __setting ( SETTING_IPv4_EXTRA );
-extern struct setting hostname_setting __setting ( SETTING_HOST );
-extern struct setting domain_setting __setting ( SETTING_IPv4_EXTRA );
-extern struct setting filename_setting __setting ( SETTING_BOOT );
-extern struct setting root_path_setting __setting ( SETTING_SANBOOT );
-extern struct setting username_setting __setting ( SETTING_AUTH );
-extern struct setting password_setting __setting ( SETTING_AUTH );
-extern struct setting priority_setting __setting ( SETTING_MISC );
-extern struct setting uuid_setting __setting ( SETTING_HOST );
-extern struct setting next_server_setting __setting ( SETTING_BOOT );
-extern struct setting mac_setting __setting ( SETTING_NETDEV );
-extern struct setting busid_setting __setting ( SETTING_NETDEV );
-extern struct setting user_class_setting __setting ( SETTING_HOST_EXTRA );
+extern const struct setting_type setting_type_string __setting_type;
+extern const struct setting_type setting_type_uristring __setting_type;
+extern const struct setting_type setting_type_ipv4 __setting_type;
+extern const struct setting_type setting_type_ipv6 __setting_type;
+extern const struct setting_type setting_type_int8 __setting_type;
+extern const struct setting_type setting_type_int16 __setting_type;
+extern const struct setting_type setting_type_int32 __setting_type;
+extern const struct setting_type setting_type_uint8 __setting_type;
+extern const struct setting_type setting_type_uint16 __setting_type;
+extern const struct setting_type setting_type_uint32 __setting_type;
+extern const struct setting_type setting_type_hex __setting_type;
+extern const struct setting_type setting_type_hexhyp __setting_type;
+extern const struct setting_type setting_type_hexraw __setting_type;
+extern const struct setting_type setting_type_uuid __setting_type;
+extern const struct setting_type setting_type_busdevfn __setting_type;
+
+extern const struct setting ip_setting __setting ( SETTING_IPv4 );
+extern const struct setting netmask_setting __setting ( SETTING_IPv4 );
+extern const struct setting gateway_setting __setting ( SETTING_IPv4 );
+extern const struct setting dns_setting __setting ( SETTING_IPv4_EXTRA );
+extern const struct setting hostname_setting __setting ( SETTING_HOST );
+extern const struct setting domain_setting __setting ( SETTING_IPv4_EXTRA );
+extern const struct setting filename_setting __setting ( SETTING_BOOT );
+extern const struct setting root_path_setting __setting ( SETTING_SANBOOT );
+extern const struct setting username_setting __setting ( SETTING_AUTH );
+extern const struct setting password_setting __setting ( SETTING_AUTH );
+extern const struct setting priority_setting __setting ( SETTING_MISC );
+extern const struct setting uuid_setting __setting ( SETTING_HOST );
+extern const struct setting next_server_setting __setting ( SETTING_BOOT );
+extern const struct setting mac_setting __setting ( SETTING_NETDEV );
+extern const struct setting busid_setting __setting ( SETTING_NETDEV );
+extern const struct setting user_class_setting __setting ( SETTING_HOST_EXTRA );
/**
* Initialise a settings block
@@ -418,7 +435,7 @@ extern struct setting user_class_setting __setting ( SETTING_HOST_EXTRA );
static inline void settings_init ( struct settings *settings,
struct settings_operations *op,
struct refcnt *refcnt,
- struct settings_scope *default_scope ) {
+ const struct settings_scope *default_scope ){
INIT_LIST_HEAD ( &settings->siblings );
INIT_LIST_HEAD ( &settings->children );
settings->op = op;
@@ -447,20 +464,21 @@ static inline void generic_settings_init ( struct generic_settings *generics,
* @ret rc Return status code
*/
static inline int delete_setting ( struct settings *settings,
- struct setting *setting ) {
+ const struct setting *setting ) {
return store_setting ( settings, setting, NULL, 0 );
}
/**
- * Check existence of setting
+ * Check existence of predefined setting
*
* @v settings Settings block, or NULL to search all blocks
* @v setting Setting to fetch
* @ret exists Setting exists
*/
static inline int setting_exists ( struct settings *settings,
- struct setting *setting ) {
- return ( fetch_setting_len ( settings, setting ) >= 0 );
+ const struct setting *setting ) {
+ return ( fetch_setting ( settings, setting, NULL, NULL,
+ NULL, 0 ) >= 0 );
}
#endif /* _IPXE_SETTINGS_H */
diff --git a/src/interface/efi/efi_snp_hii.c b/src/interface/efi/efi_snp_hii.c
index 9ea15a62..61954b63 100644
--- a/src/interface/efi/efi_snp_hii.c
+++ b/src/interface/efi/efi_snp_hii.c
@@ -276,7 +276,9 @@ static int efi_snp_hii_fetch ( struct efi_snp_device *snpdev,
const char *key, const char *value,
wchar_t **results, int *have_setting ) {
struct settings *settings = efi_snp_hii_settings ( snpdev );
+ struct settings *origin;
struct setting *setting;
+ struct setting fetched;
int len;
char *buf;
char *encoded;
@@ -311,7 +313,8 @@ static int efi_snp_hii_fetch ( struct efi_snp_device *snpdev,
if ( setting_exists ( settings, setting ) ) {
/* Calculate formatted length */
- len = fetchf_setting ( settings, setting, NULL, 0 );
+ len = fetchf_setting ( settings, setting, &origin, &fetched,
+ NULL, 0 );
if ( len < 0 ) {
rc = len;
DBGC ( snpdev, "SNPDEV %p could not fetch %s: %s\n",
@@ -328,7 +331,8 @@ static int efi_snp_hii_fetch ( struct efi_snp_device *snpdev,
encoded = ( buf + len + 1 /* NUL */ );
/* Format value */
- fetchf_setting ( settings, setting, buf, ( len + 1 /* NUL */ ));
+ fetchf_setting ( origin, &fetched, NULL, NULL, buf,
+ ( len + 1 /* NUL */ ) );
for ( i = 0 ; i < len ; i++ ) {
sprintf ( ( encoded + ( 4 * i ) ), "%04x",
*( ( uint8_t * ) buf + i ) );
diff --git a/src/interface/smbios/smbios_settings.c b/src/interface/smbios/smbios_settings.c
index ecd3f1d9..9995bd75 100644
--- a/src/interface/smbios/smbios_settings.c
+++ b/src/interface/smbios/smbios_settings.c
@@ -28,7 +28,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/smbios.h>
/** SMBIOS settings scope */
-static struct settings_scope smbios_settings_scope;
+static const struct settings_scope smbios_settings_scope;
/**
* Construct SMBIOS raw-data tag
@@ -63,7 +63,7 @@ static struct settings_scope smbios_settings_scope;
* @ret applies Setting applies within this settings block
*/
static int smbios_applies ( struct settings *settings __unused,
- struct setting *setting ) {
+ const struct setting *setting ) {
return ( setting->scope == &smbios_settings_scope );
}
@@ -188,7 +188,7 @@ struct init_fn smbios_init_fn __init_fn ( INIT_NORMAL ) = {
};
/** UUID setting obtained via SMBIOS */
-struct setting uuid_setting __setting ( SETTING_HOST ) = {
+const struct setting uuid_setting __setting ( SETTING_HOST ) = {
.name = "uuid",
.description = "UUID",
.tag = SMBIOS_RAW_TAG ( SMBIOS_TYPE_SYSTEM_INFORMATION,
@@ -198,7 +198,7 @@ struct setting uuid_setting __setting ( SETTING_HOST ) = {
};
/** Other SMBIOS predefined settings */
-struct setting smbios_predefined_settings[] __setting ( SETTING_HOST_EXTRA ) = {
+const struct setting smbios_predefined_settings[] __setting ( SETTING_HOST_EXTRA ) = {
{
.name = "manufacturer",
.description = "Manufacturer",
diff --git a/src/net/80211/net80211.c b/src/net/80211/net80211.c
index 3893f652..db4dc116 100644
--- a/src/net/80211/net80211.c
+++ b/src/net/80211/net80211.c
@@ -204,7 +204,7 @@ struct settings_applicator net80211_applicator __settings_applicator = {
* If this is blank, we scan for all networks and use the one with the
* greatest signal strength.
*/
-struct setting net80211_ssid_setting __setting ( SETTING_NETDEV_EXTRA ) = {
+const struct setting net80211_ssid_setting __setting ( SETTING_NETDEV_EXTRA ) = {
.name = "ssid",
.description = "Wireless SSID",
.type = &setting_type_string,
@@ -216,7 +216,7 @@ struct setting net80211_ssid_setting __setting ( SETTING_NETDEV_EXTRA ) = {
* active scan (send probe packets). If this setting is nonzero, an
* active scan on the 2.4GHz band will be used to associate.
*/
-struct setting net80211_active_setting __setting ( SETTING_NETDEV_EXTRA ) = {
+const struct setting net80211_active_setting __setting ( SETTING_NETDEV_EXTRA ) = {
.name = "active-scan",
.description = "Actively scan for wireless networks",
.type = &setting_type_int8,
@@ -228,7 +228,7 @@ struct setting net80211_active_setting __setting ( SETTING_NETDEV_EXTRA ) = {
* normal iPXE method for entering hex settings; an ASCII string of
* hex characters will not behave as expected.
*/
-struct setting net80211_key_setting __setting ( SETTING_NETDEV_EXTRA ) = {
+const struct setting net80211_key_setting __setting ( SETTING_NETDEV_EXTRA ) = {
.name = "key",
.description = "Wireless encryption key",
.type = &setting_type_string,
diff --git a/src/net/80211/wep.c b/src/net/80211/wep.c
index 37b27f71..e22ac899 100644
--- a/src/net/80211/wep.c
+++ b/src/net/80211/wep.c
@@ -236,8 +236,8 @@ static int trivial_init ( struct net80211_device *dev )
dev->associating->crypto == NET80211_CRYPT_NONE )
return 0; /* no crypto? OK. */
- len = fetch_setting ( netdev_settings ( dev->netdev ),
- &net80211_key_setting, key, WEP_MAX_KEY );
+ len = fetch_raw_setting ( netdev_settings ( dev->netdev ),
+ &net80211_key_setting, key, WEP_MAX_KEY );
if ( len <= 0 ) {
DBGC ( dev, "802.11 %p cannot do WEP without a key\n", dev );
@@ -278,8 +278,8 @@ static int trivial_change_key ( struct net80211_device *dev )
if ( ! dev->crypto || ( dev->crypto->init != wep_init ) )
change ^= 1;
- len = fetch_setting ( netdev_settings ( dev->netdev ),
- &net80211_key_setting, key, WEP_MAX_KEY );
+ len = fetch_raw_setting ( netdev_settings ( dev->netdev ),
+ &net80211_key_setting, key, WEP_MAX_KEY );
if ( len <= 0 )
change ^= 1;
diff --git a/src/net/dhcppkt.c b/src/net/dhcppkt.c
index 3722c09e..a9a6d3a9 100644
--- a/src/net/dhcppkt.c
+++ b/src/net/dhcppkt.c
@@ -226,7 +226,7 @@ int dhcppkt_fetch ( struct dhcp_packet *dhcppkt, unsigned int tag,
* @ret applies Setting applies within this settings block
*/
static int dhcppkt_settings_applies ( struct settings *settings,
- struct setting *setting ) {
+ const struct setting *setting ) {
struct dhcp_packet *dhcppkt =
container_of ( settings, struct dhcp_packet, settings );
@@ -244,7 +244,7 @@ static int dhcppkt_settings_applies ( struct settings *settings,
* @ret rc Return status code
*/
static int dhcppkt_settings_store ( struct settings *settings,
- struct setting *setting,
+ const struct setting *setting,
const void *data, size_t len ) {
struct dhcp_packet *dhcppkt =
container_of ( settings, struct dhcp_packet, settings );
diff --git a/src/net/fakedhcp.c b/src/net/fakedhcp.c
index d67501ed..3dec88b1 100644
--- a/src/net/fakedhcp.c
+++ b/src/net/fakedhcp.c
@@ -49,8 +49,8 @@ static int copy_encap_settings ( struct dhcp_packet *dest,
struct setting setting = { .name = "" };
unsigned int subtag;
unsigned int tag;
+ void *data;
int len;
- int check_len;
int rc;
for ( subtag = DHCP_MIN_OPTION; subtag <= DHCP_MAX_OPTION; subtag++ ) {
@@ -66,17 +66,11 @@ static int copy_encap_settings ( struct dhcp_packet *dest,
default:
/* Copy setting, if present */
setting.tag = tag;
- len = fetch_setting_len ( source, &setting );
- if ( len < 0 )
- break;
- {
- char buf[len];
-
- check_len = fetch_setting ( source, &setting,
- buf, sizeof (buf));
- assert ( check_len == len );
- if ( ( rc = dhcppkt_store ( dest, tag, buf,
- sizeof(buf) )) !=0)
+ len = fetch_raw_setting_copy ( source, &setting, &data);
+ if ( len >= 0 ) {
+ rc = dhcppkt_store ( dest, tag, data, len );
+ free ( data );
+ if ( rc != 0 )
return rc;
}
break;
diff --git a/src/net/ipv4.c b/src/net/ipv4.c
index 438fe9ac..f0a2e4d6 100644
--- a/src/net/ipv4.c
+++ b/src/net/ipv4.c
@@ -591,7 +591,7 @@ struct sockaddr_converter ipv4_sockaddr_converter __sockaddr_converter = {
*/
/** IPv4 address setting */
-struct setting ip_setting __setting ( SETTING_IPv4 ) = {
+const struct setting ip_setting __setting ( SETTING_IPv4 ) = {
.name = "ip",
.description = "IP address",
.tag = DHCP_EB_YIADDR,
@@ -599,7 +599,7 @@ struct setting ip_setting __setting ( SETTING_IPv4 ) = {
};
/** IPv4 subnet mask setting */
-struct setting netmask_setting __setting ( SETTING_IPv4 ) = {
+const struct setting netmask_setting __setting ( SETTING_IPv4 ) = {
.name = "netmask",
.description = "Subnet mask",
.tag = DHCP_SUBNET_MASK,
@@ -607,7 +607,7 @@ struct setting netmask_setting __setting ( SETTING_IPv4 ) = {
};
/** Default gateway setting */
-struct setting gateway_setting __setting ( SETTING_IPv4 ) = {
+const struct setting gateway_setting __setting ( SETTING_IPv4 ) = {
.name = "gateway",
.description = "Default gateway",
.tag = DHCP_ROUTERS,
diff --git a/src/net/ipv6.c b/src/net/ipv6.c
index b4f33f0d..68a0c89b 100644
--- a/src/net/ipv6.c
+++ b/src/net/ipv6.c
@@ -954,7 +954,7 @@ struct sockaddr_converter ipv6_sockaddr_converter __sockaddr_converter = {
* @v len Length of buffer
* @ret len Length of raw value, or negative error
*/
-static int parse_ipv6_setting ( struct setting_type *type __unused,
+static int parse_ipv6_setting ( const struct setting_type *type __unused,
const char *value, void *buf, size_t len ) {
struct in6_addr ipv6;
int rc;
@@ -981,7 +981,7 @@ static int parse_ipv6_setting ( struct setting_type *type __unused,
* @v len Length of buffer
* @ret len Length of formatted value, or negative error
*/
-static int format_ipv6_setting ( struct setting_type *type __unused,
+static int format_ipv6_setting ( const struct setting_type *type __unused,
const void *raw, size_t raw_len, char *buf,
size_t len ) {
const struct in6_addr *ipv6 = raw;
@@ -992,7 +992,7 @@ static int format_ipv6_setting ( struct setting_type *type __unused,
}
/** An IPv6 address setting type */
-struct setting_type setting_type_ipv6 __setting_type = {
+const struct setting_type setting_type_ipv6 __setting_type = {
.name = "ipv6",
.parse = parse_ipv6_setting,
.format = format_ipv6_setting,
diff --git a/src/net/netdev_settings.c b/src/net/netdev_settings.c
index 994e0506..cfadd9e4 100644
--- a/src/net/netdev_settings.c
+++ b/src/net/netdev_settings.c
@@ -36,27 +36,27 @@ FILE_LICENCE ( GPL2_OR_LATER );
*/
/** Network device predefined settings */
-struct setting mac_setting __setting ( SETTING_NETDEV ) = {
+const struct setting mac_setting __setting ( SETTING_NETDEV ) = {
.name = "mac",
.description = "MAC address",
.type = &setting_type_hex,
};
-struct setting bustype_setting __setting ( SETTING_NETDEV ) = {
+const struct setting bustype_setting __setting ( SETTING_NETDEV ) = {
.name = "bustype",
.description = "Bus type",
.type = &setting_type_string,
};
-struct setting busloc_setting __setting ( SETTING_NETDEV ) = {
+const struct setting busloc_setting __setting ( SETTING_NETDEV ) = {
.name = "busloc",
.description = "Bus location",
.type = &setting_type_uint32,
};
-struct setting busid_setting __setting ( SETTING_NETDEV ) = {
+const struct setting busid_setting __setting ( SETTING_NETDEV ) = {
.name = "busid",
.description = "Bus ID",
.type = &setting_type_hex,
};
-struct setting chip_setting __setting ( SETTING_NETDEV ) = {
+const struct setting chip_setting __setting ( SETTING_NETDEV ) = {
.name = "chip",
.description = "Chip",
.type = &setting_type_string,
@@ -194,7 +194,7 @@ static int netdev_fetch_chip ( struct net_device *netdev, void *data,
/** A network device setting operation */
struct netdev_setting_operation {
/** Setting */
- struct setting *setting;
+ const struct setting *setting;
/** Store setting (or NULL if not supported)
*
* @v netdev Network device
@@ -232,7 +232,8 @@ static struct netdev_setting_operation netdev_setting_operations[] = {
* @v len Length of setting data
* @ret rc Return status code
*/
-static int netdev_store ( struct settings *settings, struct setting *setting,
+static int netdev_store ( struct settings *settings,
+ const struct setting *setting,
const void *data, size_t len ) {
struct net_device *netdev = container_of ( settings, struct net_device,
settings.settings );
diff --git a/src/net/tcp/iscsi.c b/src/net/tcp/iscsi.c
index c9daf1ff..197069cc 100644
--- a/src/net/tcp/iscsi.c
+++ b/src/net/tcp/iscsi.c
@@ -1860,7 +1860,7 @@ enum iscsi_root_path_component {
};
/** iSCSI initiator IQN setting */
-struct setting initiator_iqn_setting __setting ( SETTING_SANBOOT_EXTRA ) = {
+const struct setting initiator_iqn_setting __setting ( SETTING_SANBOOT_EXTRA ) = {
.name = "initiator-iqn",
.description = "iSCSI initiator name",
.tag = DHCP_ISCSI_INITIATOR_IQN,
@@ -1868,7 +1868,7 @@ struct setting initiator_iqn_setting __setting ( SETTING_SANBOOT_EXTRA ) = {
};
/** iSCSI reverse username setting */
-struct setting reverse_username_setting __setting ( SETTING_AUTH_EXTRA ) = {
+const struct setting reverse_username_setting __setting ( SETTING_AUTH_EXTRA ) = {
.name = "reverse-username",
.description = "Reverse user name",
.tag = DHCP_EB_REVERSE_USERNAME,
@@ -1876,7 +1876,7 @@ struct setting reverse_username_setting __setting ( SETTING_AUTH_EXTRA ) = {
};
/** iSCSI reverse password setting */
-struct setting reverse_password_setting __setting ( SETTING_AUTH_EXTRA ) = {
+const struct setting reverse_password_setting __setting ( SETTING_AUTH_EXTRA ) = {
.name = "reverse-password",
.description = "Reverse password",
.tag = DHCP_EB_REVERSE_PASSWORD,
@@ -1947,46 +1947,23 @@ static int iscsi_fetch_settings ( struct iscsi_session *iscsi ) {
/* Fetch relevant settings. Don't worry about freeing on
* error, since iscsi_free() will take care of that anyway.
*/
- if ( ( len = fetch_string_setting_copy ( NULL, &username_setting,
- &iscsi->initiator_username ) ) < 0 ) {
- DBGC ( iscsi, "iSCSI %p could not fetch username: %s\n",
- iscsi, strerror ( len ) );
- return len;
- }
- if ( ( len = fetch_string_setting_copy ( NULL, &password_setting,
- &iscsi->initiator_password ) ) < 0 ) {
- DBGC ( iscsi, "iSCSI %p could not fetch password: %s\n",
- iscsi, strerror ( len ) );
- return len;
- }
- if ( ( len = fetch_string_setting_copy( NULL, &reverse_username_setting,
- &iscsi->target_username ) ) < 0 ) {
- DBGC ( iscsi, "iSCSI %p could not fetch reverse username: %s\n",
- iscsi, strerror ( len ) );
- return len;
- }
- if ( ( len = fetch_string_setting_copy( NULL, &reverse_password_setting,
- &iscsi->target_password ) ) < 0 ) {
- DBGC ( iscsi, "iSCSI %p could not fetch reverse password: %s\n",
- iscsi, strerror ( len ) );
- return len;
- }
-
- /* Find a suitable initiator name */
- if ( ( len = fetch_string_setting_copy ( NULL, &initiator_iqn_setting,
- &iscsi->initiator_iqn ) ) < 0 ) {
- DBGC ( iscsi, "iSCSI %p could not fetch initiator IQN: %s\n",
- iscsi, strerror ( len ) );
- return len;
- }
+ fetch_string_setting_copy ( NULL, &username_setting,
+ &iscsi->initiator_username );
+ fetch_string_setting_copy ( NULL, &password_setting,
+ &iscsi->initiator_password );
+ fetch_string_setting_copy ( NULL, &reverse_username_setting,
+ &iscsi->target_username );
+ fetch_string_setting_copy ( NULL, &reverse_password_setting,
+ &iscsi->target_password );
+
+ /* Use explicit initiator IQN if provided */
+ fetch_string_setting_copy ( NULL, &initiator_iqn_setting,
+ &iscsi->initiator_iqn );
if ( iscsi->initiator_iqn )
return 0;
- if ( ( len = fetch_string_setting_copy ( NULL, &hostname_setting,
- &hostname ) ) < 0 ) {
- DBGC ( iscsi, "iSCSI %p could not fetch hostname: %s\n",
- iscsi, strerror ( len ) );
- return len;
- }
+
+ /* Otherwise, try to construct an initiator IQN from the hostname */
+ fetch_string_setting_copy ( NULL, &hostname_setting, &hostname );
if ( hostname ) {
len = asprintf ( &iscsi->initiator_iqn,
ISCSI_DEFAULT_IQN_PREFIX ":%s", hostname );
@@ -1999,6 +1976,8 @@ static int iscsi_fetch_settings ( struct iscsi_session *iscsi ) {
assert ( iscsi->initiator_iqn );
return 0;
}
+
+ /* Otherwise, try to construct an initiator IQN from the UUID */
if ( ( len = fetch_uuid_setting ( NULL, &uuid_setting, &uuid ) ) < 0 ) {
DBGC ( iscsi, "iSCSI %p has no suitable initiator IQN\n",
iscsi );
diff --git a/src/net/tcp/oncrpc.c b/src/net/tcp/oncrpc.c
index 819d3179..0a3b3858 100644
--- a/src/net/tcp/oncrpc.c
+++ b/src/net/tcp/oncrpc.c
@@ -58,14 +58,14 @@ struct oncrpc_cred oncrpc_auth_none = {
.length = 0
};
-struct setting uid_setting __setting ( SETTING_AUTH ) = {
+const struct setting uid_setting __setting ( SETTING_AUTH ) = {
.name = "uid",
.description = "User ID",
.tag = DHCP_EB_UID,
.type = &setting_type_uint32
};
-struct setting gid_setting __setting ( SETTING_AUTH ) = {
+const struct setting gid_setting __setting ( SETTING_AUTH ) = {
.name = "gid",
.description = "Group ID",
.tag = DHCP_EB_GID,
diff --git a/src/net/tcp/syslogs.c b/src/net/tcp/syslogs.c
index bcda8b45..503ed177 100644
--- a/src/net/tcp/syslogs.c
+++ b/src/net/tcp/syslogs.c
@@ -190,7 +190,7 @@ struct console_driver syslogs_console __console_driver = {
*/
/** Encrypted syslog server setting */
-struct setting syslogs_setting __setting ( SETTING_MISC ) = {
+const struct setting syslogs_setting __setting ( SETTING_MISC ) = {
.name = "syslogs",
.description = "Encrypted syslog server",
.tag = DHCP_EB_SYSLOGS_SERVER,
@@ -206,15 +206,10 @@ static int apply_syslogs_settings ( void ) {
static char *old_server;
char *server;
struct interface *socket;
- int len;
int rc;
/* Fetch log server */
- len = fetch_string_setting_copy ( NULL, &syslogs_setting, &server );
- if ( len < 0 ) {
- rc = len;
- goto err_fetch_server;
- }
+ fetch_string_setting_copy ( NULL, &syslogs_setting, &server );
/* Do nothing unless log server has changed */
if ( ( ( server == NULL ) && ( old_server == NULL ) ) ||
@@ -266,7 +261,6 @@ static int apply_syslogs_settings ( void ) {
out_no_server:
out_no_change:
free ( server );
- err_fetch_server:
return rc;
}
diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c
index 66bcc83a..3163f39c 100644
--- a/src/net/udp/dhcp.c
+++ b/src/net/udp/dhcp.c
@@ -92,7 +92,7 @@ static uint8_t dhcp_request_options_data[] = {
};
/** DHCP server address setting */
-struct setting dhcp_server_setting __setting ( SETTING_MISC ) = {
+const struct setting dhcp_server_setting __setting ( SETTING_MISC ) = {
.name = "dhcp-server",
.description = "DHCP server",
.tag = DHCP_SERVER_IDENTIFIER,
@@ -975,6 +975,7 @@ int dhcp_create_request ( struct dhcp_packet *dhcppkt,
uint8_t *dhcp_features;
size_t dhcp_features_len;
size_t ll_addr_len;
+ void *user_class;
ssize_t len;
int rc;
@@ -985,7 +986,7 @@ int dhcp_create_request ( struct dhcp_packet *dhcppkt,
data, max_len ) ) != 0 ) {
DBG ( "DHCP could not create DHCP packet: %s\n",
strerror ( rc ) );
- return rc;
+ goto err_create_packet;
}
/* Set client IP address */
@@ -998,17 +999,17 @@ int dhcp_create_request ( struct dhcp_packet *dhcppkt,
dhcp_features_len ) ) != 0 ) {
DBG ( "DHCP could not set features list option: %s\n",
strerror ( rc ) );
- return rc;
+ goto err_store_features;
}
/* Add options to identify the network device */
- fetch_setting ( &netdev->settings.settings, &busid_setting, &dhcp_desc,
- sizeof ( dhcp_desc ) );
+ fetch_raw_setting ( netdev_settings ( netdev ), &busid_setting,
+ &dhcp_desc, sizeof ( dhcp_desc ) );
if ( ( rc = dhcppkt_store ( dhcppkt, DHCP_EB_BUS_ID, &dhcp_desc,
sizeof ( dhcp_desc ) ) ) != 0 ) {
DBG ( "DHCP could not set bus ID option: %s\n",
strerror ( rc ) );
- return rc;
+ goto err_store_busid;
}
/* Add DHCP client identifier. Required for Infiniband, and
@@ -1022,7 +1023,7 @@ int dhcp_create_request ( struct dhcp_packet *dhcppkt,
( ll_addr_len + 1 ) ) ) != 0 ) {
DBG ( "DHCP could not set client ID: %s\n",
strerror ( rc ) );
- return rc;
+ goto err_store_client_id;
}
/* Add client UUID, if we have one. Required for PXE. The
@@ -1039,25 +1040,29 @@ int dhcp_create_request ( struct dhcp_packet *dhcppkt,
sizeof ( client_uuid ) ) ) != 0 ) {
DBG ( "DHCP could not set client UUID: %s\n",
strerror ( rc ) );
- return rc;
+ goto err_store_client_uuid;
}
}
/* Add user class, if we have one. */
- if ( ( len = fetch_setting_len ( NULL, &user_class_setting ) ) >= 0 ) {
- char user_class[len];
- fetch_setting ( NULL, &user_class_setting, user_class,
- sizeof ( user_class ) );
+ if ( ( len = fetch_raw_setting_copy ( NULL, &user_class_setting,
+ &user_class ) ) >= 0 ) {
if ( ( rc = dhcppkt_store ( dhcppkt, DHCP_USER_CLASS_ID,
- &user_class,
- sizeof ( user_class ) ) ) != 0 ) {
+ user_class, len ) ) != 0 ) {
DBG ( "DHCP could not set user class: %s\n",
strerror ( rc ) );
- return rc;
+ goto err_store_user_class;
}
}
- return 0;
+ err_store_user_class:
+ free ( user_class );
+ err_store_client_uuid:
+ err_store_client_id:
+ err_store_busid:
+ err_store_features:
+ err_create_packet:
+ return rc;
}
/****************************************************************************
@@ -1384,7 +1389,8 @@ int start_pxebs ( struct interface *job, struct net_device *netdev,
int rc;
/* Get upper bound for PXE boot server IP address list */
- pxebs_list_len = fetch_setting_len ( NULL, &pxe_boot_servers_setting );
+ pxebs_list_len = fetch_raw_setting ( NULL, &pxe_boot_servers_setting,
+ NULL, 0 );
if ( pxebs_list_len < 0 )
pxebs_list_len = 0;
@@ -1422,8 +1428,8 @@ int start_pxebs ( struct interface *job, struct net_device *netdev,
if ( pxebs_list_len ) {
uint8_t buf[pxebs_list_len];
- fetch_setting ( NULL, &pxe_boot_servers_setting,
- buf, sizeof ( buf ) );
+ fetch_raw_setting ( NULL, &pxe_boot_servers_setting,
+ buf, sizeof ( buf ) );
pxebs_list ( dhcp, buf, sizeof ( buf ), ip );
}
if ( ! dhcp->pxe_attempt->s_addr ) {
diff --git a/src/net/udp/dhcpv6.c b/src/net/udp/dhcpv6.c
index 42d11194..7bed83d9 100644
--- a/src/net/udp/dhcpv6.c
+++ b/src/net/udp/dhcpv6.c
@@ -256,7 +256,7 @@ static int dhcpv6_iaaddr ( struct dhcpv6_option_list *options, uint32_t iaid,
*/
/** DHCPv6 settings scope */
-static struct settings_scope dhcpv6_settings_scope;
+static const struct settings_scope dhcpv6_settings_scope;
/** A DHCPv6 settings block */
struct dhcpv6_settings {
@@ -276,7 +276,7 @@ struct dhcpv6_settings {
* @ret applies Setting applies within this settings block
*/
static int dhcpv6_applies ( struct settings *settings __unused,
- struct setting *setting ) {
+ const struct setting *setting ) {
return ( setting->scope == &dhcpv6_settings_scope );
}
@@ -543,7 +543,7 @@ static size_t dhcpv6_user_class ( void *data, size_t len ) {
int actual_len;
/* Fetch user-class setting, if defined */
- actual_len = fetch_setting ( NULL, &user_class_setting, data, len );
+ actual_len = fetch_raw_setting ( NULL, &user_class_setting, data, len );
if ( actual_len >= 0 )
return actual_len;
diff --git a/src/net/udp/dns.c b/src/net/udp/dns.c
index 45f0f07c..447da8af 100644
--- a/src/net/udp/dns.c
+++ b/src/net/udp/dns.c
@@ -594,7 +594,7 @@ struct resolver dns_resolver __resolver ( RESOLV_NORMAL ) = {
*/
/** DNS server setting */
-struct setting dns_setting __setting ( SETTING_IPv4_EXTRA ) = {
+const struct setting dns_setting __setting ( SETTING_IPv4_EXTRA ) = {
.name = "dns",
.description = "DNS server",
.tag = DHCP_DNS_SERVERS,
@@ -622,11 +622,7 @@ static int apply_dns_settings ( void ) {
/* Get local domain DHCP option */
free ( localdomain );
- if ( ( len = fetch_string_setting_copy ( NULL, &domain_setting,
- &localdomain ) ) < 0 ) {
- DBG ( "DNS could not fetch local domain: %s\n",
- strerror ( len ) );
- }
+ fetch_string_setting_copy ( NULL, &domain_setting, &localdomain );
if ( localdomain )
DBG ( "DNS local domain %s\n", localdomain );
diff --git a/src/net/udp/syslog.c b/src/net/udp/syslog.c
index 4210083d..6554ab9b 100644
--- a/src/net/udp/syslog.c
+++ b/src/net/udp/syslog.c
@@ -188,7 +188,7 @@ struct console_driver syslog_console __console_driver = {
*/
/** Syslog server setting */
-struct setting syslog_setting __setting ( SETTING_MISC ) = {
+const struct setting syslog_setting __setting ( SETTING_MISC ) = {
.name = "syslog",
.description = "Syslog server",
.tag = DHCP_LOG_SERVERS,
@@ -209,17 +209,9 @@ static int apply_syslog_settings ( void ) {
/* Fetch hostname and domain name */
free ( syslog_hostname );
- if ( ( len = fetch_string_setting_copy ( NULL, &hostname_setting,
- &syslog_hostname ) ) < 0 ) {
- rc = len;
- DBG ( "SYSLOG could not fetch hostname: %s\n", strerror ( rc ));
- }
+ fetch_string_setting_copy ( NULL, &hostname_setting, &syslog_hostname );
free ( syslog_domain );
- if ( ( len = fetch_string_setting_copy ( NULL, &domain_setting,
- &syslog_domain ) ) < 0 ) {
- rc = len;
- DBG ( "SYSLOG could not fetch domain: %s\n", strerror ( rc ) );
- }
+ fetch_string_setting_copy ( NULL, &domain_setting, &syslog_domain );
/* Fetch log server */
syslog_console.disabled = CONSOLE_DISABLED;
diff --git a/src/net/validator.c b/src/net/validator.c
index d61cb92f..56eebe3d 100644
--- a/src/net/validator.c
+++ b/src/net/validator.c
@@ -121,7 +121,7 @@ static struct interface_descriptor validator_job_desc =
*/
/** Cross-signed certificate source setting */
-struct setting crosscert_setting __setting ( SETTING_CRYPTO ) = {
+const struct setting crosscert_setting __setting ( SETTING_CRYPTO ) = {
.name = "crosscert",
.description = "Cross-signed certificate source",
.tag = DHCP_EB_CROSS_CERT,
@@ -232,14 +232,7 @@ static int validator_start_download ( struct validator *validator,
int rc;
/* Determine cross-signed certificate source */
- len = fetch_string_setting_copy ( NULL, &crosscert_setting,
- &crosscert_copy );
- if ( len < 0 ) {
- rc = len;
- DBGC ( validator, "VALIDATOR %p could not fetch crosscert "
- "setting: %s\n", validator, strerror ( rc ) );
- goto err_fetch_crosscert;
- }
+ fetch_string_setting_copy ( NULL, &crosscert_setting, &crosscert_copy );
crosscert = ( crosscert_copy ? crosscert_copy : crosscert_default );
/* Allocate URI string */
@@ -279,7 +272,6 @@ static int validator_start_download ( struct validator *validator,
free ( uri_string );
err_alloc_uri_string:
free ( crosscert_copy );
- err_fetch_crosscert:
return rc;
}
diff --git a/src/tests/settings_test.c b/src/tests/settings_test.c
index 1be2cc32..5da31b4c 100644
--- a/src/tests/settings_test.c
+++ b/src/tests/settings_test.c
@@ -38,26 +38,26 @@ FILE_LICENCE ( GPL2_OR_LATER );
/**
* Report a formatted-store test result
*
- * @v settings Settings block
- * @v setting Setting
- * @v formatted Formatted value
- * @v raw_array Expected raw value
+ * @v _settings Settings block
+ * @v _setting Setting
+ * @v _formatted Formatted value
+ * @v _raw_array Expected raw value
*/
-#define storef_ok( settings, setting, formatted, raw_array ) do { \
- const uint8_t expected[] = raw_array; \
+#define storef_ok( _settings, _setting, _formatted, _raw_array ) do { \
+ const uint8_t expected[] = _raw_array; \
uint8_t actual[ sizeof ( expected ) ]; \
int len; \
\
- ok ( storef_setting ( settings, setting, formatted ) == 0 ); \
- len = fetch_setting ( settings, setting, actual, \
+ ok ( storef_setting ( _settings, _setting, _formatted ) == 0 ); \
+ len = fetch_setting ( _settings, _setting, NULL, NULL, actual, \
sizeof ( actual ) ); \
if ( len >= 0 ) { \
- DBGC ( settings, "Stored %s \"%s\", got:\n", \
- (setting)->type->name, formatted ); \
- DBGC_HDA ( settings, 0, actual, len ); \
+ DBGC ( _settings, "Stored %s \"%s\", got:\n", \
+ (_setting)->type->name, _formatted ); \
+ DBGC_HDA ( _settings, 0, actual, len ); \
} else { \
- DBGC ( settings, "Stored %s \"%s\", got error %s\n", \
- (setting)->type->name, formatted, \
+ DBGC ( _settings, "Stored %s \"%s\", got error %s\n", \
+ (_setting)->type->name, _formatted, \
strerror ( len ) ); \
} \
ok ( len == ( int ) sizeof ( actual ) ); \
@@ -67,52 +67,52 @@ FILE_LICENCE ( GPL2_OR_LATER );
/**
* Report a formatted-fetch test result
*
- * @v settings Settings block
- * @v setting Setting
- * @v raw_array Raw value
- * @v formatted Expected formatted value
+ * @v _settings Settings block
+ * @v _setting Setting
+ * @v _raw_array Raw value
+ * @v _formatted Expected formatted value
*/
-#define fetchf_ok( settings, setting, raw_array, formatted ) do { \
- const uint8_t raw[] = raw_array; \
- char actual[ strlen ( formatted ) + 1 ]; \
+#define fetchf_ok( _settings, _setting, _raw_array, _formatted ) do { \
+ const uint8_t raw[] = _raw_array; \
+ char actual[ strlen ( _formatted ) + 1 ]; \
int len; \
\
- ok ( store_setting ( settings, setting, raw, \
+ ok ( store_setting ( _settings, _setting, raw, \
sizeof ( raw ) ) == 0 ); \
- len = fetchf_setting ( settings, setting, actual, \
+ len = fetchf_setting ( _settings, _setting, NULL, NULL, actual, \
sizeof ( actual ) ); \
- DBGC ( settings, "Fetched %s \"%s\" from:\n", \
- (setting)->type->name, actual ); \
- DBGC_HDA ( settings, 0, raw, sizeof ( raw ) ); \
+ DBGC ( _settings, "Fetched %s \"%s\" from:\n", \
+ (_setting)->type->name, actual ); \
+ DBGC_HDA ( _settings, 0, raw, sizeof ( raw ) ); \
ok ( len == ( int ) ( sizeof ( actual ) - 1 ) ); \
- ok ( strcmp ( actual, formatted ) == 0 ); \
+ ok ( strcmp ( actual, _formatted ) == 0 ); \
} while ( 0 )
/**
* Report a numeric-store test result
*
- * @v settings Settings block
- * @v setting Setting
- * @v numeric Numeric value
- * @v raw_array Expected raw value
+ * @v _settings Settings block
+ * @v _setting Setting
+ * @v _numeric Numeric value
+ * @v _raw_array Expected raw value
*/
-#define storen_ok( settings, setting, numeric, raw_array ) do { \
- const uint8_t expected[] = raw_array; \
+#define storen_ok( _settings, _setting, _numeric, _raw_array ) do { \
+ const uint8_t expected[] = _raw_array; \
uint8_t actual[ sizeof ( expected ) ]; \
int len; \
\
- ok ( storen_setting ( settings, setting, numeric ) == 0 ); \
- len = fetch_setting ( settings, setting, actual, \
+ ok ( storen_setting ( _settings, _setting, _numeric ) == 0 ); \
+ len = fetch_setting ( _settings, _setting, NULL, NULL, actual, \
sizeof ( actual ) ); \
if ( len >= 0 ) { \
- DBGC ( settings, "Stored %s %#lx, got:\n", \
- (setting)->type->name, \
- ( unsigned long ) numeric ); \
- DBGC_HDA ( settings, 0, actual, len ); \
+ DBGC ( _settings, "Stored %s %#lx, got:\n", \
+ (_setting)->type->name, \
+ ( unsigned long ) _numeric ); \
+ DBGC_HDA ( _settings, 0, actual, len ); \
} else { \
- DBGC ( settings, "Stored %s %#lx, got error %s\n", \
- (setting)->type->name, \
- ( unsigned long ) numeric, strerror ( len ) ); \
+ DBGC ( _settings, "Stored %s %#lx, got error %s\n", \
+ (_setting)->type->name, \
+ ( unsigned long ) _numeric, strerror ( len ) ); \
} \
ok ( len == ( int ) sizeof ( actual ) ); \
ok ( memcmp ( actual, expected, sizeof ( actual ) ) == 0 ); \
@@ -121,22 +121,23 @@ FILE_LICENCE ( GPL2_OR_LATER );
/**
* Report a numeric-fetch test result
*
- * @v settings Settings block
- * @v setting Setting
- * @v raw_array Raw array
- * @v numeric Expected numeric value
+ * @v _settings Settings block
+ * @v _setting Setting
+ * @v _raw_array Raw array
+ * @v _numeric Expected numeric value
*/
-#define fetchn_ok( settings, setting, raw_array, numeric ) do { \
- const uint8_t raw[] = raw_array; \
+#define fetchn_ok( _settings, _setting, _raw_array, _numeric ) do { \
+ const uint8_t raw[] = _raw_array; \
unsigned long actual; \
\
- ok ( store_setting ( settings, setting, raw, \
+ ok ( store_setting ( _settings, _setting, raw, \
sizeof ( raw ) ) == 0 ); \
- ok ( fetchn_setting ( settings, setting, &actual ) == 0 ); \
- DBGC ( settings, "Fetched %s %#lx from:\n", \
- (setting)->type->name, actual ); \
- DBGC_HDA ( settings, 0, raw, sizeof ( raw ) ); \
- ok ( actual == ( unsigned long ) numeric ); \
+ ok ( fetchn_setting ( _settings, _setting, NULL, NULL, \
+ &actual ) == 0 ); \
+ DBGC ( _settings, "Fetched %s %#lx from:\n", \
+ (_setting)->type->name, actual ); \
+ DBGC_HDA ( _settings, 0, raw, sizeof ( raw ) ); \
+ ok ( actual == ( unsigned long ) _numeric ); \
} while ( 0 )
/** Test generic settings block */
diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c
index 6d6419d6..a29f8c17 100644
--- a/src/usr/autoboot.c
+++ b/src/usr/autoboot.c
@@ -59,7 +59,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#define CYAN "\033[36m"
/** The "scriptlet" setting */
-struct setting scriptlet_setting __setting ( SETTING_MISC ) = {
+const struct setting scriptlet_setting __setting ( SETTING_MISC ) = {
.name = "scriptlet",
.description = "Boot scriptlet",
.tag = DHCP_EB_SCRIPTLET,
@@ -119,7 +119,7 @@ static struct uri * parse_next_server_and_filename ( struct in_addr next_server,
}
/** The "keep-san" setting */
-struct setting keep_san_setting __setting ( SETTING_SANBOOT_EXTRA ) = {
+const struct setting keep_san_setting __setting ( SETTING_SANBOOT_EXTRA ) = {
.name = "keep-san",
.description = "Preserve SAN connection",
.tag = DHCP_EB_KEEP_SAN,
@@ -127,7 +127,7 @@ struct setting keep_san_setting __setting ( SETTING_SANBOOT_EXTRA ) = {
};
/** The "skip-san-boot" setting */
-struct setting skip_san_boot_setting __setting ( SETTING_SANBOOT_EXTRA ) = {
+const struct setting skip_san_boot_setting __setting ( SETTING_SANBOOT_EXTRA )={
.name = "skip-san-boot",
.description = "Do not boot from SAN device",
.tag = DHCP_EB_SKIP_SAN_BOOT,
@@ -256,16 +256,15 @@ struct uri * fetch_next_server_and_filename ( struct settings *settings ) {
struct uri *uri = NULL;
char *filename;
- /* Determine settings block containing the filename, if any */
- settings = fetch_setting_origin ( settings, &filename_setting );
-
- /* If we have a filename, fetch it along with next-server */
- if ( settings ) {
+ /* If we have a filename, fetch it along with the next-server
+ * setting from the same settings block.
+ */
+ if ( fetch_setting ( settings, &filename_setting, &settings,
+ NULL, NULL, 0 ) >= 0 ) {
+ fetch_string_setting_copy ( settings, &filename_setting,
+ &raw_filename );
fetch_ipv4_setting ( settings, &next_server_setting,
&next_server );
- if ( fetch_string_setting_copy ( settings, &filename_setting,
- &raw_filename ) < 0 )
- goto err_fetch;
}
/* Expand filename setting */
@@ -286,7 +285,6 @@ struct uri * fetch_next_server_and_filename ( struct settings *settings ) {
free ( filename );
err_expand:
free ( raw_filename );
- err_fetch:
return uri;
}
@@ -297,25 +295,30 @@ struct uri * fetch_next_server_and_filename ( struct settings *settings ) {
* @ret uri URI, or NULL on failure
*/
static struct uri * fetch_root_path ( struct settings *settings ) {
- char buf[256];
+ struct uri *uri = NULL;
+ char *raw_root_path;
char *root_path;
- struct uri *uri;
/* Fetch root-path setting */
- fetch_string_setting ( settings, &root_path_setting,
- buf, sizeof ( buf ) );
- if ( buf[0] )
- printf ( "Root path: %s\n", buf );
+ fetch_string_setting_copy ( settings, &root_path_setting,
+ &raw_root_path );
/* Expand filename setting */
- root_path = expand_settings ( buf );
+ root_path = expand_settings ( raw_root_path ? raw_root_path : "" );
if ( ! root_path )
- return NULL;
+ goto err_expand;
/* Parse root path */
+ if ( root_path[0] )
+ printf ( "Root path: %s\n", root_path );
uri = parse_uri ( root_path );
+ if ( ! uri )
+ goto err_parse;
+ err_parse:
free ( root_path );
+ err_expand:
+ free ( raw_root_path );
return uri;
}
@@ -331,7 +334,7 @@ static int have_pxe_menu ( void ) {
= { .tag = DHCP_PXE_DISCOVERY_CONTROL };
struct setting pxe_boot_menu_setting
= { .tag = DHCP_PXE_BOOT_MENU };
- char buf[256];
+ char buf[ 10 /* "PXEClient" + NUL */ ];
unsigned int pxe_discovery_control;
fetch_string_setting ( NULL, &vendor_class_id_setting,
diff --git a/src/usr/nslookup.c b/src/usr/nslookup.c
index b691962e..66818d11 100644
--- a/src/usr/nslookup.c
+++ b/src/usr/nslookup.c
@@ -71,7 +71,7 @@ static void nslookup_close ( struct nslookup *nslookup, int rc ) {
static void nslookup_resolv_done ( struct nslookup *nslookup,
struct sockaddr *sa ) {
struct sockaddr_in *sin;
- struct setting_type *default_type;
+ const struct setting_type *default_type;
struct settings *settings;
struct setting setting;
void *data;
diff --git a/src/usr/pxemenu.c b/src/usr/pxemenu.c
index d50ee6ba..c5cffd3d 100644
--- a/src/usr/pxemenu.c
+++ b/src/usr/pxemenu.c
@@ -101,9 +101,9 @@ static int pxe_menu_parse ( struct pxe_menu **menu ) {
/* Fetch raw menu */
memset ( raw_menu, 0, sizeof ( raw_menu ) );
- if ( ( raw_menu_len = fetch_setting ( NULL, &pxe_boot_menu_setting,
- raw_menu,
- sizeof ( raw_menu ) ) ) < 0 ) {
+ if ( ( raw_menu_len = fetch_raw_setting ( NULL, &pxe_boot_menu_setting,
+ raw_menu,
+ sizeof ( raw_menu ) ) ) < 0 ){
rc = raw_menu_len;
DBG ( "Could not retrieve raw PXE boot menu: %s\n",
strerror ( rc ) );
@@ -116,8 +116,9 @@ static int pxe_menu_parse ( struct pxe_menu **menu ) {
raw_menu_end = ( raw_menu + raw_menu_len );
/* Fetch raw prompt length */
- raw_prompt_len = fetch_setting_len ( NULL,
- &pxe_boot_menu_prompt_setting );
+ raw_prompt_len =
+ fetch_raw_setting ( NULL, &pxe_boot_menu_prompt_setting,
+ NULL, 0 );
if ( raw_prompt_len < 0 )
raw_prompt_len = 0;
@@ -168,8 +169,8 @@ static int pxe_menu_parse ( struct pxe_menu **menu ) {
if ( raw_prompt_len ) {
raw_menu_prompt = ( ( ( void * ) raw_menu_item ) +
1 /* NUL */ );
- fetch_setting ( NULL, &pxe_boot_menu_prompt_setting,
- raw_menu_prompt, raw_prompt_len );
+ fetch_raw_setting ( NULL, &pxe_boot_menu_prompt_setting,
+ raw_menu_prompt, raw_prompt_len );
(*menu)->timeout =
( ( raw_menu_prompt->timeout == 0xff ) ?
-1 : raw_menu_prompt->timeout );