Mercurial > dovecot > original-hg > dovecot-1.2
comparison src/lib-mail/message-send.c @ 991:21788a1e9e39 HEAD
Partial fetches are working fast again - faster than ever actually.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 21 Jan 2003 07:37:35 +0200 |
parents | 8028c4dcf38f |
children | e0dbaabbc22b |
comparison
equal
deleted
inserted
replaced
990:9c8df18fb2a9 | 991:21788a1e9e39 |
---|---|
5 #include "ostream.h" | 5 #include "ostream.h" |
6 #include "message-parser.h" | 6 #include "message-parser.h" |
7 #include "message-send.h" | 7 #include "message-send.h" |
8 #include "message-size.h" | 8 #include "message-size.h" |
9 | 9 |
10 int message_send(struct ostream *output, struct istream *input, | 10 off_t message_send(struct ostream *output, struct istream *input, |
11 const struct message_size *msg_size, | 11 const struct message_size *msg_size, |
12 uoff_t virtual_skip, uoff_t max_virtual_size) | 12 uoff_t virtual_skip, uoff_t max_virtual_size) |
13 { | 13 { |
14 const unsigned char *msg; | 14 const unsigned char *msg; |
15 uoff_t old_limit, limit; | 15 uoff_t old_limit, limit; |
16 size_t i, size; | 16 size_t i, size; |
17 int cr_skipped, add_cr, ret; | 17 off_t ret; |
18 int cr_skipped, add_cr; | |
18 | 19 |
19 if (msg_size->physical_size == 0 || | 20 if (msg_size->physical_size == 0 || |
20 virtual_skip >= msg_size->virtual_size) | 21 virtual_skip >= msg_size->virtual_size) |
21 return TRUE; | 22 return 0; |
22 | 23 |
23 if (max_virtual_size > msg_size->virtual_size - virtual_skip) | 24 if (max_virtual_size > msg_size->virtual_size - virtual_skip) |
24 max_virtual_size = msg_size->virtual_size - virtual_skip; | 25 max_virtual_size = msg_size->virtual_size - virtual_skip; |
25 | 26 |
26 if (msg_size->physical_size == msg_size->virtual_size) { | 27 if (msg_size->physical_size == msg_size->virtual_size) { |
37 } | 38 } |
38 | 39 |
39 message_skip_virtual(input, virtual_skip, NULL, &cr_skipped); | 40 message_skip_virtual(input, virtual_skip, NULL, &cr_skipped); |
40 | 41 |
41 /* go through the message data and insert CRs where needed. */ | 42 /* go through the message data and insert CRs where needed. */ |
43 ret = 0; | |
42 while (max_virtual_size > 0 && | 44 while (max_virtual_size > 0 && |
43 i_stream_read_data(input, &msg, &size, 0) > 0) { | 45 i_stream_read_data(input, &msg, &size, 0) > 0) { |
44 add_cr = FALSE; | 46 add_cr = FALSE; |
45 for (i = 0; i < size && max_virtual_size > 0; i++) { | 47 for (i = 0; i < size && max_virtual_size > 0; i++) { |
46 max_virtual_size--; | 48 max_virtual_size--; |
53 break; | 55 break; |
54 } | 56 } |
55 } | 57 } |
56 } | 58 } |
57 | 59 |
60 ret += i; | |
58 if (o_stream_send(output, msg, i) < 0) | 61 if (o_stream_send(output, msg, i) < 0) |
59 return FALSE; | 62 return -1; |
60 | 63 |
61 if (add_cr) { | 64 if (add_cr) { |
65 ret++; | |
62 if (o_stream_send(output, "\r", 1) < 0) | 66 if (o_stream_send(output, "\r", 1) < 0) |
63 return FALSE; | 67 return -1; |
64 cr_skipped = TRUE; | 68 cr_skipped = TRUE; |
65 } else { | 69 } else { |
66 cr_skipped = i > 0 && msg[i-1] == '\r'; | 70 cr_skipped = i > 0 && msg[i-1] == '\r'; |
67 } | 71 } |
68 | 72 |
69 i_stream_skip(input, i); | 73 i_stream_skip(input, i); |
70 } | 74 } |
71 | 75 |
72 return TRUE; | 76 return ret; |
73 } | 77 } |