# HG changeset patch # User Aki Tuomi # Date 1456679223 -7200 # Node ID 579e186b9623737d22fa2db04eb629c078bce811 # Parent 6f760a1def9f56571b96716bb24fc3c5b3c25298 doveadm-who: Rewrite to ver2 infra diff -r 6f760a1def9f -r 579e186b9623 src/doveadm/doveadm-cmd.c --- 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 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; diff -r 6f760a1def9f -r 579e186b9623 src/doveadm/doveadm-cmd.h --- 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 diff -r 6f760a1def9f -r 579e186b9623 src/doveadm/doveadm-who.c --- 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 ] [-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 };