dovecot-2.2: sdbox: When hardlink-copying a mail in alt storage,...
dovecot at dovecot.org
dovecot at dovecot.org
Fri May 15 08:17:50 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/9ad3f11617f1
changeset: 18694:9ad3f11617f1
user: Timo Sirainen <tss at iki.fi>
date: Fri May 15 11:15:50 2015 +0300
description:
sdbox: When hardlink-copying a mail in alt storage, keep it within the alt storage.
Also make sure that the alt-flag is set correctly no matter where we copy
the mail.
diffstat:
src/lib-storage/index/dbox-single/sdbox-copy.c | 16 +++++++++++-----
src/lib-storage/index/dbox-single/sdbox-file.c | 14 +++++++-------
2 files changed, 18 insertions(+), 12 deletions(-)
diffs (81 lines):
diff -r 91bbd6753689 -r 9ad3f11617f1 src/lib-storage/index/dbox-single/sdbox-copy.c
--- a/src/lib-storage/index/dbox-single/sdbox-copy.c Thu May 14 23:49:12 2015 +0300
+++ b/src/lib-storage/index/dbox-single/sdbox-copy.c Fri May 15 11:15:50 2015 +0300
@@ -89,7 +89,7 @@
(struct sdbox_mailbox *)_ctx->transaction->box;
struct sdbox_mailbox *src_mbox;
struct dbox_file *src_file, *dest_file;
- const char *src_path;
+ const char *src_path, *dest_path;
int ret;
if (strcmp(mail->box->storage->name, SDBOX_STORAGE_NAME) == 0)
@@ -102,11 +102,18 @@
src_file = sdbox_file_init(src_mbox, mail->uid);
dest_file = sdbox_file_init(dest_mbox, 0);
+ ctx->ctx.data.flags &= ~DBOX_INDEX_FLAG_ALT;
+
src_path = src_file->primary_path;
- ret = nfs_safe_link(src_path, dest_file->cur_path, FALSE);
+ dest_path = dest_file->primary_path;
+ ret = nfs_safe_link(src_path, dest_path, FALSE);
if (ret < 0 && errno == ENOENT && src_file->alt_path != NULL) {
src_path = src_file->alt_path;
- ret = nfs_safe_link(src_path, dest_file->cur_path, FALSE);
+ if (dest_file->alt_path != NULL) {
+ dest_path = dest_file->cur_path = dest_file->alt_path;
+ ctx->ctx.data.flags |= DBOX_INDEX_FLAG_ALT;
+ }
+ ret = nfs_safe_link(src_path, dest_path, FALSE);
}
if (ret < 0) {
if (ECANTLINK(errno))
@@ -119,8 +126,7 @@
} else {
mail_storage_set_critical(
_ctx->transaction->box->storage,
- "link(%s, %s) failed: %m",
- src_path, dest_file->cur_path);
+ "link(%s, %s) failed: %m", src_path, dest_path);
}
dbox_file_unref(&src_file);
dbox_file_unref(&dest_file);
diff -r 91bbd6753689 -r 9ad3f11617f1 src/lib-storage/index/dbox-single/sdbox-file.c
--- a/src/lib-storage/index/dbox-single/sdbox-file.c Thu May 14 23:49:12 2015 +0300
+++ b/src/lib-storage/index/dbox-single/sdbox-file.c Fri May 15 11:15:50 2015 +0300
@@ -44,10 +44,7 @@
sdbox_file_init_paths(file, fname);
file->uid = uid;
} else {
- file->file.primary_path =
- i_strdup_printf("%s/%s",
- mailbox_get_path(&mbox->box),
- dbox_generate_tmp_filename());
+ sdbox_file_init_paths(file, dbox_generate_tmp_filename());
}
} T_END;
dbox_file_init(&file->file);
@@ -151,16 +148,19 @@
int sdbox_file_assign_uid(struct sdbox_file *file, uint32_t uid)
{
- const char *old_path, *new_fname, *new_path;
+ const char *p, *old_path, *dir, *new_fname, *new_path;
struct stat st;
i_assert(file->uid == 0);
i_assert(uid != 0);
old_path = file->file.cur_path;
+ p = strrchr(old_path, '/');
+ i_assert(p != NULL);
+ dir = t_strdup_until(old_path, p);
+
new_fname = t_strdup_printf(SDBOX_MAIL_FILE_FORMAT, uid);
- new_path = t_strdup_printf("%s/%s", mailbox_get_path(&file->mbox->box),
- new_fname);
+ new_path = t_strdup_printf("%s/%s", dir, new_fname);
if (stat(new_path, &st) == 0) {
mail_storage_set_critical(&file->file.storage->storage,
More information about the dovecot-cvs
mailing list