Mercurial > dovecot > core-2.2
changeset 3629:e05a1af4bbc7 HEAD
Added i_stream_seek_mark() and used it
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 30 Sep 2005 23:10:38 +0300 |
parents | 571336db01f4 |
children | 7a9ae11167de |
files | src/lib-mail/istream-header-filter.c src/lib-storage/index/mbox/istream-raw-mbox.c src/lib/istream-data.c src/lib/istream-file.c src/lib/istream-internal.h src/lib/istream-limit.c src/lib/istream-mmap.c src/lib/istream-seekable.c src/lib/istream.c src/lib/istream.h |
diffstat | 10 files changed, 37 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-mail/istream-header-filter.c Fri Sep 30 21:55:00 2005 +0300 +++ b/src/lib-mail/istream-header-filter.c Fri Sep 30 23:10:38 2005 +0300 @@ -234,7 +234,8 @@ return ret; } -static void _seek(struct _istream *stream, uoff_t v_offset) +static void _seek(struct _istream *stream, uoff_t v_offset, + int mark __attr_unused__) { struct header_filter_istream *mstream = (struct header_filter_istream *)stream;
--- a/src/lib-storage/index/mbox/istream-raw-mbox.c Fri Sep 30 21:55:00 2005 +0300 +++ b/src/lib-storage/index/mbox/istream-raw-mbox.c Fri Sep 30 23:10:38 2005 +0300 @@ -279,7 +279,8 @@ return ret; } -static void _seek(struct _istream *stream, uoff_t v_offset) +static void _seek(struct _istream *stream, uoff_t v_offset, + int mark __attr_unused__) { struct raw_mbox_istream *rstream = (struct raw_mbox_istream *)stream; @@ -492,8 +493,8 @@ rstream->body_offset = (uoff_t)-1; if (stream->v_offset != rstream->from_offset) - i_stream_seek(stream, rstream->from_offset); - i_stream_seek(rstream->input, rstream->from_offset); + i_stream_seek_mark(stream, rstream->from_offset); + i_stream_seek_mark(rstream->input, rstream->from_offset); rstream->eof = FALSE; rstream->istream.istream.eof = FALSE; @@ -535,8 +536,8 @@ check = TRUE; } - i_stream_seek(stream, offset); - i_stream_seek(rstream->input, offset); + i_stream_seek_mark(stream, offset); + i_stream_seek_mark(rstream->input, offset); if (check) (void)_read(&rstream->istream);
--- a/src/lib/istream-data.c Fri Sep 30 21:55:00 2005 +0300 +++ b/src/lib/istream-data.c Fri Sep 30 23:10:38 2005 +0300 @@ -22,7 +22,8 @@ return -1; } -static void _seek(struct _istream *stream, uoff_t v_offset) +static void _seek(struct _istream *stream, uoff_t v_offset, + int mark __attr_unused__) { stream->skip = v_offset; stream->istream.v_offset = v_offset;
--- a/src/lib/istream-file.c Fri Sep 30 21:55:00 2005 +0300 +++ b/src/lib/istream-file.c Fri Sep 30 23:10:38 2005 +0300 @@ -159,7 +159,8 @@ return ret; } -static void _seek(struct _istream *stream, uoff_t v_offset) +static void _seek(struct _istream *stream, uoff_t v_offset, + int mark __attr_unused__) { struct file_istream *fstream = (struct file_istream *) stream;
--- a/src/lib/istream-internal.h Fri Sep 30 21:55:00 2005 +0300 +++ b/src/lib/istream-internal.h Fri Sep 30 23:10:38 2005 +0300 @@ -12,7 +12,7 @@ /* methods: */ ssize_t (*read)(struct _istream *stream); - void (*seek)(struct _istream *stream, uoff_t v_offset); + void (*seek)(struct _istream *stream, uoff_t v_offset, int mark); void (*sync)(struct _istream *stream); const struct stat *(*stat)(struct _istream *stream);
--- a/src/lib/istream-limit.c Fri Sep 30 21:55:00 2005 +0300 +++ b/src/lib/istream-limit.c Fri Sep 30 23:10:38 2005 +0300 @@ -80,7 +80,8 @@ return ret; } -static void _seek(struct _istream *stream, uoff_t v_offset) +static void _seek(struct _istream *stream, uoff_t v_offset, + int mark __attr_unused__) { struct limit_istream *lstream = (struct limit_istream *) stream;
--- a/src/lib/istream-mmap.c Fri Sep 30 21:55:00 2005 +0300 +++ b/src/lib/istream-mmap.c Fri Sep 30 23:10:38 2005 +0300 @@ -141,7 +141,8 @@ return stream->pos - stream->skip; } -static void _seek(struct _istream *stream, uoff_t v_offset) +static void _seek(struct _istream *stream, uoff_t v_offset, + int mark __attr_unused__) { struct mmap_istream *mstream = (struct mmap_istream *) stream;
--- a/src/lib/istream-seekable.c Fri Sep 30 21:55:00 2005 +0300 +++ b/src/lib/istream-seekable.c Fri Sep 30 23:10:38 2005 +0300 @@ -255,7 +255,8 @@ return ret; } -static void _seek(struct _istream *stream, uoff_t v_offset) +static void _seek(struct _istream *stream, uoff_t v_offset, + int mark __attr_unused__) { stream->istream.stream_errno = 0; stream->istream.v_offset = v_offset;
--- a/src/lib/istream.c Fri Sep 30 21:55:00 2005 +0300 +++ b/src/lib/istream.c Fri Sep 30 23:10:38 2005 +0300 @@ -72,7 +72,7 @@ if (stream->closed) return; - _stream->seek(_stream, stream->v_offset + count); + _stream->seek(_stream, stream->v_offset + count, FALSE); } void i_stream_seek(struct istream *stream, uoff_t v_offset) @@ -88,7 +88,18 @@ return; stream->eof = FALSE; - _stream->seek(_stream, v_offset); + _stream->seek(_stream, v_offset, FALSE); +} + +void i_stream_seek_mark(struct istream *stream, uoff_t v_offset) +{ + struct _istream *_stream = stream->real_stream; + + if (stream->closed) + return; + + stream->eof = FALSE; + _stream->seek(_stream, v_offset, TRUE); } void i_stream_sync(struct istream *stream)
--- a/src/lib/istream.h Fri Sep 30 21:55:00 2005 +0300 +++ b/src/lib/istream.h Fri Sep 30 23:10:38 2005 +0300 @@ -52,6 +52,11 @@ /* Seek to specified position from beginning of file. Never fails, the next read tells if it was successful. This works only for files. */ void i_stream_seek(struct istream *stream, uoff_t v_offset); +/* Like i_stream_seek(), but also giving a hint that after reading some data + we could be seeking back to this mark or somewhere after it. If input + stream's implementation is slow in seeking backwards, it can use this hint + to cache some of the data in memory. */ +void i_stream_seek_mark(struct istream *stream, uoff_t v_offset); /* Returns struct stat, or NULL if error. As the underlying stream may not be a file, only some of the fields might be set, others would be zero. st_size is always set, and if it's not known, it's -1. */