degesch: refactor /help, fix segfault
Forgot to check if the item has a schema.
This commit is contained in:
		
							parent
							
								
									4928f9ed62
								
							
						
					
					
						commit
						373f6333ef
					
				
							
								
								
									
										76
									
								
								degesch.c
									
									
									
									
									
								
							
							
						
						
									
										76
									
								
								degesch.c
									
									
									
									
									
								
							| @ -4120,6 +4120,41 @@ g_command_handlers[] = | ||||
| 	  "<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 | ||||
| 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; | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user