From: Timo Sirainen Date: Thu, 13 May 2010 09:47:30 +0000 (+0200) Subject: doveadm: Added support for multi-word (non-mail) commands. X-Git-Tag: 2.0.beta6~234 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=542a32ee5f4ca72626ec93b6313f909811c01534;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Added support for multi-word (non-mail) commands. --HG-- branch : HEAD --- diff --git a/src/doveadm/doveadm.c b/src/doveadm/doveadm.c index fcefd04c02..2e89277200 100644 --- a/src/doveadm/doveadm.c +++ b/src/doveadm/doveadm.c @@ -85,16 +85,57 @@ static struct doveadm_cmd doveadm_cmd_help = { cmd_help, "help", "", NULL }; +static bool +doveadm_try_run_multi_word(const struct doveadm_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_try_run_multi_word(cmd, cmdname + len + 1, + argc - 1, argv + 1); + } + if (cmdname[len] != '\0') + return FALSE; + + /* match */ + cmd->cmd(argc - 1, argv + 1); + return TRUE; +} + static bool doveadm_try_run(const char *cmd_name, int argc, char *argv[]) { const struct doveadm_cmd *cmd; + unsigned int cmd_name_len; + + i_assert(argc > 0); + cmd_name_len = strlen(cmd_name); array_foreach(&doveadm_cmds, cmd) { - if (strcmp(cmd_name, cmd->name) == 0) { + if (strcmp(cmd->name, cmd_name) == 0) { 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_try_run_multi_word(cmd, subcmd, + argc, argv)) + return TRUE; + } } + return FALSE; }