mdbox-mail.c revision d4002fe1f64d25a792f76fb102ef7dc519cd4e24
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Copyright (c) 2007-2017 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen#include "ioloop.h"
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen#include "istream.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "str.h"
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen#include "index-mail.h"
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainen#include "dbox-mail.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mdbox-storage.h"
89b548af722113acb5d63dfffb44423cb60f91e4Timo Sirainen#include "mdbox-sync.h"
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen#include "mdbox-map.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mdbox-file.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
66ae183b6e895216037bd921367670f4b0665911Timo Sirainen#include <sys/stat.h>
e86d0d34fe365da4c7ca4312d575bfcbf3a01c0eTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint mdbox_mail_lookup(struct mdbox_mailbox *mbox, struct mail_index_view *view,
da5d50534cfca45d0aaaf0bdac17b287b4588809Timo Sirainen uint32_t seq, uint32_t *map_uid_r)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const struct mdbox_mail_index_record *dbox_rec;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mdbox_index_header hdr;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const void *data;
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen uint32_t uid, cur_map_uid_validity;
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen bool need_resize;
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen mail_index_lookup_ext(view, seq, mbox->ext_id, &data, NULL);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen dbox_rec = data;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (dbox_rec == NULL || dbox_rec->map_uid == 0) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_index_lookup_uid(view, seq, &uid);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mailbox_set_critical(&mbox->box,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "mdbox: map uid lost for uid %u", uid);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mdbox_storage_set_corrupted(mbox->storage);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return -1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainen if (mbox->map_uid_validity == 0) {
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainen if (mdbox_read_header(mbox, &hdr, &need_resize) < 0)
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen return -1;
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen mbox->map_uid_validity = hdr.map_uid_validity;
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen }
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen if (mdbox_map_open_or_create(mbox->storage->map) < 0)
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen return -1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen cur_map_uid_validity = mdbox_map_get_uid_validity(mbox->storage->map);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen if (cur_map_uid_validity != mbox->map_uid_validity) {
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen mailbox_set_critical(&mbox->box,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen "mdbox: map uidvalidity mismatch (%u vs %u)",
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen mbox->map_uid_validity, cur_map_uid_validity);
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen mdbox_storage_set_corrupted(mbox->storage);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen return -1;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen *map_uid_r = dbox_rec->map_uid;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen return 0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void dbox_mail_set_expunged(struct dbox_mail *mail, uint32_t map_uid)
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail *_mail = &mail->imail.mail.mail;
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen struct mdbox_mailbox *mbox = MDBOX_MAILBOX(_mail->box);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen mail_index_refresh(_mail->box->index);
ee246b46953e4b94b2f22e093373674fa9155500Timo Sirainen if (mail_index_is_expunged(_mail->transaction->view, _mail->seq)) {
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen mail_set_expunged(_mail);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen return;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen mdbox_map_set_corrupted(mbox->storage->map,
ee246b46953e4b94b2f22e093373674fa9155500Timo Sirainen "Unexpectedly lost %s uid=%u map_uid=%u",
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen mailbox_get_vname(_mail->box),
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen _mail->uid, map_uid);
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen}
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int dbox_mail_open_init(struct dbox_mail *mail, uint32_t map_uid)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mdbox_mailbox *mbox = MDBOX_MAILBOX(mail->imail.mail.mail.box);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t file_id;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int ret;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen if ((ret = mdbox_map_lookup(mbox->storage->map, map_uid,
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen &file_id, &mail->offset)) <= 0) {
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen if (ret < 0)
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen return -1;
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen /* map_uid doesn't exist anymore. either it
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen got just expunged or the map index is
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen corrupted. */
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen dbox_mail_set_expunged(mail, map_uid);
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen return -1;
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen } else {
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen mail->open_file = mdbox_file_init(mbox->storage, file_id);
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen }
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen return 0;
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen}
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainenint mdbox_mail_open(struct dbox_mail *mail, uoff_t *offset_r,
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainen struct dbox_file **file_r)
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainen{
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen struct mail *_mail = &mail->imail.mail.mail;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen struct mdbox_mailbox *mbox = MDBOX_MAILBOX(_mail->box);
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen uint32_t prev_file_id = 0, map_uid = 0;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen bool deleted;
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen if (_mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) {
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen mail_set_aborted(_mail);
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen return -1;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen }
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen _mail->mail_stream_opened = TRUE;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen do {
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen if (mail->open_file != NULL) {
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen /* already open */
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen } else if (!_mail->saving) {
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen if (mdbox_mail_lookup(mbox, _mail->transaction->view,
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen _mail->seq, &map_uid) < 0)
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen return -1;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen if (dbox_mail_open_init(mail, map_uid) < 0)
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen return -1;
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen } else {
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen /* mail is being saved in this transaction */
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen mail->open_file =
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen mdbox_save_file_get_file(_mail->transaction,
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen _mail->seq,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen &mail->offset);
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen }
7d7b5c98f086ffa8ac9c90f21db17748ca607202Timo Sirainen
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen if (!dbox_file_is_open(mail->open_file))
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen _mail->transaction->stats.open_lookup_count++;
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen if (dbox_file_open(mail->open_file, &deleted) <= 0)
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen return -1;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen if (deleted) {
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen /* either it's expunged now or moved to another file. */
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen struct mdbox_file *mfile =
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen (struct mdbox_file *)mail->open_file;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen if (mfile->file_id == prev_file_id) {
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen dbox_mail_set_expunged(mail, map_uid);
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen return -1;
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen }
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen prev_file_id = mfile->file_id;
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen if (mdbox_map_refresh(mbox->storage->map) < 0)
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen return -1;
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen dbox_file_unref(&mail->open_file);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen }
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen } while (mail->open_file == NULL);
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen *file_r = mail->open_file;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen *offset_r = mail->offset;
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen return 0;
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen}
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainenstatic int mdbox_mail_get_save_date(struct mail *mail, time_t *date_r)
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen{
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen struct mdbox_mailbox *mbox = MDBOX_MAILBOX(mail->transaction->box);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen const struct mdbox_mail_index_record *dbox_rec;
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen const void *data;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen mail_index_lookup_ext(mail->transaction->view, mail->seq,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen mbox->ext_id, &data, NULL);
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen dbox_rec = data;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen if (dbox_rec == NULL || dbox_rec->map_uid == 0) {
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen /* lost for some reason, use fallback */
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen return dbox_mail_get_save_date(mail, date_r);
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen }
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen *date_r = dbox_rec->save_date;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen return 0;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen}
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainenstatic int
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainenmdbox_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen const char **value_r)
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen{
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen struct dbox_mail *mail = DBOX_MAIL(_mail);
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen struct mdbox_mailbox *mbox = MDBOX_MAILBOX(_mail->transaction->box);
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen struct mdbox_map_mail_index_record rec;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen uint32_t map_uid;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen uint16_t refcount;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen switch (field) {
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen case MAIL_FETCH_REFCOUNT:
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen if (mdbox_mail_lookup(mbox, _mail->transaction->view,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen _mail->seq, &map_uid) < 0)
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen return -1;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen if (mdbox_map_lookup_full(mbox->storage->map, map_uid,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen &rec, &refcount) < 0)
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen return -1;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen *value_r = p_strdup_printf(mail->imail.mail.data_pool, "%u",
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen refcount);
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen return 0;
6825360d446542046757b06064282301c4c6b27cTimo Sirainen case MAIL_FETCH_UIDL_BACKEND:
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (!dbox_header_have_flag(&mbox->box, mbox->hdr_ext_id,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen offsetof(struct mdbox_index_header, flags),
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen DBOX_INDEX_HEADER_FLAG_HAVE_POP3_UIDLS)) {
6a04c5112961c5f4fb2d2f25192b3dc424d62ad0Timo Sirainen *value_r = "";
6a04c5112961c5f4fb2d2f25192b3dc424d62ad0Timo Sirainen return 0;
6a04c5112961c5f4fb2d2f25192b3dc424d62ad0Timo Sirainen }
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen break;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen case MAIL_FETCH_POP3_ORDER:
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (!dbox_header_have_flag(&mbox->box, mbox->hdr_ext_id,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen offsetof(struct mdbox_index_header, flags),
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen DBOX_INDEX_HEADER_FLAG_HAVE_POP3_ORDERS)) {
6825360d446542046757b06064282301c4c6b27cTimo Sirainen *value_r = "";
6825360d446542046757b06064282301c4c6b27cTimo Sirainen return 0;
6825360d446542046757b06064282301c4c6b27cTimo Sirainen }
6825360d446542046757b06064282301c4c6b27cTimo Sirainen break;
6825360d446542046757b06064282301c4c6b27cTimo Sirainen default:
6825360d446542046757b06064282301c4c6b27cTimo Sirainen break;
6825360d446542046757b06064282301c4c6b27cTimo Sirainen }
6825360d446542046757b06064282301c4c6b27cTimo Sirainen return dbox_mail_get_special(_mail, field, value_r);
6825360d446542046757b06064282301c4c6b27cTimo Sirainen}
6825360d446542046757b06064282301c4c6b27cTimo Sirainen
c8d093d149253fe8faec267c5057f45fe626f84cTimo Sirainenstatic void
c8d093d149253fe8faec267c5057f45fe626f84cTimo Sirainenmdbox_mail_update_flags(struct mail *mail, enum modify_type modify_type,
6825360d446542046757b06064282301c4c6b27cTimo Sirainen enum mail_flags flags)
6825360d446542046757b06064282301c4c6b27cTimo Sirainen{
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if ((flags & DBOX_INDEX_FLAG_ALT) != 0) {
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen mdbox_purge_alt_flag_change(mail, modify_type != MODIFY_REMOVE);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen flags &= ~DBOX_INDEX_FLAG_ALT;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (flags == 0 && modify_type != MODIFY_REPLACE)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen return;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen index_mail_update_flags(mail, modify_type, flags);
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen}
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenstruct mail_vfuncs mdbox_mail_vfuncs = {
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen dbox_mail_close,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen index_mail_free,
2a34e2be33f8a17d21384a5527ed9f75f4d270e0Timo Sirainen index_mail_set_seq,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen index_mail_set_uid,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen index_mail_set_uid_cache_updates,
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen index_mail_prefetch,
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen index_mail_precache,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen index_mail_add_temp_wanted_fields,
89b548af722113acb5d63dfffb44423cb60f91e4Timo Sirainen
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen index_mail_get_flags,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen index_mail_get_keywords,
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen index_mail_get_keyword_indexes,
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen index_mail_get_modseq,
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen index_mail_get_pvt_modseq,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen index_mail_get_parts,
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen index_mail_get_date,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen dbox_mail_get_received_date,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen mdbox_mail_get_save_date,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen dbox_mail_get_virtual_size,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen dbox_mail_get_physical_size,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen index_mail_get_first_header,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen index_mail_get_headers,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen index_mail_get_header_stream,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen dbox_mail_get_stream,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen index_mail_get_binary_stream,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen mdbox_mail_get_special,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen index_mail_get_backend_mail,
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen mdbox_mail_update_flags,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen index_mail_update_keywords,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen index_mail_update_modseq,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen index_mail_update_pvt_modseq,
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen NULL,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen index_mail_expunge,
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen index_mail_set_cache_corrupted,
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen index_mail_opened,
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen};
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen