#include "mail-storage-private.h"
#include "mail-copy.h"
+static void
+mail_copy_set_failed(struct mail_save_context *ctx, struct mail *mail,
+ const char *func)
+{
+ const char *errstr;
+ enum mail_error error;
+
+ if (ctx->transaction->box->storage == mail->box->storage)
+ return;
+
+ errstr = mail_storage_get_last_error(mail->box->storage, &error);
+ mail_storage_set_error(ctx->transaction->box->storage, error,
+ t_strdup_printf("%s (%s)", errstr, func));
+}
+
static int
mail_storage_try_copy(struct mail_save_context **_ctx, struct mail *mail)
{
to help anything. */
pmail->v.set_uid_cache_updates(mail, TRUE);
- if (mail_get_stream(mail, NULL, NULL, &input) < 0)
+ if (mail_get_stream(mail, NULL, NULL, &input) < 0) {
+ mail_copy_set_failed(ctx, mail, "stream");
return -1;
+ }
if (ctx->received_date == (time_t)-1) {
- if (mail_get_received_date(mail, &received_date) < 0)
+ if (mail_get_received_date(mail, &received_date) < 0) {
+ mail_copy_set_failed(ctx, mail, "received-date");
return -1;
+ }
mailbox_save_set_received_date(ctx, received_date, 0);
}
if (ctx->from_envelope == NULL) {
if (mail_get_special(mail, MAIL_FETCH_FROM_ENVELOPE,
- &from_envelope) < 0)
+ &from_envelope) < 0) {
+ mail_copy_set_failed(ctx, mail, "from-envelope");
return -1;
+ }
if (*from_envelope != '\0')
mailbox_save_set_from_envelope(ctx, from_envelope);
}
if (ctx->guid == NULL) {
- if (mail_get_special(mail, MAIL_FETCH_GUID, &guid) < 0)
+ if (mail_get_special(mail, MAIL_FETCH_GUID, &guid) < 0) {
+ mail_copy_set_failed(ctx, mail, "guid");
return -1;
+ }
if (*guid != '\0')
mailbox_save_set_guid(ctx, guid);
}