dovecot-2.0: doveadm: Added support for multi-word commands.

dovecot at dovecot.org dovecot at dovecot.org
Fri Apr 30 17:51:03 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/65e21dc80414
changeset: 11242:65e21dc80414
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Apr 30 17:50:01 2010 +0300
description:
doveadm: Added support for multi-word commands.

diffstat:

 src/doveadm/doveadm-mail.c |  41 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 41 insertions(+), 0 deletions(-)

diffs (61 lines):

diff -r be74fa9bfcc9 -r 65e21dc80414 src/doveadm/doveadm-mail.c
--- a/src/doveadm/doveadm-mail.c	Fri Apr 30 16:24:33 2010 +0300
+++ b/src/doveadm/doveadm-mail.c	Fri Apr 30 17:50:01 2010 +0300
@@ -277,16 +277,57 @@
 	}
 }
 
+static bool
+doveadm_mail_try_run_multi_word(const struct doveadm_mail_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_mail_try_run_multi_word(cmd, cmdname + len + 1,
+						       argc - 1, argv + 1);
+	}
+	if (cmdname[len] != '\0')
+		return FALSE;
+
+	/* match */
+	doveadm_mail_cmd(cmd, argc - 1, argv + 1);
+	return TRUE;
+}
+
 bool doveadm_mail_try_run(const char *cmd_name, int argc, char *argv[])
 {
 	const struct doveadm_mail_cmd *cmd;
+	unsigned int cmd_name_len;
 
+	i_assert(argc > 0);
+
+	cmd_name_len = strlen(cmd_name);
 	array_foreach(&doveadm_mail_cmds, cmd) {
 		if (strcmp(cmd->name, cmd_name) == 0) {
 			doveadm_mail_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_mail_try_run_multi_word(cmd, subcmd,
+							    argc, argv))
+				return TRUE;
+		}
 	}
+
 	return FALSE;
 }
 


More information about the dovecot-cvs mailing list