[dovecot-cvs] dovecot/src/lib-storage/index index-copy.c,1.26,1.27 index-fetch.c,1.41,1.42 index-messageset.c,1.13,1.14 index-messageset.h,1.6,1.7 index-save.c,1.23,1.24 index-storage.h,1.29,1.30 index-update-flags.c,1.18,1.19
cras at procontrol.fi
cras at procontrol.fi
Wed Jan 22 21:23:30 EET 2003
Update of /home/cvs/dovecot/src/lib-storage/index
In directory danu:/tmp/cvs-serv16040/src/lib-storage/index
Modified Files:
index-copy.c index-fetch.c index-messageset.c
index-messageset.h index-save.c index-storage.h
index-update-flags.c
Log Message:
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
fails, none of the messages are copied. maildir_copy_with_hardlinks didn't
actually work.
Index: index-copy.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-copy.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- index-copy.c 20 Jan 2003 14:52:51 -0000 1.26
+++ index-copy.c 22 Jan 2003 19:23:28 -0000 1.27
@@ -8,13 +8,15 @@
#include <unistd.h>
-static int copy_messageset(struct messageset_context *ctx,
- struct index_mailbox *src, struct mailbox *dest)
+static int copy_messageset(struct messageset_context *msgset_ctx,
+ struct mail_save_context *save_ctx,
+ struct index_mailbox *src,
+ struct mailbox *dest)
{
const struct messageset_mail *mail;
struct mail_full_flags flags;
struct istream *input;
- time_t internal_date;
+ time_t received_date;
int failed, deleted;
memset(&flags, 0, sizeof(flags));
@@ -22,19 +24,15 @@
mail_custom_flags_list_get(src->index->custom_flags);
flags.custom_flags_count = MAIL_CUSTOM_FLAGS_COUNT;
- while ((mail = index_messageset_next(ctx)) != NULL) {
+ while ((mail = index_messageset_next(msgset_ctx)) != NULL) {
input = src->index->open_mail(src->index, mail->rec,
- &internal_date, &deleted);
- if (input == NULL) {
- if (deleted)
- continue;
+ &received_date, &deleted);
+ if (input == NULL)
return FALSE;
- }
- /* save it in destination mailbox */
flags.flags = mail->rec->msg_flags;
- failed = !dest->save(dest, &flags, internal_date, 0,
- input, input->v_limit);
+ failed = !dest->save_next(save_ctx, &flags, received_date,
+ 0, input);
i_stream_unref(input);
if (failed)
@@ -48,9 +46,9 @@
const char *messageset, int uidset)
{
struct index_mailbox *ibox = (struct index_mailbox *) box;
- struct messageset_context *ctx;
- enum mail_lock_type lock_type;
- int ret, copy_inside_mailbox;
+ struct messageset_context *msgset_ctx;
+ struct mail_save_context *save_ctx;
+ int ret, ret2, copy_inside_mailbox;
if (destbox->readonly) {
mail_storage_set_error(box->storage,
@@ -63,31 +61,36 @@
strcmp(destbox->name, box->name) == 0;
if (copy_inside_mailbox) {
- /* copying inside same mailbox */
if (!index_storage_lock(ibox, MAIL_LOCK_EXCLUSIVE))
return FALSE;
-
- /* kludgy.. */
- ((struct index_mailbox *) destbox)->delay_save_unlocking = TRUE;
-
- lock_type = MAIL_LOCK_EXCLUSIVE;
} else {
- lock_type = MAIL_LOCK_SHARED;
+ if (!index_storage_sync_and_lock(ibox, TRUE, MAIL_LOCK_SHARED))
+ return FALSE;
}
- if (!index_storage_sync_and_lock(ibox, TRUE, lock_type))
- return FALSE;
-
- ctx = index_messageset_init(ibox, messageset, uidset);
- ret = copy_messageset(ctx, ibox, destbox);
- if (index_messageset_deinit(ctx) < 0)
+ save_ctx = destbox->save_init(destbox, TRUE);
+ if (save_ctx == NULL)
ret = FALSE;
+ else {
+ /* abort if any of the messages are expunged */
+ msgset_ctx = index_messageset_init(ibox, messageset, uidset,
+ FALSE);
+ ret = copy_messageset(msgset_ctx, save_ctx, ibox, destbox);
+ ret2 = index_messageset_deinit(msgset_ctx);
+ if (ret2 < 0)
+ ret = FALSE;
+ else if (ret2 == 0) {
+ mail_storage_set_error(ibox->box.storage,
+ "Some of the requested messages no longer exist.");
+ ret = FALSE;
+ }
- if (copy_inside_mailbox)
- ((struct index_mailbox *) destbox)->delay_save_unlocking = TRUE;
+ if (!destbox->save_deinit(save_ctx, !ret))
+ ret = FALSE;
+ }
if (!index_storage_lock(ibox, MAIL_LOCK_UNLOCK))
- return FALSE;
+ ret = FALSE;
return ret;
}
Index: index-fetch.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-fetch.c,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -d -r1.41 -r1.42
--- index-fetch.c 21 Jan 2003 21:02:30 -0000 1.41
+++ index-fetch.c 22 Jan 2003 19:23:28 -0000 1.42
@@ -58,7 +58,7 @@
ctx->update_seen = *update_seen;
index_mail_init(ibox, &ctx->mail, wanted_fields, NULL);
- ctx->msgset_ctx = index_messageset_init(ibox, messageset, uidset);
+ ctx->msgset_ctx = index_messageset_init(ibox, messageset, uidset, TRUE);
return ctx;
}
Index: index-messageset.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-messageset.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- index-messageset.c 21 Jan 2003 20:06:49 -0000 1.13
+++ index-messageset.c 22 Jan 2003 19:23:28 -0000 1.14
@@ -19,7 +19,7 @@
unsigned int num1, num2;
const char *messageset, *p;
- int uidset;
+ int uidset, skip_expunged;
int first, ret;
const char *error;
@@ -30,7 +30,7 @@
struct messageset_context *
index_messageset_init(struct index_mailbox *ibox,
- const char *messageset, int uidset)
+ const char *messageset, int uidset, int skip_expunged)
{
struct messageset_context *ctx;
@@ -42,6 +42,7 @@
ctx->messages_count = ibox->synced_messages_count;
ctx->p = ctx->messageset = messageset;
ctx->uidset = uidset;
+ ctx->skip_expunged = skip_expunged;
/* Reset index errors, we rely on it to check for failures */
index_reset_error(ctx->index);
@@ -55,7 +56,7 @@
{
struct messageset_context *ctx;
- ctx = index_messageset_init(ibox, NULL, uidset);
+ ctx = index_messageset_init(ibox, NULL, uidset, TRUE);
if (num1 <= num2) {
ctx->num1 = num1;
ctx->num2 = num2;
@@ -283,6 +284,13 @@
ctx->ret = uidset_init(ctx);
else
ctx->ret = seqset_init(ctx);
+
+ if (ctx->expunges_found && !ctx->skip_expunged) {
+ /* we wish to abort if there's any
+ expunged messages */
+ ctx->ret = 1;
+ return NULL;
+ }
} while (ctx->ret == 1);
if (ctx->ret != 0)
Index: index-messageset.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-messageset.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- index-messageset.h 20 Jan 2003 14:52:51 -0000 1.6
+++ index-messageset.h 22 Jan 2003 19:23:28 -0000 1.7
@@ -13,13 +13,13 @@
struct messageset_context *
index_messageset_init(struct index_mailbox *ibox,
- const char *messageset, int uidset);
+ const char *messageset, int uidset, int skip_expunged);
struct messageset_context *
index_messageset_init_range(struct index_mailbox *ibox,
unsigned int num1, unsigned int num2, int uidset);
-/* Returns 1 if all were found, 0 if some messages were deleted,
+/* Returns 1 if all were found, 0 if some messages were expunged,
-1 if internal error occured or -2 if messageset was invalid. */
int index_messageset_deinit(struct messageset_context *ctx);
Index: index-save.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-save.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- index-save.c 5 Jan 2003 13:09:52 -0000 1.23
+++ index-save.c 22 Jan 2003 19:23:28 -0000 1.24
@@ -71,8 +71,7 @@
}
int index_storage_save(struct mail_storage *storage, const char *path,
- struct istream *input, struct ostream *output,
- uoff_t data_size)
+ struct istream *input, struct ostream *output)
{
int (*write_func)(struct ostream *, const unsigned char *, size_t);
const unsigned char *data;
@@ -83,13 +82,13 @@
write_func = getenv("MAIL_SAVE_CRLF") ? write_with_crlf : write_with_lf;
failed = FALSE;
- while (data_size > 0) {
+ for (;;) {
ret = i_stream_read(input);
if (ret < 0) {
errno = input->stream_errno;
if (errno == 0) {
- mail_storage_set_error(storage,
- "Client disconnected");
+ /* EOF */
+ break;
} else if (errno == EAGAIN) {
mail_storage_set_error(storage,
"Timeout while waiting for input");
@@ -97,13 +96,11 @@
mail_storage_set_critical(storage,
"Error reading mail from client: %m");
}
- return FALSE;
+ failed = TRUE;
+ break;
}
data = i_stream_get_data(input, &size);
- if (size > data_size)
- size = (size_t)data_size;
-
if (!failed) {
ret = write_func(output, data, size);
if (ret < 0) {
@@ -122,7 +119,6 @@
}
}
- data_size -= size;
i_stream_skip(input, size);
}
Index: index-storage.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-storage.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- index-storage.h 20 Jan 2003 14:52:51 -0000 1.29
+++ index-storage.h 22 Jan 2003 19:23:28 -0000 1.30
@@ -25,7 +25,6 @@
time_t next_lock_notify; /* temporary */
unsigned int sent_diskspace_warning:1;
- unsigned int delay_save_unlocking:1; /* For COPYing inside mailbox */
};
int mail_storage_set_index_error(struct index_mailbox *ibox);
@@ -61,8 +60,7 @@
unsigned int seq, int notify);
int index_storage_save(struct mail_storage *storage, const char *path,
- struct istream *input, struct ostream *output,
- uoff_t data_size);
+ struct istream *input, struct ostream *output);
void index_mailbox_check_add(struct index_mailbox *ibox, const char *path);
void index_mailbox_check_remove(struct index_mailbox *ibox);
Index: index-update-flags.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-update-flags.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- index-update-flags.c 20 Jan 2003 14:52:51 -0000 1.18
+++ index-update-flags.c 22 Jan 2003 19:23:28 -0000 1.19
@@ -85,7 +85,7 @@
mail_flags &= ~MAIL_RECENT; /* \Recent can't be changed */
- ctx = index_messageset_init(ibox, messageset, uidset);
+ ctx = index_messageset_init(ibox, messageset, uidset, TRUE);
ret = update_messageset(ctx, ibox, mail_flags, modify_type, notify);
ret2 = index_messageset_deinit(ctx);
More information about the dovecot-cvs
mailing list