int dbox_save_continue(struct mail_save_context *_ctx) { struct dbox_save_context *ctx = (struct dbox_save_context *)_ctx; struct mail_storage *storage = _ctx->transaction->box->storage; if (ctx->failed) return -1; if (_ctx->data.attach != NULL) return index_attachment_save_continue(_ctx); do { if (o_stream_send_istream(_ctx->data.output, ctx->input) < 0) { if (!mail_storage_set_error_from_errno(storage)) { mail_storage_set_critical(storage, "write(%s) failed: %m", o_stream_get_name(_ctx->data.output)); } ctx->failed = TRUE; return -1; } index_mail_cache_parse_continue(_ctx->dest_mail); /* both tee input readers may consume data from our primary input stream. we'll have to make sure we don't return with one of the streams still having data in them. */ } while (i_stream_read(ctx->input) > 0); return 0; }
void index_mail_cache_parse_deinit(struct mail *_mail, time_t received_date, bool success) { struct index_mail *mail = (struct index_mail *)_mail; if (!success) { /* we're going to delete this mail anyway, don't bother trying to update cache file */ mail->data.no_caching = TRUE; mail->data.forced_no_caching = TRUE; if (mail->data.parser_ctx == NULL) { /* we didn't even start cache parsing */ return; } } /* This is needed with 0 byte mails to get hdr=NULL call done. */ index_mail_cache_parse_continue(_mail); if (mail->data.received_date == (time_t)-1) mail->data.received_date = received_date; if (mail->data.save_date == (time_t)-1) { /* this save_date may not be exactly the same as what we get in future, but then again neither mbox nor maildir guarantees it anyway. */ mail->data.save_date = ioloop_time; } mail->data.save_bodystructure_body = FALSE; mail->data.parsed_bodystructure = TRUE; (void)index_mail_parse_body_finish(mail, 0); }
int maildir_save_continue(struct mail_save_context *_ctx) { struct maildir_save_context *ctx = (struct maildir_save_context *)_ctx; struct mail_storage *storage = &ctx->mbox->storage->storage; if (ctx->failed) return -1; do { if (o_stream_send_istream(_ctx->data.output, ctx->input) < 0) { if (!mail_storage_set_error_from_errno(storage)) { mail_storage_set_critical(storage, "o_stream_send_istream(%s/%s) " "failed: %m", ctx->tmpdir, ctx->file_last->tmp_name); } ctx->failed = TRUE; return -1; } if (ctx->cur_dest_mail != NULL) index_mail_cache_parse_continue(ctx->cur_dest_mail); /* both tee input readers may consume data from our primary input stream. we'll have to make sure we don't return with one of the streams still having data in them. */ } while (i_stream_read(ctx->input) > 0); return 0; }