Mercurial > dovecot > core-2.2
changeset 11296:f491253bb457 HEAD
doveadm: Added support for multi-word (non-mail) commands.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 13 May 2010 11:47:30 +0200 |
parents | c9463679f71e |
children | 0741e7003efa |
files | src/doveadm/doveadm.c |
diffstat | 1 files changed, 42 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/doveadm/doveadm.c Thu May 13 11:05:56 2010 +0200 +++ b/src/doveadm/doveadm.c Thu May 13 11:47:30 2010 +0200 @@ -85,16 +85,57 @@ cmd_help, "help", "<cmd>", 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; }