view src/lib-storage/mail-copy.c @ 7086:7ed926ed7aa4 HEAD

Updated copyright notices to include year 2008.
author Timo Sirainen <tss@iki.fi>
date Tue, 01 Jan 2008 22:05:21 +0200
parents 65c69a53a7be
children 2c1e4f1fc4e0
line wrap: on
line source

/* Copyright (c) 2004-2008 Dovecot authors, see the included COPYING file */

#include "lib.h"
#include "istream.h"
#include "mail-storage-private.h"
#include "mail-copy.h"

int mail_storage_copy(struct mailbox_transaction_context *t, struct mail *mail,
		      enum mail_flags flags, struct mail_keywords *keywords,
		      struct mail *dest_mail)
{
	struct mail_save_context *ctx;
	struct istream *input;
	const char *from_envelope;
	time_t received_date;

	if (mail_get_stream(mail, NULL, NULL, &input) < 0)
		return -1;
	if (mail_get_received_date(mail, &received_date) < 0)
		return -1;
	if (mail_get_special(mail, MAIL_FETCH_FROM_ENVELOPE,
			     &from_envelope) < 0)
		return -1;

	if (*from_envelope == '\0')
		from_envelope = NULL;

	if (mailbox_save_init(t, flags, keywords, received_date,
			      0, from_envelope, input, dest_mail, &ctx) < 0)
		return -1;

	while (i_stream_read(input) != -1) {
		if (mailbox_save_continue(ctx) < 0)
			break;
	}

	if (input->stream_errno != 0) {
		mail_storage_set_critical(t->box->storage,
					  "copy: i_stream_read() failed: %m");
		mailbox_save_cancel(&ctx);
		return -1;
	}

	return mailbox_save_finish(&ctx);
}