From: Aki Tuomi Date: Sun, 28 Feb 2016 16:59:35 +0000 (+0200) Subject: doveadm kick: Don't show who command's help on duplicate network/username masks X-Git-Tag: 2.2.22.rc1~20 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a7fc192e2177fd869bca779e9f6014f7149cda2d;p=thirdparty%2Fdovecot%2Fcore.git doveadm kick: Don't show who command's help on duplicate network/username masks --- diff --git a/src/doveadm/doveadm-kick.c b/src/doveadm/doveadm-kick.c index 3cc98ead76..39ac8575f8 100644 --- a/src/doveadm/doveadm-kick.c +++ b/src/doveadm/doveadm-kick.c @@ -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); diff --git a/src/doveadm/doveadm-who.c b/src/doveadm/doveadm-who.c index 572d6a0917..a38ecd2259 100644 --- a/src/doveadm/doveadm-who.c +++ b/src/doveadm/doveadm-who.c @@ -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) { diff --git a/src/doveadm/doveadm-who.h b/src/doveadm/doveadm-who.h index 1ce199c9da..57c663a95d 100644 --- a/src/doveadm/doveadm-who.h +++ b/src/doveadm/doveadm-who.h @@ -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);