maildir-mail.c revision 90adcaa0a00eba29b7fbd50ca66be11c8d086d6a
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Copyright (C) 2003 Timo Sirainen */
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainendo_open(struct maildir_mailbox *mbox, const char *path, void *context)
8153fdec343e40e2a78f5c12353e89b994b28f74Timo Sirainen mail_storage_set_critical(STORAGE(mbox->storage),
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainendo_stat(struct maildir_mailbox *mbox, const char *path, void *context)
8153fdec343e40e2a78f5c12353e89b994b28f74Timo Sirainen mail_storage_set_critical(STORAGE(mbox->storage),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic struct istream *
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenmaildir_open_mail(struct maildir_mailbox *mbox, struct mail *mail,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (maildir_file_do(mbox, mail->uid, do_open, &fd) < 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen path = maildir_save_file_get_path(mail->transaction, mail->seq);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int maildir_mail_stat(struct mail *mail, struct stat *st)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->box;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct index_mail_data *data = &((struct index_mail *)mail)->data;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen if (data->access_part != 0 && data->stream == NULL) {
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen /* we're going to open the mail anyway */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_storage_set_critical(STORAGE(mbox->storage),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "fstat(maildir) failed: %m");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (maildir_file_do(mbox, mail->uid, do_stat, st) <= 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen path = maildir_save_file_get_path(mail->transaction, mail->seq);
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainenstatic time_t maildir_mail_get_received_date(struct mail *_mail)
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen index_mail_cache_add(mail, MAIL_CACHE_RECEIVED_DATE,
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen &data->received_date, sizeof(data->received_date));
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstatic time_t maildir_mail_get_save_date(struct mail *_mail)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
8754bb7a1f24705ffa5434f9e10d57e0b3b88d6eTimo Sirainen index_mail_cache_add(mail, MAIL_CACHE_SAVE_DATE,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic uoff_t maildir_mail_get_virtual_size(struct mail *_mail)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->ibox;
366d6311c9d5bac6613e3cd64619eb878adce9ecTimo Sirainen if ((mail->wanted_fields & MAIL_FETCH_VIRTUAL_SIZE) == 0) {
366d6311c9d5bac6613e3cd64619eb878adce9ecTimo Sirainen data->virtual_size = index_mail_get_cached_virtual_size(mail);
366d6311c9d5bac6613e3cd64619eb878adce9ecTimo Sirainen fname = maildir_uidlist_lookup(mbox->uidlist, _mail->uid,
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen path = maildir_save_file_get_path(_mail->transaction,
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen /* size can be included in filename */
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen if (maildir_filename_get_size(fname, MAILDIR_EXTRA_VIRTUAL_SIZE,
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen index_mail_cache_add(mail, MAIL_CACHE_VIRTUAL_FULL_SIZE,
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainenstatic const char *
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainenmaildir_mail_get_special(struct mail *_mail, enum mail_fetch_field field)
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->ibox;
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen path = maildir_save_file_get_path(_mail->transaction,
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen return end == NULL ? fname : t_strdup_until(fname, end);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic uoff_t maildir_mail_get_physical_size(struct mail *_mail)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->ibox;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen fname = maildir_uidlist_lookup(mbox->uidlist, _mail->uid,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen path = maildir_save_file_get_path(_mail->transaction,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* size can be included in filename */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (!maildir_filename_get_size(fname, MAILDIR_EXTRA_FILE_SIZE, &size)) {
87460b08cb97b31cde640d4975a6aa2c1d0e7226Timo Sirainen /* saved mail which hasn't been committed yet */
return size;
bool deleted;
return NULL;