Mercurial > dovecot > core-2.2
annotate src/lib/istream-limit.c @ 5106:81394e71f92a HEAD
Added istream->blocking setting. It's now used to assert-crash early if a
blocking stream unexpectedly returns "need more data".
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 06 Feb 2007 12:40:15 +0200 |
parents | 928229f8b3e6 |
children | be4fb0976c1d |
rev | line source |
---|---|
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2003 Timo Sirainen */ |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "istream-internal.h" |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 struct limit_istream { |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 struct _istream istream; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 struct istream *input; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 uoff_t v_start_offset, v_size; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 }; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 static void _close(struct _iostream *stream __attr_unused__) |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 { |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 } |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 static void _destroy(struct _iostream *stream) |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 { |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 struct limit_istream *lstream = (struct limit_istream *) stream; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 /* get to same position in parent stream */ |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 i_stream_seek(lstream->input, lstream->v_start_offset + |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 lstream->istream.istream.v_offset); |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
24 i_stream_unref(&lstream->input); |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 } |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 static void _set_max_buffer_size(struct _iostream *stream, size_t max_size) |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 { |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 struct limit_istream *lstream = (struct limit_istream *) stream; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 i_stream_set_max_buffer_size(lstream->input, max_size); |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 } |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 static ssize_t _read(struct _istream *stream) |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 { |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 struct limit_istream *lstream = (struct limit_istream *) stream; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 uoff_t left; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 ssize_t ret; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 size_t pos; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
1874 | 41 if (stream->istream.v_offset + |
2441
b65224a24696
When we reach the limit, set eof = true
Timo Sirainen <tss@iki.fi>
parents:
2431
diff
changeset
|
42 (stream->pos - stream->skip) >= lstream->v_size) { |
b65224a24696
When we reach the limit, set eof = true
Timo Sirainen <tss@iki.fi>
parents:
2431
diff
changeset
|
43 stream->istream.eof = TRUE; |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 return -1; |
2441
b65224a24696
When we reach the limit, set eof = true
Timo Sirainen <tss@iki.fi>
parents:
2431
diff
changeset
|
45 } |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 if (lstream->input->v_offset != |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 lstream->v_start_offset + stream->istream.v_offset) { |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 i_stream_seek(lstream->input, |
1874 | 50 lstream->v_start_offset + |
51 stream->istream.v_offset); | |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 } |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 |
2295
545c1d3ead54
Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents:
2166
diff
changeset
|
54 stream->buffer = i_stream_get_data(lstream->input, &pos); |
545c1d3ead54
Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents:
2166
diff
changeset
|
55 if (pos <= stream->pos) { |
2444 | 56 if ((ret = i_stream_read(lstream->input)) == -2) { |
2295
545c1d3ead54
Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents:
2166
diff
changeset
|
57 if (stream->skip == 0) |
545c1d3ead54
Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents:
2166
diff
changeset
|
58 return -2; |
545c1d3ead54
Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents:
2166
diff
changeset
|
59 } |
2431
8e9d8cb1e674
Removed istream.disconnected, it's too much of a special case and the only
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
60 stream->istream.eof = lstream->input->eof; |
2295
545c1d3ead54
Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents:
2166
diff
changeset
|
61 stream->buffer = i_stream_get_data(lstream->input, &pos); |
2444 | 62 } else { |
63 ret = 0; | |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 } |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 stream->pos -= stream->skip; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 stream->skip = 0; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 |
2166 | 69 if (lstream->v_size != (uoff_t)-1) { |
70 left = lstream->v_size - stream->istream.v_offset; | |
3423
61ea539ee5f1
Set stream->eof immediately after we have read up to our limit.
Timo Sirainen <tss@iki.fi>
parents:
3241
diff
changeset
|
71 if (pos >= left) { |
2166 | 72 pos = left; |
3423
61ea539ee5f1
Set stream->eof immediately after we have read up to our limit.
Timo Sirainen <tss@iki.fi>
parents:
3241
diff
changeset
|
73 stream->istream.eof = TRUE; |
61ea539ee5f1
Set stream->eof immediately after we have read up to our limit.
Timo Sirainen <tss@iki.fi>
parents:
3241
diff
changeset
|
74 } |
2166 | 75 } |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 |
2444 | 77 ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) : |
78 (ret == 0 ? 0 : -1); | |
1874 | 79 stream->pos = pos; |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 return ret; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 } |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 |
3629
e05a1af4bbc7
Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents:
3423
diff
changeset
|
83 static void _seek(struct _istream *stream, uoff_t v_offset, |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3647
diff
changeset
|
84 bool mark __attr_unused__) |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 { |
2983 | 86 struct limit_istream *lstream = (struct limit_istream *) stream; |
87 | |
88 i_assert(v_offset <= lstream->v_size); | |
89 | |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 stream->istream.stream_errno = 0; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 stream->istream.v_offset = v_offset; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 stream->skip = stream->pos = 0; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 } |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3647
diff
changeset
|
95 static const struct stat *_stat(struct _istream *stream, bool exact) |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 { |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 struct limit_istream *lstream = (struct limit_istream *) stream; |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
98 const struct stat *st; |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 |
3647
7af5162d934c
Added exact parameter to i_stream_stat()
Timo Sirainen <tss@iki.fi>
parents:
3629
diff
changeset
|
100 st = i_stream_stat(lstream->input, exact); |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
101 if (st == NULL) |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
102 return NULL; |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
103 |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
104 stream->statbuf = *st; |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
105 if (lstream->v_size != (uoff_t)-1) |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
106 stream->statbuf.st_size = lstream->v_size; |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
107 return &stream->statbuf; |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 } |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 struct istream *i_stream_create_limit(pool_t pool, struct istream *input, |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 uoff_t v_start_offset, uoff_t v_size) |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 { |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 struct limit_istream *lstream; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 i_stream_ref(input); |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 lstream = p_new(pool, struct limit_istream, 1); |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 lstream->input = input; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 lstream->v_start_offset = v_start_offset; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 lstream->v_size = v_size; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 lstream->istream.istream.v_offset = |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 input->v_offset < v_start_offset ? 0 : |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 input->v_offset - v_start_offset > v_size ? v_size : |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 input->v_offset - v_start_offset; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 lstream->istream.iostream.close = _close; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 lstream->istream.iostream.destroy = _destroy; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 lstream->istream.iostream.set_max_buffer_size = _set_max_buffer_size; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 lstream->istream.read = _read; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 lstream->istream.seek = _seek; |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3239
diff
changeset
|
133 lstream->istream.stat = _stat; |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
135 lstream->istream.istream.blocking = input->blocking; |
3239
904a268921af
Added seekable variable to struct istream.
Timo Sirainen <tss@iki.fi>
parents:
2983
diff
changeset
|
136 lstream->istream.istream.seekable = input->seekable; |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 return _i_stream_create(&lstream->istream, pool, i_stream_get_fd(input), |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 input->real_stream->abs_start_offset + |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 v_start_offset); |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 } |