]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm-server: Fixed running multi-word commands.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 29 Mar 2016 11:10:10 +0000 (14:10 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 29 Mar 2016 12:11:58 +0000 (15:11 +0300)
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").

src/doveadm/client-connection.c
src/doveadm/doveadm-cmd.c
src/doveadm/doveadm-cmd.h
src/doveadm/doveadm-mail-batch.c

index f96e2540a88050a5c725865a64a0d72222a5ac5c..1c3398cff14c197617115d7f7c24fed057275438 100644 (file)
@@ -234,7 +234,7 @@ static int doveadm_cmd_handle(struct client_connection *conn,
        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);
index 401386a0810fc96ab455ea529535d46451d90f50..8d9ff5092ee2f1c27c05fabd0a3d063b8d01c0d7 100644 (file)
@@ -61,35 +61,42 @@ const struct doveadm_cmd_ver2 *doveadm_cmd_find_ver2(const char *cmd_name)
 }
 
 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 @@ bool doveadm_cmd_try_run_ver2(const char *cmd_name,
 {
        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 @@ int doveadm_cmd_run_ver2(int argc, const char *const argv[],
        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 @@ int doveadm_cmd_run_ver2(int argc, const char *const argv[],
                }
        }
 
-       cptr = cctx->cmd->name;
-       while((cptr = strchr(cptr+1, ' ')) != NULL) optind++;
-
        /* process positional arguments */
        for(;optind<argc;optind++) {
                struct doveadm_cmd_param *ptr;
index e4ec4791cd04e0c496ac13ce1e85ded23b16e8c2..6e2d2b878a1ca47aed0a59baca133f8cf81dd42c 100644 (file)
@@ -117,8 +117,8 @@ void doveadm_cmd_ver2_to_mail_cmd_wrapper(struct doveadm_cmd_context *cctx);
 
 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,
index d27e86837b9dab1f7d645d44d8f60538529ef893..f59b9414b32d78a1f1190935d644e93d9f5cfb2a 100644 (file)
@@ -60,7 +60,7 @@ cmd_batch_add(struct batch_cmd_context *batchctx,
        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);