static ssize_t i_stream_fs_file_read(struct istream_private *stream) { struct fs_file_istream *fstream = (struct fs_file_istream *)stream; struct istream *input; if (fstream->istream.parent == NULL) { input = fs_read_stream(fstream->file, i_stream_get_max_buffer_size(&stream->istream)); i_stream_init_parent(stream, input); i_stream_unref(&input); } i_stream_seek(stream->parent, stream->parent_start_offset + stream->istream.v_offset); return i_stream_read_copy_from_parent(&stream->istream); }
struct istream * i_stream_create(struct istream_private *_stream, struct istream *parent, int fd) { _stream->fd = fd; if (parent != NULL) i_stream_init_parent(_stream, parent); _stream->istream.real_stream = _stream; if (_stream->iostream.close == NULL) _stream->iostream.close = i_stream_default_close; if (_stream->iostream.destroy == NULL) _stream->iostream.destroy = i_stream_default_destroy; if (_stream->seek == NULL) { _stream->seek = _stream->istream.seekable ? i_stream_default_seek_seekable : i_stream_default_seek_nonseekable; } if (_stream->stat == NULL) _stream->stat = i_stream_default_stat; if (_stream->get_size == NULL) _stream->get_size = i_stream_default_get_size; if (_stream->iostream.set_max_buffer_size == NULL) { _stream->iostream.set_max_buffer_size = i_stream_default_set_max_buffer_size; } if (_stream->init_buffer_size == 0) _stream->init_buffer_size = I_STREAM_MIN_SIZE; memset(&_stream->statbuf, 0, sizeof(_stream->statbuf)); _stream->statbuf.st_size = -1; _stream->statbuf.st_atime = _stream->statbuf.st_mtime = _stream->statbuf.st_ctime = ioloop_time; io_stream_init(&_stream->iostream); return &_stream->istream; }