From 5fbd0207b269ca555dd904e297128ae3e9c0e984 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 22 Mar 2011 19:12:10 +0000 Subject: [PATCH] [settings] Display canonical setting name in output of "show" command Enable the "show" command to display the full, canonicalised name of the fetched setting. For example: iPXE> show mac net0/mac:hex = 52:54:00:12:34:56 iPXE> dhcp && show ip DHCP (net0 52:54:00:12:34:56)... ok net0.dhcp/ip:ipv4 = 10.0.0.168 iPXE> show net0/6 net0.dhcp/dns:ipv4 = 10.0.0.6 Inspired-by: Glenn Brown Signed-off-by: Michael Brown --- src/core/settings.c | 58 ++++++++++++++++++++++++++----------- src/hci/commands/nvo_cmd.c | 10 ++++--- src/include/ipxe/settings.h | 4 ++- 3 files changed, 50 insertions(+), 22 deletions(-) diff --git a/src/core/settings.c b/src/core/settings.c index 06d22ed3..536a68d4 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -1007,7 +1007,6 @@ parse_setting_name ( const char *name, char *setting_name; char *type_name; struct setting *named_setting; - unsigned int tag; /* Set defaults */ *settings = &settings_root; @@ -1038,16 +1037,14 @@ parse_setting_name ( const char *name, } /* Identify setting */ - if ( ( named_setting = find_setting ( setting_name ) ) != NULL ) { + setting->tag = parse_setting_tag ( *settings, setting_name ); + setting->name = setting_name; + for_each_table_entry ( named_setting, SETTINGS ) { /* Matches a defined named setting; use that setting */ - memcpy ( setting, named_setting, sizeof ( *setting ) ); - } else if ( ( tag = parse_setting_tag ( *settings, - setting_name ) ) != 0 ) { - /* Is a valid numeric tag; use the tag */ - setting->tag = tag; - } else { - /* Use the arbitrary name */ - setting->name = setting_name; + if ( setting_cmp ( named_setting, setting ) == 0 ) { + memcpy ( setting, named_setting, sizeof ( *setting ) ); + break; + } } /* Identify setting type, if specified */ @@ -1076,30 +1073,57 @@ int storef_named_setting ( const char *name, const char *value ) { char tmp_name[ strlen ( name ) + 1 ]; int rc; + /* Parse setting name */ if ( ( rc = parse_setting_name ( name, autovivify_child_settings, &settings, &setting, tmp_name )) != 0) return rc; - return storef_setting ( settings, &setting, value ); + + /* Store setting */ + if ( ( rc = storef_setting ( settings, &setting, value ) ) != 0 ) + return rc; + + return 0; } /** * Fetch and format value of named setting * * @v name Name of setting - * @v buf Buffer to contain formatted value - * @v len Length of buffer + * @v name_buf Buffer to contain canonicalised name + * @v name_len Length of canonicalised name buffer + * @v value_buf Buffer to contain formatted value + * @v value_len Length of formatted value buffer * @ret len Length of formatted value, or negative error */ -int fetchf_named_setting ( const char *name, char *buf, size_t len ) { +int fetchf_named_setting ( const char *name, + char *name_buf, size_t name_len, + char *value_buf, size_t value_len ) { struct settings *settings; struct setting setting; + struct settings *origin; + const char *origin_name; char tmp_name[ strlen ( name ) + 1 ]; int rc; + /* Parse setting name */ if ( ( rc = parse_setting_name ( name, find_child_settings, &settings, &setting, tmp_name )) != 0) return rc; - return fetchf_setting ( settings, &setting, buf, len ); + + /* Fetch setting */ + if ( ( rc = fetchf_setting ( settings, &setting, value_buf, + value_len ) ) < 0 ) + return rc; + + /* Construct setting name */ + origin = fetch_setting_origin ( settings, &setting ); + assert ( origin != NULL ); + origin_name = settings_name ( origin ); + snprintf ( name_buf, name_len, "%s%s%s:%s", + origin_name, ( origin_name[0] ? "/" : "" ), + setting.name, setting.type->name ); + + return 0; } /****************************************************************************** @@ -1597,7 +1621,7 @@ char * expand_settings ( const char *string ) { tail = ( end + 1 ); /* Determine setting length */ - setting_len = fetchf_named_setting ( name, NULL, 0 ); + setting_len = fetchf_named_setting ( name, NULL, 0, NULL, 0 ); if ( setting_len < 0 ) setting_len = 0; /* Treat error as empty setting */ @@ -1606,7 +1630,7 @@ char * expand_settings ( const char *string ) { char setting_buf[ setting_len + 1 ]; setting_buf[0] = '\0'; - fetchf_named_setting ( name, setting_buf, + fetchf_named_setting ( name, NULL, 0, setting_buf, sizeof ( setting_buf ) ); /* Construct expanded string and discard old string */ diff --git a/src/hci/commands/nvo_cmd.c b/src/hci/commands/nvo_cmd.c index 35c9d473..88d41270 100644 --- a/src/hci/commands/nvo_cmd.c +++ b/src/hci/commands/nvo_cmd.c @@ -54,7 +54,8 @@ static struct command_descriptor show_cmd = static int show_exec ( int argc, char **argv ) { struct show_options opts; const char *name; - char buf[256]; + char name_buf[32]; + char value_buf[256]; int rc; /* Parse options */ @@ -65,15 +66,16 @@ static int show_exec ( int argc, char **argv ) { name = argv[optind]; /* Fetch setting */ - if ( ( rc = fetchf_named_setting ( name, buf, - sizeof ( buf ) ) ) < 0 ) { + if ( ( rc = fetchf_named_setting ( name, name_buf, sizeof ( name_buf ), + value_buf, + sizeof ( value_buf ) ) ) < 0 ) { printf ( "Could not find \"%s\": %s\n", name, strerror ( rc ) ); return rc; } /* Print setting value */ - printf ( "%s = %s\n", name, buf ); + printf ( "%s = %s\n", name_buf, value_buf ); return 0; } diff --git a/src/include/ipxe/settings.h b/src/include/ipxe/settings.h index e132333a..d251b46e 100644 --- a/src/include/ipxe/settings.h +++ b/src/include/ipxe/settings.h @@ -255,7 +255,9 @@ extern int storef_setting ( struct settings *settings, struct setting *setting, const char *value ); extern int storef_named_setting ( const char *name, const char *value ); -extern int fetchf_named_setting ( const char *name, char *buf, size_t len ); +extern int fetchf_named_setting ( const char *name, char *name_buf, + size_t name_len, char *value_buf, + size_t value_len ); extern char * expand_settings ( const char *string ); extern struct setting_type setting_type_string __setting_type;