[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