mail-search.c \
mail-search-build.c \
mail-storage.c \
+ mail-storage-hooks.c \
mail-storage-settings.c \
mail-thread.c \
mail-user.c \
mail-thread.h \
mail-storage.h \
mail-storage-private.h \
+ mail-storage-hooks.h \
mail-storage-service.h \
mail-storage-settings.h \
mail-user.h \
{ NULL, 0, 0 }
};
-static void (*index_list_next_hook_mailbox_created)(struct mailbox *box);
-
static MODULE_CONTEXT_DEFINE_INIT(index_list_storage_module,
&mail_storage_module_register);
INDEX_LIST_CONTEXT(box->list);
struct index_list_mailbox *ibox;
- if (index_list_next_hook_mailbox_created != NULL)
- index_list_next_hook_mailbox_created(box);
-
if (ilist == NULL)
return;
}
}
+static struct mail_storage_hooks index_mailbox_list_sync_hooks = {
+ .mailbox_allocated = index_list_mail_mailbox_allocated
+};
+
void index_mailbox_list_sync_init(void)
{
- index_list_next_hook_mailbox_created = hook_mailbox_allocated;
- hook_mailbox_allocated = index_list_mail_mailbox_allocated;
+ mail_storage_hooks_add_internal(&index_mailbox_list_sync_hooks);
}
#include "imap-match.h"
#include "mail-index.h"
#include "mail-storage.h"
+#include "mail-storage-hooks.h"
#include "mailbox-tree.h"
#include "mailbox-list-subscriptions.h"
#include "mailbox-list-index.h"
struct index_mailbox_list_module index_mailbox_list_module =
MODULE_CONTEXT_INIT(&mailbox_list_module_register);
-static void (*index_next_hook_mailbox_list_created)(struct mailbox_list *list);
static enum mailbox_info_flags
index_mailbox_list_index_flags_translate(enum mailbox_list_index_flags flags)
}
}
+static struct mail_storage_hooks index_mailbox_list_hooks = {
+ .mailbox_list_created = index_mailbox_list_created
+};
+
void index_mailbox_list_init(void); /* called in mailbox-list-register.c */
void index_mailbox_list_init(void)
{
- index_next_hook_mailbox_list_created = hook_mailbox_list_created;
- hook_mailbox_list_created = index_mailbox_list_created;
-
+ mail_storage_hooks_add_internal(&index_mailbox_list_hooks);
index_mailbox_list_sync_init();
}
#include <stdlib.h>
-void (*hook_mail_namespaces_created)(struct mail_namespace *namespaces);
-
void mail_namespace_add_storage(struct mail_namespace *ns,
struct mail_storage *storage)
{
}
mail_user_add_namespace(user, &namespaces);
- if (hook_mail_namespaces_created != NULL) {
- T_BEGIN {
- hook_mail_namespaces_created(namespaces);
- } T_END;
- }
+ T_BEGIN {
+ hook_mail_namespaces_created(namespaces);
+ } T_END;
return 0;
}
const struct mail_storage_settings *mail_set;
};
-/* Called after namespaces has been created */
-extern void (*hook_mail_namespaces_created)(struct mail_namespace *namespaces);
-
int mail_namespaces_init(struct mail_user *user, const char **error_r);
struct mail_namespace *mail_namespaces_init_empty(struct mail_user *user);
/* Deinitialize all namespaces. mail_user_deinit() calls this automatically
#include "module-context.h"
#include "file-lock.h"
#include "mail-storage.h"
+#include "mail-storage-hooks.h"
#include "mail-storage-settings.h"
#include "mail-index-private.h"
/* Block size when read()ing message (header and) body. */
#define MAIL_READ_FULL_BLOCK_SIZE (1024*8)
-/* Called after mail storage has been created */
-extern void (*hook_mail_storage_created)(struct mail_storage *storage);
-/* Called after mailbox has been allocated */
-extern void (*hook_mailbox_allocated)(struct mailbox *box);
-/* Called after mailbox index has been opened */
-extern void (*hook_mailbox_index_opened)(struct mailbox *box);
-
struct mail_storage_module_register {
unsigned int id;
};
struct mail_storage_mail_index_module mail_storage_mail_index_module =
MODULE_CONTEXT_INIT(&mail_index_module_register);
-void (*hook_mail_storage_created)(struct mail_storage *storage);
-void (*hook_mailbox_allocated)(struct mailbox *box) = NULL;
-void (*hook_mailbox_index_opened)(struct mailbox *box) = NULL;
-
ARRAY_TYPE(mail_storage) mail_storage_classes;
void mail_storage_init(void)
{
mailbox_lists_init();
+ mail_storage_hooks_init();
i_array_init(&mail_storage_classes, 8);
}
{
if (array_is_created(&mail_storage_classes))
array_free(&mail_storage_classes);
+ mail_storage_hooks_deinit();
mailbox_lists_deinit();
}
return -1;
}
- if (hook_mail_storage_created != NULL) T_BEGIN {
+ T_BEGIN {
hook_mail_storage_created(storage);
} T_END;
T_BEGIN {
box = storage->v.mailbox_alloc(storage, new_list,
name, input, flags);
- if (hook_mailbox_allocated != NULL)
- hook_mailbox_allocated(box);
+ hook_mailbox_allocated(box);
} T_END;
return box;
}
struct mail_user_module_register mail_user_module_register = { 0 };
struct auth_master_connection *mail_user_auth_master_conn;
-void (*hook_mail_user_created)(struct mail_user *user) = NULL;
-
static void mail_user_deinit_base(struct mail_user *user)
{
mail_namespaces_deinit(&user->namespaces);
user->mail_debug = mail_set->mail_debug;
user->initialized = TRUE;
- if (hook_mail_user_created != NULL)
- hook_mail_user_created(user);
+ hook_mail_user_created(user);
return 0;
}
struct mail_user_settings *set;
struct mail_namespace *namespaces;
struct mail_storage *storages;
+ ARRAY_DEFINE(hooks, const struct mail_storage_hooks *);
/* Module-specific contexts. See mail_storage_module_id. */
ARRAY_DEFINE(module_contexts, union mail_user_module_context *);
extern struct mail_user_module_register mail_user_module_register;
extern struct auth_master_connection *mail_user_auth_master_conn;
-/* Called after user has been created */
-extern void (*hook_mail_user_created)(struct mail_user *user);
-
struct mail_user *mail_user_alloc(const char *username,
const struct setting_parser_info *set_info,
const struct mail_user_settings *set);
use objects' module_contexts[id] for their own purposes. */
extern struct mailbox_list_module_register mailbox_list_module_register;
-extern void (*hook_mailbox_list_created)(struct mailbox_list *list);
-
void mailbox_lists_init(void);
void mailbox_lists_deinit(void);
struct mailbox_list_module_register mailbox_list_module_register = { 0 };
-void (*hook_mailbox_list_created)(struct mailbox_list *list);
-
static ARRAY_DEFINE(mailbox_list_drivers, const struct mailbox_list *);
void mailbox_lists_init(void)
}
mail_namespace_finish_list_init(ns, list);
- if (hook_mailbox_list_created != NULL)
- hook_mailbox_list_created(list);
+ hook_mailbox_list_created(list);
return 0;
}
}
/* get our init func */
- module->init = (void (*)(void))
+ module->init = (void (*)(struct module *))
get_symbol(module, t_strconcat(name, "_init", NULL),
!require_init_funcs);
module->deinit = module->init == NULL ? NULL : (void (*)(void))
for (module = modules; module != NULL; module = module->next) {
if (module->init != NULL) {
T_BEGIN {
- module->init();
+ module->init(module);
} T_END;
}
}
char *path, *name;
void *handle;
- void (*init)(void);
+ void (*init)(struct module *module);
void (*deinit)(void);
struct module *next;
return FALSE;
}
+bool str_array_find(const char *const *arr, const char *value)
+{
+ for (; *arr != NULL; arr++) {
+ if (strcmp(*arr, value) == 0)
+ return TRUE;
+ }
+ return FALSE;
+}
+
bool str_array_icase_find(const char *const *arr, const char *value)
{
for (; *arr != NULL; arr++) {
ATTR_MALLOC;
/* Removes a value from NULL-terminated string array. Returns TRUE if found. */
bool str_array_remove(const char **arr, const char *value);
-/* Returns TRUE if value exists in NULL-terminated string array.
- Strings are compared case-insensitively. */
+/* Returns TRUE if value exists in NULL-terminated string array. */
+bool str_array_find(const char *const *arr, const char *value);
+/* Like str_array_find(), but use strcasecmp(). */
bool str_array_icase_find(const char *const *arr, const char *value);
/* INTERNAL */
} else {
acl_mailbox_list_init_default(list);
}
-
- if (acl_next_hook_mailbox_list_created != NULL)
- acl_next_hook_mailbox_list_created(list);
}
#include <stdlib.h>
-void (*acl_next_hook_mail_storage_created)(struct mail_storage *storage);
-void (*acl_next_hook_mailbox_list_created)(struct mailbox_list *list);
-void (*acl_next_hook_mail_user_created)(struct mail_user *user);
-
const char *acl_plugin_version = PACKAGE_VERSION;
-void acl_plugin_init(void)
-{
- acl_next_hook_mail_storage_created = hook_mail_storage_created;
- hook_mail_storage_created = acl_mail_storage_created;
-
- acl_next_hook_mailbox_list_created = hook_mailbox_list_created;
- hook_mailbox_list_created = acl_mailbox_list_created;
+static struct mail_storage_hooks acl_mail_storage_hooks = {
+ .mail_user_created = acl_mail_user_created,
+ .mail_storage_created = acl_mail_storage_created,
+ .mailbox_list_created = acl_mailbox_list_created
+};
- acl_next_hook_mail_user_created = hook_mail_user_created;
- hook_mail_user_created = acl_mail_user_created;
+void acl_plugin_init(struct module *module)
+{
+ mail_storage_hooks_add(module, &acl_mail_storage_hooks);
}
void acl_plugin_deinit(void)
{
- hook_mail_storage_created = acl_next_hook_mail_storage_created;
- hook_mailbox_list_created = acl_next_hook_mailbox_list_created;
- hook_mail_user_created = acl_next_hook_mail_user_created;
+ mail_storage_hooks_remove(&acl_mail_storage_hooks);
}
struct acl_storage_rights_context rights;
};
-extern void (*acl_next_hook_mail_storage_created)(struct mail_storage *storage);
-extern void (*acl_next_hook_mailbox_list_created)(struct mailbox_list *list);
-extern void (*acl_next_hook_mail_user_created)(struct mail_user *user);
extern MODULE_CONTEXT_DEFINE(acl_storage_module, &mail_storage_module_register);
extern MODULE_CONTEXT_DEFINE(acl_user_module, &mail_user_module_register);
extern MODULE_CONTEXT_DEFINE(acl_mailbox_list_module,
bool parent, unsigned int acl_storage_right_idx,
bool *can_see_r);
-void acl_plugin_init(void);
+void acl_plugin_init(struct module *module);
void acl_plugin_deinit(void);
#endif
if (auser == NULL) {
/* ACLs disabled for this user */
- } else {
- astorage = p_new(storage->pool,
- union mail_storage_module_context, 1);
- astorage->super = storage->v;
- storage->v.mailbox_alloc = acl_mailbox_alloc;
-
- MODULE_CONTEXT_SET_SELF(storage, acl_storage_module, astorage);
+ return;
}
- if (acl_next_hook_mail_storage_created != NULL)
- acl_next_hook_mail_storage_created(storage);
+ astorage = p_new(storage->pool, union mail_storage_module_context, 1);
+ astorage->super = storage->v;
+ storage->v.mailbox_alloc = acl_mailbox_alloc;
+
+ MODULE_CONTEXT_SET_SELF(storage, acl_storage_module, astorage);
}
static void acl_user_deinit(struct mail_user *user)
if (user->mail_debug)
i_debug("acl: No acl setting - ACLs are disabled");
}
-
- if (acl_next_hook_mail_user_created != NULL)
- acl_next_hook_mail_user_created(user);
}
#include "lib.h"
#include "mail-storage.h"
+#include "mail-storage-hooks.h"
#include "mail-namespace.h"
#include "autocreate-plugin.h"
const char *autocreate_plugin_version = PACKAGE_VERSION;
-static void (*autocreate_next_hook_mail_namespaces_created)
- (struct mail_namespace *ns);
-
static void
autocreate_mailbox(struct mail_namespace *namespaces, const char *name)
{
{
autocreate_mailboxes(namespaces);
autosubscribe_mailboxes(namespaces);
-
- if (autocreate_next_hook_mail_namespaces_created != NULL)
- autocreate_next_hook_mail_namespaces_created(namespaces);
}
-void autocreate_plugin_init(void)
+static struct mail_storage_hooks autocreate_mail_storage_hooks = {
+ .mail_namespaces_created = autocreate_mail_namespaces_created
+};
+
+void autocreate_plugin_init(struct module *module)
{
- autocreate_next_hook_mail_namespaces_created =
- hook_mail_namespaces_created;
- hook_mail_namespaces_created = autocreate_mail_namespaces_created;
+ mail_storage_hooks_add(module, &autocreate_mail_storage_hooks);
}
void autocreate_plugin_deinit(void)
{
- hook_mail_namespaces_created =
- autocreate_next_hook_mail_namespaces_created;
+ mail_storage_hooks_remove(&autocreate_mail_storage_hooks);
}
#ifndef AUTOCREATE_PLUGIN_H
#define AUTOCREATE_PLUGIN_H
-void autocreate_plugin_init(void);
+void autocreate_plugin_init(struct module *module);
void autocreate_plugin_deinit(void);
#endif
#include "lib.h"
#include "mail-namespace.h"
+#include "mail-storage-hooks.h"
#include "convert-storage.h"
#include "convert-plugin.h"
const char *convert_plugin_version = PACKAGE_VERSION;
-static void (*convert_next_hook_mail_namespaces_created)
- (struct mail_namespace *namespaces);
-
static void convert_mail_storage(struct mail_namespace *namespaces,
const char *convert_mail)
{
}
static void
-convert_hook_mail_namespaces_created(struct mail_namespace *namespaces)
+convert_mail_namespaces_created(struct mail_namespace *namespaces)
{
const char *convert_mail;
convert_mail_storage(namespaces, convert_mail);
else if (namespaces->user->mail_debug)
i_debug("convert: No convert_mail setting - plugin disabled");
-
- if (convert_next_hook_mail_namespaces_created != NULL)
- convert_next_hook_mail_namespaces_created(namespaces);
}
-void convert_plugin_init(void)
+static struct mail_storage_hooks convert_mail_storage_hooks = {
+ .mail_namespaces_created = convert_mail_namespaces_created
+};
+
+void convert_plugin_init(struct module *module)
{
- convert_next_hook_mail_namespaces_created =
- hook_mail_namespaces_created;
- hook_mail_namespaces_created = convert_hook_mail_namespaces_created;
+ mail_storage_hooks_add(module, &convert_mail_storage_hooks);
}
void convert_plugin_deinit(void)
{
- hook_mail_namespaces_created =
- convert_next_hook_mail_namespaces_created;
+ mail_storage_hooks_remove(&convert_mail_storage_hooks);
}
#ifndef CONVERT_PLUGIN_H
#define CONVERT_PLUGIN_H
-void convert_plugin_init(void);
+void convert_plugin_init(struct module *module);
void convert_plugin_deinit(void);
#endif
const char *expire_plugin_version = PACKAGE_VERSION;
-static void (*next_hook_mailbox_allocated)(struct mailbox *box);
-static void (*next_hook_mail_namespaces_created)(struct mail_namespace *ns);
-
static MODULE_CONTEXT_DEFINE_INIT(expire_storage_module,
&mail_storage_module_register);
static MODULE_CONTEXT_DEFINE_INIT(expire_mail_module, &mail_module_register);
if (euser != NULL)
expire_mailbox_allocate_init(box, euser);
-
- if (next_hook_mailbox_allocated != NULL)
- next_hook_mailbox_allocated(box);
}
static void expire_mail_user_deinit(struct mail_user *user)
else
MODULE_CONTEXT_SET(user, expire_mail_user_module, euser);
}
-
- if (next_hook_mail_namespaces_created != NULL)
- next_hook_mail_namespaces_created(ns);
}
-void expire_plugin_init(void)
-{
- next_hook_mailbox_allocated = hook_mailbox_allocated;
- hook_mailbox_allocated = expire_mailbox_allocated;
+static struct mail_storage_hooks expire_mail_storage_hooks = {
+ .mail_namespaces_created = expire_mail_namespaces_created,
+ .mailbox_allocated = expire_mailbox_allocated
+};
- next_hook_mail_namespaces_created = hook_mail_namespaces_created;
- hook_mail_namespaces_created = expire_mail_namespaces_created;
+void expire_plugin_init(struct module *module)
+{
+ mail_storage_hooks_add(module, &expire_mail_storage_hooks);
}
void expire_plugin_deinit(void)
{
- hook_mailbox_allocated = next_hook_mailbox_allocated;
- hook_mail_namespaces_created = next_hook_mail_namespaces_created;
+ mail_storage_hooks_remove(&expire_mail_storage_hooks);
}
#ifndef EXPIRE_PLUGIN_H
#define EXPIRE_PLUGIN_H
-void expire_plugin_init(void);
+void expire_plugin_init(struct module *module);
void expire_plugin_deinit(void);
#endif
unsigned int fts_lucene_storage_module_id;
-void fts_lucene_plugin_init(void)
+void fts_lucene_plugin_init(struct module *module ATTR_UNUSED)
{
fts_backend_register(&fts_backend_lucene);
}
extern struct fts_backend fts_backend_lucene;
-void fts_lucene_plugin_init(void);
+void fts_lucene_plugin_init(struct module *module);
void fts_lucene_plugin_deinit(void);
#endif
#include "lib.h"
#include "array.h"
#include "mail-user.h"
+#include "mail-storage-hooks.h"
#include "fts-solr-plugin.h"
#include <stdlib.h>
const char *fts_solr_plugin_version = PACKAGE_VERSION;
-static void (*fts_solr_next_hook_mail_user_created)(struct mail_user *user);
struct fts_solr_user_module fts_solr_user_module =
MODULE_CONTEXT_INIT(&mail_user_module_register);
env = mail_user_plugin_getenv(user, "fts_solr");
if (env != NULL)
fts_solr_mail_user_create(user, env);
-
- if (fts_solr_next_hook_mail_user_created != NULL)
- fts_solr_next_hook_mail_user_created(user);
}
-void fts_solr_plugin_init(void)
+static struct mail_storage_hooks fts_solr_mail_storage_hooks = {
+ .mail_user_created = fts_solr_mail_user_created
+};
+
+void fts_solr_plugin_init(struct module *module)
{
fts_backend_register(&fts_backend_solr);
-
- fts_solr_next_hook_mail_user_created = hook_mail_user_created;
- hook_mail_user_created = fts_solr_mail_user_created;
+ mail_storage_hooks_add(module, &fts_solr_mail_storage_hooks);
}
void fts_solr_plugin_deinit(void)
{
fts_backend_unregister(fts_backend_solr.name);
- hook_mail_user_created = fts_solr_next_hook_mail_user_created;
+ mail_storage_hooks_remove(&fts_solr_mail_storage_hooks);
}
const char *fts_solr_plugin_dependencies[] = { "fts", NULL };
extern struct fts_backend fts_backend_solr;
extern MODULE_CONTEXT_DEFINE(fts_solr_user_module, &mail_user_module_register);
-void fts_solr_plugin_init(void);
+void fts_solr_plugin_init(struct module *module);
void fts_solr_plugin_deinit(void);
#endif
const char *fts_squat_plugin_version = PACKAGE_VERSION;
-void fts_squat_plugin_init(void)
+void fts_squat_plugin_init(struct module *module ATTR_UNUSED)
{
fts_backend_register(&fts_backend_squat);
}
#include "fts-api-private.h"
+struct module;
+
extern const char *fts_squat_plugin_dependencies[];
extern struct fts_backend fts_backend_squat;
-void fts_squat_plugin_init(void);
+void fts_squat_plugin_init(struct module *module);
void fts_squat_plugin_deinit(void);
#endif
/* Copyright (c) 2006-2009 Dovecot authors, see the included COPYING file */
#include "lib.h"
-#include "mail-storage-private.h"
+#include "mail-storage-hooks.h"
#include "fts-plugin.h"
#include <stdlib.h>
const char *fts_plugin_version = PACKAGE_VERSION;
-void (*fts_next_hook_mailbox_allocated)(struct mailbox *box);
+static struct mail_storage_hooks fts_mail_storage_hooks = {
+ .mailbox_allocated = fts_mailbox_allocated
+};
-void fts_plugin_init(void)
+void fts_plugin_init(struct module *module)
{
- fts_next_hook_mailbox_allocated = hook_mailbox_allocated;
- hook_mailbox_allocated = fts_mailbox_allocated;
+ mail_storage_hooks_add(module, &fts_mail_storage_hooks);
}
void fts_plugin_deinit(void)
{
- hook_mailbox_allocated = fts_next_hook_mailbox_allocated;
+ mail_storage_hooks_remove(&fts_mail_storage_hooks);
}
#ifndef FTS_PLUGIN_H
#define FTS_PLUGIN_H
-extern void (*fts_next_hook_mailbox_allocated)(struct mailbox *box);
-
void fts_mailbox_allocated(struct mailbox *box);
-void fts_plugin_init(void);
+void fts_plugin_init(struct module *module);
void fts_plugin_deinit(void);
#endif
env = mail_user_plugin_getenv(box->storage->user, "fts");
if (env != NULL)
fts_mailbox_init(box, env);
-
- if (fts_next_hook_mailbox_allocated != NULL)
- fts_next_hook_mailbox_allocated(box);
}
next_hook_client_created(client);
}
-void imap_acl_plugin_init(void)
+void imap_acl_plugin_init(struct module *module ATTR_UNUSED)
{
command_register("LISTRIGHTS", cmd_listrights, 0);
command_register("GETACL", cmd_getacl, 0);
extern const char *imap_acl_plugin_dependencies[];
-void imap_acl_plugin_init(void);
+void imap_acl_plugin_init(struct module *module);
void imap_acl_plugin_deinit(void);
#endif
next_hook_client_created(client);
}
-void imap_quota_plugin_init(void)
+void imap_quota_plugin_init(struct module *module ATTR_UNUSED)
{
command_register("GETQUOTAROOT", cmd_getquotaroot, 0);
command_register("GETQUOTA", cmd_getquota, 0);
#ifndef IMAP_QUOTA_PLUGIN_H
#define IMAP_QUOTA_PLUGIN_H
+struct module;
+
extern const char *imap_quota_plugin_dependencies[];
-void imap_quota_plugin_init(void);
+void imap_quota_plugin_init(struct module *module);
void imap_quota_plugin_deinit(void);
#endif
const char *lazy_expunge_plugin_version = PACKAGE_VERSION;
-static void (*lazy_expunge_next_hook_mail_namespaces_created)
- (struct mail_namespace *namespaces);
-static void (*lazy_expunge_next_hook_mailbox_allocated)(struct mailbox *box);
-static void (*lazy_expunge_next_hook_mailbox_list_created)
- (struct mailbox_list *list);
-static void (*lazy_expunge_next_hook_mail_user_created)(struct mail_user *user);
-
static MODULE_CONTEXT_DEFINE_INIT(lazy_expunge_mail_storage_module,
&mail_storage_module_register);
static MODULE_CONTEXT_DEFINE_INIT(lazy_expunge_mail_module,
MODULE_CONTEXT_SET_SELF(box, lazy_expunge_mail_storage_module,
mbox);
}
-
- if (lazy_expunge_next_hook_mailbox_allocated != NULL)
- lazy_expunge_next_hook_mailbox_allocated(box);
}
static int
MODULE_CONTEXT_SET(list, lazy_expunge_mailbox_list_module,
llist);
}
-
- if (lazy_expunge_next_hook_mailbox_list_created != NULL)
- lazy_expunge_next_hook_mailbox_list_created(list);
}
static void
-lazy_expunge_hook_mail_namespaces_created(struct mail_namespace *namespaces)
+lazy_expunge_mail_namespaces_created(struct mail_namespace *namespaces)
{
struct lazy_expunge_mail_user *luser =
LAZY_EXPUNGE_USER_CONTEXT(namespaces->user);
llist = LAZY_EXPUNGE_LIST_CONTEXT(luser->lazy_ns[i]->list);
llist->internal_namespace = TRUE;
}
-
- if (lazy_expunge_next_hook_mail_namespaces_created != NULL)
- lazy_expunge_next_hook_mail_namespaces_created(namespaces);
}
static void lazy_expunge_mail_user_created(struct mail_user *user)
i_debug("lazy_expunge: No lazy_expunge setting - "
"plugin disabled");
}
-
- if (lazy_expunge_next_hook_mail_user_created != NULL)
- lazy_expunge_next_hook_mail_user_created(user);
}
-void lazy_expunge_plugin_init(void)
-{
- lazy_expunge_next_hook_mail_namespaces_created =
- hook_mail_namespaces_created;
- hook_mail_namespaces_created =
- lazy_expunge_hook_mail_namespaces_created;
-
- lazy_expunge_next_hook_mailbox_allocated = hook_mailbox_allocated;
- hook_mailbox_allocated = lazy_expunge_mailbox_allocated;
-
- lazy_expunge_next_hook_mailbox_list_created = hook_mailbox_list_created;
- hook_mailbox_list_created = lazy_expunge_mailbox_list_created;
+static struct mail_storage_hooks lazy_expunge_mail_storage_hooks = {
+ .mail_user_created = lazy_expunge_mail_user_created,
+ .mail_namespaces_created = lazy_expunge_mail_namespaces_created,
+ .mailbox_list_created = lazy_expunge_mailbox_list_created,
+ .mailbox_allocated = lazy_expunge_mailbox_allocated
+};
- lazy_expunge_next_hook_mail_user_created = hook_mail_user_created;
- hook_mail_user_created = lazy_expunge_mail_user_created;
+void lazy_expunge_plugin_init(struct module *module)
+{
+ mail_storage_hooks_add(module, &lazy_expunge_mail_storage_hooks);
}
void lazy_expunge_plugin_deinit(void)
{
- hook_mail_namespaces_created =
- lazy_expunge_hook_mail_namespaces_created;
- hook_mailbox_allocated = lazy_expunge_next_hook_mailbox_allocated;
- hook_mailbox_list_created = lazy_expunge_next_hook_mailbox_list_created;
- hook_mail_user_created = lazy_expunge_next_hook_mail_user_created;
+ mail_storage_hooks_remove(&lazy_expunge_mail_storage_hooks);
}
#ifndef LAZY_EXPUNGE_PLUGIN_H
#define TLAZY_EXPUNGE_PLUGIN_H
-void lazy_expunge_plugin_init(void);
+void lazy_expunge_plugin_init(struct module *module);
void lazy_expunge_plugin_deinit(void);
#endif
const char *listescape_plugin_version = PACKAGE_VERSION;
-static void (*listescape_next_hook_mail_storage_created)
- (struct mail_storage *storage);
-static void (*listescape_next_hook_mailbox_list_created)
- (struct mailbox_list *list);
-
static MODULE_CONTEXT_DEFINE_INIT(listescape_storage_module,
&mail_storage_module_register);
static MODULE_CONTEXT_DEFINE_INIT(listescape_list_module,
{
struct listescape_mail_storage *mstorage;
- if (listescape_next_hook_mail_storage_created != NULL)
- listescape_next_hook_mail_storage_created(storage);
-
mstorage = p_new(storage->pool, struct listescape_mail_storage, 1);
mstorage->module_ctx.super = storage->v;
storage->v.mailbox_alloc = listescape_mailbox_alloc;
struct listescape_mailbox_list *mlist;
const char *env;
- if (listescape_next_hook_mailbox_list_created != NULL)
- listescape_next_hook_mailbox_list_created(list);
-
if (list->hierarchy_sep == list->ns->sep)
return;
MODULE_CONTEXT_SET(list, listescape_list_module, mlist);
}
-void listescape_plugin_init(void)
-{
- listescape_next_hook_mail_storage_created = hook_mail_storage_created;
- hook_mail_storage_created = listescape_mail_storage_created;
+static struct mail_storage_hooks listescape_mail_storage_hooks = {
+ .mail_storage_created = listescape_mail_storage_created,
+ .mailbox_list_created = listescape_mailbox_list_created
+};
- listescape_next_hook_mailbox_list_created = hook_mailbox_list_created;
- hook_mailbox_list_created = listescape_mailbox_list_created;
+void listescape_plugin_init(struct module *module)
+{
+ mail_storage_hooks_add(module, &listescape_mail_storage_hooks);
}
void listescape_plugin_deinit(void)
{
- hook_mail_storage_created = listescape_next_hook_mail_storage_created;
- hook_mailbox_list_created = listescape_next_hook_mailbox_list_created;
+ mail_storage_hooks_remove(&listescape_mail_storage_hooks);
}
#ifndef LISTESCAPE_PLUGIN_H
#define LISTESCAPE_PLUGIN_H
-void listescape_plugin_init(void);
+void listescape_plugin_init(struct module *module);
void listescape_plugin_deinit(void);
#endif
static struct notify_context *mail_log_ctx;
-void mail_log_plugin_init(void)
+void mail_log_plugin_init(struct module *module ATTR_UNUSED)
{
mail_log_read_settings(&mail_log_set);
mail_log_ctx = notify_register(&mail_log_vfuncs);
extern const char *mail_log_plugin_dependencies[];
-void mail_log_plugin_init(void);
+void mail_log_plugin_init(struct module *module);
void mail_log_plugin_deinit(void);
#endif
const char *mbox_snarf_plugin_version = PACKAGE_VERSION;
-static void (*mbox_snarf_next_hook_mail_storage_created)
- (struct mail_storage *storage);
-
static MODULE_CONTEXT_DEFINE_INIT(mbox_snarf_storage_module,
&mail_storage_module_register);
path = mail_user_plugin_getenv(storage->user, "mbox_snarf");
if (path != NULL)
mbox_snarf_mail_storage_create(storage, path);
-
- if (mbox_snarf_next_hook_mail_storage_created != NULL)
- mbox_snarf_next_hook_mail_storage_created(storage);
}
-void mbox_snarf_plugin_init(void)
+static struct mail_storage_hooks mbox_snarf_mail_storage_hooks = {
+ .mail_storage_created = mbox_snarf_mail_storage_created
+};
+
+void mbox_snarf_plugin_init(struct module *module)
{
- mbox_snarf_next_hook_mail_storage_created = hook_mail_storage_created;
- hook_mail_storage_created = mbox_snarf_mail_storage_created;
+ mail_storage_hooks_add(module, &mbox_snarf_mail_storage_hooks);
}
void mbox_snarf_plugin_deinit(void)
{
- hook_mail_storage_created = mbox_snarf_next_hook_mail_storage_created;
+ mail_storage_hooks_remove(&mbox_snarf_mail_storage_hooks);
}
#ifndef MBOX_SNARF_PLUGIN_H
#define MBOX_SNARF_PLUGIN_H
-void mbox_snarf_plugin_init(void);
+void mbox_snarf_plugin_init(struct module *module);
void mbox_snarf_plugin_deinit(void);
#endif
struct mailbox_list *newlist,
const char *newname, bool rename_children);
-void notify_plugin_init_storage(void);
+void notify_plugin_init_storage(struct module *module);
void notify_plugin_deinit_storage(void);
#endif
i_free(ctx);
}
-void notify_plugin_init(void)
+void notify_plugin_init(struct module *module)
{
- notify_plugin_init_storage();
+ notify_plugin_init_storage(module);
}
void notify_plugin_deinit(void)
struct mailbox_transaction_context;
struct mailbox_list;
struct notify_context;
+struct module;
struct notify_vfuncs {
void *(*mail_transaction_begin)(struct mailbox_transaction_context *t);
notify_register(const struct notify_vfuncs *vfuncs);
void notify_unregister(struct notify_context *ctx);
-void notify_plugin_init(void);
+void notify_plugin_init(struct module *module);
void notify_plugin_deinit(void);
#endif
static MODULE_CONTEXT_DEFINE_INIT(notify_mailbox_list_module,
&mailbox_list_module_register);
-static void (*notify_next_hook_mail_storage_created)
- (struct mail_storage *storage);
-static void (*notify_next_hook_mailbox_list_created)
- (struct mailbox_list *list);
-
static void
notify_mail_expunge(struct mail *_mail)
{
storage->v.mailbox_alloc = notify_mailbox_alloc;
MODULE_CONTEXT_SET_SELF(storage, notify_storage_module, lstorage);
-
- if (notify_next_hook_mail_storage_created != NULL)
- notify_next_hook_mail_storage_created(storage);
}
static void notify_mailbox_list_created(struct mailbox_list *list)
list->v.rename_mailbox = notify_mailbox_list_rename;
MODULE_CONTEXT_SET_SELF(list, notify_mailbox_list_module, llist);
-
- if (notify_next_hook_mailbox_list_created != NULL)
- notify_next_hook_mailbox_list_created(list);
}
-void notify_plugin_init_storage(void)
-{
- notify_next_hook_mail_storage_created = hook_mail_storage_created;
- hook_mail_storage_created = notify_mail_storage_created;
+static struct mail_storage_hooks notify_mail_storage_hooks = {
+ .mail_storage_created = notify_mail_storage_created,
+ .mailbox_list_created = notify_mailbox_list_created
+};
- notify_next_hook_mailbox_list_created = hook_mailbox_list_created;
- hook_mailbox_list_created = notify_mailbox_list_created;
+void notify_plugin_init_storage(struct module *module)
+{
+ mail_storage_hooks_add(module, ¬ify_mail_storage_hooks);
}
void notify_plugin_deinit_storage(void)
{
- hook_mail_storage_created = notify_next_hook_mail_storage_created;
- hook_mailbox_list_created = notify_next_hook_mailbox_list_created;
+ mail_storage_hooks_remove(¬ify_mail_storage_hooks);
}
/* Copyright (c) 2005-2009 Dovecot authors, see the included COPYING file */
#include "lib.h"
-#include "mail-storage.h"
-#include "mailbox-list-private.h"
-#include "quota.h"
+#include "mail-user.h"
+#include "mail-storage-hooks.h"
#include "quota-plugin.h"
#include <stdlib.h>
-/* defined by imap, pop3, lda */
-extern void (*hook_mail_storage_created)(struct mail_storage *storage);
-
-void (*quota_next_hook_mail_user_created)(struct mail_user *user);
-void (*quota_next_hook_mail_storage_created)(struct mail_storage *storage);
-void (*quota_next_hook_mailbox_list_created)(struct mailbox_list *list);
-void (*quota_next_hook_mail_namespaces_created)(struct mail_namespace *namespaces);
-
const char *quota_plugin_version = PACKAGE_VERSION;
-void quota_plugin_init(void)
-{
- quota_next_hook_mail_user_created = hook_mail_user_created;
- hook_mail_user_created = quota_mail_user_created;
-
- quota_next_hook_mail_storage_created = hook_mail_storage_created;
- hook_mail_storage_created = quota_mail_storage_created;
-
- quota_next_hook_mailbox_list_created = hook_mailbox_list_created;
- hook_mailbox_list_created = quota_mailbox_list_created;
+static struct mail_storage_hooks quota_mail_storage_hooks = {
+ .mail_user_created = quota_mail_user_created,
+ .mail_namespaces_created = quota_mail_namespaces_created,
+ .mail_storage_created = quota_mail_storage_created,
+ .mailbox_list_created = quota_mailbox_list_created
+};
- quota_next_hook_mail_namespaces_created = hook_mail_namespaces_created;
- hook_mail_namespaces_created = quota_mail_namespaces_created;
+void quota_plugin_init(struct module *module)
+{
+ mail_storage_hooks_add(module, "a_mail_storage_hooks);
}
void quota_plugin_deinit(void)
{
- hook_mail_user_created = quota_next_hook_mail_user_created;
- hook_mail_storage_created = quota_next_hook_mail_storage_created;
- hook_mailbox_list_created = quota_next_hook_mailbox_list_created;
- hook_mail_namespaces_created = quota_next_hook_mail_namespaces_created;
+ mail_storage_hooks_remove("a_mail_storage_hooks);
}
#include "module-context.h"
+struct module;
+
#define QUOTA_USER_CONTEXT(obj) \
MODULE_CONTEXT(obj, quota_user_module)
struct mail_storage;
-extern void (*quota_next_hook_mail_user_created)(struct mail_user *user);
-extern void (*quota_next_hook_mail_storage_created)
- (struct mail_storage *storage);
-extern void (*quota_next_hook_mailbox_list_created)(struct mailbox_list *list);
-
extern MODULE_CONTEXT_DEFINE(quota_user_module, &mail_user_module_register);
void quota_mail_user_created(struct mail_user *user);
void quota_mailbox_list_created(struct mailbox_list *list);
void quota_mail_namespaces_created(struct mail_namespace *namespaces);
-void quota_plugin_init(void);
+void quota_plugin_init(struct module *module);
void quota_plugin_deinit(void);
#endif
} else if (user->mail_debug) {
i_debug("quota: No quota setting - plugin disabled");
}
-
- if (quota_next_hook_mail_user_created != NULL)
- quota_next_hook_mail_user_created(user);
}
static void quota_maildir_storage_set(struct mail_storage *storage)
MODULE_CONTEXT_SET_SELF(storage, quota_storage_module, qstorage);
quota_maildir_storage_set(storage);
-
- if (quota_next_hook_mail_storage_created != NULL)
- quota_next_hook_mail_storage_created(storage);
}
static struct quota_root *
quota_get_mail_user_quota(list->ns->user);
quota_add_user_namespace(quota, list->ns);
}
- if (quota_next_hook_mailbox_list_created != NULL)
- quota_next_hook_mailbox_list_created(list);
}
static void quota_root_set_namespace(struct quota_root *root,
static MODULE_CONTEXT_DEFINE_INIT(trash_user_module,
&mail_user_module_register);
-static void (*trash_next_hook_mail_namespaces_created)
- (struct mail_namespace *namespaces);
static int (*trash_next_quota_test_alloc)(struct quota_transaction_context *,
uoff_t, bool *);
}
static void
-trash_hook_mail_namespaces_created(struct mail_namespace *namespaces)
+trash_mail_namespaces_created(struct mail_namespace *namespaces)
{
struct mail_user *user = namespaces->user;
struct quota_user *quser = QUOTA_USER_CONTEXT(user);
quser->quota->set->test_alloc = trash_quota_test_alloc;
}
}
-
- if (trash_next_hook_mail_namespaces_created != NULL)
- trash_next_hook_mail_namespaces_created(namespaces);
}
-void trash_plugin_init(void)
+static struct mail_storage_hooks trash_mail_storage_hooks = {
+ .mail_namespaces_created = trash_mail_namespaces_created
+};
+
+void trash_plugin_init(struct module *module)
{
- trash_next_hook_mail_namespaces_created = hook_mail_namespaces_created;
- hook_mail_namespaces_created = trash_hook_mail_namespaces_created;
+ mail_storage_hooks_add(module, &trash_mail_storage_hooks);
}
void trash_plugin_deinit(void)
{
- hook_mail_namespaces_created = trash_hook_mail_namespaces_created;
+ mail_storage_hooks_remove(&trash_mail_storage_hooks);
}
const char *trash_plugin_dependencies[] = { "quota", NULL };
extern const char *trash_plugin_dependencies[];
-void trash_plugin_init(void);
+void trash_plugin_init(struct module *module);
void trash_plugin_deinit(void);
#endif
const char *virtual_plugin_version = PACKAGE_VERSION;
-void virtual_plugin_init(void)
+void virtual_plugin_init(struct module *module ATTR_UNUSED)
{
mail_storage_class_register(&virtual_storage);
}
#ifndef VIRTUAL_PLUGIN_H
#define VIRTUAL_PLUGIN_H
-void virtual_plugin_init(void);
+void virtual_plugin_init(struct module *module);
void virtual_plugin_deinit(void);
#endif
const char *zlib_plugin_version = PACKAGE_VERSION;
-static void (*zlib_next_hook_mail_storage_created)
- (struct mail_storage *storage);
-
static MODULE_CONTEXT_DEFINE_INIT(zlib_storage_module,
&mail_storage_module_register);
static MODULE_CONTEXT_DEFINE_INIT(zlib_mail_module, &mail_module_register);
storage->v.mailbox_alloc = zlib_mailbox_alloc;
MODULE_CONTEXT_SET_SELF(storage, zlib_storage_module, qstorage);
-
- if (zlib_next_hook_mail_storage_created != NULL)
- zlib_next_hook_mail_storage_created(storage);
}
-void zlib_plugin_init(void)
+static struct mail_storage_hooks zlib_mail_storage_hooks = {
+ .mail_storage_created = zlib_mail_storage_created
+};
+
+void zlib_plugin_init(struct module *module)
{
- zlib_next_hook_mail_storage_created = hook_mail_storage_created;
- hook_mail_storage_created = zlib_mail_storage_created;
+ mail_storage_hooks_add(module, &zlib_mail_storage_hooks);
}
void zlib_plugin_deinit(void)
{
- hook_mail_storage_created = zlib_next_hook_mail_storage_created;
+ mail_storage_hooks_remove(&zlib_mail_storage_hooks);
}
#ifndef ZLIB_PLUGIN_H
#define ZLIB_PLUGIN_H
-void zlib_plugin_init(void);
+void zlib_plugin_init(struct module *module);
void zlib_plugin_deinit(void);
#endif