]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm-who: Rewrite to ver2 infra
authorAki Tuomi <aki.tuomi@dovecot.fi>
Sun, 28 Feb 2016 17:07:03 +0000 (19:07 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 29 Feb 2016 23:32:18 +0000 (01:32 +0200)
src/doveadm/doveadm-cmd.c
src/doveadm/doveadm-cmd.h
src/doveadm/doveadm-who.c

index 1fc7a54d5306c32be22ef96b0439ef6d809c5c0b..9ec9234a23862faeb92a51ba8f8ce6b21798ed3d 100644 (file)
@@ -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 @@ 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;
index 5e80cd661029871121a04ebc9de59025c55bf952..7a79616701b6d4f39b00a056316dce2ffd8611de 100644 (file)
@@ -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
index a38ecd2259612e5e3b017522862ffda4fff539a0..8580f929d8f9cd7de02cb721f7f65f568925350d 100644 (file)
@@ -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 <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
 };