dsync-mailbox.c revision c864fdd520b0c3f10a4b9bc5373368f4ae8faaff
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2013-2017 Dovecot authors, see the included COPYING file */
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen#include "lib.h"
3b1f449bb7a1e97adb95385765cb7f0cb6ccd260Timo Sirainen#include "istream.h"
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen#include "mail-storage-private.h"
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen#include "dsync-brain-private.h"
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen#include "dsync-mailbox.h"
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainenvoid dsync_mailbox_attribute_dup(pool_t pool,
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen const struct dsync_mailbox_attribute *src,
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen struct dsync_mailbox_attribute *dest_r)
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen{
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen dest_r->type = src->type;
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen dest_r->key = p_strdup(pool, src->key);
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen dest_r->value = p_strdup(pool, src->value);
41e51b972f02e8b16c19fab9160294ea0a07c343Timo Sirainen if (src->value_stream != NULL) {
41e51b972f02e8b16c19fab9160294ea0a07c343Timo Sirainen dest_r->value_stream = src->value_stream;
41e51b972f02e8b16c19fab9160294ea0a07c343Timo Sirainen i_stream_ref(dest_r->value_stream);
41e51b972f02e8b16c19fab9160294ea0a07c343Timo Sirainen }
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen dest_r->deleted = src->deleted;
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen dest_r->last_change = src->last_change;
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen dest_r->modseq = src->modseq;
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen}
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainenint dsync_mailbox_lock(struct dsync_brain *brain, struct mailbox *box,
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen struct file_lock **lock_r)
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen{
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen const char *path, *error;
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen int ret;
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen /* Make sure the mailbox is open - locking requires it */
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen if (mailbox_open(box) < 0) {
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen i_error("Can't open mailbox %s: %s", mailbox_get_vname(box),
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen mailbox_get_last_internal_error(box, &brain->mail_error));
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen return -1;
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen }
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen ret = mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_INDEX, &path);
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen if (ret < 0) {
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen i_error("Can't get mailbox %s path: %s", mailbox_get_vname(box),
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen mailbox_get_last_internal_error(box, &brain->mail_error));
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen return -1;
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen }
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen if (ret == 0) {
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen /* No index files - don't do any locking. In theory we still
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen could, but this lock is mainly meant to prevent replication
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen problems, and replication wouldn't work without indexes. */
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen *lock_r = NULL;
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen return 0;
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen }
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen if (mailbox_lock_file_create(box, DSYNC_MAILBOX_LOCK_FILENAME,
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen brain->mailbox_lock_timeout_secs,
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen lock_r, &error) <= 0) {
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen i_error("Failed to lock mailbox %s for dsyncing: %s",
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen box->vname, error);
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen return -1;
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen }
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen return 0;
c864fdd520b0c3f10a4b9bc5373368f4ae8faaffTimo Sirainen}