]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm kick: Don't show who command's help on duplicate network/username masks
authorAki Tuomi <aki.tuomi@dovecot.fi>
Sun, 28 Feb 2016 16:59:35 +0000 (18:59 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 29 Feb 2016 23:32:12 +0000 (01:32 +0200)
src/doveadm/doveadm-kick.c
src/doveadm/doveadm-who.c
src/doveadm/doveadm-who.h

index 3cc98ead76754829f70a875243bd2772b5490689..39ac8575f8b0ad6f3940e5c6dba7a0f0faa08ff4 100644 (file)
@@ -196,7 +196,8 @@ static void cmd_kick(int argc, char *argv[])
                i_fatal_status(EX_USAGE,
                               "user and/or ip[/bits] must be specified.");
        }
-       who_parse_args(&ctx.who, argv);
+       if (who_parse_args(&ctx.who, (const char *const *)argv + 1) < 0)
+               help(&doveadm_cmd_kick);
 
        who_lookup(&ctx.who, kick_aggregate_line);
        kick_users(&ctx);
index 572d6a0917c636babf6560c37addd45eb372eecf..a38ecd2259612e5e3b017522862ffda4fff539a0 100644 (file)
@@ -112,24 +112,30 @@ static void who_aggregate_line(struct who_context *ctx,
                array_append(&user->pids, &line->pid, 1);
 }
 
-void who_parse_args(struct who_context *ctx, char **args)
+int who_parse_args(struct who_context *ctx, const char *const *masks)
 {
        struct ip_addr net_ip;
-       unsigned int net_bits;
-
-       while (args[1] != NULL) {
-               if (net_parse_range(args[1], &net_ip, &net_bits) == 0) {
-                       if (ctx->filter.net_bits != 0)
-                               help(&doveadm_cmd_who);
+       unsigned int i, net_bits;
+
+       for (i = 0; masks[i] != NULL; i++) {
+               if (net_parse_range(masks[i], &net_ip, &net_bits) == 0) {
+                       if (ctx->filter.net_bits != 0) {
+                               i_error("Multiple network masks not supported");
+                               doveadm_exit_code = EX_USAGE;
+                               return -1;
+                       }
                        ctx->filter.net_ip = net_ip;
                        ctx->filter.net_bits = net_bits;
                } else {
-                       if (ctx->filter.username != NULL)
-                               help(&doveadm_cmd_who);
-                       ctx->filter.username = args[1];
+                       if (ctx->filter.username != NULL) {
+                               i_error("Multiple username masks not supported");
+                               doveadm_exit_code = EX_USAGE;
+                               return -1;
+                       }
+                       ctx->filter.username = masks[i];
                }
-               args++;
        }
+       return 0;
 }
 
 void who_lookup(struct who_context *ctx, who_callback_t *callback)
@@ -293,7 +299,8 @@ static void cmd_who(int argc, char *argv[])
        }
 
        argv += optind - 1;
-       who_parse_args(&ctx, argv);
+       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) {
index 1ce199c9daa61ff8ddb7577ae1a701824c766721..57c663a95da70c08b81ed7a9974425d1afaded6a 100644 (file)
@@ -27,7 +27,7 @@ struct who_context {
 typedef void who_callback_t(struct who_context *ctx,
                            const struct who_line *line);
 
-void who_parse_args(struct who_context *ctx, char **args);
+int who_parse_args(struct who_context *ctx, const char *const *masks);
 
 void who_lookup(struct who_context *ctx, who_callback_t *callback);