#include "lib.h"
#include "istream.h"
#include "nfs-workarounds.h"
-#include "index-mail.h"
+#include "maildir-mail.h"
#include "maildir-storage.h"
#include "maildir-filename.h"
#include "maildir-uidlist.h"
#include <unistd.h>
#include <sys/stat.h>
+static void maildir_mail_fix_corruption(struct mail *_mail);
+
struct maildir_open_context {
int fd;
char *path;
struct index_mail_data *data = &mail->data;
bool deleted;
+ maildir_mail_fix_corruption(_mail);
if (data->stream == NULL) {
data->stream = maildir_open_mail(mbox, _mail, &deleted);
if (data->stream == NULL) {
(void)maildir_file_do(mbox, mail->uid, do_fix_size, &ctx);
}
+static void maildir_mail_fix_corruption(struct mail *_mail)
+{
+ struct maildir_mail *mail =
+ container_of(_mail, struct maildir_mail, imail.mail.mail);
+
+ if (mail->corrupted_field == 0)
+ return;
+
+ mail->corrupted_field = 0;
+ maildir_mail_remove_sizes_from_uidlist(_mail);
+ maildir_mail_remove_sizes_from_filename(_mail, mail->corrupted_field);
+}
+
static void maildir_mail_set_cache_corrupted(struct mail *_mail,
enum mail_fetch_field field,
const char *reason)
{
+ struct maildir_mail *mail =
+ container_of(_mail, struct maildir_mail, imail.mail.mail);
+
if (field == MAIL_FETCH_PHYSICAL_SIZE ||
- field == MAIL_FETCH_VIRTUAL_SIZE) {
- maildir_mail_remove_sizes_from_uidlist(_mail);
- maildir_mail_remove_sizes_from_filename(_mail, field);
- }
+ field == MAIL_FETCH_VIRTUAL_SIZE)
+ mail->corrupted_field = field;
index_mail_set_cache_corrupted(_mail, field, reason);
}
+static void maildir_mail_close(struct mail *_mail)
+{
+ maildir_mail_fix_corruption(_mail);
+ index_mail_close(_mail);
+}
+
struct mail_vfuncs maildir_mail_vfuncs = {
- index_mail_close,
+ maildir_mail_close,
index_mail_free,
index_mail_set_seq,
index_mail_set_uid,
#include "maildir-uidlist.h"
#include "maildir-keywords.h"
#include "maildir-sync.h"
-#include "index-mail.h"
+#include "maildir-mail.h"
#include <sys/stat.h>
return mbox->_private_flags_mask;
}
+static struct mail *
+maildir_mail_alloc(struct mailbox_transaction_context *t,
+ enum mail_fetch_field wanted_fields,
+ struct mailbox_header_lookup_ctx *wanted_headers)
+{
+ struct maildir_mail *mail;
+ pool_t pool;
+
+ pool = pool_alloconly_create("mail", 2048);
+ mail = p_new(pool, struct maildir_mail, 1);
+
+ index_mail_init(&mail->imail, t, wanted_fields,
+ wanted_headers, pool, NULL);
+ return &mail->imail.mail.mail;
+}
+
bool maildir_is_backend_readonly(struct maildir_mailbox *mbox)
{
if (!mbox->backend_readonly_set) {
index_transaction_commit,
index_transaction_rollback,
maildir_get_private_flags_mask,
- index_mail_alloc,
+ maildir_mail_alloc,
index_storage_search_init,
index_storage_search_deinit,
index_storage_search_next_nonblock,