[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 <ci@iversenit.dk>
pull/232/head
Christian Iversen 2021-01-27 22:18:25 +01:00
parent a08244ecc4
commit 6733296243
1 changed files with 29 additions and 11 deletions

View File

@ -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;