#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"
#include "mail-storage-settings.h"
#include "mail-storage-service.h"
#include "doveadm.h"
+#include "doveadm-settings.h"
#include "doveadm-mail.h"
#include <stdio.h>
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;
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)
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;
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;
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;
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);
}
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)
--- /dev/null
+/* 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;
#include "lib.h"
#include "array.h"
+#include "module-dir.h"
#include "master-service.h"
+#include "master-service-settings.h"
#include "doveadm-mail.h"
+#include "doveadm-settings.h"
#include "doveadm.h"
#include <stdio.h>
bool doveadm_verbose = FALSE, doveadm_debug = FALSE;
+static struct module *modules = NULL;
static ARRAY_DEFINE(doveadm_cmds, struct doveadm_cmd);
void doveadm_register_cmd(const struct doveadm_cmd *cmd)
return FALSE;
}
+static void doveadm_load_modules(void)
+{
+ struct module_dir_load_settings mod_set;
+
+ /* some doveadm plugins have dependencies to mail plugins. we can load
+ only those whose dependencies have been loaded earlier, the rest are
+ ignored. */
+ 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;
+ mod_set.ignore_dlopen_errors = TRUE;
+
+ modules = module_dir_load_missing(modules, DOVEADM_MODULEDIR,
+ NULL, &mod_set);
+ module_dir_init(modules);
+}
+
int main(int argc, char *argv[])
{
- const char *cmd_name;
+ const struct setting_parser_info *set_roots[] = {
+ &doveadm_setting_parser_info,
+ NULL
+ };
+ const char *cmd_name, *error;
int c;
/* "+" is GNU extension to stop at the first non-option.
master_service = master_service_init("doveadm",
MASTER_SERVICE_FLAG_STANDALONE,
&argc, &argv, "+Dv");
- i_array_init(&doveadm_cmds, 32);
- doveadm_mail_init();
- doveadm_register_cmd(&doveadm_cmd_help);
- doveadm_register_cmd(&doveadm_cmd_auth);
- doveadm_register_cmd(&doveadm_cmd_user);
- doveadm_register_cmd(&doveadm_cmd_dump);
- doveadm_register_cmd(&doveadm_cmd_pw);
- doveadm_register_cmd(&doveadm_cmd_who);
- doveadm_register_cmd(&doveadm_cmd_penalty);
-
while ((c = master_getopt(master_service)) > 0) {
switch (c) {
case 'D':
return FATAL_DEFAULT;
}
}
+
+ if (master_service_settings_read_simple(master_service, set_roots,
+ &error) < 0)
+ i_fatal("Error reading configuration: %s", error);
+ doveadm_settings = master_service_settings_get_others(master_service)[0];
+
+ i_array_init(&doveadm_cmds, 32);
+ doveadm_register_cmd(&doveadm_cmd_help);
+ doveadm_register_cmd(&doveadm_cmd_auth);
+ doveadm_register_cmd(&doveadm_cmd_user);
+ doveadm_register_cmd(&doveadm_cmd_dump);
+ doveadm_register_cmd(&doveadm_cmd_pw);
+ doveadm_register_cmd(&doveadm_cmd_who);
+ doveadm_register_cmd(&doveadm_cmd_penalty);
+ doveadm_mail_init();
+ doveadm_load_modules();
+
if (optind == argc)
usage();
!doveadm_mail_try_run(cmd_name, argc, argv))
usage();
- master_service_deinit(&master_service);
doveadm_mail_deinit();
+ module_dir_unload(&modules);
array_free(&doveadm_cmds);
+ master_service_deinit(&master_service);
return 0;
}