static int cydir_mail_get_stream(struct mail *_mail, struct message_size *hdr_size, struct message_size *body_size, struct istream **stream_r) { struct index_mail *mail = (struct index_mail *)_mail; const char *path; int fd; if (mail->data.stream == NULL) { mail->mail.stats_open_lookup_count++; path = cydir_mail_get_path(_mail); fd = open(path, O_RDONLY); if (fd == -1) { if (errno == ENOENT) mail_set_expunged(_mail); else { mail_storage_set_critical(_mail->box->storage, "open(%s) failed: %m", path); } return -1; } mail->data.stream = i_stream_create_fd(fd, 0, TRUE); i_stream_set_name(mail->data.stream, path); index_mail_set_read_buffer_size(_mail, mail->data.stream); if (mail->mail.v.istream_opened != NULL) { if (mail->mail.v.istream_opened(_mail, stream_r) < 0) return -1; } } return index_mail_init_stream(mail, hdr_size, body_size, stream_r); }
int dbox_mail_get_stream(struct mail *_mail, bool get_body ATTR_UNUSED, struct message_size *hdr_size, struct message_size *body_size, struct istream **stream_r) { struct dbox_storage *storage = (struct dbox_storage *)_mail->box->storage; struct dbox_mail *mail = (struct dbox_mail *)_mail; struct index_mail_data *data = &mail->imail.data; struct istream *input; uoff_t offset; int ret; if (data->stream == NULL) { if (storage->v.mail_open(mail, &offset, &mail->open_file) < 0) return -1; ret = get_mail_stream(mail, offset, &input); if (ret <= 0) { if (ret < 0) return -1; dbox_file_set_corrupted(mail->open_file, "uid=%u points to broken data at offset=" "%"PRIuUOFF_T, _mail->uid, offset); if (input != NULL) i_stream_unref(&input); return -1; } data->stream = input; index_mail_set_read_buffer_size(_mail, input); } return index_mail_init_stream(&mail->imail, hdr_size, body_size, stream_r); }
static struct istream * maildir_open_mail(struct maildir_mailbox *mbox, struct mail *mail, bool *deleted_r) { struct istream *input; const char *path; struct maildir_open_context ctx; *deleted_r = FALSE; ctx.fd = -1; ctx.path = NULL; mail->transaction->stats.open_lookup_count++; if (!mail->saving) { if (maildir_file_do(mbox, mail->uid, do_open, &ctx) < 0) return NULL; } else { path = maildir_save_file_get_path(mail->transaction, mail->seq); if (do_open(mbox, path, &ctx) <= 0) return NULL; } if (ctx.fd == -1) { *deleted_r = TRUE; return NULL; } input = i_stream_create_fd_autoclose(&ctx.fd, 0); if (input->stream_errno == EISDIR) { i_stream_destroy(&input); if (maildir_lose_unexpected_dir(&mbox->storage->storage, ctx.path) >= 0) *deleted_r = TRUE; } else { i_stream_set_name(input, ctx.path); index_mail_set_read_buffer_size(mail, input); } i_free(ctx.path); return input; }
static int cydir_mail_get_stream(struct mail *_mail, bool get_body ATTR_UNUSED, struct message_size *hdr_size, struct message_size *body_size, struct istream **stream_r) { struct index_mail *mail = (struct index_mail *)_mail; struct istream *input; const char *path; int fd; if (mail->data.stream == NULL) { _mail->transaction->stats.open_lookup_count++; path = cydir_mail_get_path(_mail); fd = open(path, O_RDONLY); if (fd == -1) { if (errno == ENOENT) mail_set_expunged(_mail); else { mail_storage_set_critical(_mail->box->storage, "open(%s) failed: %m", path); } return -1; } input = i_stream_create_fd(fd, 0, TRUE); i_stream_set_name(input, path); index_mail_set_read_buffer_size(_mail, input); if (mail->mail.v.istream_opened != NULL) { if (mail->mail.v.istream_opened(_mail, &input) < 0) { i_stream_unref(&input); return -1; } } mail->data.stream = input; } return index_mail_init_stream(mail, hdr_size, body_size, stream_r); }