maildir-mail.c revision f567e9ad51a3b4f61580299f12b67e070fb16c5c
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2003-2014 Dovecot authors, see the included COPYING file */
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainendo_open(struct maildir_mailbox *mbox, const char *path,
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen mail_storage_set_critical(&mbox->storage->storage, "%s",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_storage_set_critical(&mbox->storage->storage,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainendo_stat(struct maildir_mailbox *mbox, const char *path, struct stat *st)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_storage_set_critical(&mbox->storage->storage, "%s",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_storage_set_critical(&mbox->storage->storage,
bbce20cb4e5739e9a06058cf8ee1f38a7f6884f6Timo Sirainenstatic struct istream *
bbce20cb4e5739e9a06058cf8ee1f38a7f6884f6Timo Sirainenmaildir_open_mail(struct maildir_mailbox *mbox, struct mail *mail,
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen if (maildir_file_do(mbox, mail->uid, do_open, &ctx) < 0)
93b29720c5141f787bd1861796867e4595c9d084Timo Sirainen path = maildir_save_file_get_path(mail->transaction, mail->seq);
93b29720c5141f787bd1861796867e4595c9d084Timo Sirainen if (maildir_lose_unexpected_dir(&mbox->storage->storage,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int maildir_mail_stat(struct mail *mail, struct stat *st_r)
1cf72a848805fcf014b01c9d3665b6a157846a21Timo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->box;
1cf72a848805fcf014b01c9d3665b6a157846a21Timo Sirainen struct index_mail *imail = (struct index_mail *)mail;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (mail->lookup_abort == MAIL_LOOKUP_ABORT_NOT_IN_CACHE) {
93b29720c5141f787bd1861796867e4595c9d084Timo Sirainen /* we're going to open the mail anyway */
0d658231054332c3f4c04aab0422af649de89a8cTimo Sirainen (void)mail_get_stream(mail, NULL, NULL, &input);
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen mail->transaction->stats.fstat_lookup_count++;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen if (i_stream_stat(imail->data.stream, FALSE, &stp) < 0)
0d658231054332c3f4c04aab0422af649de89a8cTimo Sirainen ret = maildir_file_do(mbox, mail->uid, do_stat, st_r);
45e62043058738e294f89504c319d852e25943ccTimo Sirainen path = maildir_save_file_get_path(mail->transaction, mail->seq);
9df8c9225140d9d1df5ddf4c6c9da61662ae6c44Timo Sirainenstatic int maildir_mail_get_received_date(struct mail *_mail, time_t *date_r)
95a284736b8b11319a3f575ba249ba2eb7dbac1bTimo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
95a284736b8b11319a3f575ba249ba2eb7dbac1bTimo Sirainen if (index_mail_get_received_date(_mail, date_r) == 0)
a4d209d480d453566d331e870b8d0c99af7716c8Timo Sirainenstatic int maildir_mail_get_save_date(struct mail *_mail, time_t *date_r)
a4d209d480d453566d331e870b8d0c99af7716c8Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen if (index_mail_get_save_date(_mail, date_r) == 0)
fc7b17677ac1a5fa3f7fe13d5ef7dcfea8d9b4a1Timo Sirainenmaildir_mail_get_fname(struct maildir_mailbox *mbox, struct mail *mail,
fc7b17677ac1a5fa3f7fe13d5ef7dcfea8d9b4a1Timo Sirainen const char **fname_r)
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen ret = maildir_sync_lookup(mbox, mail->uid, &flags, fname_r);
e86d0d34fe365da4c7ca4312d575bfcbf3a01c0eTimo Sirainen /* file exists in index file, but not in dovecot-uidlist anymore. */
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen /* one reason this could happen is if we delayed opening
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen dovecot-uidlist and we're trying to open a mail that got recently
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen expunged. Let's test this theory first: */
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen exists = mail_index_lookup_seq(view, mail->uid, &seq);
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen /* the message still exists in index. this means there's some
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen kind of a desync, which doesn't get fixed if cur/ mtime is
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen the same as in index. fix this by forcing a resync. */
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen (void)maildir_storage_sync_force(mbox, mail->uid);
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainenstatic int maildir_get_pop3_state(struct index_mail *mail)
e86d0d34fe365da4c7ca4312d575bfcbf3a01c0eTimo Sirainen struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box);
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen /* if this mail itself has non-pop3 fields we know we're not
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen allowed_pop3_fields = MAIL_FETCH_FLAGS | MAIL_FETCH_STREAM_HEADER |
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen MAIL_FETCH_STREAM_BODY | MAIL_FETCH_UIDL_FILE_NAME |
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen (mail->data.wanted_fields & ~allowed_pop3_fields) != 0)
1cf72a848805fcf014b01c9d3665b6a157846a21Timo Sirainen /* get vsize decisions */
1cf72a848805fcf014b01c9d3665b6a157846a21Timo Sirainen psize_idx = ibox->cache_fields[MAIL_CACHE_PHYSICAL_FULL_SIZE].idx;
1cf72a848805fcf014b01c9d3665b6a157846a21Timo Sirainen vsize_idx = ibox->cache_fields[MAIL_CACHE_VIRTUAL_FULL_SIZE].idx;
1cf72a848805fcf014b01c9d3665b6a157846a21Timo Sirainen vsize_dec = mail_cache_field_get_decision(box->cache,
1cf72a848805fcf014b01c9d3665b6a157846a21Timo Sirainen /* also check if there are any non-[pv]size cached fields */
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen fields = mail_cache_register_get_list(box->cache,
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen for (i = 0; i < count; i++) {
1cf72a848805fcf014b01c9d3665b6a157846a21Timo Sirainen dec = fields[i].decision & ~MAIL_CACHE_DECISION_FORCED;
1cf72a848805fcf014b01c9d3665b6a157846a21Timo Sirainen /* either nothing is cached, or only vsize is cached. */
1cf72a848805fcf014b01c9d3665b6a157846a21Timo Sirainen } else if (vsize_dec != MAIL_CACHE_DECISION_YES &&
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (box->flags & MAILBOX_FLAG_POP3_SESSION) == 0) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* if virtual size isn't cached permanently,
1cf72a848805fcf014b01c9d3665b6a157846a21Timo Sirainen POP3 isn't being used */
a050ca9def13949dbaa67bd6574a41c4f397ae26Timo Sirainen /* possibly a mixed pop3/imap */
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainenstatic int maildir_quick_size_lookup(struct index_mail *mail, bool vsize,
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)_mail->box;
1cf72a848805fcf014b01c9d3665b6a157846a21Timo Sirainen if (maildir_mail_get_fname(mbox, _mail, &fname) <= 0)
1cf72a848805fcf014b01c9d3665b6a157846a21Timo Sirainen if (maildir_save_file_get_size(_mail->transaction, _mail->seq,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen path = maildir_save_file_get_path(_mail->transaction,
f2786c07cbd4a7a0a6a46c3e06dc4545aaf2f278Timo Sirainen /* size can be included in filename */
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen if (vsize || !mbox->storage->set->maildir_broken_filename_sizes) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* size can be included in uidlist entry */
c680a6b35b459045e92814778908da5a93922107Timo Sirainen value = maildir_uidlist_lookup_ext(mbox->uidlist, _mail->uid,
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen if (value != NULL && str_to_uoff(value, size_r) == 0)
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainenmaildir_handle_size_caching(struct index_mail *mail, bool quick_check,
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)box;
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen field = vsize ? MAIL_FETCH_VIRTUAL_SIZE : MAIL_FETCH_PHYSICAL_SIZE;
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen if ((mail->data.dont_cache_fetch_fields & field) != 0)
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen if (quick_check && maildir_quick_size_lookup(mail, vsize, &size) > 0) {
ae8817f05005f57bba32479a610b52d083e2b6ebTimo Sirainen /* already in filename / uidlist. don't add it anywhere,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen including to the uidlist if it's already in filename.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen do some extra checks here to catch potential cache bugs. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (vsize && mail->data.virtual_size != size) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "Corrupted virtual size for uid=%u: "
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen } else if (!vsize && mail->data.physical_size != size) {
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen "Corrupted physical size for uid=%u: "
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen /* 1 = pop3-only, 0 = mixed, -1 = no pop3 */
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen if (pop3_state >= 0 && mail->mail.mail.uid != 0) {
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen /* if size is wanted permanently, store it to uidlist
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen so that in case cache file gets lost we can get it quickly */
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen maildir_uidlist_set_ext(mbox->uidlist, mail->mail.mail.uid,
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainenstatic int maildir_mail_get_virtual_size(struct mail *_mail, uoff_t *size_r)
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)_mail->box;
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen (_mail->box->flags & MAILBOX_FLAG_POP3_SESSION) != 0) {
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen /* try to get the size from uidlist. this is especially useful
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen with pop3 to avoid unnecessarily opening the cache file. */
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen if (index_mail_get_cached_virtual_size(mail, size_r)) {
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen i_assert(mail->data.virtual_size != (uoff_t)-1);
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen maildir_handle_size_caching(mail, TRUE, TRUE);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen data->dont_cache_fetch_fields |= MAIL_FETCH_VIRTUAL_SIZE;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* fallback to reading the file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen old_offset = data->stream == NULL ? 0 : data->stream->v_offset;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (mail_get_stream(_mail, &hdr_size, &body_size, &input) < 0)
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen maildir_handle_size_caching(mail, FALSE, TRUE);
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenstatic int maildir_mail_get_physical_size(struct mail *_mail, uoff_t *size_r)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)_mail->box;
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen (_mail->box->flags & MAILBOX_FLAG_POP3_SESSION) != 0) {
b5ac20e30146562322ceb7939f044d52d1e51184Timo Sirainen /* try to get the size from uidlist (see virtual size above) */
075912b4566a79c7bc59bf229c9f629ef7be0ea2Timo Sirainen if (index_mail_get_physical_size(_mail, size_r) == 0) {
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen i_assert(mail->data.physical_size != (uoff_t)-1);
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen maildir_handle_size_caching(mail, TRUE, FALSE);
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen data->dont_cache_fetch_fields |= MAIL_FETCH_PHYSICAL_SIZE;
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen ret = maildir_file_do(mbox, _mail->uid, do_stat, &st);
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen /* saved mail which hasn't been committed yet */
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen path = maildir_save_file_get_path(_mail->transaction,
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen mail_storage_set_critical(_mail->box->storage,
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen maildir_handle_size_caching(mail, FALSE, FALSE);
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainenmaildir_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen const char **value_r)
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)_mail->box;
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen const char *path, *fname = NULL, *end, *guid, *uidl, *order;
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen /* use GUID from uidlist if it exists */
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen /* first make sure that we have a refreshed uidlist */
075912b4566a79c7bc59bf229c9f629ef7be0ea2Timo Sirainen if (maildir_mail_get_fname(mbox, _mail, &fname) <= 0)
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen guid = maildir_uidlist_lookup_ext(mbox->uidlist, _mail->uid,
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen mail_storage_set_critical(_mail->box->storage,
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen "Maildir %s: Corrupted dovecot-uidlist: "
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen "UID %u had empty GUID, clearing it",
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen maildir_uidlist_unset_ext(mbox->uidlist, _mail->uid,
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen /* default to base filename: */
a5b331e18b220fac557480b569b85215a1b3bd8eTimo Sirainen if (maildir_mail_get_special(_mail, MAIL_FETCH_UIDL_FILE_NAME,
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen /* we came here from MAIL_FETCH_GUID,
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen avoid a second lookup */
b5ac20e30146562322ceb7939f044d52d1e51184Timo Sirainen if (maildir_mail_get_fname(mbox, _mail, &fname) <= 0)
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen path = maildir_save_file_get_path(_mail->transaction,
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen p_strdup_until(mail->mail.data_pool, fname, end);
c91de2744f8c1e61e91082ff5e214450f28a0e7cTimo Sirainen uidl = maildir_uidlist_lookup_ext(mbox->uidlist, _mail->uid,
a8012fea2a7315033bc467acbf46be8e7323318cTimo Sirainen /* use the default */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* special optimization case: use the base file name */
075912b4566a79c7bc59bf229c9f629ef7be0ea2Timo Sirainen *value_r = p_strdup(mail->mail.data_pool, uidl);
f2786c07cbd4a7a0a6a46c3e06dc4545aaf2f278Timo Sirainen order = maildir_uidlist_lookup_ext(mbox->uidlist, _mail->uid,
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen *value_r = p_strdup(mail->mail.data_pool, order);
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen *value_r = p_strdup_printf(mail->mail.data_pool, "%lu",
c9c24293550541307f1bb41bba4a0fdfe2fa59e0Timo Sirainen return index_mail_get_special(_mail, field, value_r);
b7cf555b699d73f2d71de0dabc088af6a7be3627Timo Sirainenmaildir_mail_get_stream(struct mail *_mail, bool get_body ATTR_UNUSED,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
f1e1d821d93e4a1dc6ed8f23febde868b5d64cd5Timo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)_mail->box;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen data->stream = maildir_open_mail(mbox, _mail, &deleted);
075912b4566a79c7bc59bf229c9f629ef7be0ea2Timo Sirainen return index_mail_init_stream(mail, hdr_size, body_size, stream_r);
1225a5a7ce39f1d5545d5ed3b84ecd4f72438d36Timo Sirainenstatic void maildir_update_pop3_uidl(struct mail *_mail, const char *uidl)
6eb30032b4a50c383dea4c9c74342d906de6ad36Timo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)_mail->box;
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen if (maildir_mail_get_special(_mail, MAIL_FETCH_UIDL_FILE_NAME,
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen /* special case optimization: empty UIDL means the same
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen as base filename */
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen _mail->transaction->nontransactional_changes = TRUE;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen maildir_uidlist_set_ext(mbox->uidlist, _mail->uid,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void maildir_mail_remove_sizes_from_uidlist(struct mail *mail)
5f78b33aa505b17e23cdf27b071a24e127b3db54Timo Sirainen struct maildir_mailbox *mbox = (struct maildir_mailbox *)mail->box;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (maildir_uidlist_lookup_ext(mbox->uidlist, mail->uid,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen maildir_uidlist_unset_ext(mbox->uidlist, mail->uid,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (maildir_uidlist_lookup_ext(mbox->uidlist, mail->uid,
5f78b33aa505b17e23cdf27b071a24e127b3db54Timo Sirainen maildir_uidlist_unset_ext(mbox->uidlist, mail->uid,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainendo_fix_size(struct maildir_mailbox *mbox, const char *path, char *wrong_key_p)
5f78b33aa505b17e23cdf27b071a24e127b3db54Timo Sirainen const char *fname, *newpath, *extra, *info, *dir;
ccffbed92cb02c24fd717808a84138240bf1885bTimo Sirainen mail_storage_set_critical(&mbox->storage->storage,
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen newpath = t_strdup_printf("%s/%s,S=%"PRIuUOFF_T"%s", dir,
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen "Maildir filename has wrong %c value, "
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen "renamed the file from %s to %s",
95a1a5195d56f3cf5d1e529aad668f87ad3b979bTimo Sirainen mail_storage_set_critical(&mbox->storage->storage,
const char *fname;
char wrong_key;
&size)) {
&size)) {