From 35edecac34e129ea075e00d021fc6e786fa20777 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 20 Dec 2006 04:20:13 +0000 Subject: [PATCH] Move {show,set,clear}_setting() to {show,set,clear}_named_setting(). 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 | 40 +++++++++++++--------------- src/hci/commands/nvo_cmd.c | 9 ++++--- src/hci/tui/settings_ui.c | 10 +++---- src/include/gpxe/settings.h | 52 +++++++++++++++++++++++++++++++++---- 4 files changed, 74 insertions(+), 37 deletions(-) diff --git a/src/core/settings.c b/src/core/settings.c index 22b1dafc..5e025dc5 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -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; diff --git a/src/hci/commands/nvo_cmd.c b/src/hci/commands/nvo_cmd.c index 357d636a..bbc9a749 100644 --- a/src/hci/commands/nvo_cmd.c +++ b/src/hci/commands/nvo_cmd.c @@ -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; diff --git a/src/hci/tui/settings_ui.c b/src/hci/tui/settings_ui.c index f04140a1..7da95910 100644 --- a/src/hci/tui/settings_ui.c +++ b/src/hci/tui/settings_ui.c @@ -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 */ diff --git a/src/include/gpxe/settings.h b/src/include/gpxe/settings.h index ab0de5b4..f84378af 100644 --- a/src/include/gpxe/settings.h +++ b/src/include/gpxe/settings.h @@ -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 */