]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[settings] Display canonical setting name in output of "show" command
authorMichael Brown <mcb30@ipxe.org>
Tue, 22 Mar 2011 19:12:10 +0000 (19:12 +0000)
committerMichael Brown <mcb30@ipxe.org>
Tue, 22 Mar 2011 20:13:50 +0000 (20:13 +0000)
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>
src/core/settings.c
src/hci/commands/nvo_cmd.c
src/include/ipxe/settings.h

index 06d22ed3552606a2116d48a641100f5f7130a0b3..536a68d46589359485247a016608729ce7b00248 100644 (file)
@@ -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 */
index 35c9d473346be20c4890e320fb52a5f706c0db03..88d412700c51e508177e26b98347d29415a0c5a0 100644 (file)
@@ -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", namebuf );
+       printf ( "%s = %s\n", name_buf, value_buf );
 
        return 0;
 }
index e132333a7499744a515e84b9e107d03970bceb05..d251b46e331eff9a76f64cbabdb68eea5c8c3176 100644 (file)
@@ -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;