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);