From: Timo Sirainen Date: Wed, 3 Nov 2010 16:24:31 +0000 (+0000) Subject: doveadm dump: Allow plugins to add more dump types X-Git-Tag: 2.0.7~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=134582c78f038b4d9b9fde127399aefa50935a53;p=thirdparty%2Fdovecot%2Fcore.git doveadm dump: Allow plugins to add more dump types --- diff --git a/src/doveadm/doveadm-dump.c b/src/doveadm/doveadm-dump.c index acd5b8ce4e..e87c4e1269 100644 --- a/src/doveadm/doveadm-dump.c +++ b/src/doveadm/doveadm-dump.c @@ -1,27 +1,28 @@ -/* Copyright (C) 2004 Joshua Goodall */ +/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */ #include "lib.h" +#include "array.h" #include "doveadm.h" #include "doveadm-dump.h" #include #include -static const struct doveadm_cmd_dump *dumps[] = { - &doveadm_cmd_dump_index, - &doveadm_cmd_dump_log, - &doveadm_cmd_dump_mailboxlog, - &doveadm_cmd_dump_thread -}; +static ARRAY_DEFINE(dumps, const struct doveadm_cmd_dump *); + +void doveadm_dump_register(const struct doveadm_cmd_dump *dump) +{ + array_append(&dumps, &dump, 1); +} static const struct doveadm_cmd_dump * dump_find_name(const char *name) { - unsigned int i; + const struct doveadm_cmd_dump *const *dumpp; - for (i = 0; i < N_ELEMENTS(dumps); i++) { - if (strcmp(dumps[i]->name, name) == 0) - return dumps[i]; + array_foreach(&dumps, dumpp) { + if (strcmp((*dumpp)->name, name) == 0) + return *dumpp; } return NULL; } @@ -29,11 +30,11 @@ dump_find_name(const char *name) static const struct doveadm_cmd_dump * dump_find_test(const char *path) { - unsigned int i; + const struct doveadm_cmd_dump *const *dumpp; - for (i = 0; i < N_ELEMENTS(dumps); i++) { - if (dumps[i]->test(path)) - return dumps[i]; + array_foreach(&dumps, dumpp) { + if ((*dumpp)->test(path)) + return *dumpp; } return NULL; } @@ -76,3 +77,24 @@ static void cmd_dump(int argc, char *argv[]) struct doveadm_cmd doveadm_cmd_dump = { cmd_dump, "dump", "[-t ] " }; + +static const struct doveadm_cmd_dump *dumps_builtin[] = { + &doveadm_cmd_dump_index, + &doveadm_cmd_dump_log, + &doveadm_cmd_dump_mailboxlog, + &doveadm_cmd_dump_thread +}; + +void doveadm_dump_init(void) +{ + unsigned int i; + + i_array_init(&dumps, N_ELEMENTS(dumps_builtin) + 8); + for (i = 0; i < N_ELEMENTS(dumps_builtin); i++) + doveadm_dump_register(dumps_builtin[i]); +} + +void doveadm_dump_deinit(void) +{ + array_free(&dumps); +} diff --git a/src/doveadm/doveadm-dump.h b/src/doveadm/doveadm-dump.h index c344fb0d3f..c72e578e37 100644 --- a/src/doveadm/doveadm-dump.h +++ b/src/doveadm/doveadm-dump.h @@ -14,4 +14,9 @@ extern struct doveadm_cmd_dump doveadm_cmd_dump_log; extern struct doveadm_cmd_dump doveadm_cmd_dump_mailboxlog; extern struct doveadm_cmd_dump doveadm_cmd_dump_thread; +void doveadm_dump_register(const struct doveadm_cmd_dump *dump); + +void doveadm_dump_init(void); +void doveadm_dump_deinit(void); + #endif diff --git a/src/doveadm/doveadm.c b/src/doveadm/doveadm.c index ece467fc91..6da650cbf1 100644 --- a/src/doveadm/doveadm.c +++ b/src/doveadm/doveadm.c @@ -9,6 +9,7 @@ #include "master-service-settings.h" #include "settings-parser.h" #include "doveadm-print-private.h" +#include "doveadm-dump.h" #include "doveadm-mail.h" #include "doveadm-settings.h" #include "doveadm.h" @@ -315,6 +316,7 @@ int main(int argc, char *argv[]) quick_init = FALSE; doveadm_register_director_commands(); doveadm_register_log_commands(); + doveadm_dump_init(); doveadm_mail_init(); doveadm_load_modules(); @@ -353,6 +355,7 @@ int main(int argc, char *argv[]) if (!quick_init) { doveadm_mail_deinit(); + doveadm_dump_deinit(); doveadm_unload_modules(); doveadm_print_deinit(); }