raw-mail.c revision 8fa302c0c0f110aecf266d20673aae567bd77f3b
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen/* Copyright (c) 2007 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;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen const struct stat *st;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen st = i_stream_stat(mbox->input, TRUE);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (st == NULL) {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen mail_storage_set_critical(mail->box->storage,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen "stat(%s) failed: %m", mbox->path);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen return -1;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen }
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen mbox->mtime = st->st_mtime;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo 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 struct raw_mailbox *mbox = (struct raw_mailbox *)_mail->box;
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen if (mail->data.stream == NULL) {
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen i_stream_ref(mbox->input);
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen mail->data.stream = mbox->input;
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;
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,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_get_flags,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_get_keywords,
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,
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen index_mail_expunge
4146f38412c650f4d0e100cf22d7b32e7d24b2b6Timo Sirainen};