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