]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Added support for multi-word commands.
authorTimo Sirainen <tss@iki.fi>
Fri, 30 Apr 2010 14:50:01 +0000 (17:50 +0300)
committerTimo Sirainen <tss@iki.fi>
Fri, 30 Apr 2010 14:50:01 +0000 (17:50 +0300)
--HG--
branch : HEAD

src/doveadm/doveadm-mail.c

index 78c1d01e77b262ae3323d428e1ee7486a5757e08..c02e302677c66a8a5a4a982d78362ab31e438334 100644 (file)
@@ -277,16 +277,57 @@ doveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
        }
 }
 
+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;
 }