Mercurial > dovecot > core-2.2
changeset 12605:d675c0264190
imapc: If mail's input stream is changed, don't assume virtual size = physical size.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 28 Jan 2011 19:39:00 +0200 |
parents | 0e5c36a54ce8 |
children | 54bcc1728a43 |
files | src/lib-storage/index/imapc/imapc-mail.c src/lib-storage/index/imapc/imapc-search.c |
diffstat | 2 files changed, 36 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/imapc/imapc-mail.c Fri Jan 28 17:57:21 2011 +0200 +++ b/src/lib-storage/index/imapc/imapc-mail.c Fri Jan 28 19:39:00 2011 +0200 @@ -43,13 +43,43 @@ return 0; } +static int imapc_mail_get_sizes(struct index_mail *mail) +{ + struct message_size hdr_size, body_size; + struct istream *input; + uoff_t old_offset; + + /* fallback to reading the file */ + old_offset = mail->data.stream->v_offset; + if (mail_get_stream(&mail->mail.mail, + &hdr_size, &body_size, &input) < 0) + return -1; + i_stream_seek(mail->data.stream, old_offset); + return 0; +} + +static int imapc_mail_get_virtual_size(struct mail *_mail, uoff_t *size_r) +{ + struct index_mail *mail = (struct index_mail *)_mail; + struct index_mail_data *data = &mail->data; + + if (data->virtual_size == (uoff_t)-1) { + if (imapc_mail_get_sizes(mail) < 0) + return -1; + } + *size_r = data->virtual_size; + return 0; +} + static int imapc_mail_get_physical_size(struct mail *_mail, uoff_t *size_r) { struct index_mail *mail = (struct index_mail *)_mail; struct index_mail_data *data = &mail->data; - if (data->physical_size == (uoff_t)-1) - return -1; + if (data->physical_size == (uoff_t)-1) { + if (imapc_mail_get_sizes(mail) < 0) + return -1; + } *size_r = data->physical_size; return 0; } @@ -82,7 +112,7 @@ index_mail_get_date, imapc_mail_get_received_date, imapc_mail_get_save_date, - imapc_mail_get_physical_size, /* physical = virtual in our case */ + imapc_mail_get_virtual_size, imapc_mail_get_physical_size, index_mail_get_first_header, index_mail_get_headers,
--- a/src/lib-storage/index/imapc/imapc-search.c Fri Jan 28 17:57:21 2011 +0200 +++ b/src/lib-storage/index/imapc/imapc-search.c Fri Jan 28 19:39:00 2011 +0200 @@ -104,9 +104,7 @@ i_stream_unref(&imail->data.stream); return; } - } - - if (body) { + } else if (body) { ret = i_stream_get_size(imail->data.stream, TRUE, &size); if (ret < 0) { i_stream_unref(&imail->data.stream); @@ -114,6 +112,8 @@ } i_assert(ret != 0); imail->data.physical_size = size; + /* we'll assume that the remote server is working properly and + sending CRLF linefeeds */ imail->data.virtual_size = size; }