[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