dbox-save.c revision 1b6c4fdd2bb4234b5711874b3845547f49649744
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2007-2012 Dovecot authors, see the included COPYING file */
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainenvoid dbox_save_add_to_index(struct dbox_save_context *ctx)
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen struct mail_save_data *mdata = &ctx->ctx.data;
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen mail_index_append(ctx->trans, mdata->uid, &ctx->seq);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen mail_index_update_flags(ctx->trans, ctx->seq, MODIFY_REPLACE,
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen mail_index_update_keywords(ctx->trans, ctx->seq,
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen mail_index_update_modseq(ctx->trans, ctx->seq,
93ae7fcd39c6982f7e338adfe71139942d9bbad1Timo Sirainenvoid dbox_save_begin(struct dbox_save_context *ctx, struct istream *input)
93ae7fcd39c6982f7e338adfe71139942d9bbad1Timo Sirainen struct mail_storage *_storage = _ctx->transaction->box->storage;
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen struct dbox_storage *storage = (struct dbox_storage *)_storage;
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen ctx->mail = mail_alloc(_ctx->transaction, 0, NULL);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen mail_set_seq_saving(_ctx->dest_mail, ctx->seq);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen ctx->input = index_mail_cache_parse_init(_ctx->dest_mail, crlf_input);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen /* write a dummy header. it'll get rewritten when we're finished */
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen memset(&dbox_msg_hdr, 0, sizeof(dbox_msg_hdr));
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen if (o_stream_send(ctx->dbox_output, &dbox_msg_hdr,
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen sizeof(dbox_msg_hdr)) < 0) {
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen mail_storage_set_critical(_storage, "write(%s) failed: %m",
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen index_attachment_save_begin(_ctx, storage->attachment_fs, ctx->input);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainenint dbox_save_continue(struct mail_save_context *_ctx)
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen struct dbox_save_context *ctx = (struct dbox_save_context *)_ctx;
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen struct mail_storage *storage = _ctx->transaction->box->storage;
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen if (o_stream_send_istream(_ctx->data.output, ctx->input) < 0) {
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen if (!mail_storage_set_error_from_errno(storage)) {
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen "write(%s) failed: %m",
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen index_mail_cache_parse_continue(_ctx->dest_mail);
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen /* both tee input readers may consume data from our primary
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen input stream. we'll have to make sure we don't return with
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen one of the streams still having data in them. */
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainenvoid dbox_save_end(struct dbox_save_context *ctx)
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen struct mail_save_data *mdata = &ctx->ctx.data;
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen struct ostream *dbox_output = ctx->dbox_output;
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen if (index_attachment_save_finish(&ctx->ctx) < 0)
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen mail_storage_set_critical(ctx->ctx.transaction->box->storage,
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen "write(%s) failed: %m",
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen /* e.g. zlib plugin had changed this */
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainenvoid dbox_save_write_metadata(struct mail_save_context *_ctx,
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen struct ostream *output, uoff_t output_msg_size,
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen struct dbox_save_context *ctx = (struct dbox_save_context *)_ctx;
8e4a702a1f96f118976da6eb9ece344df625eabbTimo Sirainen struct mail_save_data *mdata = &ctx->ctx.data;
56bcd695f96f093d801743a5633555339e241f5bTimo Sirainen memset(&metadata_hdr, 0, sizeof(metadata_hdr));
e0e555a09a8ff93aa904586aeffd37f5b0e3a84dTimo Sirainen memcpy(metadata_hdr.magic_post, DBOX_MAGIC_POST,
i_unreached();
(unsigned long long)vsize);