[dovecot-cvs] dovecot/src/lib istream-internal.h,1.3,1.4 istream.c,1.7,1.8
cras at procontrol.fi
cras at procontrol.fi
Fri Mar 21 00:31:39 EET 2003
Update of /home/cvs/dovecot/src/lib
In directory danu:/tmp/cvs-serv14069/lib
Modified Files:
istream-internal.h istream.c
Log Message:
Fixes for resetting stream limits. Should fix some APPEND problems.
Index: istream-internal.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib/istream-internal.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- istream-internal.h 7 Jan 2003 17:44:23 -0000 1.3
+++ istream-internal.h 20 Mar 2003 22:31:36 -0000 1.4
@@ -21,7 +21,7 @@
unsigned char *w_buffer; /* may be NULL */
size_t buffer_size;
- size_t skip, pos;
+ size_t skip, pos, high_pos;
};
struct istream *_i_stream_create(struct _istream *_buf, pool_t pool, int fd,
Index: istream.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/istream.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- istream.c 10 Mar 2003 00:36:08 -0000 1.7
+++ istream.c 20 Mar 2003 22:31:36 -0000 1.8
@@ -76,13 +76,13 @@
diff = (off_t)stream->start_offset - (off_t)offset;
stream->start_offset = offset;
stream->v_offset += diff;
- if (stream->v_size != 0) {
+ if (stream->v_size != 0)
stream->v_size += diff;
+ if (stream->v_limit != 0)
stream->v_limit += diff;
- }
/* reset buffer data */
- _stream->skip = _stream->pos = 0;
+ _stream->skip = _stream->pos = _stream->high_pos = 0;
}
void i_stream_set_read_limit(struct istream *stream, uoff_t v_offset)
@@ -92,6 +92,11 @@
i_assert(stream->v_size == 0 || v_offset <= stream->v_size);
+ if (_stream->high_pos != 0) {
+ _stream->pos = _stream->high_pos;
+ _stream->high_pos = 0;
+ }
+
if (v_offset == 0)
stream->v_limit = stream->v_size;
else {
@@ -99,8 +104,11 @@
stream->v_limit = v_offset;
max_pos = v_offset - stream->v_offset + _stream->skip;
- if (_stream->pos > max_pos)
+ if (_stream->pos > max_pos) {
+ if (_stream->high_pos == 0)
+ _stream->high_pos = _stream->pos;
_stream->pos = max_pos;
+ }
}
}
@@ -111,6 +119,11 @@
if (stream->closed)
return -1;
+ if (_stream->pos < _stream->high_pos) {
+ /* virtual limit reached */
+ return -1;
+ }
+
return _stream->read(_stream);
}
@@ -137,7 +150,11 @@
count -= data_size;
stream->v_offset += data_size;
- _stream->skip_count(_stream, count);
+ if (_stream->pos < _stream->high_pos) {
+ /* virtual limit reached */
+ } else {
+ _stream->skip_count(_stream, count);
+ }
}
void i_stream_seek(struct istream *stream, uoff_t v_offset)
@@ -237,7 +254,7 @@
while (_stream->pos - _stream->skip <= threshold) {
/* we need more data */
- ret = _stream->read(_stream);
+ ret = i_stream_read(stream);
if (ret < 0)
break;
}
More information about the dovecot-cvs
mailing list