maildir-mail.c revision 6ef7e31619edfaa17ed044b45861d106a86191ef
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (C) 2003 Timo Sirainen */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainendo_open(struct maildir_mailbox *mbox, const char *path, void *context)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_storage_set_critical(STORAGE(mbox->storage),
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainendo_stat(struct maildir_mailbox *mbox, const char *path, void *context)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_storage_set_critical(STORAGE(mbox->storage),
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainenstatic struct istream *
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainenmaildir_open_mail(struct maildir_mailbox *mbox, uint32_t uid, bool *deleted)
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen if (maildir_file_do(mbox, uid, do_open, &fd) < 0)
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainenstatic time_t maildir_mail_get_received_date(struct mail *_mail)
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->ibox;
992a13add4eea0810e4db0f042a595dddf85536aTimo 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),
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen "fstat(maildir) failed: %m");
e9d29ae46d435aee85514decfe6ee27399ebf794Timo Sirainen if (maildir_file_do(mbox, mail->mail.mail.uid,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen mail_cache_add(mail->trans->cache_trans, mail->data.seq,
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen &data->received_date, sizeof(data->received_date));
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainenstatic uoff_t maildir_mail_get_virtual_size(struct mail *_mail)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->ibox;
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen const char *fname, *p;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if ((mail->wanted_fields & MAIL_FETCH_VIRTUAL_SIZE) == 0) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen data->virtual_size = index_mail_get_cached_virtual_size(mail);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen /* size can be included in filename */
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen p = strstr(fname, MAILDIR_EXTRA_SEP_S MAILDIR_EXTRA_VIRTUAL_SIZE "=");
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen virtual_size = virtual_size * 10 + (*p - '0');
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen if (*p == MAILDIR_INFO_SEP || *p == MAILDIR_EXTRA_SEP ||
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainen *p == '\0') {
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainen mail_cache_add(mail->trans->cache_trans, mail->data.seq,
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainenstatic const char *
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainenmaildir_mail_get_special(struct mail *_mail, enum mail_fetch_field field)
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->ibox;
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen return end == NULL ? fname : t_strdup_until(fname, end);
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainenstatic uoff_t maildir_mail_get_physical_size(struct mail *_mail)
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->ibox;
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen const char *fname, *p;
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen /* size can be included in filename */
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen p = strstr(fname, MAILDIR_EXTRA_SEP_S MAILDIR_EXTRA_FILE_SIZE "=");
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen if (maildir_file_do(mbox, mail->mail.mail.uid,
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen mail_cache_add(mail->trans->cache_trans, mail->data.seq,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen MAIL_CACHE_PHYSICAL_FULL_SIZE, &size, sizeof(size));
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainenstatic struct istream *maildir_mail_get_stream(struct mail *_mail,
04870054863757edf048c81dcce3c5e7dec453cdTimo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
04870054863757edf048c81dcce3c5e7dec453cdTimo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->ibox;