istream-file.c revision b3142c8e513bc78da821fa70f479016148fa95e5
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2002-2003 Timo Sirainen */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen/* @UNSAFE: whole file */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen void (*timeout_cb)(void *);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen struct _istream *_stream = (struct _istream *) stream;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (fstream->autoclose_fd && _stream->fd != -1) {
7631f16156aca373004953fe6b01a7f343fb47e0Timo Sirainen struct _istream *_stream = (struct _istream *) stream;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen p_free(_stream->iostream.pool, _stream->w_buffer);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void _set_max_buffer_size(struct _iostream *stream, size_t max_size)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void _set_blocking(struct _iostream *stream, int timeout_msecs,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen net_set_nonblock(fstream->istream.fd, timeout_msecs == 0);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void i_stream_grow_buffer(struct _istream *stream, size_t bytes)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen stream->buffer_size = nearest_power(stream->buffer_size);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen stream->buffer_size > fstream->max_buffer_size)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen stream->buffer_size = fstream->max_buffer_size;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen p_realloc(stream->iostream.pool, stream->w_buffer,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void i_stream_compress(struct _istream *stream)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen memmove(stream->w_buffer, stream->w_buffer + stream->skip,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
1f19649986397419d014febd1337c6eb7b530f26Timo Sirainen /* remove the unused bytes from beginning of buffer */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen stream->buffer_size < fstream->max_buffer_size) {
1f19649986397419d014febd1337c6eb7b530f26Timo Sirainen /* buffer is full - grow it */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen i_stream_grow_buffer(stream, I_STREAM_MIN_SIZE);
1f19649986397419d014febd1337c6eb7b530f26Timo Sirainen if (ret == 0 && timeout_time > 0 && time(NULL) > timeout_time) {
1f19649986397419d014febd1337c6eb7b530f26Timo Sirainen /* timeouted */
1f19649986397419d014febd1337c6eb7b530f26Timo Sirainen fstream->timeout_cb(fstream->timeout_context);
de62ce819d59a529530da4b57be1b8d6dad13d6bTimo Sirainen if (errno == ECONNRESET || errno == ETIMEDOUT) {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* treat as disconnection */
ret = 0;
return ret;