dovecot-2.0: Initial commit for making mail_storage:mailbox_list...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Jun 3 05:31:53 EEST 2009
details: http://hg.dovecot.org/dovecot-2.0/rev/e374a365521d
changeset: 9434:e374a365521d
user: Timo Sirainen <tss at iki.fi>
date: Tue Jun 02 22:30:28 2009 -0400
description:
Initial commit for making mail_storage:mailbox_list to be from 1:1 to n:n.
This will allow namespaces to share the same storage and a single namespace
to have multiple storages (multiple mailbox formats). Neither works
currently, and this commit probably breaks some things.
diffstat:
102 files changed, 2164 insertions(+), 2528 deletions(-)
src/config/settings-get.pl | 1
src/imap/cmd-append.c | 13
src/imap/cmd-copy.c | 16
src/imap/cmd-create.c | 6
src/imap/cmd-delete.c | 20
src/imap/cmd-list.c | 12
src/imap/cmd-rename.c | 24
src/imap/cmd-select.c | 31
src/imap/cmd-status.c | 15
src/imap/cmd-subscribe.c | 8
src/imap/imap-client.c | 7
src/imap/imap-commands-util.c | 31
src/imap/imap-commands-util.h | 9
src/imap/imap-commands.h | 1
src/imap/imap-status.c | 25
src/imap/imap-status.h | 6
src/lda/main.c | 8
src/lib-lda/mail-deliver.c | 55 -
src/lib-storage/index/cydir/cydir-mail.c | 2
src/lib-storage/index/cydir/cydir-save.c | 4
src/lib-storage/index/cydir/cydir-storage.c | 198 ++----
src/lib-storage/index/cydir/cydir-sync.c | 3
src/lib-storage/index/dbox/dbox-map.c | 13
src/lib-storage/index/dbox/dbox-settings.c | 20
src/lib-storage/index/dbox/dbox-storage-rebuild.c | 48 +
src/lib-storage/index/dbox/dbox-storage.c | 313 +++------
src/lib-storage/index/dbox/dbox-storage.h | 7
src/lib-storage/index/dbox/dbox-sync-rebuild.c | 8
src/lib-storage/index/index-storage.c | 55 -
src/lib-storage/index/index-storage.h | 4
src/lib-storage/index/maildir/maildir-keywords.c | 5
src/lib-storage/index/maildir/maildir-storage.c | 423 +++++--------
src/lib-storage/index/maildir/maildir-storage.h | 3
src/lib-storage/index/maildir/maildir-sync-index.c | 5
src/lib-storage/index/maildir/maildir-uidlist.c | 11
src/lib-storage/index/maildir/maildir-util.c | 10
src/lib-storage/index/mbox/mbox-lock.c | 2
src/lib-storage/index/mbox/mbox-save.c | 2
src/lib-storage/index/mbox/mbox-storage.c | 650 +++++++-------------
src/lib-storage/index/mbox/mbox-storage.h | 2
src/lib-storage/index/raw/raw-storage.c | 155 +---
src/lib-storage/index/shared/shared-list.c | 73 +-
src/lib-storage/index/shared/shared-storage.c | 185 ++---
src/lib-storage/index/shared/shared-storage.h | 6
src/lib-storage/list/index-mailbox-list-sync.c | 14
src/lib-storage/list/index-mailbox-list.c | 12
src/lib-storage/list/mailbox-list-fs.c | 15
src/lib-storage/list/mailbox-list-maildir.h | 3
src/lib-storage/mail-namespace.c | 44 +
src/lib-storage/mail-namespace.h | 20
src/lib-storage/mail-storage-private.h | 16
src/lib-storage/mail-storage-settings.c | 14
src/lib-storage/mail-storage-settings.h | 4
src/lib-storage/mail-storage.c | 337 +++++-----
src/lib-storage/mail-storage.h | 39 -
src/lib-storage/mail-user.c | 11
src/lib-storage/mailbox-list-private.h | 11
src/lib-storage/mailbox-list.c | 191 +++--
src/lib-storage/mailbox-list.h | 22
src/lmtp/commands.c | 11
src/plugins/acl/acl-api-private.h | 2
src/plugins/acl/acl-api.c | 6
src/plugins/acl/acl-api.h | 2
src/plugins/acl/acl-backend-vfile-acllist.c | 7
src/plugins/acl/acl-backend-vfile.c | 41 -
src/plugins/acl/acl-backend.c | 2
src/plugins/acl/acl-lookup-dict.c | 4
src/plugins/acl/acl-mailbox-list.c | 93 +-
src/plugins/acl/acl-mailbox.c | 23
src/plugins/acl/acl-plugin.h | 19
src/plugins/acl/acl-shared-storage.c | 22
src/plugins/acl/acl-storage.c | 145 ----
src/plugins/acl/acl-storage.h | 4
src/plugins/autocreate/autocreate-plugin.c | 6
src/plugins/convert/convert-storage.c | 103 +--
src/plugins/expire/expire-plugin.c | 23
src/plugins/expire/expire-tool.c | 6
src/plugins/fts-lucene/fts-backend-lucene.c | 4
src/plugins/fts-solr/fts-backend-solr.c | 10
src/plugins/fts-squat/fts-backend-squat.c | 9
src/plugins/fts/fts-storage.c | 6
src/plugins/imap-acl/imap-acl-plugin.c | 36 -
src/plugins/imap-quota/imap-quota-plugin.c | 20
src/plugins/lazy-expunge/lazy-expunge-plugin.c | 139 ++--
src/plugins/listescape/listescape-plugin.c | 44 -
src/plugins/mail-log/mail-log-plugin.c | 17
src/plugins/mbox-snarf/mbox-snarf-plugin.c | 17
src/plugins/quota/quota-count.c | 24
src/plugins/quota/quota-dirsize.c | 14
src/plugins/quota/quota-fs.c | 22
src/plugins/quota/quota-maildir.c | 79 +-
src/plugins/quota/quota-private.h | 17
src/plugins/quota/quota-storage.c | 96 +-
src/plugins/quota/quota.c | 91 +-
src/plugins/trash/trash-plugin.c | 7
src/plugins/virtual/virtual-config.c | 18
src/plugins/virtual/virtual-mail.c | 2
src/plugins/virtual/virtual-storage.c | 195 ++----
src/plugins/virtual/virtual-storage.h | 1
src/plugins/zlib/zlib-plugin.c | 24
src/pop3/pop3-client.c | 27
src/util/doveadm.c | 6
diffs (truncated from 9622 to 300 lines):
diff -r 438491c166cb -r e374a365521d src/config/settings-get.pl
--- a/src/config/settings-get.pl Tue Jun 02 17:42:40 2009 -0400
+++ b/src/config/settings-get.pl Tue Jun 02 22:30:28 2009 -0400
@@ -4,6 +4,7 @@ print '#include "lib.h"'."\n";
print '#include "lib.h"'."\n";
print '#include "array.h"'."\n";
print '#include "var-expand.h"'."\n";
+print '#include "file-lock.h"'."\n";
print '#include "settings-parser.h"'."\n";
print '#include "all-settings.h"'."\n";
print '#include <stddef.h>'."\n";
diff -r 438491c166cb -r e374a365521d src/imap/cmd-append.c
--- a/src/imap/cmd-append.c Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-append.c Tue Jun 02 22:30:28 2009 -0400
@@ -8,7 +8,6 @@
#include "imap-commands.h"
#include "imap-parser.h"
#include "imap-date.h"
-#include "mail-storage.h"
#include <sys/time.h>
@@ -452,24 +451,24 @@ static struct mailbox *
static struct mailbox *
get_mailbox(struct client_command_context *cmd, const char *name)
{
- struct mail_storage *storage;
+ struct mail_namespace *ns;
struct mailbox *box;
if (!client_verify_mailbox_name(cmd, name, TRUE, FALSE))
return NULL;
- storage = client_find_storage(cmd, &name);
- if (storage == NULL)
+ ns = client_find_namespace(cmd, &name);
+ if (ns == NULL)
return NULL;
if (cmd->client->mailbox != NULL &&
- mailbox_equals(cmd->client->mailbox, storage, name))
+ mailbox_equals(cmd->client->mailbox, ns, name))
return cmd->client->mailbox;
- box = mailbox_open(&storage, name, NULL, MAILBOX_OPEN_SAVEONLY |
+ box = mailbox_open(ns->list, name, NULL, MAILBOX_OPEN_SAVEONLY |
MAILBOX_OPEN_KEEP_RECENT);
if (box == NULL) {
- client_send_storage_error(cmd, storage);
+ client_send_list_error(cmd, ns->list);
return NULL;
}
if (cmd->client->enabled_features != 0)
diff -r 438491c166cb -r e374a365521d src/imap/cmd-copy.c
--- a/src/imap/cmd-copy.c Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-copy.c Tue Jun 02 22:30:28 2009 -0400
@@ -93,7 +93,8 @@ bool cmd_copy(struct client_command_cont
bool cmd_copy(struct client_command_context *cmd)
{
struct client *client = cmd->client;
- struct mail_storage *storage;
+ struct mail_namespace *dest_ns;
+ struct mail_storage *dest_storage;
struct mailbox *destbox;
struct mailbox_transaction_context *t;
struct mail_search_args *search_args;
@@ -119,18 +120,18 @@ bool cmd_copy(struct client_command_cont
if (ret <= 0)
return ret < 0;
- storage = client_find_storage(cmd, &mailbox);
- if (storage == NULL)
+ dest_ns = client_find_namespace(cmd, &mailbox);
+ if (dest_ns == NULL)
return TRUE;
- if (mailbox_equals(client->mailbox, storage, mailbox))
+ if (mailbox_equals(client->mailbox, dest_ns, mailbox))
destbox = client->mailbox;
else {
- destbox = mailbox_open(&storage, mailbox, NULL,
+ destbox = mailbox_open(dest_ns->list, mailbox, NULL,
MAILBOX_OPEN_SAVEONLY |
MAILBOX_OPEN_KEEP_RECENT);
if (destbox == NULL) {
- client_send_storage_error(cmd, storage);
+ client_send_list_error(cmd, dest_ns->list);
return TRUE;
}
if (client->enabled_features != 0)
@@ -168,6 +169,7 @@ bool cmd_copy(struct client_command_cont
}
}
+ dest_storage = mailbox_get_storage(destbox);
if (destbox != client->mailbox) {
sync_flags |= MAILBOX_SYNC_FLAG_FAST;
imap_flags |= IMAP_SYNC_FLAG_SAFE;
@@ -182,7 +184,7 @@ bool cmd_copy(struct client_command_cont
"NO ["IMAP_RESP_CODE_EXPUNGEISSUED"] "
"Some of the requested messages no longer exist.");
} else {
- client_send_storage_error(cmd, storage);
+ client_send_storage_error(cmd, dest_storage);
return TRUE;
}
}
diff -r 438491c166cb -r e374a365521d src/imap/cmd-create.c
--- a/src/imap/cmd-create.c Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-create.c Tue Jun 02 22:30:28 2009 -0400
@@ -7,6 +7,7 @@ bool cmd_create(struct client_command_co
bool cmd_create(struct client_command_context *cmd)
{
struct mail_namespace *ns;
+ struct mail_storage *storage;
const char *mailbox, *full_mailbox;
bool directory;
size_t len;
@@ -38,8 +39,9 @@ bool cmd_create(struct client_command_co
if (!client_verify_mailbox_name(cmd, full_mailbox, FALSE, TRUE))
return TRUE;
- if (mail_storage_mailbox_create(ns->storage, mailbox, directory) < 0)
- client_send_storage_error(cmd, ns->storage);
+ storage = mail_namespace_get_default_storage(ns);
+ if (mail_storage_mailbox_create(storage, ns, mailbox, directory) < 0)
+ client_send_storage_error(cmd, storage);
else
client_send_tagline(cmd, "OK Create completed.");
return TRUE;
diff -r 438491c166cb -r e374a365521d src/imap/cmd-delete.c
--- a/src/imap/cmd-delete.c Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-delete.c Tue Jun 02 22:30:28 2009 -0400
@@ -6,8 +6,8 @@ bool cmd_delete(struct client_command_co
bool cmd_delete(struct client_command_context *cmd)
{
struct client *client = cmd->client;
+ struct mail_namespace *ns;
struct mail_storage *storage;
- struct mailbox_list *list;
struct mailbox *mailbox;
const char *name;
@@ -21,8 +21,13 @@ bool cmd_delete(struct client_command_co
return TRUE;
}
+ ns = client_find_namespace(cmd, &name);
+ if (ns == NULL)
+ return TRUE;
+
mailbox = client->mailbox;
- if (mailbox != NULL && strcmp(mailbox_get_name(mailbox), name) == 0) {
+ if (mailbox != NULL && mailbox_get_namespace(mailbox) == ns &&
+ strcmp(mailbox_get_name(mailbox), name) == 0) {
/* deleting selected mailbox. close it first */
client_search_updates_free(client);
storage = mailbox_get_storage(mailbox);
@@ -30,22 +35,17 @@ bool cmd_delete(struct client_command_co
if (mailbox_close(&mailbox) < 0)
client_send_untagged_storage_error(client, storage);
- } else {
- storage = client_find_storage(cmd, &name);
- if (storage == NULL)
- return TRUE;
}
if ((client->workarounds & WORKAROUND_TB_EXTRA_MAILBOX_SEP) != 0 &&
*name != '\0' &&
- name[strlen(name)-1] == mail_storage_get_hierarchy_sep(storage)) {
+ name[strlen(name)-1] == mailbox_list_get_hierarchy_sep(ns->list)) {
/* drop the extra trailing hierarchy separator */
name = t_strndup(name, strlen(name)-1);
}
- list = mail_storage_get_list(storage);
- if (mailbox_list_delete_mailbox(list, name) < 0)
- client_send_list_error(cmd, list);
+ if (mailbox_list_delete_mailbox(ns->list, name) < 0)
+ client_send_list_error(cmd, ns->list);
else {
client_send_tagline(cmd, "OK Delete completed.");
}
diff -r 438491c166cb -r e374a365521d src/imap/cmd-list.c
--- a/src/imap/cmd-list.c Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-list.c Tue Jun 02 22:30:28 2009 -0400
@@ -310,16 +310,16 @@ static void list_send_status(struct cmd_
static void list_send_status(struct cmd_list_context *ctx, const char *name)
{
struct mailbox_status status;
- const char *storage_name;
+ const char *storage_name, *error;
size_t prefix_len = strlen(ctx->ns->prefix);
storage_name = strncmp(name, ctx->ns->prefix, prefix_len) == 0 ?
name + prefix_len : name;
- if (!imap_status_get(ctx->cmd->client, ctx->ns->storage, storage_name,
- ctx->status_items, &status)) {
- client_send_untagged_storage_error(ctx->cmd->client,
- ctx->ns->storage);
+ if (imap_status_get(ctx->cmd->client, ctx->ns, storage_name,
+ ctx->status_items, &status, &error) < 0) {
+ client_send_line(ctx->cmd->client,
+ t_strconcat("* NO ", error, NULL));
return;
}
@@ -775,7 +775,7 @@ static void cmd_list_ref_root(struct cli
ns_sep = ns->sep;
} else {
ns_prefix = "";
- ns_sep = mail_namespace_get_root_sep(client->user->namespaces);
+ ns_sep = mail_namespaces_get_root_sep(client->user->namespaces);
}
str = t_str_new(64);
diff -r 438491c166cb -r e374a365521d src/imap/cmd-rename.c
--- a/src/imap/cmd-rename.c Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-rename.c Tue Jun 02 22:30:28 2009 -0400
@@ -6,9 +6,7 @@
bool cmd_rename(struct client_command_context *cmd)
{
- struct mail_storage *old_storage, *new_storage;
- struct mailbox_list *old_list, *new_list;
- struct mail_namespace *old_ns;
+ struct mail_namespace *old_ns, *new_ns;
const char *oldname, *newname;
unsigned int oldlen;
@@ -19,20 +17,18 @@ bool cmd_rename(struct client_command_co
if (!client_verify_mailbox_name(cmd, newname, FALSE, TRUE))
return TRUE;
- old_storage = client_find_storage(cmd, &oldname);
- if (old_storage == NULL)
+ old_ns = client_find_namespace(cmd, &oldname);
+ if (old_ns == NULL)
return TRUE;
- old_list = mail_storage_get_list(old_storage);
- new_storage = client_find_storage(cmd, &newname);
- if (new_storage == NULL)
+ new_ns = client_find_namespace(cmd, &newname);
+ if (new_ns == NULL)
return TRUE;
- new_list = mail_storage_get_list(new_storage);
- if (old_storage == new_storage) {
+ if (old_ns == new_ns) {
/* disallow box -> box/child, because it may break clients and
there's really no point in doing it anyway. */
- old_ns = mailbox_list_get_namespace(old_list);
+ old_ns = mailbox_list_get_namespace(old_ns->list);
oldlen = strlen(oldname);
if (strncmp(oldname, newname, oldlen) == 0 &&
newname[oldlen] == old_ns->real_sep) {
@@ -42,9 +38,9 @@ bool cmd_rename(struct client_command_co
}
}
- if (mailbox_list_rename_mailbox(old_list, oldname,
- new_list, newname, TRUE) < 0)
- client_send_list_error(cmd, old_list);
+ if (mailbox_list_rename_mailbox(old_ns->list, oldname,
+ new_ns->list, newname, TRUE) < 0)
+ client_send_list_error(cmd, old_ns->list);
else
client_send_tagline(cmd, "OK Rename completed.");
return TRUE;
diff -r 438491c166cb -r e374a365521d src/imap/cmd-select.c
--- a/src/imap/cmd-select.c Tue Jun 02 17:42:40 2009 -0400
+++ b/src/imap/cmd-select.c Tue Jun 02 22:30:28 2009 -0400
@@ -12,7 +12,7 @@
struct imap_select_context {
struct client_command_context *cmd;
- struct mail_storage *storage;
+ struct mail_namespace *ns;
struct mailbox *box;
struct imap_fetch_context *fetch_ctx;
@@ -188,7 +188,6 @@ static void cmd_select_finish(struct ima
if (ret < 0) {
if (ctx->box != NULL)
mailbox_close(&ctx->box);
- client_send_storage_error(ctx->cmd, ctx->storage);
ctx->cmd->client->mailbox = NULL;
} else {
client_send_tagline(ctx->cmd, mailbox_is_readonly(ctx->box) ?
@@ -209,6 +208,10 @@ static bool cmd_select_continue(struct c
}
ret = imap_fetch_deinit(ctx->fetch_ctx);
+ if (ret < 0) {
+ client_send_storage_error(ctx->cmd,
+ mailbox_get_storage(ctx->box));
+ }
More information about the dovecot-cvs
mailing list