[dovecot-cvs] dovecot/src/lib-mail message-send.c,1.16,1.17 message-send.h,1.9,1.10 message-size.c,1.11,1.12 message-size.h,1.9,1.10

cras at procontrol.fi cras at procontrol.fi
Sun Apr 27 01:52:41 EEST 2003


Update of /home/cvs/dovecot/src/lib-mail
In directory danu:/tmp/cvs-serv231/lib-mail

Modified Files:
	message-send.c message-send.h message-size.c message-size.h 
Log Message:
Partial fetches were broken when they stopped between virtual CR and LF.



Index: message-send.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-mail/message-send.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- message-send.c	21 Jan 2003 05:37:35 -0000	1.16
+++ message-send.c	26 Apr 2003 21:52:38 -0000	1.17
@@ -9,7 +9,7 @@
 
 off_t message_send(struct ostream *output, struct istream *input,
 		   const struct message_size *msg_size,
-		   uoff_t virtual_skip, uoff_t max_virtual_size)
+		   uoff_t virtual_skip, uoff_t max_virtual_size, int *last_cr)
 {
 	const unsigned char *msg;
 	uoff_t old_limit, limit;
@@ -17,6 +17,9 @@
 	off_t ret;
 	int cr_skipped, add_cr;
 
+	if (last_cr != NULL)
+		*last_cr = -1;
+
 	if (msg_size->physical_size == 0 ||
 	    virtual_skip >= msg_size->virtual_size)
 		return 0;
@@ -37,7 +40,7 @@
 		return ret;
 	}
 
-	message_skip_virtual(input, virtual_skip, NULL, &cr_skipped);
+	message_skip_virtual(input, virtual_skip, NULL, 0, &cr_skipped);
 
 	/* go through the message data and insert CRs where needed.  */
 	ret = 0;
@@ -73,5 +76,70 @@
 		i_stream_skip(input, i);
 	}
 
+	if (last_cr != NULL)
+		*last_cr = cr_skipped;
 	return ret;
+}
+
+void message_skip_virtual(struct istream *input, uoff_t virtual_skip,
+			  struct message_size *msg_size,
+			  int cr_skipped, int *last_cr)
+{
+	const unsigned char *msg;
+	size_t i, size, startpos;
+
+	if (virtual_skip == 0) {
+		*last_cr = cr_skipped;
+		return;
+	}
+
+	*last_cr = FALSE;
+	startpos = 0;
+	while (i_stream_read_data(input, &msg, &size, startpos) > 0) {
+		for (i = startpos; i < size && virtual_skip > 0; i++) {
+			virtual_skip--;
+
+			if (msg[i] == '\r') {
+				/* CR */
+				if (virtual_skip == 0)
+					*last_cr = TRUE;
+			} else if (msg[i] == '\n') {
+				/* LF */
+				if ((i == 0 && !cr_skipped) ||
+				    (i > 0 && msg[i-1] != '\r')) {
+					/* missing CR */
+					if (msg_size != NULL)
+						msg_size->virtual_size++;
+
+					if (virtual_skip == 0) {
+						/* CR/LF boundary */
+						*last_cr = TRUE;
+						break;
+					}
+
+					virtual_skip--;
+				}
+
+				/* increase after making sure we didn't break
+				   at virtual \r */
+				if (msg_size != NULL)
+					msg_size->lines++;
+			}
+		}
+
+		if (msg_size != NULL) {
+			msg_size->physical_size += i;
+			msg_size->virtual_size += i;
+		}
+
+		if (i < size) {
+			i_stream_skip(input, i);
+			break;
+		}
+
+		/* leave the last character, it may be \r */
+		i_stream_skip(input, i - 1);
+		startpos = 1;
+		cr_skipped = FALSE;
+	}
 }

