dovecot-2.2: o_stream_send_istream(): Get input stream size with...
dovecot at dovecot.org
dovecot at dovecot.org
Tue Aug 28 22:41:19 EEST 2012
details: http://hg.dovecot.org/dovecot-2.2/rev/3cba27563159
changeset: 14963:3cba27563159
user: Timo Sirainen <tss at iki.fi>
date: Tue Aug 28 22:20:17 2012 +0300
description:
o_stream_send_istream(): Get input stream size with i_stream_get_size() instead of _stat().
diffstat:
src/lib/ostream-file.c | 24 +++++++++++-------------
1 files changed, 11 insertions(+), 13 deletions(-)
diffs (65 lines):
diff -r bb0533bca649 -r 3cba27563159 src/lib/ostream-file.c
--- a/src/lib/ostream-file.c Tue Aug 28 22:15:57 2012 +0300
+++ b/src/lib/ostream-file.c Tue Aug 28 22:20:17 2012 +0300
@@ -677,17 +677,15 @@
struct istream *instream, int in_fd)
{
struct file_ostream *foutstream = (struct file_ostream *)outstream;
- const struct stat *st;
uoff_t start_offset;
uoff_t in_size, offset, send_size, v_offset;
ssize_t ret;
- st = i_stream_stat(instream, TRUE);
- if (st == NULL) {
- outstream->ostream.stream_errno = instream->stream_errno;
+ if ((ret = i_stream_get_size(instream, TRUE, &in_size)) <= 0) {
+ outstream->ostream.stream_errno = ret == 0 ? ESPIPE :
+ instream->stream_errno;
return -1;
}
- in_size = st->st_size;
o_stream_socket_cork(foutstream);
@@ -815,18 +813,18 @@
struct istream *instream, bool same_stream)
{
struct file_ostream *foutstream = (struct file_ostream *)outstream;
- const struct stat *st;
+ uoff_t in_size;
off_t in_abs_offset, ret;
if (same_stream) {
/* copying data within same fd. we'll have to be careful with
seeks and overlapping writes. */
- st = i_stream_stat(instream, TRUE);
- if (st == NULL) {
- outstream->ostream.stream_errno = instream->stream_errno;
+ if ((ret = i_stream_get_size(instream, TRUE, &in_size)) <= 0) {
+ outstream->ostream.stream_errno = ret == 0 ? ESPIPE :
+ instream->stream_errno;
return -1;
}
- i_assert(instream->v_offset <= (uoff_t)st->st_size);
+ i_assert(instream->v_offset <= in_size);
in_abs_offset = instream->real_stream->abs_start_offset +
instream->v_offset;
@@ -834,13 +832,13 @@
if (ret == 0) {
/* copying data over itself. we don't really
need to do that, just fake it. */
- return st->st_size - instream->v_offset;
+ return in_size - instream->v_offset;
}
- if (ret > 0 && st->st_size > ret) {
+ if (ret > 0 && in_size > (uoff_t)ret) {
/* overlapping */
i_assert(instream->seekable);
return io_stream_copy_backwards(outstream, instream,
- st->st_size);
+ in_size);
}
}
More information about the dovecot-cvs
mailing list