raw-mail.c revision 225e82df5dd1e765f4e52b80c954558f00e5a7df
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include "lib.h"
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include "istream.h"
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include "index-mail.h"
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include "raw-storage.h"
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include <fcntl.h>
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include <unistd.h>
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen#include <sys/stat.h>
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenstatic int raw_mail_stat(struct mail *mail)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen{
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen struct raw_mailbox *mbox = (struct raw_mailbox *)mail->box;
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen struct mail_private *p = (struct mail_private *)mail;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen const struct stat *st;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen if (mail->lookup_abort == MAIL_LOOKUP_ABORT_NOT_IN_CACHE)
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen return mail_set_aborted(mail);
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen
1eb17e61d3d38372674aa0c55caedb0185a985f5Timo Sirainen p->stats_fstat_lookup_count++;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen st = i_stream_stat(mail->box->input, TRUE);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (st == NULL) {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen mail_storage_set_critical(mail->box->storage,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen "stat(%s) failed: %m", mail->box->path);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return -1;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen }
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
8ff3b9b8e5d9263bbaeb7bd4b7df9c54c6dd35a2Timo Sirainen if (mbox->mtime != (time_t)-1)
8ff3b9b8e5d9263bbaeb7bd4b7df9c54c6dd35a2Timo Sirainen mbox->mtime = st->st_mtime;
8ff3b9b8e5d9263bbaeb7bd4b7df9c54c6dd35a2Timo Sirainen if (mbox->ctime != (time_t)-1)
8ff3b9b8e5d9263bbaeb7bd4b7df9c54c6dd35a2Timo Sirainen mbox->ctime = st->st_ctime;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen mbox->size = st->st_size;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return 0;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen}
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenstatic int raw_mail_get_received_date(struct mail *_mail, time_t *date_r)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen{
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen struct raw_mailbox *mbox = (struct raw_mailbox *)_mail->box;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (mbox->mtime == (time_t)-1) {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (raw_mail_stat(_mail) < 0)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return -1;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen }
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen *date_r = mail->data.received_date = mbox->mtime;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return 0;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen}
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenstatic int raw_mail_get_save_date(struct mail *_mail, time_t *date_r)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen{
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen struct raw_mailbox *mbox = (struct raw_mailbox *)_mail->box;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (mbox->ctime == (time_t)-1) {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (raw_mail_stat(_mail) < 0)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return -1;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen }
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen *date_r = mail->data.save_date = mbox->ctime;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return 0;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen}
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenstatic int raw_mail_get_physical_size(struct mail *_mail, uoff_t *size_r)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen{
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen struct raw_mailbox *mbox = (struct raw_mailbox *)_mail->box;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (mbox->size == (uoff_t)-1) {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (raw_mail_stat(_mail) < 0)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return -1;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen }
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen *size_r = mail->data.physical_size = mbox->size;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return 0;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen}
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenstatic int
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenraw_mail_get_stream(struct mail *_mail, struct message_size *hdr_size,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen struct message_size *body_size, struct istream **stream_r)
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen{
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (mail->data.stream == NULL) {
ba7feb1cccc99ce1e8a03d35ca024192ea9233b1Timo Sirainen /* we can't just reference mbox->input, because
ba7feb1cccc99ce1e8a03d35ca024192ea9233b1Timo Sirainen index_mail_close() expects to be able to free the stream */
ba7feb1cccc99ce1e8a03d35ca024192ea9233b1Timo Sirainen mail->data.stream =
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen i_stream_create_limit(_mail->box->input, (uoff_t)-1);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen }
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return index_mail_init_stream(mail, hdr_size, body_size, stream_r);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen}
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainenstatic int
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainenraw_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen const char **value_r)
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen{
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen struct raw_mailbox *mbox = (struct raw_mailbox *)_mail->box;
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen switch (field) {
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen case MAIL_FETCH_FROM_ENVELOPE:
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen *value_r = mbox->envelope_sender;
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen return 0;
80cc932b7d4fd914ed6ccb68e988e9002118d5deTimo Sirainen case MAIL_FETCH_UIDL_FILE_NAME:
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen *value_r = mbox->have_filename ? _mail->box->path : "";
80cc932b7d4fd914ed6ccb68e988e9002118d5deTimo Sirainen return 0;
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen default:
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen return index_mail_get_special(_mail, field, value_r);
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen }
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen}
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainenstruct mail_vfuncs raw_mail_vfuncs = {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_close,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_free,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_set_seq,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_set_uid,
aa247243412a49f9bdebf7255e131dc6ece4ed46Timo Sirainen index_mail_set_uid_cache_updates,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_get_flags,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_get_keywords,
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen index_mail_get_keyword_indexes,
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen index_mail_get_modseq,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_get_parts,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_get_date,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen raw_mail_get_received_date,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen raw_mail_get_save_date,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_get_virtual_size,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen raw_mail_get_physical_size,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_get_first_header,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_get_headers,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_get_header_stream,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen raw_mail_get_stream,
8fa302c0c0f110aecf266d20673aae567bd77f3bTimo Sirainen raw_mail_get_special,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_update_flags,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_update_keywords,
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen index_mail_update_modseq,
bddd52cb7f3e5a894c080f60750aa76b5aeaf103Timo Sirainen index_mail_update_uid,
225e82df5dd1e765f4e52b80c954558f00e5a7dfTimo Sirainen NULL,
838e367716bbd5e44b4a1691db9cbf72af53e9f0Timo Sirainen index_mail_expunge,
01404d41657a104c5ea1c12bb87f9c321e9c1ac4Timo Sirainen index_mail_set_cache_corrupted,
01404d41657a104c5ea1c12bb87f9c321e9c1ac4Timo Sirainen index_mail_get_index_mail
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen};