From: Marco Bettini Date: Thu, 28 Apr 2022 08:37:49 +0000 (+0000) Subject: doveadm: Add doveadm_cmd_param_dump() doveadm_cmd_args_dump() debug functions X-Git-Tag: 2.4.0~4010 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=32f548da2ba54e425302e9921809a8b250e9dece;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Add doveadm_cmd_param_dump() doveadm_cmd_args_dump() debug functions --- diff --git a/src/doveadm/doveadm-cmd-parse.c b/src/doveadm/doveadm-cmd-parse.c index c33bd969e5..43f0eeabb0 100644 --- a/src/doveadm/doveadm-cmd-parse.c +++ b/src/doveadm/doveadm-cmd-parse.c @@ -4,6 +4,7 @@ #include "array.h" #include "istream.h" #include "str.h" +#include "strescape.h" #include "net.h" #include "doveadm.h" #include "doveadm-cmd-parse.h" @@ -403,3 +404,68 @@ int doveadm_cmdline_run(int argc, const char *const argv[], doveadm_cmd_params_clean(&pargv); return 0; } + +static const char* +doveadm_cmd_param_tostring(const struct doveadm_cmd_param *argv) +{ + if (!argv->value_set) + return ""; + switch(argv->type) { + case CMD_PARAM_ISTREAM: + return "stream"; + case CMD_PARAM_BOOL: + return argv->value.v_bool ? "TRUE" : "FALSE"; + case CMD_PARAM_IP: + return net_ip2addr(&argv->value.v_ip); + case CMD_PARAM_INT64: + return t_strdup_printf("%ld", argv->value.v_int64); + case CMD_PARAM_STR: { + const char *item = argv->value.v_string; + size_t item_len = strlen(item); + string_t *value = t_str_new(item_len + 2); + str_append_c(value, '"'); + str_append_escaped(value, item, item_len); + str_append_c(value, '"'); + return str_c(value); + } + case CMD_PARAM_ARRAY: { + string_t *value = t_str_new(64); + const char *const *item; + array_foreach(&argv->value.v_array, item) { + if (str_len(value) > 0) str_append(value, ", "); + str_append_c(value, '"'); + str_append_escaped(value, *item, strlen(*item)); + str_append_c(value, '"'); + } + return str_c(value); + } + default: + return ""; + } +} + +void doveadm_cmd_params_dump(const struct doveadm_cmd_context *cctx) +{ + i_debug("%s()", __func__); + i_assert(cctx != NULL); + i_assert(cctx->argv != NULL); + const struct doveadm_cmd_param *argv = cctx->argv; + for (int index = 0; index < cctx->argc; index++, argv++) T_BEGIN { + const char *value = doveadm_cmd_param_tostring(argv); + i_debug(" %c%c%c%c %02x/%02x -%c %s: %s", + *value != '\0' ? 'S': '-', + argv->type == CMD_PARAM_ARRAY ? 'A': '-', + (argv->flags & CMD_PARAM_FLAG_POSITIONAL) != 0 ? 'P': '-', + (argv->flags & CMD_PARAM_FLAG_KEY_VALUE) != 0 ? 'N': '-', + (int)argv->type, (int)argv->flags, + argv->short_opt != '\0' ? argv->short_opt : '-', + argv->name, value); + } T_END; +} + +void doveadm_cmd_args_dump(const char *const *items) +{ + i_debug("%s()", __func__); + for (; *items != NULL; items++) + i_debug(" %s", *items); +} diff --git a/src/doveadm/doveadm-cmd-parse.h b/src/doveadm/doveadm-cmd-parse.h index eee77dfdd1..ccbabaa434 100644 --- a/src/doveadm/doveadm-cmd-parse.h +++ b/src/doveadm/doveadm-cmd-parse.h @@ -155,4 +155,8 @@ bool doveadm_cmd_param_istream(const struct doveadm_cmd_context *cctx, void doveadm_cmd_params_clean(ARRAY_TYPE(doveadm_cmd_param_arr_t) *pargv); void doveadm_cmd_params_null_terminate_arrays(ARRAY_TYPE(doveadm_cmd_param_arr_t) *pargv); +/* debug functions */ +void doveadm_cmd_args_dump(const char *const *items); +void doveadm_cmd_params_dump(const struct doveadm_cmd_context *cctx); + #endif