dovecot-2.0: doveadm: Added support for plugins.
dovecot at dovecot.org
dovecot at dovecot.org
Mon Mar 8 17:29:24 EET 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/b06d874708d4
changeset: 10859:b06d874708d4
user: Timo Sirainen <tss at iki.fi>
date: Mon Mar 08 17:28:29 2010 +0200
description:
doveadm: Added support for plugins.
diffstat:
src/doveadm/Makefile.am | 26 +++++++-
src/doveadm/doveadm-mail.c | 102 ++++++++++++++++++++--------------
src/doveadm/doveadm-settings.c | 34 +++++++++++
src/doveadm/doveadm-settings.h | 12 ++++
src/doveadm/doveadm.c | 60 +++++++++++++++----
5 files changed, 174 insertions(+), 60 deletions(-)
diffs (truncated from 414 to 300 lines):
diff -r c9dc5c447db5 -r b06d874708d4 src/doveadm/Makefile.am
--- a/src/doveadm/Makefile.am Mon Mar 08 17:28:04 2010 +0200
+++ b/src/doveadm/Makefile.am Mon Mar 08 17:28:29 2010 +0200
@@ -1,7 +1,10 @@
+doveadm_moduledir = $(moduledir)/doveadm
+
bin_PROGRAMS = doveadm
AM_CPPFLAGS = \
-I$(top_srcdir)/src/lib \
+ -I$(top_srcdir)/src/lib-settings \
-I$(top_srcdir)/src/lib-auth \
-I$(top_srcdir)/src/lib-dict \
-I$(top_srcdir)/src/lib-master \
@@ -10,21 +13,32 @@
-I$(top_srcdir)/src/lib-index \
-I$(top_srcdir)/src/lib-storage \
-I$(top_srcdir)/src/auth \
+ -DMODULEDIR=\""$(moduledir)"\" \
+ -DDOVEADM_MODULEDIR=\""$(doveadm_moduledir)"\" \
-DPKG_RUNDIR=\""$(rundir)"\"
+if !BUILD_SHARED_LIBS
+unused_objects = \
+ ../lib/mountpoint.o \
+ ../lib-imap/imap-util.o
+endif
+
cmd_pw_libs = \
../auth/libpassword.a \
../lib-ntlm/libntlm.a \
../lib-otp/libotp.a
+libs = \
+ $(LIBDOVECOT_STORAGE) \
+ $(cmd_pw_libs) \
+ $(unused_objects)
+
doveadm_LDADD = \
- $(cmd_pw_libs) $(AUTH_LIBS) \
- $(LIBDOVECOT_STORAGE) \
+ $(libs) $(AUTH_LIBS) \
$(LIBDOVECOT) \
$(MODULE_LIBS)
doveadm_DEPENDENCIES = \
- $(cmd_pw_libs) \
- $(LIBDOVECOT_STORAGE) \
+ $(libs) \
$(LIBDOVECOT_DEPS)
doveadm_SOURCES = \
@@ -38,9 +52,11 @@
doveadm-mail.c \
doveadm-penalty.c \
doveadm-pw.c \
+ doveadm-settings.c \
doveadm-who.c
noinst_HEADERS = \
doveadm.h \
doveadm-dump.h \
- doveadm-mail.h
+ doveadm-mail.h \
+ doveadm-settings.h
diff -r c9dc5c447db5 -r b06d874708d4 src/doveadm/doveadm-mail.c
--- a/src/doveadm/doveadm-mail.c Mon Mar 08 17:28:04 2010 +0200
+++ b/src/doveadm/doveadm-mail.c Mon Mar 08 17:28:29 2010 +0200
@@ -4,6 +4,7 @@
#include "array.h"
#include "lib-signals.h"
#include "ioloop.h"
+#include "module-dir.h"
#include "master-service.h"
#include "mail-user.h"
#include "mail-namespace.h"
@@ -11,6 +12,7 @@
#include "mail-storage-settings.h"
#include "mail-storage-service.h"
#include "doveadm.h"
+#include "doveadm-settings.h"
#include "doveadm-mail.h"
#include <stdio.h>
@@ -75,40 +77,11 @@
mailbox_free(&box);
}
-static void
-doveadm_mail_single_user(doveadm_mail_command_t *cmd, const char *username,
- enum mail_storage_service_flags service_flags,
- const char *args[])
-{
- struct mail_storage_service_ctx *storage_service;
- struct mail_storage_service_user *service_user;
- struct mail_storage_service_input input;
- struct mail_user *mail_user;
- const char *error;
-
- if (username == NULL)
- i_fatal("USER environment is missing and -u option not used");
-
- memset(&input, 0, sizeof(input));
- input.username = username;
-
- storage_service = mail_storage_service_init(master_service, NULL,
- service_flags);
- if (mail_storage_service_lookup_next(storage_service, &input,
- &service_user, &mail_user,
- &error) <= 0)
- i_fatal("%s", error);
- cmd(mail_user, args);
- mail_user_unref(&mail_user);
- mail_storage_service_user_free(&service_user);
- mail_storage_service_deinit(&storage_service);
-}
-
static int
doveadm_mail_next_user(doveadm_mail_command_t *cmd,
struct mail_storage_service_ctx *storage_service,
const struct mail_storage_service_input *input,
- const char *args[])
+ const char *args[], const char **error_r)
{
struct mail_storage_service_user *service_user;
struct mail_user *mail_user;
@@ -119,24 +92,51 @@
ret = mail_storage_service_lookup(storage_service, input,
&service_user, &error);
if (ret <= 0) {
- if (ret == 0) {
- i_info("User no longer exists, skipping");
- return 0;
- } else {
- i_error("User lookup failed: %s", error);
- return -1;
+ if (ret < 0) {
+ *error_r = t_strdup_printf("User lookup failed: %s",
+ error);
}
+ return ret;
}
+
if (mail_storage_service_next(storage_service, service_user,
&mail_user, &error) < 0) {
- i_error("User init failed: %s", error);
+ *error_r = t_strdup_printf("User init failed: %s", error);
mail_storage_service_user_free(&service_user);
return -1;
}
+
cmd(mail_user, args);
mail_storage_service_user_free(&service_user);
mail_user_unref(&mail_user);
- return 0;
+ return 1;
+}
+
+static void
+doveadm_mail_single_user(doveadm_mail_command_t *cmd, const char *username,
+ enum mail_storage_service_flags service_flags,
+ const char *args[])
+{
+ struct mail_storage_service_ctx *storage_service;
+ struct mail_storage_service_input input;
+ const char *error;
+ int ret;
+
+ if (username == NULL)
+ i_fatal("USER environment is missing and -u option not used");
+
+ memset(&input, 0, sizeof(input));
+ input.username = username;
+
+ storage_service = mail_storage_service_init(master_service, NULL,
+ service_flags);
+ ret = doveadm_mail_next_user(cmd, storage_service, &input,
+ args, &error);
+ if (ret < 0)
+ i_fatal("%s", error);
+ else if (ret == 0)
+ i_fatal("User no longer exists");
+ mail_storage_service_deinit(&storage_service);
}
static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
@@ -152,7 +152,7 @@
struct mail_storage_service_input input;
struct mail_storage_service_ctx *storage_service;
unsigned int user_idx, user_count, interval, n;
- const char *user;
+ const char *user, *error;
int ret;
service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
@@ -177,7 +177,11 @@
input.username = user;
T_BEGIN {
ret = doveadm_mail_next_user(cmd, storage_service,
- &input, args);
+ &input, args, &error);
+ if (ret < 0)
+ i_error("%s", error);
+ else if (ret == 0)
+ i_info("User no longer exists, skipping");
} T_END;
if (ret < 0)
break;
@@ -204,7 +208,8 @@
static void
doveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
{
- enum mail_storage_service_flags service_flags = 0;
+ enum mail_storage_service_flags service_flags =
+ MAIL_STORAGE_SERVICE_FLAG_NO_LOG_INIT;
const char *username;
bool all_users = FALSE;
int c;
@@ -268,7 +273,7 @@
void doveadm_mail_help(const struct doveadm_mail_cmd *cmd)
{
- fprintf(stderr, "doveadm %s %s\n", cmd->name,
+ fprintf(stderr, "doveadm %s <user>|-a %s\n", cmd->name,
cmd->usage_args == NULL ? "" : cmd->usage_args);
exit(0);
}
@@ -290,11 +295,24 @@
void doveadm_mail_init(void)
{
+ struct module_dir_load_settings mod_set;
unsigned int i;
i_array_init(&doveadm_mail_cmds, 32);
for (i = 0; i < N_ELEMENTS(mail_commands); i++)
doveadm_mail_register_cmd(&mail_commands[i]);
+
+ memset(&mod_set, 0, sizeof(mod_set));
+ mod_set.version = master_service_get_version_string(master_service);
+ mod_set.require_init_funcs = TRUE;
+ mod_set.debug = doveadm_debug;
+
+ /* load all configured mail plugins */
+ mail_storage_service_modules =
+ module_dir_load_missing(mail_storage_service_modules,
+ doveadm_settings->mail_plugin_dir,
+ doveadm_settings->mail_plugins,
+ &mod_set);
}
void doveadm_mail_deinit(void)
diff -r c9dc5c447db5 -r b06d874708d4 src/doveadm/doveadm-settings.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/doveadm/doveadm-settings.c Mon Mar 08 17:28:29 2010 +0200
@@ -0,0 +1,34 @@
+/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "settings-parser.h"
+#include "doveadm-settings.h"
+
+#undef DEF
+#define DEF(type, name) \
+ { type, #name, offsetof(struct doveadm_settings, name), NULL }
+
+static const struct setting_define doveadm_setting_defines[] = {
+ DEF(SET_STR, mail_plugins),
+ DEF(SET_STR, mail_plugin_dir),
+
+ SETTING_DEFINE_LIST_END
+};
+
+const struct doveadm_settings doveadm_default_settings = {
+ .mail_plugins = "",
+ .mail_plugin_dir = MODULEDIR
+};
+
+const struct setting_parser_info doveadm_setting_parser_info = {
+ .module_name = "doveadm",
+ .defines = doveadm_setting_defines,
+ .defaults = &doveadm_default_settings,
+
+ .type_offset = (size_t)-1,
+ .struct_size = sizeof(struct doveadm_settings),
+
+ .parent_offset = (size_t)-1
+};
+
+const struct doveadm_settings *doveadm_settings;
diff -r c9dc5c447db5 -r b06d874708d4 src/doveadm/doveadm-settings.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/doveadm/doveadm-settings.h Mon Mar 08 17:28:29 2010 +0200
@@ -0,0 +1,12 @@
+#ifndef DOVEADM_SETTINGS_H
+#define DOVEADM_SETTINGS_H
+
+struct doveadm_settings {
+ const char *mail_plugins;
+ const char *mail_plugin_dir;
+};
More information about the dovecot-cvs
mailing list