- command_help_show_indent(n);
- LOG_USER_N("%s", command_name(c, ' '));
- if (c->usage) {
- LOG_USER_N(" ");
- command_help_show_wrap(c->usage, 0, n + 5);
+ char *cmd_name = command_name(c, ' ');
+ if (NULL == cmd_name)
+ return -ENOMEM;
+
+ /* If the match string occurs anywhere, we print out
+ * stuff for this command. */
+ bool is_match = (strstr(cmd_name, match) != NULL) ||
+ ((c->usage != NULL) && (strstr(c->usage, match) != NULL)) ||
+ ((c->help != NULL) && (strstr(c->help, match) != NULL));
+
+ if (is_match) {
+ command_help_show_indent(n);
+ LOG_USER_N("%s", cmd_name);
+ }
+ free(cmd_name);
+
+ if (is_match) {
+ if (c->usage) {
+ LOG_USER_N(" ");
+ command_help_show_wrap(c->usage, 0, n + 5);
+ } else
+ LOG_USER_N("\n");
+ }
+
+ if (is_match && show_help) {
+ char *msg;
+
+ /* Normal commands are runtime-only; highlight exceptions */
+ if (c->mode != COMMAND_EXEC) {
+ const char *stage_msg = "";
+
+ switch (c->mode) {
+ case COMMAND_CONFIG:
+ stage_msg = " (configuration command)";
+ break;
+ case COMMAND_ANY:
+ stage_msg = " (command valid any time)";
+ break;
+ default:
+ stage_msg = " (?mode error?)";
+ break;
+ }
+ msg = alloc_printf("%s%s", c->help ? : "", stage_msg);
+ } else
+ msg = alloc_printf("%s", c->help ? : "");
+
+ if (NULL != msg) {
+ command_help_show_wrap(msg, n + 3, n + 3);
+ free(msg);
+ } else
+ return -ENOMEM;
+ }
+
+ if (++n > 5) {
+ LOG_ERROR("command recursion exceeded");
+ return ERROR_FAIL;