From: Timo Sirainen Date: Fri, 30 Apr 2010 14:50:01 +0000 (+0300) Subject: doveadm: Added support for multi-word commands. X-Git-Tag: 2.0.beta5~32 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ff4ec35014310044f27c7d11ba9fdb53319d7157;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Added support for multi-word commands. --HG-- branch : HEAD --- diff --git a/src/doveadm/doveadm-mail.c b/src/doveadm/doveadm-mail.c index 78c1d01e77..c02e302677 100644 --- a/src/doveadm/doveadm-mail.c +++ b/src/doveadm/doveadm-mail.c @@ -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; }