Index: message-send.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-mail/message-send.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- message-send.h	21 Jan 2003 05:37:35 -0000	1.9
+++ message-send.h	26 Apr 2003 21:52:38 -0000	1.10
@@ -6,10 +6,18 @@
 /* Send message to client inserting CRs if needed. Only max_virtual_size
    bytes if sent (relative to virtual_skip), if you want it unlimited,
    use (uoff_t)-1. Remember that if input begins with LF, CR is inserted
-   before it unless virtual_skip = 1. Returns number of bytes sent, or -1
-   if error. */
+   before it unless virtual_skip = 1. last_cr is set to 1, 0 or -1 if not
+   known. Returns number of bytes sent, or -1 if error. */
 off_t message_send(struct ostream *output, struct istream *input,
 		   const struct message_size *msg_size,
-		   uoff_t virtual_skip, uoff_t max_virtual_size);
+		   uoff_t virtual_skip, uoff_t max_virtual_size, int *last_cr);
+
+/* Skip number of virtual bytes from putfer. msg_size is updated if it's not
+   NULL. If cr_skipped is TRUE and first character is \n, it's not treated as
+   \r\n. last_cr is set to TRUE if last character we skipped was \r, meaning
+   that next character should be \n and you shouldn't treat it as \r\n. */
+void message_skip_virtual(struct istream *input, uoff_t virtual_skip,
+			  struct message_size *msg_size,
+			  int cr_skipped, int *last_cr);
 
 #endif

Index: message-size.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-mail/message-size.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- message-size.c	5 Jan 2003 13:09:52 -0000	1.11
+++ message-size.c	26 Apr 2003 21:52:38 -0000	1.12
@@ -110,64 +110,6 @@
 		*last_cr = cr;
 }
 
-void message_skip_virtual(struct istream *input, uoff_t virtual_skip,
-			  struct message_size *msg_size, int *cr_skipped)
-{
-	const unsigned char *msg;
-	size_t i, size, startpos;
-
-	*cr_skipped = FALSE;
-	if (virtual_skip == 0)
-		return;
-
-	startpos = 0;
-	while (i_stream_read_data(input, &msg, &size, startpos) > 0) {
-		for (i = startpos; i < size && virtual_skip > 0; i++) {
-			virtual_skip--;
-
-			if (msg[i] == '\r') {
-				/* CR */
-				if (virtual_skip == 0)
-					*cr_skipped = TRUE;
-			} else if (msg[i] == '\n') {
-				/* LF */
-				if (i == 0 || msg[i-1] != '\r') {
-					/* missing CR */
-					if (msg_size != NULL)
-						msg_size->virtual_size++;
-
-					if (virtual_skip == 0) {
-						/* CR/LF boundary */
-						*cr_skipped = TRUE;
-						break;
-					}
-
-					virtual_skip--;
-				}
-
-				/* increase after making sure we didn't break
-				   at virtual \r */
-				if (msg_size != NULL)
-					msg_size->lines++;
-			}
-		}
-
-		if (msg_size != NULL) {
-			msg_size->physical_size += i;
-			msg_size->virtual_size += i;
-		}
-
-		if (i < size) {
-			i_stream_skip(input, i);
-			break;
-		}
-
-		/* leave the last character, it may be \r */
-		i_stream_skip(input, i - 1);
-		startpos = 1;
-	}
-}
-
 void message_size_add(struct message_size *dest,
 		      const struct message_size *src)
 {

Index: message-size.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-mail/message-size.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- message-size.h	20 Jan 2003 14:52:51 -0000	1.9
+++ message-size.h	26 Apr 2003 21:52:38 -0000	1.10
@@ -16,12 +16,6 @@
 void message_get_body_size(struct istream *input, struct message_size *body,
 			   uoff_t max_virtual_size, int *last_cr);
 
-/* Skip number of virtual bytes from putfer. If first character is \n, and
-   cr_skipped is FALSE, \r must be sent before it. msg_size is updated if
-   it's not NULL. */
-void message_skip_virtual(struct istream *input, uoff_t virtual_skip,
-			  struct message_size *msg_size, int *cr_skipped);
-
 /* Sum contents of src into dest. */
 void message_size_add(struct message_size *dest,
 		      const struct message_size *src);




More information about the dovecot-cvs mailing list