# HG changeset patch # User Timo Sirainen # Date 1246150415 14400 # Node ID b1a27ed69e608c37088d86147abdee5b3ac7b182 # Parent 389148f79d49793c0ae5c4aa7a2ffea9b579ca00 Added struct istream.readable_fd, which is used to determine if sendfile() can be used. diff -r 389148f79d49 -r b1a27ed69e60 src/lib-mail/istream-header-filter.c --- a/src/lib-mail/istream-header-filter.c Sun Jun 28 00:22:44 2009 +0200 +++ b/src/lib-mail/istream-header-filter.c Sat Jun 27 20:53:35 2009 -0400 @@ -429,6 +429,7 @@ mstream->istream.sync = i_stream_header_filter_sync; mstream->istream.stat = i_stream_header_filter_stat; + mstream->istream.istream.readable_fd = FALSE; mstream->istream.istream.blocking = input->blocking; mstream->istream.istream.seekable = input->seekable; diff -r 389148f79d49 -r b1a27ed69e60 src/lib-storage/index/mbox/istream-raw-mbox.c --- a/src/lib-storage/index/mbox/istream-raw-mbox.c Sun Jun 28 00:22:44 2009 +0200 +++ b/src/lib-storage/index/mbox/istream-raw-mbox.c Sat Jun 27 20:53:35 2009 -0400 @@ -451,6 +451,7 @@ rstream->istream.sync = i_stream_raw_mbox_sync; rstream->istream.stat = i_stream_raw_mbox_stat; + rstream->istream.istream.readable_fd = input->readable_fd; rstream->istream.istream.blocking = input->blocking; rstream->istream.istream.seekable = input->seekable; diff -r 389148f79d49 -r b1a27ed69e60 src/lib/istream-concat.c --- a/src/lib/istream-concat.c Sun Jun 28 00:22:44 2009 +0200 +++ b/src/lib/istream-concat.c Sat Jun 27 20:53:35 2009 -0400 @@ -269,6 +269,7 @@ cstream->istream.seek = i_stream_concat_seek; cstream->istream.stat = i_stream_concat_stat; + cstream->istream.istream.readable_fd = FALSE; cstream->istream.istream.blocking = blocking; cstream->istream.istream.seekable = seekable; return i_stream_create(&cstream->istream, NULL, -1); diff -r 389148f79d49 -r b1a27ed69e60 src/lib/istream-crlf.c --- a/src/lib/istream-crlf.c Sun Jun 28 00:22:44 2009 +0200 +++ b/src/lib/istream-crlf.c Sat Jun 27 20:53:35 2009 -0400 @@ -202,6 +202,7 @@ cstream->istream.seek = i_stream_crlf_seek; cstream->istream.stat = i_stream_crlf_stat; + cstream->istream.istream.readable_fd = FALSE; cstream->istream.istream.blocking = input->blocking; cstream->istream.istream.seekable = FALSE; return i_stream_create(&cstream->istream, input, diff -r 389148f79d49 -r b1a27ed69e60 src/lib/istream-data.c --- a/src/lib/istream-data.c Sun Jun 28 00:22:44 2009 +0200 +++ b/src/lib/istream-data.c Sat Jun 27 20:53:35 2009 -0400 @@ -27,6 +27,7 @@ stream->read = i_stream_data_read; stream->seek = i_stream_data_seek; + stream->istream.readable_fd = FALSE; stream->istream.blocking = TRUE; stream->istream.seekable = TRUE; (void)i_stream_create(stream, NULL, -1); diff -r 389148f79d49 -r b1a27ed69e60 src/lib/istream-file.c --- a/src/lib/istream-file.c Sun Jun 28 00:22:44 2009 +0200 +++ b/src/lib/istream-file.c Sat Jun 27 20:53:35 2009 -0400 @@ -171,6 +171,7 @@ fstream->istream.istream.blocking = TRUE; fstream->istream.istream.seekable = TRUE; } + fstream->istream.istream.readable_fd = TRUE; return i_stream_create(&fstream->istream, NULL, fd); } diff -r 389148f79d49 -r b1a27ed69e60 src/lib/istream-limit.c --- a/src/lib/istream-limit.c Sun Jun 28 00:22:44 2009 +0200 +++ b/src/lib/istream-limit.c Sat Jun 27 20:53:35 2009 -0400 @@ -131,6 +131,7 @@ lstream->istream.seek = i_stream_limit_seek; lstream->istream.stat = i_stream_limit_stat; + lstream->istream.istream.readable_fd = input->readable_fd; lstream->istream.istream.blocking = input->blocking; lstream->istream.istream.seekable = input->seekable; return i_stream_create(&lstream->istream, input, diff -r 389148f79d49 -r b1a27ed69e60 src/lib/istream-mmap.c --- a/src/lib/istream-mmap.c Sun Jun 28 00:22:44 2009 +0200 +++ b/src/lib/istream-mmap.c Sat Jun 27 20:53:35 2009 -0400 @@ -219,6 +219,7 @@ mstream->istream.sync = i_stream_mmap_sync; mstream->istream.stat = i_stream_mmap_stat; + mstream->istream.istream.readable_fd = TRUE; mstream->istream.abs_start_offset = start_offset; istream = i_stream_create(&mstream->istream, NULL, fd); istream->mmaped = TRUE; diff -r 389148f79d49 -r b1a27ed69e60 src/lib/istream-seekable.c --- a/src/lib/istream-seekable.c Sun Jun 28 00:22:44 2009 +0200 +++ b/src/lib/istream-seekable.c Sat Jun 27 20:53:35 2009 -0400 @@ -319,6 +319,7 @@ sstream->istream.seek = i_stream_seekable_seek; sstream->istream.stat = i_stream_seekable_stat; + sstream->istream.istream.readable_fd = FALSE; sstream->istream.istream.blocking = blocking; sstream->istream.istream.seekable = TRUE; return i_stream_create(&sstream->istream, NULL, -1); diff -r 389148f79d49 -r b1a27ed69e60 src/lib/istream.h --- a/src/lib/istream.h Sun Jun 28 00:22:44 2009 +0200 +++ b/src/lib/istream.h Sat Jun 27 20:53:35 2009 -0400 @@ -11,6 +11,8 @@ unsigned int mmaped:1; /* be careful when copying data */ unsigned int blocking:1; /* read() shouldn't return 0 */ unsigned int closed:1; + unsigned int readable_fd:1; /* fd can be read directly if necessary + (for sendfile()) */ unsigned int seekable:1; /* we can seek() backwards */ unsigned int eof:1; /* read() has reached to end of file (but may still be data available in buffer) */ diff -r 389148f79d49 -r b1a27ed69e60 src/lib/ostream-file.c --- a/src/lib/ostream-file.c Sun Jun 28 00:22:44 2009 +0200 +++ b/src/lib/ostream-file.c Sat Jun 27 20:53:35 2009 -0400 @@ -783,7 +783,7 @@ off_t ret; int in_fd; - in_fd = i_stream_get_fd(instream); + in_fd = !instream->readable_fd ? -1 : i_stream_get_fd(instream); if (in_fd == foutstream->fd) { /* copying data within same fd. we'll have to be careful with diff -r 389148f79d49 -r b1a27ed69e60 src/plugins/zlib/istream-zlib.c --- a/src/plugins/zlib/istream-zlib.c Sun Jun 28 00:22:44 2009 +0200 +++ b/src/plugins/zlib/istream-zlib.c Sat Jun 27 20:53:35 2009 -0400 @@ -246,6 +246,7 @@ zstream->istream.istream.seekable = TRUE; } - return i_stream_create(&zstream->istream, NULL, -1); + zstream->istream.istream.readable_fd = FALSE; + return i_stream_create(&zstream->istream, NULL, fd); } #endif