diff options
-rw-r--r-- | src/core/settings.c | 34 | ||||
-rw-r--r-- | src/hci/tui/settings_ui.c | 12 | ||||
-rw-r--r-- | src/interface/efi/efi_snp_hii.c | 4 |
3 files changed, 44 insertions, 6 deletions
diff --git a/src/core/settings.c b/src/core/settings.c index 8ce2af2b..1f99bca8 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -565,6 +565,31 @@ int setting_applies ( struct settings *settings, } /** + * Find setting applicable to settings block, if any + * + * @v settings Settings block + * @v setting Setting + * @ret setting Applicable setting, if any + */ +static const struct setting * +applicable_setting ( struct settings *settings, const struct setting *setting ){ + const struct setting *applicable; + + /* If setting is already applicable, use it */ + if ( setting_applies ( settings, setting ) ) + return setting; + + /* Otherwise, look for a matching predefined setting which does apply */ + for_each_table_entry ( applicable, SETTINGS ) { + if ( ( setting_cmp ( setting, applicable ) == 0 ) && + ( setting_applies ( settings, applicable ) ) ) + return applicable; + } + + return NULL; +} + +/** * Store value of setting * * @v settings Settings block, or NULL @@ -580,7 +605,7 @@ int store_setting ( struct settings *settings, const struct setting *setting, /* Find target settings block */ settings = settings_target ( settings ); - /* Fail if tag does not apply to this settings block */ + /* Fail if setting does not apply to this settings block */ if ( ! setting_applies ( settings, setting ) ) return -ENOTTY; @@ -628,6 +653,7 @@ int store_setting ( struct settings *settings, const struct setting *setting, int fetch_setting ( struct settings *settings, const struct setting *setting, struct settings **origin, struct setting *fetched, void *data, size_t len ) { + const struct setting *applicable; struct settings *child; struct setting tmp; int ret; @@ -646,11 +672,11 @@ int fetch_setting ( struct settings *settings, const struct setting *setting, if ( ! settings->op->fetch ) return -ENOTSUP; - /* Try this block first, if applicable */ - if ( setting_applies ( settings, setting ) ) { + /* Try this block first, if an applicable setting exists */ + if ( ( applicable = applicable_setting ( settings, setting ) ) ) { /* Create modifiable copy of setting */ - memcpy ( &tmp, setting, sizeof ( tmp ) ); + memcpy ( &tmp, applicable, sizeof ( tmp ) ); if ( ( ret = settings->op->fetch ( settings, &tmp, data, len ) ) >= 0 ) { diff --git a/src/hci/tui/settings_ui.c b/src/hci/tui/settings_ui.c index 8fe13ad8..87afc9ba 100644 --- a/src/hci/tui/settings_ui.c +++ b/src/hci/tui/settings_ui.c @@ -119,6 +119,7 @@ static unsigned int select_setting_row ( struct setting_widget *widget, unsigned int index ) { struct settings *settings; struct setting *setting; + struct setting *previous = NULL; unsigned int count = 0; /* Initialise structure */ @@ -146,11 +147,18 @@ static unsigned int select_setting_row ( struct setting_widget *widget, /* Include any applicable settings */ for_each_table_entry ( setting, SETTINGS ) { + + /* Skip inapplicable settings */ if ( ! setting_applies ( widget->settings, setting ) ) continue; - if ( count++ == index ) { - /* Read current setting value and origin */ + /* Skip duplicate settings */ + if ( previous && ( setting_cmp ( setting, previous ) == 0 ) ) + continue; + previous = setting; + + /* Read current setting value and origin */ + if ( count++ == index ) { fetchf_setting ( widget->settings, setting, &widget->row.origin, &widget->row.setting, diff --git a/src/interface/efi/efi_snp_hii.c b/src/interface/efi/efi_snp_hii.c index 61954b63..c272527c 100644 --- a/src/interface/efi/efi_snp_hii.c +++ b/src/interface/efi/efi_snp_hii.c @@ -126,6 +126,7 @@ static void efi_snp_hii_questions ( struct efi_snp_device *snpdev, struct efi_ifr_builder *ifr, unsigned int varstore_id ) { struct setting *setting; + struct setting *previous = NULL; unsigned int name_id; unsigned int prompt_id; unsigned int help_id; @@ -135,6 +136,9 @@ static void efi_snp_hii_questions ( struct efi_snp_device *snpdev, for_each_table_entry ( setting, SETTINGS ) { if ( ! efi_snp_hii_setting_applies ( snpdev, setting ) ) continue; + if ( previous && ( setting_cmp ( setting, previous ) == 0 ) ) + continue; + previous = setting; name_id = efi_ifr_string ( ifr, "%s", setting->name ); prompt_id = efi_ifr_string ( ifr, "%s", setting->description ); help_id = efi_ifr_string ( ifr, "http://ipxe.org/cfg/%s", |