From: Aki Tuomi Date: Sun, 28 Feb 2016 17:07:03 +0000 (+0200) Subject: doveadm-who: Rewrite to ver2 infra X-Git-Tag: 2.2.22.rc1~19 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=99819adc9638200bc2ec1b68da9d2c68e8435740;p=thirdparty%2Fdovecot%2Fcore.git doveadm-who: Rewrite to ver2 infra --- diff --git a/src/doveadm/doveadm-cmd.c b/src/doveadm/doveadm-cmd.c index 1fc7a54d53..9ec9234a23 100644 --- a/src/doveadm/doveadm-cmd.c +++ b/src/doveadm/doveadm-cmd.c @@ -13,7 +13,6 @@ #include static struct doveadm_cmd *doveadm_commands[] = { - &doveadm_cmd_who, &doveadm_cmd_kick, &doveadm_cmd_mailbox_mutf7, &doveadm_cmd_sis_deduplicate, @@ -25,7 +24,8 @@ static struct doveadm_cmd_ver2 *doveadm_commands_ver2[] = { &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; diff --git a/src/doveadm/doveadm-cmd.h b/src/doveadm/doveadm-cmd.h index 5e80cd6610..7a79616701 100644 --- a/src/doveadm/doveadm-cmd.h +++ b/src/doveadm/doveadm-cmd.h @@ -88,7 +88,6 @@ extern ARRAY_TYPE(doveadm_cmd_ver2) doveadm_cmds_ver2; 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_reset_ver2; 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 diff --git a/src/doveadm/doveadm-who.c b/src/doveadm/doveadm-who.c index a38ecd2259..8580f929d8 100644 --- a/src/doveadm/doveadm-who.c +++ b/src/doveadm/doveadm-who.c @@ -274,34 +274,31 @@ static void who_print_line(struct who_context *ctx, } 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 @@ static void cmd_who(int argc, char *argv[]) pool_unref(&ctx.pool); } -struct doveadm_cmd doveadm_cmd_who = { - cmd_who, "who", - "[-a ] [-1] [] []" +struct doveadm_cmd_ver2 doveadm_cmd_who_ver2 = { + .name = "who", + .cmd = cmd_who, + .usage = "[-a ] [-1] [] []", +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 };