From: Marco Bettini Date: Fri, 22 Apr 2022 13:03:51 +0000 (+0000) Subject: doveadm: Add doveadm_cmd_param_uint64/uint32/int32() X-Git-Tag: 2.4.0~4013 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6e9fbca334a70599f62238b8a09445069fa04bf1;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Add doveadm_cmd_param_uint64/uint32/int32() --- diff --git a/src/doveadm/doveadm-cmd-parse.c b/src/doveadm/doveadm-cmd-parse.c index 3d5adedb1d..8077d025b4 100644 --- a/src/doveadm/doveadm-cmd-parse.c +++ b/src/doveadm/doveadm-cmd-parse.c @@ -40,6 +40,23 @@ bool doveadm_cmd_param_bool(const struct doveadm_cmd_context *cctx, return TRUE; } +#define doveadm_cmd_param_int64_cast(type, check) \ +bool doveadm_cmd_param_##type(const struct doveadm_cmd_context *cctx, \ + const char *name, type##_t *value_r) \ +{ \ + int64_t value; \ + bool ret = doveadm_cmd_param_int64(cctx, name, &value); \ + if (ret) { \ + i_assert(check); \ + *value_r = (type##_t) value; \ + } \ + return ret; \ +} + +doveadm_cmd_param_int64_cast(uint64, value >= 0) +doveadm_cmd_param_int64_cast(uint32, value >= 0 && value <= UINT32_MAX) +doveadm_cmd_param_int64_cast(int32, value >= INT32_MIN && value <= INT32_MAX) + bool doveadm_cmd_param_int64(const struct doveadm_cmd_context *cctx, const char *name, int64_t *value_r) { @@ -171,6 +188,14 @@ doveadm_fill_param(struct doveadm_cmd_param *param, "Invalid number: %s", value); return -1; } + if ((param->flags & CMD_PARAM_FLAG_UNSIGNED) != 0 && + param->value.v_int64 < 0) { + param->value_set = FALSE; + *error_r = t_strdup_printf( + "Cannot be negative: %s", value); + param->value_set = FALSE; + return -1; + } break; case CMD_PARAM_IP: if (net_addr2ip(value, ¶m->value.v_ip) != 0) { diff --git a/src/doveadm/doveadm-cmd-parse.h b/src/doveadm/doveadm-cmd-parse.h index 94d1cadef9..960db0167e 100644 --- a/src/doveadm/doveadm-cmd-parse.h +++ b/src/doveadm/doveadm-cmd-parse.h @@ -23,6 +23,7 @@ typedef enum { CMD_PARAM_FLAG_NONE = 0x0, CMD_PARAM_FLAG_POSITIONAL = 0x1, CMD_PARAM_FLAG_DO_NOT_EXPOSE = 0x2, + CMD_PARAM_FLAG_UNSIGNED = 0x4, /* int64 checked to be non negative */ } doveadm_cmd_param_flag_t; typedef enum { @@ -104,6 +105,12 @@ doveadm_cmd_param_flag(const struct doveadm_cmd_context *cctx, const char *name) bool doveadm_cmd_param_int64(const struct doveadm_cmd_context *cctx, const char *name, int64_t *value_r); +bool doveadm_cmd_param_uint64(const struct doveadm_cmd_context *cctx, + const char *name, uint64_t *value_r); +bool doveadm_cmd_param_int32(const struct doveadm_cmd_context *cctx, + const char *name, int32_t *value_r); +bool doveadm_cmd_param_uint32(const struct doveadm_cmd_context *cctx, + const char *name, uint32_t *value_r); bool doveadm_cmd_param_str(const struct doveadm_cmd_context *cctx, const char *name, const char **value_r); bool doveadm_cmd_param_ip(const struct doveadm_cmd_context *cctx, diff --git a/src/doveadm/doveadm-dict.c b/src/doveadm/doveadm-dict.c index a99272338b..05589d2c98 100644 --- a/src/doveadm/doveadm-dict.c +++ b/src/doveadm/doveadm-dict.c @@ -295,7 +295,7 @@ DOVEADM_CMD_PARAMS_END .usage = "[-u ] [-t ] ", DOVEADM_CMD_PARAMS_START DOVEADM_CMD_PARAM('u', "user", CMD_PARAM_STR, 0) -DOVEADM_CMD_PARAM('t', "timestamp", CMD_PARAM_INT64, 0) +DOVEADM_CMD_PARAM('t', "timestamp", CMD_PARAM_INT64, CMD_PARAM_FLAG_UNSIGNED) DOVEADM_CMD_PARAM('\0', "dict-uri", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) DOVEADM_CMD_PARAM('\0', "key", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) DOVEADM_CMD_PARAM('\0', "value", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) @@ -307,7 +307,7 @@ DOVEADM_CMD_PARAMS_END .usage = "[-u ] [-t ] ", DOVEADM_CMD_PARAMS_START DOVEADM_CMD_PARAM('u', "user", CMD_PARAM_STR, 0) -DOVEADM_CMD_PARAM('t', "timestamp", CMD_PARAM_INT64, 0) +DOVEADM_CMD_PARAM('t', "timestamp", CMD_PARAM_INT64, CMD_PARAM_FLAG_UNSIGNED) DOVEADM_CMD_PARAM('\0', "dict-uri", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) DOVEADM_CMD_PARAM('\0', "key", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) DOVEADM_CMD_PARAMS_END @@ -318,7 +318,7 @@ DOVEADM_CMD_PARAMS_END .usage = "[-u ] [-t ] ", DOVEADM_CMD_PARAMS_START DOVEADM_CMD_PARAM('u', "user", CMD_PARAM_STR, 0) -DOVEADM_CMD_PARAM('t', "timestamp", CMD_PARAM_INT64, 0) +DOVEADM_CMD_PARAM('t', "timestamp", CMD_PARAM_INT64, CMD_PARAM_FLAG_UNSIGNED) DOVEADM_CMD_PARAM('\0', "dict-uri", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) DOVEADM_CMD_PARAM('\0', "key", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) DOVEADM_CMD_PARAM('\0', "difference", CMD_PARAM_INT64, CMD_PARAM_FLAG_POSITIONAL) diff --git a/src/doveadm/doveadm-director.c b/src/doveadm/doveadm-director.c index 89089a6983..1bbf5c4d57 100644 --- a/src/doveadm/doveadm-director.c +++ b/src/doveadm/doveadm-director.c @@ -1022,7 +1022,7 @@ DOVEADM_CMD_PARAMS_END DOVEADM_CMD_PARAMS_START DOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0) DOVEADM_CMD_PARAM('F', "force-flush", CMD_PARAM_BOOL, 0) -DOVEADM_CMD_PARAM('\0', "max-parallel", CMD_PARAM_INT64, 0) +DOVEADM_CMD_PARAM('\0', "max-parallel", CMD_PARAM_INT64, CMD_PARAM_FLAG_UNSIGNED) DOVEADM_CMD_PARAM('\0', "host", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) DOVEADM_CMD_PARAMS_END }, diff --git a/src/doveadm/doveadm-fs.c b/src/doveadm/doveadm-fs.c index 17f6129927..f2f60e0887 100644 --- a/src/doveadm/doveadm-fs.c +++ b/src/doveadm/doveadm-fs.c @@ -558,7 +558,7 @@ DOVEADM_CMD_PARAMS_END .usage = "[-R] [-n ] [ ...]", DOVEADM_CMD_PARAMS_START DOVEADM_CMD_PARAM('R', "recursive", CMD_PARAM_BOOL, 0) -DOVEADM_CMD_PARAM('n', "max-parallel", CMD_PARAM_INT64, 0) +DOVEADM_CMD_PARAM('n', "max-parallel", CMD_PARAM_INT64, CMD_PARAM_FLAG_UNSIGNED) DOVEADM_CMD_PARAM('\0', "fs-driver", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) DOVEADM_CMD_PARAM('\0', "fs-args", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) DOVEADM_CMD_PARAM('\0', "path", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL) diff --git a/src/doveadm/doveadm-log.c b/src/doveadm/doveadm-log.c index f63ad4d1d9..af06ebb701 100644 --- a/src/doveadm/doveadm-log.c +++ b/src/doveadm/doveadm-log.c @@ -392,7 +392,7 @@ DOVEADM_CMD_PARAMS_END .usage = "[-s ]", .cmd = cmd_log_errors, DOVEADM_CMD_PARAMS_START -DOVEADM_CMD_PARAM('s', "since", CMD_PARAM_INT64, 0) +DOVEADM_CMD_PARAM('s', "since", CMD_PARAM_INT64, CMD_PARAM_FLAG_UNSIGNED) DOVEADM_CMD_PARAMS_END } }; diff --git a/src/doveadm/doveadm-pw.c b/src/doveadm/doveadm-pw.c index a4f852c81a..bdc983269c 100644 --- a/src/doveadm/doveadm-pw.c +++ b/src/doveadm/doveadm-pw.c @@ -23,8 +23,7 @@ static void cmd_pw(struct doveadm_cmd_context *cctx) const char *scheme = NULL; const char *plaintext = NULL; const char *test_hash = NULL; - bool list_schemes = FALSE, reverse_verify = FALSE; - int64_t rounds_int64; + bool list_schemes = FALSE; struct module_dir_load_settings mod_set; struct password_generate_params gen_params; i_zero(&gen_params); @@ -43,16 +42,12 @@ static void cmd_pw(struct doveadm_cmd_context *cctx) (void)doveadm_cmd_param_bool(cctx, "list", &list_schemes); (void)doveadm_cmd_param_str(cctx, "plaintext", &plaintext); - if (doveadm_cmd_param_int64(cctx, "rounds", &rounds_int64)) { - if (rounds_int64 > UINT_MAX) - i_fatal("Invalid number of rounds: %"PRId64, rounds_int64); - gen_params.rounds = rounds_int64; - } + (void)doveadm_cmd_param_uint32(cctx, "rounds", &gen_params.rounds); (void)doveadm_cmd_param_str(cctx, "scheme", &scheme); - if (doveadm_cmd_param_str(cctx, "test-hash", &test_hash)) - reverse_verify = TRUE; (void)doveadm_cmd_param_str(cctx, "user", &gen_params.user); - (void)doveadm_cmd_param_bool(cctx, "reverse-verify", &reverse_verify); + bool reverse_verify = + doveadm_cmd_param_flag(cctx, "reverse-verify") || + doveadm_cmd_param_str(cctx, "test-hash", &test_hash); if (list_schemes) { ARRAY_TYPE(password_scheme_p) arr; @@ -127,7 +122,7 @@ struct doveadm_cmd_ver2 doveadm_cmd_pw = { DOVEADM_CMD_PARAMS_START DOVEADM_CMD_PARAM('l', "list", CMD_PARAM_BOOL, 0) DOVEADM_CMD_PARAM('p', "plaintext", CMD_PARAM_STR, 0) -DOVEADM_CMD_PARAM('r', "rounds", CMD_PARAM_INT64, 0) +DOVEADM_CMD_PARAM('r', "rounds", CMD_PARAM_INT64, CMD_PARAM_FLAG_UNSIGNED) DOVEADM_CMD_PARAM('s', "scheme", CMD_PARAM_STR, 0) DOVEADM_CMD_PARAM('t', "test-hash", CMD_PARAM_STR, 0) DOVEADM_CMD_PARAM('u', "user", CMD_PARAM_STR, 0) diff --git a/src/doveadm/doveadm-zlib.c b/src/doveadm/doveadm-zlib.c index 0987de92e3..d205f417b7 100644 --- a/src/doveadm/doveadm-zlib.c +++ b/src/doveadm/doveadm-zlib.c @@ -294,6 +294,6 @@ struct doveadm_cmd_ver2 doveadm_cmd_zlibconnect = { .usage = " []", DOVEADM_CMD_PARAMS_START DOVEADM_CMD_PARAM('\0', "host", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) -DOVEADM_CMD_PARAM('\0', "port", CMD_PARAM_INT64, CMD_PARAM_FLAG_POSITIONAL) +DOVEADM_CMD_PARAM('\0', "port", CMD_PARAM_INT64, CMD_PARAM_FLAG_POSITIONAL|CMD_PARAM_FLAG_UNSIGNED) DOVEADM_CMD_PARAMS_END };