changeset 19901:579e186b9623

doveadm-who: Rewrite to ver2 infra
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Sun, 28 Feb 2016 19:07:03 +0200
parents 6f760a1def9f
children fb76c4085b27
files src/doveadm/doveadm-cmd.c src/doveadm/doveadm-cmd.h src/doveadm/doveadm-who.c
diffstat 3 files changed, 27 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/doveadm/doveadm-cmd.c	Sun Feb 28 18:59:35 2016 +0200
+++ b/src/doveadm/doveadm-cmd.c	Sun Feb 28 19:07:03 2016 +0200
@@ -13,7 +13,6 @@
 #include <getopt.h>
 
 static struct doveadm_cmd *doveadm_commands[] = {
-	&doveadm_cmd_who,
 	&doveadm_cmd_kick,
 	&doveadm_cmd_mailbox_mutf7,
 	&doveadm_cmd_sis_deduplicate,
@@ -25,7 +24,8 @@
 	&doveadm_cmd_reload_ver2,
 	&doveadm_cmd_stats_dump_ver2,
 	&doveadm_cmd_stats_reset_ver2,
-	&doveadm_cmd_penalty_ver2
+	&doveadm_cmd_penalty_ver2,
+	&doveadm_cmd_who_ver2
 };
 
 ARRAY_TYPE(doveadm_cmd) doveadm_cmds;
--- a/src/doveadm/doveadm-cmd.h	Sun Feb 28 18:59:35 2016 +0200
+++ b/src/doveadm/doveadm-cmd.h	Sun Feb 28 19:07:03 2016 +0200
@@ -88,7 +88,6 @@
 
 extern struct doveadm_cmd doveadm_cmd_dump;
 extern struct doveadm_cmd doveadm_cmd_pw;
-extern struct doveadm_cmd doveadm_cmd_who;
 extern struct doveadm_cmd doveadm_cmd_kick;
 extern struct doveadm_cmd doveadm_cmd_mailbox_mutf7;
 extern struct doveadm_cmd doveadm_cmd_sis_deduplicate;
@@ -149,5 +148,6 @@
 extern struct doveadm_cmd_ver2 doveadm_cmd_stats_dump_ver2;
 extern struct doveadm_cmd_ver2 doveadm_cmd_stats_top_ver2;
 extern struct doveadm_cmd_ver2 doveadm_cmd_penalty_ver2;
+extern struct doveadm_cmd_ver2 doveadm_cmd_who_ver2;
 
 #endif
--- a/src/doveadm/doveadm-who.c	Sun Feb 28 18:59:35 2016 +0200
+++ b/src/doveadm/doveadm-who.c	Sun Feb 28 19:07:03 2016 +0200
@@ -274,34 +274,31 @@
 	} T_END;
 }
 
-static void cmd_who(int argc, char *argv[])
+static void cmd_who(struct doveadm_cmd_context *cctx)
 {
+	const char *const *masks;
 	struct who_context ctx;
 	bool separate_connections = FALSE;
-	int c;
 
 	memset(&ctx, 0, sizeof(ctx));
-	ctx.anvil_path = t_strconcat(doveadm_settings->base_dir, "/anvil", NULL);
+	if (!doveadm_cmd_param_str(cctx, "socket-path", &(ctx.anvil_path)))
+		ctx.anvil_path = t_strconcat(doveadm_settings->base_dir, "/anvil", NULL);
+	(void)doveadm_cmd_param_bool(cctx, "separate-connections", &separate_connections);
+	if (!doveadm_cmd_param_array(cctx, "mask", &masks)) {
+		doveadm_exit_code = EX_USAGE;
+		i_error("user and/or ip[/bits] must be specified.");
+		return;
+	}
+
 	ctx.pool = pool_alloconly_create("who users", 10240);
 	hash_table_create(&ctx.users, ctx.pool, 0, who_user_hash, who_user_cmp);
 
-	while ((c = getopt(argc, argv, "1a:")) > 0) {
-		switch (c) {
-		case '1':
-			separate_connections = TRUE;
-			break;
-		case 'a':
-			ctx.anvil_path = optarg;
-			break;
-		default:
-			help(&doveadm_cmd_who);
-		}
+	if (who_parse_args(&ctx, masks) != 0) {
+		hash_table_destroy(&ctx.users);
+		pool_unref(&ctx.pool);
+		return;
 	}
 
-	argv += optind - 1;
-	if (who_parse_args(&ctx, (const char *const *)argv + 1) < 0)
-		help(&doveadm_cmd_who);
-
 	doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
 	if (!separate_connections) {
 		who_lookup(&ctx, who_aggregate_line);
@@ -319,7 +316,13 @@
 	pool_unref(&ctx.pool);
 }
 
-struct doveadm_cmd doveadm_cmd_who = {
-	cmd_who, "who",
-	"[-a <anvil socket path>] [-1] [<user mask>] [<ip/bits>]"
+struct doveadm_cmd_ver2 doveadm_cmd_who_ver2 = {
+	.name = "who",
+	.cmd = cmd_who,
+	.usage = "[-a <anvil socket path>] [-1] [<user mask>] [<ip/bits>]",
+DOVEADM_CMD_PARAMS_START
+DOVEADM_CMD_PARAM('a',"socket-path", CMD_PARAM_STR, 0)
+DOVEADM_CMD_PARAM('1',"separate-connections", CMD_PARAM_BOOL, 0)
+DOVEADM_CMD_PARAM('\0',"mask", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
+DOVEADM_CMD_PARAMS_END
 };