]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm dump: Allow plugins to add more dump types
authorTimo Sirainen <tss@iki.fi>
Wed, 3 Nov 2010 16:24:31 +0000 (16:24 +0000)
committerTimo Sirainen <tss@iki.fi>
Wed, 3 Nov 2010 16:24:31 +0000 (16:24 +0000)
src/doveadm/doveadm-dump.c
src/doveadm/doveadm-dump.h
src/doveadm/doveadm.c

index acd5b8ce4e15cf870bcb4d7bdac4f6e0b037ab87..e87c4e12690c1020aeb3a46fec6ed6738d5d0551 100644 (file)
@@ -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 <stdio.h>
 #include <unistd.h>
 
-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 <type>] <path>"
 };
+
+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);
+}
index c344fb0d3f2b2d47877e1e63b5a4afd1b67791c3..c72e578e379640afd433132a57f7e554ce63fe71 100644 (file)
@@ -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
index ece467fc912f29932649603303fb98b741be00c7..6da650cbf1f3d8104573dbef5e3a06cce2f1e244 100644 (file)
@@ -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();
        }