From 6733296243b8b8b88e5cb1eb7d3225fe3048541e Mon Sep 17 00:00:00 2001 From: Christian Iversen Date: Wed, 27 Jan 2021 22:18:25 +0100 Subject: [PATCH] [cmdline] Allow "show" to display multiple settings at once For convenience, it is now possible to display a whole set of options at once, by specifying the scope name, including trailing slash. Before: iPXE> show net0/ip net0/ip:ipv4 = 1.2.3.4 iPXE> show net0/netmask net0/netmask:ipv4 = 255.255.255.0 After: iPXE> show net0/ net0/busid = 01:80:86:10:0e net0/busloc = 0x10 net0/bustype = PCI net0/chip = 82540em net0/hwaddr = 52:54:00:12:34:56 net0/ifname = net0 net0/mac = 52:54:00:12:34:56 net0/ip = 1.2.3.4 net0/netmask = 255.255.255.0 net0/ip6 = fe80::5054:ff:fe12:3456 net0/len6 = 64 Signed-off-by: Christian Iversen --- src/hci/commands/nvo_cmd.c | 40 +++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/hci/commands/nvo_cmd.c b/src/hci/commands/nvo_cmd.c index ac0d60651..8243be169 100644 --- a/src/hci/commands/nvo_cmd.c +++ b/src/hci/commands/nvo_cmd.c @@ -63,6 +63,7 @@ static int show_exec ( int argc, char **argv ) { struct named_setting setting; struct settings *origin; struct setting fetched; + struct setting *iter; char name_buf[32]; char *value; int len; @@ -76,18 +77,35 @@ static int show_exec ( int argc, char **argv ) { if ( ( rc = parse_existing_setting ( argv[optind], &setting ) ) != 0 ) goto err_parse_setting; - /* Fetch formatted setting value */ - 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; - } + if ( setting.settings && setting.setting.name[0] == 0 ) { + /* The user requested a scope name (e.g. "show net1/"). Iterate + * over all settings and show relevant ones, similar to how the + * config interface would present it. */ + for_each_table_entry ( iter, SETTINGS ) { + if ( ! setting_applies ( setting.settings, iter ) ) + continue; - /* Print setting value */ - setting_name ( origin, &fetched, name_buf, sizeof ( name_buf ) ); - printf ( "%s = %s\n", name_buf, value ); + if ( fetchf_setting_copy ( setting.settings, iter, + &origin, &fetched, &value ) < 0 ) + continue; + + setting_name ( origin, &fetched, name_buf, sizeof ( name_buf ) ); + printf ( "%s/%s = %s\n", setting.settings->name, iter->name, value ); + } + } else { + /* Fetch formatted setting value */ + 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; + } + + /* Print setting value */ + setting_name ( origin, &fetched, name_buf, sizeof ( name_buf ) ); + printf ( "%s = %s\n", name_buf, value ); + } /* Success */ rc = 0;