dstream->istream.read = i_stream_dot_read;
dstream->istream.stat = i_stream_dot_stat;
+ dstream->istream.istream.readable_fd = FALSE;
dstream->istream.istream.blocking = input->blocking;
dstream->istream.istream.seekable = FALSE;
dstream->send_last_lf = send_last_lf;
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;
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;
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);
i_stream_crlf_read_lf;
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,
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);
fstream->istream.istream.blocking = TRUE;
fstream->istream.istream.seekable = TRUE;
}
+ fstream->istream.istream.readable_fd = TRUE;
return i_stream_create(&fstream->istream, NULL, fd);
}
lstream->istream.stat = i_stream_limit_stat;
lstream->istream.get_size = i_stream_limit_get_size;
+ 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,
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;
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);
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) */
off_t in_abs_offset, 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
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