Move {show,set,clear}_setting() to {show,set,clear}_named_setting().
authorMichael Brown <mcb30@etherboot.org>
Wed, 20 Dec 2006 04:20:13 +0000 (04:20 +0000)
committerMichael Brown <mcb30@etherboot.org>
Wed, 20 Dec 2006 04:20:13 +0000 (04:20 +0000)
Introduce new {show,set,clear}_setting() that take a struct setting *
rather than a const char *.

set_setting() handles calling clear_setting() when appropriate, so that
individual setting types don't have to check for empty strings.

src/core/settings.c
src/hci/commands/nvo_cmd.c
src/hci/tui/settings_ui.c
src/include/gpxe/settings.h

index 22b1daf..5e025dc 100644 (file)
@@ -116,7 +116,7 @@ find_or_build_config_setting ( const char *name,
 }
 
 /**
- * Show value of setting
+ * Show value of named setting
  *
  * @v context          Configuration context
  * @v name             Configuration setting name
@@ -124,27 +124,27 @@ find_or_build_config_setting ( const char *name,
  * @v len              Length of buffer
  * @ret rc             Return status code
  */
-int show_setting ( struct config_context *context, const char *name,
-                  char *buf, size_t len ) {
+int show_named_setting ( struct config_context *context, const char *name,
+                        char *buf, size_t len ) {
        struct config_setting *setting;
        struct config_setting tmp_setting;
 
        setting = find_or_build_config_setting ( name, &tmp_setting );
        if ( ! setting )
                return -ENOENT;
-       return setting->type->show ( context, setting, buf, len );
+       return show_setting ( context, setting, buf, len );
 }
 
 /**
- * Set value of setting
+ * Set value of named setting
  *
  * @v context          Configuration context
  * @v name             Configuration setting name
  * @v value            Setting value (as a string)
  * @ret rc             Return status code
  */
-int set_setting ( struct config_context *context, const char *name,
-                 const char *value ) {
+int set_named_setting ( struct config_context *context, const char *name,
+                       const char *value ) {
        struct config_setting *setting;
        struct config_setting tmp_setting;
 
@@ -155,24 +155,21 @@ int set_setting ( struct config_context *context, const char *name,
 }
 
 /**
- * Clear setting
+ * Set value of setting
  *
  * @v context          Configuration context
- * @v name             Configuration setting name
+ * @v setting          Configuration setting
+ * @v value            Setting value (as a string), or NULL
  * @ret rc             Return status code
  */
-int clear_setting ( struct config_context *context, const char *name ) {
-       struct config_setting *setting;
-       struct config_setting tmp_setting;
-
-       setting = find_or_build_config_setting ( name, &tmp_setting );
-       if ( ! setting )
-               return -ENOENT;
-
-       /* All types of settings get cleared the same way */
-       delete_dhcp_option ( context->options, setting->tag );
-
-       return 0;
+int set_setting ( struct config_context *context,
+                 struct config_setting *setting,
+                 const char *value ) {
+       if ( ( ! value ) || ( ! *value ) ) {
+               /* Save putting deletion logic in each individual handler */
+               return clear_setting ( context, setting );
+       }
+       return setting->type->set ( context, setting, value );
 }
 
 /**
@@ -259,7 +256,6 @@ static int set_ipv4 ( struct config_context *context,
                      const char *value ) {
        struct dhcp_option *option;
        struct in_addr ipv4;
-       int rc;
        
        if ( inet_aton ( value, &ipv4 ) == 0 )
                return -EINVAL;
index 357d636..bbc9a74 100644 (file)
@@ -27,8 +27,8 @@ static int show_exec ( int argc, char **argv ) {
        }
 
        dummy_context.options = ugly_nvo_hack->options;
-       if ( ( rc = show_setting ( &dummy_context, argv[1], buf,
-                                  sizeof ( buf ) ) ) != 0 ) {
+       if ( ( rc = show_named_setting ( &dummy_context, argv[1], buf,
+                                        sizeof ( buf ) ) ) != 0 ) {
                printf ( "Could not find \"%s\": %s\n",
                         argv[1], strerror ( -rc ) );
                return 1;
@@ -59,7 +59,8 @@ static int set_exec ( int argc, char **argv ) {
        }
 
        dummy_context.options = ugly_nvo_hack->options;
-       if ( ( rc = set_setting ( &dummy_context, argv[1], argv[2] ) ) != 0 ) {
+       if ( ( rc = set_named_setting ( &dummy_context, argv[1],
+                                       argv[2] ) ) != 0 ) {
                printf ( "Could not set \"%s\"=\"%s\": %s\n",
                         argv[1], argv[2], strerror ( -rc ) );
                return 1;
@@ -94,7 +95,7 @@ static int clear_exec ( int argc, char **argv ) {
        }
 
        dummy_context.options = ugly_nvo_hack->options;
-       if ( ( rc = clear_setting ( &dummy_context, argv[1] ) ) != 0 ) {
+       if ( ( rc = clear_named_setting ( &dummy_context, argv[1] ) ) != 0 ) {
                printf ( "Could not clear \"%s\": %s\n",
                         argv[1], strerror ( -rc ) );
                return 1;
index f04140a..7da9591 100644 (file)
@@ -91,9 +91,8 @@ static void load_setting ( struct setting_widget *widget ) {
        widget->editing = 0;
 
        /* Read current setting value */
-       if ( widget->setting->type->show ( widget->context, widget->setting,
-                                          widget->value,
-                                          sizeof ( widget->value ) ) != 0 ) {
+       if ( show_setting ( widget->context, widget->setting,
+                           widget->value, sizeof ( widget->value ) ) != 0 ) {
                widget->value[0] = '\0';
        }       
 
@@ -110,8 +109,7 @@ static void load_setting ( struct setting_widget *widget ) {
  * @v widget           Setting widget
  */
 static int save_setting ( struct setting_widget *widget ) {
-       return widget->setting->type->set ( widget->context, widget->setting,
-                                           widget->value );
+       return set_setting ( widget->context, widget->setting, widget->value );
 }
 
 /**
@@ -252,7 +250,7 @@ static void main_loop ( struct config_context *context ) {
                                if ( ( rc = save_setting ( &widget ) ) != 0 ) {
                                        alert ( " Could not set %s: %s ",
                                                widget.setting->name,
-                                               strerror ( -rc ) );
+                                               strerror ( rc ) );
                                }
                                /* Fall through */
                        case 0x03: /* Ctrl-C */
index ab0de5b..f84378a 100644 (file)
@@ -96,12 +96,54 @@ struct config_setting {
 /** Declare a configuration setting */
 #define        __config_setting __table ( config_settings, 01 )
 
-/* Function prototypes */
+/**
+ * Show value of setting
+ *
+ * @v context          Configuration context
+ * @v setting          Configuration setting
+ * @v buf              Buffer to contain value
+ * @v len              Length of buffer
+ * @ret rc             Return status code
+ */
+static inline int show_setting ( struct config_context *context,
+                                struct config_setting *setting,
+                                char *buf, size_t len ) {
+       return setting->type->show ( context, setting, buf, len );
+}
 
-extern int show_setting ( struct config_context *context, const char *name,
-                         char *buf, size_t len );
-extern int set_setting ( struct config_context *context, const char *name,
+extern int set_setting ( struct config_context *context,
+                        struct config_setting *setting,
                         const char *value );
-extern int clear_setting ( struct config_context *context, const char *name );
+
+/**
+ * Clear setting
+ *
+ * @v context          Configuration context
+ * @v setting          Configuration setting
+ * @ret rc             Return status code
+ */
+static inline int clear_setting ( struct config_context *context,
+                                 struct config_setting *setting ) {
+       delete_dhcp_option ( context->options, setting->tag );
+       return 0;
+}
+
+/* Function prototypes */
+extern int show_named_setting ( struct config_context *context,
+                               const char *name, char *buf, size_t len );
+extern int set_named_setting ( struct config_context *context,
+                              const char *name, const char *value );
+
+/**
+ * Clear named setting
+ *
+ * @v context          Configuration context
+ * @v name             Configuration setting name
+ * @ret rc             Return status code
+ */
+static inline int clear_named_setting ( struct config_context *context,
+                                       const char *name ) {
+       return set_named_setting ( context, name, NULL );
+}
 
 #endif /* _GPXE_SETTINGS_H */