summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown2006-12-20 05:20:13 +0100
committerMichael Brown2006-12-20 05:20:13 +0100
commit35edecac34e129ea075e00d021fc6e786fa20777 (patch)
treeeec108ce34d9786c0cabf35f510d98ac7cb5f1dd /src
parentAdded messages for some of the most common errors (diff)
downloadipxe-35edecac34e129ea075e00d021fc6e786fa20777.tar.gz
ipxe-35edecac34e129ea075e00d021fc6e786fa20777.tar.xz
ipxe-35edecac34e129ea075e00d021fc6e786fa20777.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/core/settings.c40
-rw-r--r--src/hci/commands/nvo_cmd.c9
-rw-r--r--src/hci/tui/settings_ui.c10
-rw-r--r--src/include/gpxe/settings.h52
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 */