}
}
+static bool
+doveadm_mail_try_run_multi_word(const struct doveadm_mail_cmd *cmd,
+ const char *cmdname, int argc, char *argv[])
+{
+ unsigned int len;
+
+ if (argc < 1)
+ return FALSE;
+
+ len = strlen(argv[1]);
+ if (strncmp(cmdname, argv[1], len) != 0)
+ return FALSE;
+
+ if (cmdname[len] == ' ') {
+ /* more args */
+ return doveadm_mail_try_run_multi_word(cmd, cmdname + len + 1,
+ argc - 1, argv + 1);
+ }
+ if (cmdname[len] != '\0')
+ return FALSE;
+
+ /* match */
+ doveadm_mail_cmd(cmd, argc - 1, argv + 1);
+ return TRUE;
+}
+
bool doveadm_mail_try_run(const char *cmd_name, int argc, char *argv[])
{
const struct doveadm_mail_cmd *cmd;
+ unsigned int cmd_name_len;
+
+ i_assert(argc > 0);
+ cmd_name_len = strlen(cmd_name);
array_foreach(&doveadm_mail_cmds, cmd) {
if (strcmp(cmd->name, cmd_name) == 0) {
doveadm_mail_cmd(cmd, argc, argv);
return TRUE;
}
+
+ /* see if it matches a multi-word command */
+ if (strncmp(cmd->name, cmd_name, cmd_name_len) == 0 &&
+ cmd->name[cmd_name_len] == ' ') {
+ const char *subcmd = cmd->name + cmd_name_len + 1;
+
+ if (doveadm_mail_try_run_multi_word(cmd, subcmd,
+ argc, argv))
+ return TRUE;
+ }
}
+
return FALSE;
}