From 373f6333efbeeeee28753adeb78094ef0807efa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Janouch?= Date: Sun, 3 May 2015 16:47:31 +0200 Subject: [PATCH] degesch: refactor /help, fix segfault Forgot to check if the item has a schema. --- degesch.c | 76 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 32 deletions(-) diff --git a/degesch.c b/degesch.c index b0a3e04..1d66a9d 100644 --- a/degesch.c +++ b/degesch.c @@ -4120,6 +4120,41 @@ g_command_handlers[] = "" }, }; +static bool +try_handle_command_help_option (struct app_context *ctx, const char *name) +{ + struct config_item_ *item = + config_item_get (ctx->config.root, name, NULL); + if (!item) + return false; + + struct config_schema *schema = item->schema; + if (!schema) + { + buffer_send_error (ctx, ctx->global_buffer, + "%s: %s", "This option has no schema", name); + return true; + } + + buffer_send_status (ctx, ctx->global_buffer, "%s", ""); + buffer_send_status (ctx, ctx->global_buffer, + "Option \"%s\":", name); + buffer_send_status (ctx, ctx->global_buffer, + " Description: %s", schema->comment); + buffer_send_status (ctx, ctx->global_buffer, + " Type: %s", config_item_type_name (schema->type)); + buffer_send_status (ctx, ctx->global_buffer, + " Default: %s", schema->default_ ? schema->default_ : "null"); + + struct str tmp; + str_init (&tmp); + config_item_write (item, false, &tmp); + buffer_send_status (ctx, ctx->global_buffer, + " Current value: %s", tmp.str); + str_free (&tmp); + return true; +} + static bool handle_command_help (struct app_context *ctx, char *arguments) { @@ -4140,43 +4175,20 @@ handle_command_help (struct app_context *ctx, char *arguments) for (size_t i = 0; i < N_ELEMENTS (g_command_handlers); i++) { struct command_handler *handler = &g_command_handlers[i]; - if (!strcasecmp_ascii (command, handler->name)) - { - buffer_send_status (ctx, ctx->global_buffer, "%s", ""); - buffer_send_status (ctx, ctx->global_buffer, "%s: %s", - handler->name, handler->description); - buffer_send_status (ctx, ctx->global_buffer, " Arguments: %s", - handler->usage); - return true; - } - } + if (strcasecmp_ascii (command, handler->name)) + continue; - struct config_item_ *item = - config_item_get (ctx->config.root, command, NULL); - if (item) - { - struct config_schema *schema = item->schema; buffer_send_status (ctx, ctx->global_buffer, "%s", ""); - buffer_send_status (ctx, ctx->global_buffer, - "Option \"%s\":", command); - buffer_send_status (ctx, ctx->global_buffer, - " Description: %s", schema->comment); - buffer_send_status (ctx, ctx->global_buffer, - " Type: %s", config_item_type_name (schema->type)); - buffer_send_status (ctx, ctx->global_buffer, - " Default: %s", schema->default_ ? schema->default_ : "null"); - - struct str tmp; - str_init (&tmp); - config_item_write (item, false, &tmp); - buffer_send_status (ctx, ctx->global_buffer, - " Current value: %s", tmp.str); - str_free (&tmp); + buffer_send_status (ctx, ctx->global_buffer, "%s: %s", + handler->name, handler->description); + buffer_send_status (ctx, ctx->global_buffer, " Arguments: %s", + handler->usage); return true; } - buffer_send_error (ctx, ctx->global_buffer, - "%s: %s", "No such command or option", command); + if (!try_handle_command_help_option (ctx, command)) + buffer_send_error (ctx, ctx->global_buffer, + "%s: %s", "No such command or option", command); return true; }