Mercurial > dovecot > original-hg > dovecot-1.2
view src/lib-storage/index/index-copy.c @ 47:306c20092a96 HEAD
Errors in user-specified messagesets are now properly reported back to user.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 27 Aug 2002 06:33:10 +0300 |
parents | a946ce1f09b7 |
children | 2c641eb4324b |
line wrap: on
line source
/* Copyright (C) 2002 Timo Sirainen */ #include "lib.h" #include "iobuffer.h" #include "index-storage.h" #include "mail-messageset.h" #include <unistd.h> typedef struct { Mailbox *dest; const char **custom_flags; } CopyData; static int copy_func(MailIndex *index, MailIndexRecord *rec, unsigned int seq __attr_unused__, void *context) { CopyData *cd = context; IOBuffer *inbuf; int failed; inbuf = index->open_mail(index, rec); if (inbuf == NULL) return FALSE; /* save it in destination mailbox */ failed = !cd->dest->save(cd->dest, rec->msg_flags, cd->custom_flags, rec->internal_date, inbuf, inbuf->size); (void)close(inbuf->fd); io_buffer_destroy(inbuf); return !failed; } int index_storage_copy(Mailbox *box, Mailbox *destbox, const char *messageset, int uidset) { IndexMailbox *ibox = (IndexMailbox *) box; CopyData cd; int failed; if (destbox->readonly) { mail_storage_set_error(box->storage, "Destination mailbox is read-only"); return FALSE; } if (!ibox->index->set_lock(ibox->index, MAIL_LOCK_SHARED)) return mail_storage_set_index_error(ibox); cd.custom_flags = flags_file_list_get(ibox->flagsfile); cd.dest = destbox; failed = index_messageset_foreach(ibox, messageset, uidset, copy_func, destbox) <= 0; flags_file_list_unref(ibox->flagsfile); if (!ibox->index->set_lock(ibox->index, MAIL_LOCK_UNLOCK)) return mail_storage_set_index_error(ibox); return !failed; }