annotate src/lib/istream-limit.c @ 7031:4b51ee73ed51 HEAD

Removed v_start_offset parameter from i_stream_create_limit(). We'll always use input->v_offset now.
author Timo Sirainen <tss@iki.fi>
date Sat, 22 Dec 2007 05:04:46 +0200
parents 1a89a1509e81
children 85cf52f0bc64
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6429
65c69a53a7be Replaced my Copyright notices. The year range always ends with 2007 now.
Timo Sirainen <tss@iki.fi>
parents: 6420
diff changeset
1 /* Copyright (c) 2003-2007 Dovecot authors, see the included COPYING file */
1870
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 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
7 struct istream_private istream;
1870
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 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
10 };
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
12 static void i_stream_limit_destroy(struct iostream_private *stream)
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 {
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 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
15
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 /* get to same position in parent stream */
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6559
diff changeset
17 i_stream_seek(lstream->istream.parent, lstream->v_start_offset +
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 lstream->istream.istream.v_offset);
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6559
diff changeset
19 i_stream_unref(&lstream->istream.parent);
1870
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
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
22 static void
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
23 i_stream_limit_set_max_buffer_size(struct iostream_private *stream,
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
24 size_t max_size)
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 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
27
6559
15a9ce2cc0ab Always keep a usable value in stream->max_buffer_size.
Timo Sirainen <tss@iki.fi>
parents: 6557
diff changeset
28 lstream->istream.max_buffer_size = max_size;
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6559
diff changeset
29 i_stream_set_max_buffer_size(lstream->istream.parent, max_size);
1870
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
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
32 static ssize_t i_stream_limit_read(struct istream_private *stream)
1870
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 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
35 uoff_t left;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 ssize_t ret;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 size_t pos;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38
1874
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
39 if (stream->istream.v_offset +
2441
b65224a24696 When we reach the limit, set eof = true
Timo Sirainen <tss@iki.fi>
parents: 2431
diff changeset
40 (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
41 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
42 return -1;
2441
b65224a24696 When we reach the limit, set eof = true
Timo Sirainen <tss@iki.fi>
parents: 2431
diff changeset
43 }
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6559
diff changeset
45 if (stream->parent->v_offset !=
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 lstream->v_start_offset + stream->istream.v_offset) {
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6559
diff changeset
47 i_stream_seek(stream->parent,
1874
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
48 lstream->v_start_offset +
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
49 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
50 }
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6559
diff changeset
52 stream->buffer = i_stream_get_data(stream->parent, &pos);
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
53 if (pos <= stream->pos) {
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6559
diff changeset
54 if ((ret = i_stream_read(stream->parent)) == -2)
6557
b56ed305a8bf Fix to handling buffer full conditions.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
55 return -2;
b56ed305a8bf Fix to handling buffer full conditions.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
56
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6559
diff changeset
57 stream->istream.stream_errno = stream->parent->stream_errno;
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6559
diff changeset
58 stream->istream.eof = stream->parent->eof;
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6559
diff changeset
59 stream->buffer = i_stream_get_data(stream->parent, &pos);
2444
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2441
diff changeset
60 } else {
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2441
diff changeset
61 ret = 0;
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 }
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 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
65 stream->skip = 0;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
2166
ed6b3d59ce93 minor fix
Timo Sirainen <tss@iki.fi>
parents: 2160
diff changeset
67 if (lstream->v_size != (uoff_t)-1) {
ed6b3d59ce93 minor fix
Timo Sirainen <tss@iki.fi>
parents: 2160
diff changeset
68 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
69 if (pos >= left) {
2166
ed6b3d59ce93 minor fix
Timo Sirainen <tss@iki.fi>
parents: 2160
diff changeset
70 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
71 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
72 }
2166
ed6b3d59ce93 minor fix
Timo Sirainen <tss@iki.fi>
parents: 2160
diff changeset
73 }
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74
2444
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2441
diff changeset
75 ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2441
diff changeset
76 (ret == 0 ? 0 : -1);
1874
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
77 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
78 return ret;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 }
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
81 static void i_stream_limit_seek(struct istream_private *stream, uoff_t v_offset,
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
82 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
83 {
2983
c20a64efd608 Added assert.
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
84 struct limit_istream *lstream = (struct limit_istream *) stream;
c20a64efd608 Added assert.
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
85
c20a64efd608 Added assert.
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
86 i_assert(v_offset <= lstream->v_size);
c20a64efd608 Added assert.
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
87
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 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
89 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
90 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
91 }
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
93 static const struct stat *
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
94 i_stream_limit_stat(struct istream_private *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
95 {
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 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
97 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
98
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6559
diff changeset
99 st = i_stream_stat(stream->parent, 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
100 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
101 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
102
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
103 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
104 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
105 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
106 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
107 }
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108
7031
4b51ee73ed51 Removed v_start_offset parameter from i_stream_create_limit(). We'll always
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
109 struct istream *i_stream_create_limit(struct istream *input, uoff_t v_size)
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 {
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 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
112
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 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
114
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5207
diff changeset
115 lstream = i_new(struct limit_istream, 1);
7031
4b51ee73ed51 Removed v_start_offset parameter from i_stream_create_limit(). We'll always
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
116 lstream->v_start_offset = input->v_offset;
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 lstream->v_size = v_size;
6559
15a9ce2cc0ab Always keep a usable value in stream->max_buffer_size.
Timo Sirainen <tss@iki.fi>
parents: 6557
diff changeset
118 lstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
120 lstream->istream.iostream.destroy = i_stream_limit_destroy;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
121 lstream->istream.iostream.set_max_buffer_size =
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
122 i_stream_limit_set_max_buffer_size;
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6559
diff changeset
124 lstream->istream.parent = input;
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
125 lstream->istream.read = i_stream_limit_read;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
126 lstream->istream.seek = i_stream_limit_seek;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
127 lstream->istream.stat = i_stream_limit_stat;
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128
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
129 lstream->istream.istream.blocking = input->blocking;
3239
904a268921af Added seekable variable to struct istream.
Timo Sirainen <tss@iki.fi>
parents: 2983
diff changeset
130 lstream->istream.istream.seekable = input->seekable;
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
131 return i_stream_create(&lstream->istream, i_stream_get_fd(input),
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
132 input->real_stream->abs_start_offset +
7031
4b51ee73ed51 Removed v_start_offset parameter from i_stream_create_limit(). We'll always
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
133 input->v_offset);
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 }