[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 <glenn@myri.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
parent
ba8dd80487
commit
5fbd0207b2
@ -1007,7 +1007,6 @@ parse_setting_name ( const char *name,
|
|||||||
char *setting_name;
|
char *setting_name;
|
||||||
char *type_name;
|
char *type_name;
|
||||||
struct setting *named_setting;
|
struct setting *named_setting;
|
||||||
unsigned int tag;
|
|
||||||
|
|
||||||
/* Set defaults */
|
/* Set defaults */
|
||||||
*settings = &settings_root;
|
*settings = &settings_root;
|
||||||
@ -1038,16 +1037,14 @@ parse_setting_name ( const char *name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Identify setting */
|
/* 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 */
|
/* Matches a defined named setting; use that setting */
|
||||||
memcpy ( setting, named_setting, sizeof ( *setting ) );
|
if ( setting_cmp ( named_setting, setting ) == 0 ) {
|
||||||
} else if ( ( tag = parse_setting_tag ( *settings,
|
memcpy ( setting, named_setting, sizeof ( *setting ) );
|
||||||
setting_name ) ) != 0 ) {
|
break;
|
||||||
/* Is a valid numeric tag; use the tag */
|
}
|
||||||
setting->tag = tag;
|
|
||||||
} else {
|
|
||||||
/* Use the arbitrary name */
|
|
||||||
setting->name = setting_name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Identify setting type, if specified */
|
/* 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 ];
|
char tmp_name[ strlen ( name ) + 1 ];
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
/* Parse setting name */
|
||||||
if ( ( rc = parse_setting_name ( name, autovivify_child_settings,
|
if ( ( rc = parse_setting_name ( name, autovivify_child_settings,
|
||||||
&settings, &setting, tmp_name )) != 0)
|
&settings, &setting, tmp_name )) != 0)
|
||||||
return rc;
|
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
|
* Fetch and format value of named setting
|
||||||
*
|
*
|
||||||
* @v name Name of setting
|
* @v name Name of setting
|
||||||
* @v buf Buffer to contain formatted value
|
* @v name_buf Buffer to contain canonicalised name
|
||||||
* @v len Length of buffer
|
* @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
|
* @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 settings *settings;
|
||||||
struct setting setting;
|
struct setting setting;
|
||||||
|
struct settings *origin;
|
||||||
|
const char *origin_name;
|
||||||
char tmp_name[ strlen ( name ) + 1 ];
|
char tmp_name[ strlen ( name ) + 1 ];
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
/* Parse setting name */
|
||||||
if ( ( rc = parse_setting_name ( name, find_child_settings,
|
if ( ( rc = parse_setting_name ( name, find_child_settings,
|
||||||
&settings, &setting, tmp_name )) != 0)
|
&settings, &setting, tmp_name )) != 0)
|
||||||
return rc;
|
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 );
|
tail = ( end + 1 );
|
||||||
|
|
||||||
/* Determine setting length */
|
/* 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 )
|
if ( setting_len < 0 )
|
||||||
setting_len = 0; /* Treat error as empty setting */
|
setting_len = 0; /* Treat error as empty setting */
|
||||||
|
|
||||||
@ -1606,7 +1630,7 @@ char * expand_settings ( const char *string ) {
|
|||||||
char setting_buf[ setting_len + 1 ];
|
char setting_buf[ setting_len + 1 ];
|
||||||
|
|
||||||
setting_buf[0] = '\0';
|
setting_buf[0] = '\0';
|
||||||
fetchf_named_setting ( name, setting_buf,
|
fetchf_named_setting ( name, NULL, 0, setting_buf,
|
||||||
sizeof ( setting_buf ) );
|
sizeof ( setting_buf ) );
|
||||||
|
|
||||||
/* Construct expanded string and discard old string */
|
/* Construct expanded string and discard old string */
|
||||||
|
@ -54,7 +54,8 @@ static struct command_descriptor show_cmd =
|
|||||||
static int show_exec ( int argc, char **argv ) {
|
static int show_exec ( int argc, char **argv ) {
|
||||||
struct show_options opts;
|
struct show_options opts;
|
||||||
const char *name;
|
const char *name;
|
||||||
char buf[256];
|
char name_buf[32];
|
||||||
|
char value_buf[256];
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* Parse options */
|
/* Parse options */
|
||||||
@ -65,15 +66,16 @@ static int show_exec ( int argc, char **argv ) {
|
|||||||
name = argv[optind];
|
name = argv[optind];
|
||||||
|
|
||||||
/* Fetch setting */
|
/* Fetch setting */
|
||||||
if ( ( rc = fetchf_named_setting ( name, buf,
|
if ( ( rc = fetchf_named_setting ( name, name_buf, sizeof ( name_buf ),
|
||||||
sizeof ( buf ) ) ) < 0 ) {
|
value_buf,
|
||||||
|
sizeof ( value_buf ) ) ) < 0 ) {
|
||||||
printf ( "Could not find \"%s\": %s\n",
|
printf ( "Could not find \"%s\": %s\n",
|
||||||
name, strerror ( rc ) );
|
name, strerror ( rc ) );
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print setting value */
|
/* Print setting value */
|
||||||
printf ( "%s = %s\n", name, buf );
|
printf ( "%s = %s\n", name_buf, value_buf );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -255,7 +255,9 @@ extern int storef_setting ( struct settings *settings,
|
|||||||
struct setting *setting,
|
struct setting *setting,
|
||||||
const char *value );
|
const char *value );
|
||||||
extern int storef_named_setting ( const char *name, 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 char * expand_settings ( const char *string );
|
||||||
|
|
||||||
extern struct setting_type setting_type_string __setting_type;
|
extern struct setting_type setting_type_string __setting_type;
|
||||||
|
Reference in New Issue
Block a user