sdbox-copy.c revision e8762c2b4914db7997fa9eb644a91586952d1876
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainensdbox_copy_hardlink(struct mail_save_context *_ctx, struct mail *mail)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct dbox_save_context *ctx = (struct dbox_save_context *)_ctx;
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen (struct sdbox_mailbox *)_ctx->transaction->box;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (strcmp(mail->box->storage->name, SDBOX_STORAGE_NAME) == 0)
ccc895c0358108d2304239063e940b7d75f364abTimo Sirainen /* Source storage isn't sdbox, can't hard link */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen src_file = sdbox_file_init(src_mbox, mail->uid);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ret = nfs_safe_link(src_path, dest_file->cur_path, FALSE);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (ret < 0 && errno == ENOENT && src_file->alt_path != NULL) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ret = nfs_safe_link(src_path, dest_file->cur_path, FALSE);
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen "link(%s, %s) failed: %m",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainensdbox_compatible_file_modes(struct mailbox *box1, struct mailbox *box2)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return box1->file_create_mode == box2->file_create_mode &&
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen box1->file_create_gid == box2->file_create_gid;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint sdbox_copy(struct mail_save_context *_ctx, struct mail *mail)
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen struct dbox_save_context *ctx = (struct dbox_save_context *)_ctx;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mailbox_transaction_context *_t = _ctx->transaction;
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)_t->box;
e9d29ae46d435aee85514decfe6ee27399ebf794Timo Sirainen i_assert((_t->flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0);
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen if (sdbox_compatible_file_modes(&mbox->box, mail->box)) {
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen /* non-fatal hardlinking failure, try the slow way */