summaryrefslogtreecommitdiffstats
path: root/src/core/settings.c
diff options
context:
space:
mode:
authorMichael Brown2006-08-11 20:16:57 +0200
committerMichael Brown2006-08-11 20:16:57 +0200
commit7029fb8eff9cf4522ac574f26374c8c3082248e1 (patch)
tree998982ceddb0523f6ed9d4ce03e4e83f6291e7ad /src/core/settings.c
parentFail gracefully when set_dhcp_option() is called with options==NULL. (diff)
downloadipxe-7029fb8eff9cf4522ac574f26374c8c3082248e1.tar.gz
ipxe-7029fb8eff9cf4522ac574f26374c8c3082248e1.tar.xz
ipxe-7029fb8eff9cf4522ac574f26374c8c3082248e1.zip
Add string configuration type
Diffstat (limited to 'src/core/settings.c')
-rw-r--r--src/core/settings.c59
1 files changed, 54 insertions, 5 deletions
diff --git a/src/core/settings.c b/src/core/settings.c
index 4df491fb..0de697e0 100644
--- a/src/core/settings.c
+++ b/src/core/settings.c
@@ -116,17 +116,19 @@ find_or_build_config_setting ( const char *name,
*
* @v context Configuration context
* @v name Configuration setting name
- * @ret value Setting value (as a string), or NULL
+ * @v buf Buffer to contain value
+ * @v len Length of buffer
+ * @ret rc Return status code
*/
-const char * ( show_setting ) ( struct config_context *context,
- const char *name ) {
+int ( show_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 NULL;
- return setting->type->show ( context, setting );
+ return -ENOENT;
+ return setting->type->show ( context, setting, buf, len );
}
/** Set value of setting
@@ -146,3 +148,50 @@ int ( set_setting ) ( struct config_context *context, const char *name,
return -ENOENT;
return setting->type->set ( context, setting, value );
}
+
+/**
+ * Show value of string 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 int show_string ( struct config_context *context,
+ struct config_setting *setting,
+ char *buf, size_t len ) {
+ struct dhcp_option *option;
+
+ option = find_dhcp_option ( context->options, setting->tag );
+ if ( ! option )
+ return -ENOENT;
+ dhcp_snprintf ( buf, len, option );
+ return 0;
+}
+
+/** Set value of string setting
+ *
+ * @v context Configuration context
+ * @v setting Configuration setting
+ * @v value Setting value (as a string)
+ * @ret rc Return status code
+ */
+static int set_string ( struct config_context *context,
+ struct config_setting *setting,
+ const char *value ) {
+ struct dhcp_option *option;
+
+ option = set_dhcp_option ( context->options, setting->tag,
+ value, strlen ( value ) );
+ if ( ! option )
+ return -ENOMEM;
+ return 0;
+}
+
+/** A string configuration setting */
+struct config_setting_type config_setting_type_string __config_setting_type = {
+ .name = "string",
+ .show = show_string,
+ .set = set_string,
+};