doveadm-print.c revision 4f79049854ca6a69453deb5487f2b722fdae3e35
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen#include "lib.h"
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen#include "array.h"
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen#include "doveadm-print-private.h"
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenstruct doveadm_print_header_context {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen const char *key;
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi char *sticky_value;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen bool sticky;
c6be98b5270900746f35ebe28bd636019976e29eTimo Sirainen};
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenstruct doveadm_print_context {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen pool_t pool;
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi ARRAY_DEFINE(headers, struct doveadm_print_header_context);
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen const struct doveadm_print_vfuncs *v;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen unsigned int header_idx;
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi};
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenstatic struct doveadm_print_context *ctx;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenstatic const struct doveadm_print_vfuncs *doveadm_print_vfuncs_all[] = {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen &doveadm_print_flow_vfuncs,
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen &doveadm_print_tab_vfuncs,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen &doveadm_print_table_vfuncs
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen};
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenbool doveadm_print_is_initialized(void)
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen{
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen return ctx != NULL;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen}
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenvoid doveadm_print_header(const char *key, const char *title,
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen enum doveadm_print_header_flags flags)
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen{
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen struct doveadm_print_header hdr;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen struct doveadm_print_header_context *hdr_ctx;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi if (title == NULL)
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi flags |= DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE;
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi memset(&hdr, 0, sizeof(hdr));
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi hdr.key = key;
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi hdr.title = title;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen hdr.flags = flags;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen ctx->v->header(&hdr);
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen hdr_ctx = array_append_space(&ctx->headers);
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen hdr_ctx->key = p_strdup(ctx->pool, key);
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen hdr_ctx->sticky = (flags & DOVEADM_PRINT_HEADER_FLAG_STICKY) != 0;
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen}
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomivoid doveadm_print_header_simple(const char *key_title)
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi{
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi doveadm_print_header(key_title, key_title, 0);
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi}
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomivoid doveadm_print(const char *value)
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen{
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen const struct doveadm_print_header_context *headers;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen unsigned int count;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen headers = array_get(&ctx->headers, &count);
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen for (;;) {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen if (ctx->header_idx == count)
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen ctx->header_idx = 0;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen else if (headers[ctx->header_idx].sticky) {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen ctx->v->print(headers[ctx->header_idx].sticky_value);
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen ctx->header_idx++;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen } else {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen break;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen }
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi }
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen
c6be98b5270900746f35ebe28bd636019976e29eTimo Sirainen ctx->v->print(value);
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen ctx->header_idx++;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen}
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenvoid doveadm_print_num(uintmax_t value)
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen{
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen T_BEGIN {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen doveadm_print(dec2str(value));
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen } T_END;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen}
c6be98b5270900746f35ebe28bd636019976e29eTimo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenvoid doveadm_print_sticky(const char *key, const char *value)
237a6211c7fc4d6dbb58dd0467da6dba1b8f21f6Timo Sirainen{
45ead232666a47819e89dc71dec57767340d0b62Timo Sirainen struct doveadm_print_header_context *hdr;
1e11a94ec50fc9b57eb2c859771c6a326ccaf86fAki Tuomi
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen array_foreach_modifiable(&ctx->headers, hdr) {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen if (strcmp(hdr->key, key) == 0) {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen i_free(hdr->sticky_value);
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen hdr->sticky_value = i_strdup(value);
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen return;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen }
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen }
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen i_unreached();
2d1892aaeb63b9774237b6e60d6bb04bf6f8259cTimo Sirainen}
2d1892aaeb63b9774237b6e60d6bb04bf6f8259cTimo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenvoid doveadm_print_init(const char *name)
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen{
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen pool_t pool;
2d1892aaeb63b9774237b6e60d6bb04bf6f8259cTimo Sirainen unsigned int i;
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen if (ctx != NULL) {
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen /* already forced the type */
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen return;
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen }
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen pool = pool_alloconly_create("doveadm print", 1024);
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen ctx = p_new(pool, struct doveadm_print_context, 1);
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen ctx->pool = pool;
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen p_array_init(&ctx->headers, pool, 16);
107659c01b2359b0ee426bde020c8d4e29ede30dTimo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen for (i = 0; i < N_ELEMENTS(doveadm_print_vfuncs_all); i++) {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen if (strcmp(doveadm_print_vfuncs_all[i]->name, name) == 0) {
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen ctx->v = doveadm_print_vfuncs_all[i];
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen break;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen }
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen }
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen if (ctx->v == NULL)
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen i_fatal("Unknown print formatter: %s", name);
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen if (ctx->v->init != NULL)
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen ctx->v->init();
d6b3cfd855c0eebed68be50d3111de1b5a6afeb0Timo Sirainen}
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainenvoid doveadm_print_deinit(void)
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen{
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen struct doveadm_print_header_context *hdr;
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen
71df09024cea5f2faa93da3bb9513ee96ba6bf22Timo Sirainen if (ctx == NULL)
return;
ctx->v->deinit();
array_foreach_modifiable(&ctx->headers, hdr)
i_free(hdr->sticky_value);
pool_unref(&ctx->pool);
ctx = NULL;
}