summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/settings.c35
-rw-r--r--src/include/gpxe/settings.h3
-rw-r--r--src/usr/aoeboot.c3
-rw-r--r--src/usr/autoboot.c7
-rw-r--r--src/usr/iscsiboot.c3
5 files changed, 41 insertions, 10 deletions
diff --git a/src/core/settings.c b/src/core/settings.c
index 458ba1117..3f961bcda 100644
--- a/src/core/settings.c
+++ b/src/core/settings.c
@@ -156,16 +156,14 @@ static void reprioritise_settings ( struct settings *settings ) {
return;
/* Read priority, if present */
- priority = 0;
- fetch_int_setting ( settings, DHCP_EB_PRIORITY, &priority );
+ priority = fetch_intz_setting ( settings, DHCP_EB_PRIORITY );
/* Remove from siblings list */
list_del ( &settings->siblings );
/* Reinsert after any existing blocks which have a higher priority */
list_for_each_entry ( tmp, &parent->children, siblings ) {
- tmp_priority = 0;
- fetch_int_setting ( tmp, DHCP_EB_PRIORITY, &tmp_priority );
+ tmp_priority = fetch_intz_setting ( tmp, DHCP_EB_PRIORITY );
if ( priority > tmp_priority )
break;
}
@@ -441,6 +439,35 @@ int fetch_uint_setting ( struct settings *settings, unsigned int tag,
return len;
}
+/**
+ * Fetch value of signed integer setting, or zero
+ *
+ * @v settings Settings block, or NULL to search all blocks
+ * @v tag Setting tag number
+ * @ret value Setting value, or zero
+ */
+long fetch_intz_setting ( struct settings *settings, unsigned int tag ) {
+ long value = 0;
+
+ fetch_int_setting ( settings, tag, &value );
+ return value;
+}
+
+/**
+ * Fetch value of unsigned integer setting, or zero
+ *
+ * @v settings Settings block, or NULL to search all blocks
+ * @v tag Setting tag number
+ * @ret value Setting value, or zero
+ */
+unsigned long fetch_uintz_setting ( struct settings *settings,
+ unsigned int tag ) {
+ unsigned long value = 0;
+
+ fetch_uint_setting ( settings, tag, &value );
+ return value;
+}
+
/******************************************************************************
*
* Named and typed setting routines
diff --git a/src/include/gpxe/settings.h b/src/include/gpxe/settings.h
index 94ca9e0f5..b79ce5080 100644
--- a/src/include/gpxe/settings.h
+++ b/src/include/gpxe/settings.h
@@ -160,6 +160,9 @@ extern int fetch_int_setting ( struct settings *settings, unsigned int tag,
long *value );
extern int fetch_uint_setting ( struct settings *settings, unsigned int tag,
unsigned long *value );
+extern long fetch_intz_setting ( struct settings *settings, unsigned int tag );
+extern unsigned long fetch_uintz_setting ( struct settings *settings,
+ unsigned int tag );
extern struct settings * find_settings ( const char *name );
extern int store_typed_setting ( struct settings *settings,
unsigned int tag, struct setting_type *type,
diff --git a/src/usr/aoeboot.c b/src/usr/aoeboot.c
index 82b63e7e1..6bf56a87b 100644
--- a/src/usr/aoeboot.c
+++ b/src/usr/aoeboot.c
@@ -6,6 +6,7 @@
#include <gpxe/ata.h>
#include <gpxe/netdevice.h>
#include <gpxe/dhcp.h>
+#include <gpxe/settings.h>
#include <gpxe/abft.h>
#include <int13.h>
#include <usr/aoeboot.h>
@@ -55,7 +56,7 @@ int aoeboot ( const char *root_path ) {
container_of ( ata.backend, struct aoe_session, refcnt );
abft_fill_data ( aoe );
- drive.drive = find_global_dhcp_num_option ( DHCP_EB_BIOS_DRIVE );
+ drive.drive = fetch_uintz_setting ( NULL, DHCP_EB_BIOS_DRIVE );
drive.blockdev = &ata.blockdev;
register_int13_drive ( &drive );
diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c
index b84bd7b17..bc86d05e8 100644
--- a/src/usr/autoboot.c
+++ b/src/usr/autoboot.c
@@ -21,6 +21,7 @@
#include <errno.h>
#include <gpxe/netdevice.h>
#include <gpxe/dhcp.h>
+#include <gpxe/settings.h>
#include <gpxe/image.h>
#include <gpxe/embedded.h>
#include <usr/ifmgmt.h>
@@ -146,16 +147,14 @@ static int netboot ( struct net_device *netdev ) {
return rc;
/* Try to download and boot whatever we are given as a filename */
- dhcp_snprintf ( buf, sizeof ( buf ),
- find_global_dhcp_option ( DHCP_BOOTFILE_NAME ) );
+ fetch_string_setting ( NULL, DHCP_BOOTFILE_NAME, buf, sizeof ( buf ) );
if ( buf[0] ) {
printf ( "Booting from filename \"%s\"\n", buf );
return boot_filename ( buf );
}
/* No filename; try the root path */
- dhcp_snprintf ( buf, sizeof ( buf ),
- find_global_dhcp_option ( DHCP_ROOT_PATH ) );
+ fetch_string_setting ( NULL, DHCP_ROOT_PATH, buf, sizeof ( buf ) );
if ( buf[0] ) {
printf ( "Booting from root path \"%s\"\n", buf );
return boot_root_path ( buf );
diff --git a/src/usr/iscsiboot.c b/src/usr/iscsiboot.c
index a7caebaf6..c3a477c4a 100644
--- a/src/usr/iscsiboot.c
+++ b/src/usr/iscsiboot.c
@@ -3,6 +3,7 @@
#include <stdio.h>
#include <gpxe/iscsi.h>
#include <gpxe/dhcp.h>
+#include <gpxe/settings.h>
#include <gpxe/netdevice.h>
#include <gpxe/ibft.h>
#include <int13.h>
@@ -45,7 +46,7 @@ int iscsiboot ( const char *root_path ) {
goto error_init;
}
- drive.drive = find_global_dhcp_num_option ( DHCP_EB_BIOS_DRIVE );
+ drive.drive = fetch_uintz_setting ( NULL, DHCP_EB_BIOS_DRIVE );
drive.blockdev = &scsi.blockdev;
/* FIXME: ugly, ugly hack */