Mercurial > dovecot > core-2.2
changeset 19966:7dd537c3f6d6
doveadm-server: Fixed running multi-word commands.
The problem with for example "mailbox status" command is that:
- doveadm cli: argv[0] = "mailbox", argv[1] = "status"
- doveadm-server: argv[0] = "mailbox status"
So with doveadm cli we'll now instead just skip over words until argv[0]
is the last word of the command ("status").
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Tue, 29 Mar 2016 14:10:10 +0300 |
parents | 9c7f7098fdaf |
children | 454bef9b317b |
files | src/doveadm/client-connection.c src/doveadm/doveadm-cmd.c src/doveadm/doveadm-cmd.h src/doveadm/doveadm-mail-batch.c |
diffstat | 4 files changed, 21 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/doveadm/client-connection.c Tue Mar 29 14:06:43 2016 +0300 +++ b/src/doveadm/client-connection.c Tue Mar 29 14:10:10 2016 +0300 @@ -234,7 +234,7 @@ struct doveadm_mail_cmd_context *mctx; const struct doveadm_cmd_ver2 *cmd_ver2; - if ((cmd_ver2 = doveadm_cmd_find_with_args_ver2(cmd_name, argc, argv)) == NULL) { + if ((cmd_ver2 = doveadm_cmd_find_with_args_ver2(cmd_name, &argc, &argv)) == NULL) { mail_cmd = doveadm_mail_cmd_find(cmd_name); if (mail_cmd == NULL) { cmd = doveadm_cmd_find_with_args(cmd_name, &argc, &argv);
--- a/src/doveadm/doveadm-cmd.c Tue Mar 29 14:06:43 2016 +0300 +++ b/src/doveadm/doveadm-cmd.c Tue Mar 29 14:10:10 2016 +0300 @@ -61,35 +61,42 @@ } const struct doveadm_cmd_ver2 * -doveadm_cmd_find_with_args_ver2(const char *cmd_name, int argc, const char *const argv[]) +doveadm_cmd_find_with_args_ver2(const char *cmd_name, int *argc, + const char *const *argv[]) { - int i; + int i, k; const struct doveadm_cmd_ver2 *cmd; const char *cptr; - for(i=0;i<argc;i++) { - if (strcmp(argv[i],cmd_name)==0) break; + for(i=0;i<*argc;i++) { + if (strcmp((*argv)[i],cmd_name)==0) break; } - i_assert(i != argc); + i_assert(i != *argc); array_foreach(&doveadm_cmds_ver2, cmd) { cptr = cmd->name; /* cannot reuse i here because this needs be done more than once */ - for(int k=0; *cptr != '\0' && i+k < argc; k++) { - size_t alen = strlen(argv[i+k]); + for (k=0; *cptr != '\0' && i+k < *argc; k++) { + size_t alen = strlen((*argv)[i+k]); /* make sure we don't overstep */ if (strlen(cptr) < alen) break; /* did not match */ - if (strncmp(cptr, argv[i+k], alen) != 0) break; + if (strncmp(cptr, (*argv)[i+k], alen) != 0) break; /* do not accept abbreviations */ if (cptr[alen] != ' ' && cptr[alen] != '\0') break; cptr += alen; if (*cptr != '\0') cptr++; /* consume space */ } /* name was fully consumed */ - if (*cptr == '\0') return cmd; + if (*cptr == '\0') { + if (k > 1) { + *argc -= k-1; + *argv += k-1; + } + return cmd; + } } return NULL; @@ -432,7 +439,7 @@ { const struct doveadm_cmd_ver2 *cmd; - cmd = doveadm_cmd_find_with_args_ver2(cmd_name, argc, argv); + cmd = doveadm_cmd_find_with_args_ver2(cmd_name, &argc, &argv); if (cmd == NULL) return FALSE; @@ -448,7 +455,6 @@ struct doveadm_cmd_param *param; ARRAY_TYPE(doveadm_cmd_param_arr_t) pargv; ARRAY_TYPE(getopt_option_array) opts; - const char *cptr; unsigned int pargc; int c,li; pool_t pool = pool_datastack_create(); @@ -492,9 +498,6 @@ } } - cptr = cctx->cmd->name; - while((cptr = strchr(cptr+1, ' ')) != NULL) optind++; - /* process positional arguments */ for(;optind<argc;optind++) { struct doveadm_cmd_param *ptr;
--- a/src/doveadm/doveadm-cmd.h Tue Mar 29 14:06:43 2016 +0300 +++ b/src/doveadm/doveadm-cmd.h Tue Mar 29 14:10:10 2016 +0300 @@ -117,8 +117,8 @@ void doveadm_cmd_register_ver2(struct doveadm_cmd_ver2 *cmd); const struct doveadm_cmd_ver2 * -doveadm_cmd_find_with_args_ver2(const char *cmd_name, int argc, - const char *const argv[]); +doveadm_cmd_find_with_args_ver2(const char *cmd_name, int *argc, + const char *const *argv[]); const struct doveadm_cmd_ver2 *doveadm_cmd_find_ver2(const char *cmd_name); /* Returns FALSE if cmd_name doesn't exist, TRUE if it exists. */ bool doveadm_cmd_try_run_ver2(const char *cmd_name,
--- a/src/doveadm/doveadm-mail-batch.c Tue Mar 29 14:06:43 2016 +0300 +++ b/src/doveadm/doveadm-mail-batch.c Tue Mar 29 14:10:10 2016 +0300 @@ -60,7 +60,7 @@ const char *getopt_args; int c; - cmd_ver2 = doveadm_cmd_find_with_args_ver2(argv[0], argc, argv); + cmd_ver2 = doveadm_cmd_find_with_args_ver2(argv[0], &argc, &argv); if (cmd_ver2 == NULL) cmd = doveadm_mail_cmd_find_from_argv(argv[0], &argc, &argv);