degesch: refactor /help, fix segfault
Forgot to check if the item has a schema.
This commit is contained in:
parent
4928f9ed62
commit
373f6333ef
66
degesch.c
66
degesch.c
|
@ -4120,6 +4120,41 @@ g_command_handlers[] =
|
||||||
"<command>" },
|
"<command>" },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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
|
static bool
|
||||||
handle_command_help (struct app_context *ctx, char *arguments)
|
handle_command_help (struct app_context *ctx, char *arguments)
|
||||||
{
|
{
|
||||||
|
@ -4140,8 +4175,9 @@ handle_command_help (struct app_context *ctx, char *arguments)
|
||||||
for (size_t i = 0; i < N_ELEMENTS (g_command_handlers); i++)
|
for (size_t i = 0; i < N_ELEMENTS (g_command_handlers); i++)
|
||||||
{
|
{
|
||||||
struct command_handler *handler = &g_command_handlers[i];
|
struct command_handler *handler = &g_command_handlers[i];
|
||||||
if (!strcasecmp_ascii (command, handler->name))
|
if (strcasecmp_ascii (command, handler->name))
|
||||||
{
|
continue;
|
||||||
|
|
||||||
buffer_send_status (ctx, ctx->global_buffer, "%s", "");
|
buffer_send_status (ctx, ctx->global_buffer, "%s", "");
|
||||||
buffer_send_status (ctx, ctx->global_buffer, "%s: %s",
|
buffer_send_status (ctx, ctx->global_buffer, "%s: %s",
|
||||||
handler->name, handler->description);
|
handler->name, handler->description);
|
||||||
|
@ -4149,32 +4185,8 @@ handle_command_help (struct app_context *ctx, char *arguments)
|
||||||
handler->usage);
|
handler->usage);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (!try_handle_command_help_option (ctx, command))
|
||||||
buffer_send_error (ctx, ctx->global_buffer,
|
buffer_send_error (ctx, ctx->global_buffer,
|
||||||
"%s: %s", "No such command or option", command);
|
"%s: %s", "No such command or option", command);
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue