From: Timo Sirainen Date: Tue, 10 May 2016 21:06:54 +0000 (-0400) Subject: lib-storage: Moved common code to index_storage_save_continue() X-Git-Tag: 2.3.0.rc1~3771 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c68f28e2cf5f9621511bece0414335e551dc82c6;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Moved common code to index_storage_save_continue() --- diff --git a/src/lib-storage/index/cydir/cydir-save.c b/src/lib-storage/index/cydir/cydir-save.c index cc964cd9b0..0131521ef0 100644 --- a/src/lib-storage/index/cydir/cydir-save.c +++ b/src/lib-storage/index/cydir/cydir-save.c @@ -91,6 +91,7 @@ int cydir_save_begin(struct mail_save_context *_ctx, struct istream *input) if (ctx->fd != -1) { _ctx->data.output = o_stream_create_fd_file(ctx->fd, 0, FALSE); + o_stream_set_name(_ctx->data.output, path); o_stream_cork(_ctx->data.output); } else { mail_storage_set_critical(trans->box->storage, @@ -131,27 +132,15 @@ int cydir_save_begin(struct mail_save_context *_ctx, struct istream *input) int cydir_save_continue(struct mail_save_context *_ctx) { struct cydir_save_context *ctx = (struct cydir_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, - "write(%s) failed: %m", - cydir_get_save_path(ctx, ctx->mail_count)); - } - 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); + if (index_storage_save_continue(_ctx, ctx->input, + _ctx->dest_mail) < 0) { + ctx->failed = TRUE; + return -1; + } return 0; } diff --git a/src/lib-storage/index/dbox-common/dbox-save.c b/src/lib-storage/index/dbox-common/dbox-save.c index fe305a6df8..c62973874c 100644 --- a/src/lib-storage/index/dbox-common/dbox-save.c +++ b/src/lib-storage/index/dbox-common/dbox-save.c @@ -7,6 +7,7 @@ #include "str.h" #include "hex-binary.h" #include "index-mail.h" +#include "index-storage.h" #include "dbox-attachment.h" #include "dbox-file.h" #include "dbox-save.h" @@ -70,7 +71,6 @@ void dbox_save_begin(struct dbox_save_context *ctx, struct istream *input) 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; @@ -78,22 +78,11 @@ int dbox_save_continue(struct mail_save_context *_ctx) 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); + if (index_storage_save_continue(_ctx, ctx->input, + _ctx->dest_mail) < 0) { + ctx->failed = TRUE; + return -1; + } return 0; } diff --git a/src/lib-storage/index/imapc/imapc-save.c b/src/lib-storage/index/imapc/imapc-save.c index e6012ff8d8..ff9e23b228 100644 --- a/src/lib-storage/index/imapc/imapc-save.c +++ b/src/lib-storage/index/imapc/imapc-save.c @@ -89,17 +89,11 @@ int imapc_save_begin(struct mail_save_context *_ctx, struct istream *input) int imapc_save_continue(struct mail_save_context *_ctx) { struct imapc_save_context *ctx = (struct imapc_save_context *)_ctx; - struct mail_storage *storage = _ctx->transaction->box->storage; if (ctx->failed) return -1; - 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) failed: %m", - ctx->temp_path); - } + if (index_storage_save_continue(_ctx, ctx->input, NULL) < 0) { ctx->failed = TRUE; return -1; } diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index b4fbe858d0..e94b82a3e1 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -3,6 +3,7 @@ #include "lib.h" #include "array.h" #include "istream.h" +#include "ostream.h" #include "ioloop.h" #include "str.h" #include "mkdir-parents.h" @@ -1016,3 +1017,28 @@ int index_storage_expunged_sync_begin(struct mailbox *box, } return 1; } + +int index_storage_save_continue(struct mail_save_context *ctx, + struct istream *input, + struct mail *cache_dest_mail) +{ + struct mail_storage *storage = ctx->transaction->box->storage; + + do { + if (o_stream_send_istream(ctx->data.output, 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)); + } + return -1; + } + if (cache_dest_mail != NULL) + index_mail_cache_parse_continue(cache_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(input) > 0); + return 0; +} diff --git a/src/lib-storage/index/index-storage.h b/src/lib-storage/index/index-storage.h index be43e1d78c..277cef094b 100644 --- a/src/lib-storage/index/index-storage.h +++ b/src/lib-storage/index/index-storage.h @@ -180,4 +180,8 @@ int index_storage_expunged_sync_begin(struct mailbox *box, enum mail_index_sync_flags flags); void index_storage_expunging_deinit(struct mailbox *box); +int index_storage_save_continue(struct mail_save_context *ctx, + struct istream *input, + struct mail *cache_dest_mail); + #endif diff --git a/src/lib-storage/index/maildir/maildir-save.c b/src/lib-storage/index/maildir/maildir-save.c index 228c272142..8999737a9d 100644 --- a/src/lib-storage/index/maildir/maildir-save.c +++ b/src/lib-storage/index/maildir/maildir-save.c @@ -440,6 +440,8 @@ int maildir_save_begin(struct mail_save_context *_ctx, struct istream *input) if (!ctx->failed) { _ctx->data.output = o_stream_create_fd_file(ctx->fd, 0, FALSE); + o_stream_set_name(_ctx->data.output, t_strdup_printf( + "%s/%s", ctx->tmpdir, ctx->file_last->tmp_name)); o_stream_cork(_ctx->data.output); ctx->last_save_finished = FALSE; } @@ -449,29 +451,15 @@ int maildir_save_begin(struct mail_save_context *_ctx, struct istream *input) 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); + if (index_storage_save_continue(_ctx, ctx->input, + ctx->cur_dest_mail) < 0) { + ctx->failed = TRUE; + return -1; + } return 0; }