bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2003-2018 Dovecot authors, see the included COPYING file */
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainendo_open(struct maildir_mailbox *mbox, const char *path,
2cfe9983ce7a6280636ee12beccc2e865111967bTimo Sirainendo_stat(struct maildir_mailbox *mbox, const char *path, struct stat *st)
d4002fe1f64d25a792f76fb102ef7dc519cd4e24Martti Rannanjärvi mailbox_set_critical(&mbox->box, "stat(%s) failed: %m", path);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic struct istream *
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainenmaildir_open_mail(struct maildir_mailbox *mbox, struct mail *mail,
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen if (maildir_file_do(mbox, mail->uid, do_open, &ctx) < 0)
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen path = maildir_save_file_get_path(mail->transaction, mail->seq);
bace943c67e6cd14ce6c994f533d82a3caad5bf1Timo Sirainen input = i_stream_create_fd_autoclose(&ctx.fd, 0);
f6f021c133f680cf3d559187524fd9abcbaae9b9Timo Sirainen if (maildir_lose_unexpected_dir(&mbox->storage->storage,
35283613d4c04ce18836e9fc431582c87b3710a0Timo Sirainenstatic int maildir_mail_stat(struct mail *mail, struct stat *st_r)
77f8c49beac69a8f5d5d41239528474ee1b877eaJosef 'Jeff' Sipek struct maildir_mailbox *mbox = MAILDIR_MAILBOX(mail->box);
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek struct index_mail *imail = INDEX_MAIL(mail);
35283613d4c04ce18836e9fc431582c87b3710a0Timo Sirainen if (mail->lookup_abort == MAIL_LOOKUP_ABORT_NOT_IN_CACHE) {
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen /* we're going to open the mail anyway */
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen (void)mail_get_stream(mail, NULL, NULL, &input);
fe0d19245382de9d4710d6ed0f7977ff5be4b3b2Timo Sirainen (fd = i_stream_get_fd(imail->data.stream)) != -1) {
2d01cc1880cf2afd4fb1c8ad7fa6ce78e562e71eTimo Sirainen mail->transaction->stats.fstat_lookup_count++;
d4002fe1f64d25a792f76fb102ef7dc519cd4e24Martti Rannanjärvi mail_set_critical(mail, "fstat(%s) failed: %m",
35283613d4c04ce18836e9fc431582c87b3710a0Timo Sirainen ret = maildir_file_do(mbox, mail->uid, do_stat, st_r);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen path = maildir_save_file_get_path(mail->transaction, mail->seq);
d4002fe1f64d25a792f76fb102ef7dc519cd4e24Martti Rannanjärvi mail_set_critical(mail, "stat(%s) failed: %m", path);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenstatic int maildir_mail_get_received_date(struct mail *_mail, time_t *date_r)
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek struct index_mail *mail = INDEX_MAIL(_mail);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen if (index_mail_get_received_date(_mail, date_r) == 0)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenstatic int maildir_mail_get_save_date(struct mail *_mail, time_t *date_r)
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek struct index_mail *mail = INDEX_MAIL(_mail);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen if (index_mail_get_save_date(_mail, date_r) == 0)
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainenmaildir_mail_get_fname(struct maildir_mailbox *mbox, struct mail *mail,
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainen const char **fname_r)
6013fbad6638795a00e6c2a2dd2cdbee19612494Timo Sirainen ret = maildir_sync_lookup(mbox, mail->uid, &flags, fname_r);
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen /* file exists in index file, but not in dovecot-uidlist anymore. */
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen /* one reason this could happen is if we delayed opening
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen dovecot-uidlist and we're trying to open a mail that got recently
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen expunged. Let's test this theory first: */
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen exists = mail_index_lookup_seq(view, mail->uid, &seq);
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen /* the message still exists in index. this means there's some
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen kind of a desync, which doesn't get fixed if cur/ mtime is
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen the same as in index. fix this by forcing a resync. */
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen (void)maildir_storage_sync_force(mbox, mail->uid);
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainenstatic int maildir_get_pop3_state(struct index_mail *mail)
d22301419109ed4a38351715e6760011421dadecTimo Sirainen struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box);
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen /* if this mail itself has non-pop3 fields we know we're not
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen allowed_pop3_fields = MAIL_FETCH_FLAGS | MAIL_FETCH_STREAM_HEADER |
5eb85ec9546bac4eea7d78de8997920ba3debd30Timo Sirainen MAIL_FETCH_STREAM_BODY | MAIL_FETCH_STORAGE_ID |
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen (mail->data.wanted_fields & ~allowed_pop3_fields) != 0)
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen /* get vsize decisions */
d22301419109ed4a38351715e6760011421dadecTimo Sirainen psize_idx = ibox->cache_fields[MAIL_CACHE_PHYSICAL_FULL_SIZE].idx;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen vsize_idx = ibox->cache_fields[MAIL_CACHE_VIRTUAL_FULL_SIZE].idx;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen vsize_dec = mail_cache_field_get_decision(box->cache,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen /* also check if there are any non-[pv]size cached fields */
d22301419109ed4a38351715e6760011421dadecTimo Sirainen fields = mail_cache_register_get_list(box->cache,
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen for (i = 0; i < count; i++) {
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen dec = fields[i].decision & ~MAIL_CACHE_DECISION_FORCED;
fdb838ec8774e41004461b7f76ab409774af06c4Timo Sirainen if (index_mail_get_vsize_extension(&mail->mail.mail) != NULL) {
fdb838ec8774e41004461b7f76ab409774af06c4Timo Sirainen /* having a vsize extension in index is the same as having
fdb838ec8774e41004461b7f76ab409774af06c4Timo Sirainen vsize's caching decision YES */
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen /* either nothing is cached, or only vsize is cached. */
236bedf76e31651ea9fca63fbdc25be673819526Timo Sirainen } else if (vsize_dec != MAIL_CACHE_DECISION_YES &&
d22301419109ed4a38351715e6760011421dadecTimo Sirainen (box->flags & MAILBOX_FLAG_POP3_SESSION) == 0) {
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen /* if virtual size isn't cached permanently,
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen POP3 isn't being used */
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen /* possibly a mixed pop3/imap */
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainenstatic int maildir_quick_size_lookup(struct index_mail *mail, bool vsize,
77f8c49beac69a8f5d5d41239528474ee1b877eaJosef 'Jeff' Sipek struct maildir_mailbox *mbox = MAILDIR_MAILBOX(_mail->box);
7ede6554e451ec039a67beec7d6ee4aff61d386eTimo Sirainen if (maildir_mail_get_fname(mbox, _mail, &fname) <= 0)
f567e9ad51a3b4f61580299f12b67e070fb16c5cTimo Sirainen if (maildir_save_file_get_size(_mail->transaction, _mail->seq,
b142deb9a831c89b1bb9129ada655f3e56b9d4ccTimo Sirainen path = maildir_save_file_get_path(_mail->transaction,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* size can be included in filename */
80bcc6caa317a52bddcafe74fede886247dbba5bTimo Sirainen if (vsize || !mbox->storage->set->maildir_broken_filename_sizes) {
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen /* size can be included in uidlist entry */
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen value = maildir_uidlist_lookup_ext(mbox->uidlist, _mail->uid,
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen if (value != NULL && str_to_uoff(value, size_r) == 0)
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainenmaildir_handle_size_caching(struct index_mail *mail, bool quick_check,
77f8c49beac69a8f5d5d41239528474ee1b877eaJosef 'Jeff' Sipek struct maildir_mailbox *mbox = MAILDIR_MAILBOX(box);
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen field = vsize ? MAIL_FETCH_VIRTUAL_SIZE : MAIL_FETCH_PHYSICAL_SIZE;
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen if ((mail->data.dont_cache_fetch_fields & field) != 0)
55b6e3105184ad6a2f987346380966f556300055Timo Sirainen if (quick_check && maildir_quick_size_lookup(mail, vsize, &size) > 0) {
7aeaf23f760d86aad525d831efcac9f860a55a39Timo Sirainen /* already in filename / uidlist. don't add it anywhere,
cf49fc07f541c0f74578ac6c3b334ddade143aa1Timo Sirainen including to the uidlist if it's already in filename.
cf49fc07f541c0f74578ac6c3b334ddade143aa1Timo Sirainen do some extra checks here to catch potential cache bugs. */
cf49fc07f541c0f74578ac6c3b334ddade143aa1Timo Sirainen if (vsize && mail->data.virtual_size != size) {
7522446d6514e5593c9d4d7e4beacd328301cb23Aki Tuomi "Corrupted virtual size: "
cf49fc07f541c0f74578ac6c3b334ddade143aa1Timo Sirainen } else if (!vsize && mail->data.physical_size != size) {
7522446d6514e5593c9d4d7e4beacd328301cb23Aki Tuomi "Corrupted physical size: "
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen /* 1 = pop3-only, 0 = mixed, -1 = no pop3 */
18065635d4e79dd96eb3b3215718abd12f6a6808Timo Sirainen if (pop3_state >= 0 && mail->mail.mail.uid != 0) {
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen /* if size is wanted permanently, store it to uidlist
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen so that in case cache file gets lost we can get it quickly */
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen maildir_uidlist_set_ext(mbox->uidlist, mail->mail.mail.uid,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainenstatic int maildir_mail_get_virtual_size(struct mail *_mail, uoff_t *size_r)
77f8c49beac69a8f5d5d41239528474ee1b877eaJosef 'Jeff' Sipek struct maildir_mailbox *mbox = MAILDIR_MAILBOX(_mail->box);
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek struct index_mail *mail = INDEX_MAIL(_mail);
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen (_mail->box->flags & MAILBOX_FLAG_POP3_SESSION) != 0) {
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen /* try to get the size from uidlist. this is especially useful
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen with pop3 to avoid unnecessarily opening the cache file. */
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen if (index_mail_get_cached_virtual_size(mail, size_r)) {
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen i_assert(mail->data.virtual_size != (uoff_t)-1);
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen maildir_handle_size_caching(mail, TRUE, TRUE);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen data->dont_cache_fetch_fields |= MAIL_FETCH_VIRTUAL_SIZE;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen /* fallback to reading the file */
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen old_offset = data->stream == NULL ? 0 : data->stream->v_offset;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen if (mail_get_stream(_mail, &hdr_size, &body_size, &input) < 0)
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen maildir_handle_size_caching(mail, FALSE, TRUE);
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainenstatic int maildir_mail_get_physical_size(struct mail *_mail, uoff_t *size_r)
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek struct index_mail *mail = INDEX_MAIL(_mail);
77f8c49beac69a8f5d5d41239528474ee1b877eaJosef 'Jeff' Sipek struct maildir_mailbox *mbox = MAILDIR_MAILBOX(_mail->box);
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen (_mail->box->flags & MAILBOX_FLAG_POP3_SESSION) != 0) {
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen /* try to get the size from uidlist (see virtual size above) */
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen if (index_mail_get_physical_size(_mail, size_r) == 0) {
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen i_assert(mail->data.physical_size != (uoff_t)-1);
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen maildir_handle_size_caching(mail, TRUE, FALSE);
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen data->dont_cache_fetch_fields |= MAIL_FETCH_PHYSICAL_SIZE;
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen /* we can't use stat(), because this may be a mail that some
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen plugin has changed (e.g. zlib). need to do it the slow
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen if (mail_get_stream(_mail, &hdr_size, &body_size, &input) < 0)
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen st.st_size = hdr_size.physical_size + body_size.physical_size;
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen ret = maildir_file_do(mbox, _mail->uid, do_stat, &st);
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen /* saved mail which hasn't been committed yet */
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen path = maildir_save_file_get_path(_mail->transaction,
d4002fe1f64d25a792f76fb102ef7dc519cd4e24Martti Rannanjärvi mail_set_critical(_mail, "stat(%s) failed: %m", path);
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen maildir_handle_size_caching(mail, FALSE, FALSE);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenmaildir_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char **value_r)
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek struct index_mail *mail = INDEX_MAIL(_mail);
77f8c49beac69a8f5d5d41239528474ee1b877eaJosef 'Jeff' Sipek struct maildir_mailbox *mbox = MAILDIR_MAILBOX(_mail->box);
e1eeb3be29afde2830c2b7ed594c6f1fef2f69dcTimo Sirainen const char *path, *fname = NULL, *end, *guid, *uidl, *order;
e4e7475f646d66a257d682738fbff1f206ce4924Timo Sirainen /* use GUID from uidlist if it exists */
24cd47a2c8f7507e555459b7e841de771ba3c318Timo Sirainen /* first make sure that we have a refreshed uidlist */
24cd47a2c8f7507e555459b7e841de771ba3c318Timo Sirainen if (maildir_mail_get_fname(mbox, _mail, &fname) <= 0)
e4e7475f646d66a257d682738fbff1f206ce4924Timo Sirainen guid = maildir_uidlist_lookup_ext(mbox->uidlist, _mail->uid,
d4002fe1f64d25a792f76fb102ef7dc519cd4e24Martti Rannanjärvi "Maildir: Corrupted dovecot-uidlist: "
d4002fe1f64d25a792f76fb102ef7dc519cd4e24Martti Rannanjärvi "UID had empty GUID, clearing it");
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen maildir_uidlist_unset_ext(mbox->uidlist, _mail->uid,
e4e7475f646d66a257d682738fbff1f206ce4924Timo Sirainen /* default to base filename: */
5eb85ec9546bac4eea7d78de8997920ba3debd30Timo Sirainen if (maildir_mail_get_special(_mail, MAIL_FETCH_STORAGE_ID,
24cd47a2c8f7507e555459b7e841de771ba3c318Timo Sirainen /* we came here from MAIL_FETCH_GUID,
24cd47a2c8f7507e555459b7e841de771ba3c318Timo Sirainen avoid a second lookup */
7ede6554e451ec039a67beec7d6ee4aff61d386eTimo Sirainen if (maildir_mail_get_fname(mbox, _mail, &fname) <= 0)
b142deb9a831c89b1bb9129ada655f3e56b9d4ccTimo Sirainen path = maildir_save_file_get_path(_mail->transaction,
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen p_strdup_until(mail->mail.data_pool, fname, end);
e76c494ad6535d3de314cc0d3ac7a44b06e53c4bTimo Sirainen uidl = maildir_uidlist_lookup_ext(mbox->uidlist, _mail->uid,
89fb98e9eb7e95255a579c8e9d865383c2334a74Timo Sirainen /* use the default */
89fb98e9eb7e95255a579c8e9d865383c2334a74Timo Sirainen /* special optimization case: use the base file name */
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen *value_r = p_strdup(mail->mail.data_pool, uidl);
e1eeb3be29afde2830c2b7ed594c6f1fef2f69dcTimo Sirainen order = maildir_uidlist_lookup_ext(mbox->uidlist, _mail->uid,
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen *value_r = p_strdup(mail->mail.data_pool, order);
03de962febfc2ac572f9e4029463c16d29c1ed55Timo Sirainen *value_r = p_strdup_printf(mail->mail.data_pool, "%lu",
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen return index_mail_get_special(_mail, field, value_r);
6df0ab0c1ab91f06b6418cb30eff44405a1b8f02Timo Sirainenmaildir_mail_get_stream(struct mail *_mail, bool get_body ATTR_UNUSED,
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek struct index_mail *mail = INDEX_MAIL(_mail);
77f8c49beac69a8f5d5d41239528474ee1b877eaJosef 'Jeff' Sipek struct maildir_mailbox *mbox = MAILDIR_MAILBOX(_mail->box);
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen data->stream = maildir_open_mail(mbox, _mail, &deleted);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return index_mail_init_stream(mail, hdr_size, body_size, stream_r);
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainenstatic void maildir_update_pop3_uidl(struct mail *_mail, const char *uidl)
77f8c49beac69a8f5d5d41239528474ee1b877eaJosef 'Jeff' Sipek struct maildir_mailbox *mbox = MAILDIR_MAILBOX(_mail->box);
5eb85ec9546bac4eea7d78de8997920ba3debd30Timo Sirainen if (maildir_mail_get_special(_mail, MAIL_FETCH_STORAGE_ID,
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen /* special case optimization: empty UIDL means the same
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen as base filename */
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen maildir_uidlist_set_ext(mbox->uidlist, _mail->uid,
de4e3a2e1e8f82b2d3226c090b71b518b43bf9cfTimo Sirainenstatic void maildir_mail_remove_sizes_from_uidlist(struct mail *mail)
77f8c49beac69a8f5d5d41239528474ee1b877eaJosef 'Jeff' Sipek struct maildir_mailbox *mbox = MAILDIR_MAILBOX(mail->box);
de4e3a2e1e8f82b2d3226c090b71b518b43bf9cfTimo Sirainen if (maildir_uidlist_lookup_ext(mbox->uidlist, mail->uid,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen maildir_uidlist_unset_ext(mbox->uidlist, mail->uid,
de4e3a2e1e8f82b2d3226c090b71b518b43bf9cfTimo Sirainen if (maildir_uidlist_lookup_ext(mbox->uidlist, mail->uid,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen maildir_uidlist_unset_ext(mbox->uidlist, mail->uid,
9559586a78b7b21e0b74748c427e0a252242be40Timo Sirainendo_fix_size(struct maildir_mailbox *mbox, const char *path,
b12b6da6f084212d42421a28ae329eae79751c42Timo Sirainen const char *fname, *newpath, *extra, *info, *dir;
3ec3632e12638396944e854a8f7a2bc6c67b981dTimo Sirainen newpath = t_strdup_printf("%s/%s,S=%"PRIuUOFF_T"%s", dir,
b12b6da6f084212d42421a28ae329eae79751c42Timo Sirainen "Maildir filename has wrong %c value, "
b12b6da6f084212d42421a28ae329eae79751c42Timo Sirainen "renamed the file from %s to %s",
d4002fe1f64d25a792f76fb102ef7dc519cd4e24Martti Rannanjärvi mailbox_set_critical(&mbox->box, "rename(%s, %s) failed: %m",
de4e3a2e1e8f82b2d3226c090b71b518b43bf9cfTimo Sirainenmaildir_mail_remove_sizes_from_filename(struct mail *mail,
77f8c49beac69a8f5d5d41239528474ee1b877eaJosef 'Jeff' Sipek struct maildir_mailbox *mbox = MAILDIR_MAILBOX(mail->box);
6d9ce72cef0963ac414353dc4dfb3a51f62fa542Timo Sirainen struct mail_private *pmail = (struct mail_private *)mail;
9559586a78b7b21e0b74748c427e0a252242be40Timo Sirainen if (mbox->storage->set->maildir_broken_filename_sizes) {
0fa25bd866479a9aac973e716ba04dd8be8c2814Timo Sirainen /* never try to fix sizes in maildir filenames */
de4e3a2e1e8f82b2d3226c090b71b518b43bf9cfTimo Sirainen if (maildir_sync_lookup(mbox, mail->uid, &flags, &fname) <= 0)
45799f8340fdcddfb077c1d44ad1d2014d7db31cTimo Sirainen maildir_filename_get_size(fname, MAILDIR_EXTRA_VIRTUAL_SIZE,
45799f8340fdcddfb077c1d44ad1d2014d7db31cTimo Sirainen } else if (field == MAIL_FETCH_PHYSICAL_SIZE &&
45799f8340fdcddfb077c1d44ad1d2014d7db31cTimo Sirainen maildir_filename_get_size(fname, MAILDIR_EXTRA_FILE_SIZE,
45799f8340fdcddfb077c1d44ad1d2014d7db31cTimo Sirainen /* the broken size isn't in filename */
9559586a78b7b21e0b74748c427e0a252242be40Timo Sirainen /* the mail could be e.g. compressed. get the physical size
9559586a78b7b21e0b74748c427e0a252242be40Timo Sirainen the slow way by actually reading the mail. */
9559586a78b7b21e0b74748c427e0a252242be40Timo Sirainen if (mail_get_stream(mail, NULL, NULL, &input) < 0)
9559586a78b7b21e0b74748c427e0a252242be40Timo Sirainen (void)maildir_file_do(mbox, mail->uid, do_fix_size, &ctx);
0206dc57f2c04da69599dea5816235cfeb2b897aMartti Rannanjärvistatic void maildir_mail_set_cache_corrupted(struct mail *_mail,
de4e3a2e1e8f82b2d3226c090b71b518b43bf9cfTimo Sirainen maildir_mail_remove_sizes_from_uidlist(_mail);
de4e3a2e1e8f82b2d3226c090b71b518b43bf9cfTimo Sirainen maildir_mail_remove_sizes_from_filename(_mail, field);