From eb2e26f4cd9e0a9984fef35478d4ed8adcfefc01 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 30 Jun 2026 15:33:37 +0100 Subject: [PATCH] Default command tree bits. --- cmd-parse.y | 2 ++ server-client.c | 42 ++++++++++++------------------------------ 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/cmd-parse.y b/cmd-parse.y index 7f64ff70a..10fcb1aa9 100644 --- a/cmd-parse.y +++ b/cmd-parse.y @@ -763,6 +763,8 @@ cmd_parse_from_arguments(struct args_value *values, u_int count) case ARGS_COMMANDS: child = cmd_parse_new_commands_node(values[i].cmd, 0); break; + default: + fatalx("unknown argument type"); } TAILQ_INSERT_TAIL(&cmd->children, child, entry); } diff --git a/server-client.c b/server-client.c index cbbb79d38..8b579275b 100644 --- a/server-client.c +++ b/server-client.c @@ -2578,7 +2578,10 @@ server_client_dispatch_command(struct client *c, struct imsg *imsg) size_t len; int argc = 0; char **argv, *cause; - struct cmdq_item *new_item; + struct cmdq_item *item; + struct cmd_invoke_input ci = { 0 }; + struct args_value *values; + struct cmd_parse_tree *tree; if (c->flags & CLIENT_EXIT) return (0); @@ -2598,40 +2601,19 @@ server_client_dispatch_command(struct client *c, struct imsg *imsg) } argc = data.argc; - if (argc == 0) { - new_item = cmdq_get_callback(server_client_default_command, - NULL); - } else { -#if 0 /* XXX: command parser conversion */ - struct cmd_parse_result *pr; - struct args_value *values; - + if (argc == 0) + item = cmdq_get_callback(server_client_default_command, NULL); + else { values = args_from_vector(argc, argv); - pr = cmd_parse_from_arguments(values, argc, NULL); - switch (pr->status) { - case CMD_PARSE_ERROR: - cause = pr->error; - goto error; - case CMD_PARSE_SUCCESS: - break; - } + tree = cmd_parse_from_arguments(values, argc); args_free_values(values, argc); free(values); cmd_free_argv(argc, argv); - if ((c->flags & CLIENT_READONLY) && - !cmd_list_all_have(pr->cmdlist, CMD_READONLY)) { - new_item = cmdq_get_callback(server_client_read_only, - NULL); - } else - new_item = cmdq_get_command(pr->cmdlist, NULL); - cmd_list_free(pr->cmdlist); -#else - cause = xstrdup( - "XXX: command parser conversion not done for client commands"); - goto error; -#endif + + item = cmd_invoke_get(tree, NULL, &ci); + cmd_parse_free(tree); } - cmdq_append(c, new_item); + cmdq_append(c, item); cmdq_append(c, cmdq_get_callback(server_client_command_done, NULL)); return (0);