dovecot: dbox rebuilding fixes
dovecot at dovecot.org
dovecot at dovecot.org
Sat Nov 3 16:17:06 EET 2007
details: http://hg.dovecot.org/dovecot/rev/dd9d618fefb9
changeset: 6669:dd9d618fefb9
user: Timo Sirainen <tss at iki.fi>
date: Sat Nov 03 16:17:02 2007 +0200
description:
dbox rebuilding fixes
diffstat:
1 file changed, 33 insertions(+), 19 deletions(-)
src/lib-storage/index/dbox/dbox-sync-rebuild.c | 52 +++++++++++++++---------
diffs (112 lines):
diff -r 4a3cc2968040 -r dd9d618fefb9 src/lib-storage/index/dbox/dbox-sync-rebuild.c
--- a/src/lib-storage/index/dbox/dbox-sync-rebuild.c Sat Nov 03 16:09:05 2007 +0200
+++ b/src/lib-storage/index/dbox/dbox-sync-rebuild.c Sat Nov 03 16:17:02 2007 +0200
@@ -122,7 +122,7 @@ static int dbox_sync_index_file_next(str
static int
dbox_sync_index_uid_file(struct dbox_sync_rebuild_context *ctx,
- const char *fname)
+ const char *dir, const char *fname)
{
struct dbox_file *file;
unsigned long uid;
@@ -139,6 +139,8 @@ dbox_sync_index_uid_file(struct dbox_syn
}
file = dbox_file_init(ctx->mbox, uid | DBOX_FILE_ID_FLAG_UID);
+ file->current_path = i_strdup_printf("%s/%s", dir, fname);
+
ret = dbox_sync_index_file_next(ctx, file, &offset) < 0 ? -1 : 0;
dbox_file_unref(&file);
return ret;
@@ -146,7 +148,7 @@ dbox_sync_index_uid_file(struct dbox_syn
static int
dbox_sync_index_multi_file(struct dbox_sync_rebuild_context *ctx,
- const char *fname)
+ const char *dir, const char *fname)
{
/* FIXME */
return 0;
@@ -176,52 +178,64 @@ dbox_sync_index_maildir_file(struct dbox
if ((ret = dbox_sync_index_file_next(ctx, file, &offset)) > 0)
dbox_index_append_file(ctx->append_ctx, file);
dbox_file_unref(&file);
- return ret;
-}
-
-static int dbox_sync_index_rebuild_ctx(struct dbox_sync_rebuild_context *ctx)
+ return ret < 0 ? -1 : 0;
+}
+
+static int dbox_sync_index_rebuild_dir(struct dbox_sync_rebuild_context *ctx,
+ const char *path, bool primary)
{
struct mail_storage *storage = ctx->mbox->ibox.box.storage;
DIR *dir;
struct dirent *d;
- int ret = 1;
-
- if (dbox_sync_set_uidvalidity(ctx) < 0)
- return -1;
-
- dir = opendir(ctx->mbox->path);
+ int ret = 0;
+
+ dir = opendir(path);
if (dir == NULL) {
if (errno == ENOENT) {
ctx->mbox->ibox.mailbox_deleted = TRUE;
return -1;
}
mail_storage_set_critical(storage,
- "opendir(%s) failed: %m", ctx->mbox->path);
+ "opendir(%s) failed: %m", path);
return -1;
}
errno = 0;
- for (; ret > 0 && (d = readdir(dir)) != NULL; errno = 0) {
+ for (; ret == 0 && (d = readdir(dir)) != NULL; errno = 0) {
if (strncmp(d->d_name, DBOX_MAIL_FILE_UID_PREFIX,
sizeof(DBOX_MAIL_FILE_UID_PREFIX)-1) == 0)
- ret = dbox_sync_index_uid_file(ctx, d->d_name);
+ ret = dbox_sync_index_uid_file(ctx, path, d->d_name);
else if (strncmp(d->d_name, DBOX_MAIL_FILE_MULTI_PREFIX,
sizeof(DBOX_MAIL_FILE_MULTI_PREFIX)-1) == 0)
- ret = dbox_sync_index_multi_file(ctx, d->d_name);
- else if (strstr(d->d_name, ":2,") != NULL)
+ ret = dbox_sync_index_multi_file(ctx, path, d->d_name);
+ else if (primary && strstr(d->d_name, ":2,") != NULL)
ret = dbox_sync_index_maildir_file(ctx, d->d_name);
}
if (errno != 0) {
mail_storage_set_critical(storage,
- "readdir(%s) failed: %m", ctx->mbox->path);
+ "readdir(%s) failed: %m", path);
ret = -1;
}
if (closedir(dir) < 0) {
mail_storage_set_critical(storage,
- "closedir(%s) failed: %m", ctx->mbox->path);
+ "closedir(%s) failed: %m", path);
ret = -1;
}
return ret;
+}
+
+static int dbox_sync_index_rebuild_ctx(struct dbox_sync_rebuild_context *ctx)
+{
+ int ret;
+
+ if (dbox_sync_set_uidvalidity(ctx) < 0)
+ return -1;
+
+ ret = dbox_sync_index_rebuild_dir(ctx, ctx->mbox->path, TRUE);
+ if (ret < 0 || ctx->mbox->alt_path == NULL)
+ return ret;
+
+ return dbox_sync_index_rebuild_dir(ctx, ctx->mbox->alt_path, FALSE);
}
static void dbox_sync_update_maildir_ids(struct dbox_sync_rebuild_context *ctx)
More information about the dovecot-cvs
mailing list