diff --git a/src/helper/command.c b/src/helper/command.c index 0561c6c5b..3df60b65a 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -263,13 +263,12 @@ static void command_free(struct command *c) } struct command* register_command(struct command_context *context, - struct command *parent, const char *name, - command_handler_t handler, enum command_mode mode, - const char *help) + struct command *parent, const struct command_registration *cr) { - if (!context || !name) + if (!context || !cr->name) return NULL; + const char *name = cr->name; struct command **head = command_list_for_parent(context, parent); struct command *c = command_find(*head, name); if (NULL != c) @@ -279,7 +278,7 @@ struct command* register_command(struct command_context *context, return c; } - c = command_new(context, parent, name, handler, mode, help); + c = command_new(context, parent, name, cr->handler, cr->mode, cr->help); /* if allocation failed or it is a placeholder (no handler), we're done */ if (NULL == c || NULL == c->handler) return c; @@ -762,8 +761,12 @@ int help_add_command(struct command_context *cmd_ctx, struct command *parent, if (NULL == nc) { // add a new command with help text - nc = register_command(cmd_ctx, parent, cmd_name, - NULL, COMMAND_ANY, help_text); + struct command_registration cr = { + .name = cmd_name, + .mode = COMMAND_ANY, + .help = help_text, + }; + nc = register_command(cmd_ctx, parent, &cr); if (NULL == nc) { LOG_ERROR("failed to add '%s' help text", cmd_name); diff --git a/src/helper/command.h b/src/helper/command.h index 25c05011d..b57ca75d8 100644 --- a/src/helper/command.h +++ b/src/helper/command.h @@ -177,6 +177,30 @@ struct command */ char *command_name(struct command *c, char delim); +/* + * Commands should be registered by filling in one or more of these + * structures and passing them to register_command(). + * + * A conventioal format should be used for help strings, to provide both + * usage and basic information: + * @code + * "@ ... - some explanation text" + * @endcode + * + * @param name The name of the command to register, which must not have + * been registered previously in the intended context. + * @param handler The callback function that will be called. If NULL, + * then the command serves as a placeholder for its children or a script. + * @param mode The command mode(s) in which this command may be run. + * @param help The help text that will be displayed to the user. + */ +struct command_registration { + const char *name; + command_handler_t handler; + enum command_mode mode; + const char *help; +}; + /** * Register a command @c handler that can be called from scripts during * the execution @c mode specified. @@ -185,31 +209,26 @@ char *command_name(struct command *c, char delim); * sub-command under it; otherwise, it will be available as a top-level * command. * - * A conventioal format should be used for help strings, to provide both - * usage and basic information: - * @code - * "@ ... - some explanation text" - * @endcode - * * @param cmd_ctx The command_context in which to register the command. * @param parent Register this command as a child of this, or NULL to * register a top-level command. - * @param name The name of the command to register, which must not have - * been registered previously. - * @param handler The callback function that will be called. If NULL, - * then the command serves as a placeholder for its children or a script. - * @param mode The command mode(s) in which this command may be run. - * @param help The help text that will be displayed to the user. + * @param rec A command_registration record that contains the desired + * command parameters. * @returns The new command, if successful; otherwise, NULL. */ struct command* register_command(struct command_context *cmd_ctx, - struct command *parent, const char *name, - command_handler_t handler, enum command_mode mode, - const char *help); + struct command *parent, const struct command_registration *rec); -// provide a simple shim, for now; allows parameters to be migrated #define COMMAND_REGISTER(_cmd_ctx, _parent, _name, _handler, _mode, _help) \ - register_command(_cmd_ctx, _parent, _name, _handler, _mode, _help) + ({ \ + struct command_registration cr = { \ + .name = _name, \ + .handler = _handler, \ + .mode = _mode, \ + .help = _help, \ + }; \ + register_command(_cmd_ctx, _parent, &cr); \ + }) /** * Unregisters command @c name from the given context, @c cmd_ctx.