From 7029fb8eff9cf4522ac574f26374c8c3082248e1 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Fri, 11 Aug 2006 18:16:57 +0000 Subject: [PATCH] Add string configuration type --- src/core/settings.c | 59 +++++++++++++++++++++++++++++++++---- src/include/gpxe/settings.h | 13 ++++---- 2 files changed, 62 insertions(+), 10 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, +}; diff --git a/src/include/gpxe/settings.h b/src/include/gpxe/settings.h index f05805f2..25aef8e7 100644 --- a/src/include/gpxe/settings.h +++ b/src/include/gpxe/settings.h @@ -44,10 +44,13 @@ struct config_setting_type { * * @v context Configuration context * @v setting Configuration setting - * @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 ) ( struct config_context *context, - struct config_setting *setting ); + int ( * show ) ( struct config_context *context, + struct config_setting *setting, + char *buf, size_t len ); /** Set value of setting * * @v context Configuration context @@ -95,8 +98,8 @@ struct config_setting { /* Function prototypes */ -extern const char * ( show_setting ) ( struct config_context *context, - const char *name ); +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, const char *value );