istream-file.c revision 07e4875d250e7a7157cd99132aafc773cf3cdf83
5e0ce63bb65db34d7f48b34bbb5545fa791781c4Timo Sirainen/* Copyright (c) 2002-2003 Timo Sirainen */
5254d77805cd35b9356d072ba325c356c43b0d51Timo Sirainen/* @UNSAFE: whole file */
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct _istream *_stream = (struct _istream *) stream;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (fstream->autoclose_fd && _stream->fd != -1) {
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct _istream *_stream = (struct _istream *) stream;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen p_free(_stream->iostream.pool, _stream->w_buffer);
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainenstatic void _set_max_buffer_size(struct _iostream *stream, size_t max_size)
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainenstatic void i_stream_grow_buffer(struct _istream *stream, size_t bytes)
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
3bbe99d30871f49610aac0417ee5951d1e740b98Timo Sirainen pool_get_exp_grown_size(stream->iostream.pool,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen stream->buffer_size > fstream->max_buffer_size)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen stream->buffer_size = fstream->max_buffer_size;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen p_realloc(stream->iostream.pool, stream->w_buffer,
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainenstatic void i_stream_compress(struct _istream *stream)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen memmove(stream->w_buffer, stream->w_buffer + stream->skip,
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* remove the unused bytes from beginning of buffer */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen stream->buffer_size < fstream->max_buffer_size) {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* buffer is full - grow it */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen i_stream_grow_buffer(stream, I_STREAM_MIN_SIZE);
1060afdc2fcdf647dbb3bc11647401f1b44a3a8aTimo Sirainen ret = pread(stream->fd, stream->w_buffer + stream->pos,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ret = read(stream->fd, stream->w_buffer + stream->pos, size);
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainenstatic void _seek(struct _istream *stream, uoff_t v_offset)
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen fstream->skip_left += v_offset - stream->istream.v_offset;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen /* can't do anything or data would be lost */
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainenstatic int fstat_cached(struct file_istream *fstream)
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen if (fstream->fstat_cache_stamp.tv_sec == ioloop_timeval.tv_sec &&
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen fstream->fstat_cache_stamp.tv_usec == ioloop_timeval.tv_usec)
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen if (fstat(fstream->istream.fd, &fstream->istream.statbuf) < 0) {
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainenstatic const struct stat *_stat(struct _istream *stream)
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen struct file_istream *fstream = (struct file_istream *) stream;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainenstruct istream *i_stream_create_file(int fd, pool_t pool,
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen fstream = p_new(pool, struct file_istream, 1);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen fstream->istream.iostream.set_max_buffer_size = _set_max_buffer_size;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* get size of fd if it's a file */
411d6baa37f31d90730e90c4a28c43e1974bbe58Timo Sirainen if (fstat(fd, &st) == 0 && S_ISREG(st.st_mode)) {