From eae6ac3d0bdb5f25193af9584db4eec9dd5226c9 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 20 Mar 2008 23:42:11 +0000 Subject: [PATCH] [Settings] Convert code in src/usr to use settings API. --- src/core/settings.c | 35 +++++++++++++++++++++++++++++++---- src/include/gpxe/settings.h | 3 +++ src/usr/aoeboot.c | 3 ++- src/usr/autoboot.c | 7 +++---- src/usr/iscsiboot.c | 3 ++- 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/core/settings.c b/src/core/settings.c index 458ba111..3f961bcd 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 94ca9e0f..b79ce508 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 82b63e7e..6bf56a87 100644 --- a/src/usr/aoeboot.c +++ b/src/usr/aoeboot.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -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 b84bd7b1..bc86d05e 100644 --- a/src/usr/autoboot.c +++ b/src/usr/autoboot.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -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 a7caebaf..c3a477c4 100644 --- a/src/usr/iscsiboot.c +++ b/src/usr/iscsiboot.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -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 */