diff --git a/src/core/settings.c b/src/core/settings.c index 650673be..3eface4b 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -115,7 +115,8 @@ find_or_build_config_setting ( const char *name, return setting; } -/** Show value of setting +/** + * Show value of setting * * @v context Configuration context * @v name Configuration setting name @@ -134,7 +135,8 @@ int show_setting ( struct config_context *context, const char *name, return setting->type->show ( context, setting, buf, len ); } -/** Set value of setting +/** + * Set value of setting * * @v context Configuration context * @v name Configuration setting name @@ -152,6 +154,27 @@ int set_setting ( struct config_context *context, const char *name, return setting->type->set ( context, setting, value ); } +/** + * Clear setting + * + * @v context Configuration context + * @v name Configuration setting name + * @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; +} + /** * Show value of string setting * diff --git a/src/include/gpxe/settings.h b/src/include/gpxe/settings.h index f5ecae94..ab0de5b4 100644 --- a/src/include/gpxe/settings.h +++ b/src/include/gpxe/settings.h @@ -102,5 +102,6 @@ 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 ); +extern int clear_setting ( struct config_context *context, const char *name ); #endif /* _GPXE_SETTINGS_H */