annotate src/lib/istream-limit.c @ 22713:cb108f786fb4

Updated copyright notices to include the year 2018.
author Stephan Bosch <stephan.bosch@dovecot.fi>
date Mon, 01 Jan 2018 22:42:08 +0100
parents 2e2563132d5f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
1 /* Copyright (c) 2003-2018 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"
13529
cf77e448295c Renamed lib/*-internal.h files to lib/*-private.h for consistency.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
4 #include "istream-private.h"
1870
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
7032
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7031
diff changeset
9 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
10 };
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
9525
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
12 static void i_stream_limit_destroy(struct iostream_private *stream)
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
13 {
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
14 struct limit_istream *lstream = (struct limit_istream *) stream;
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
15 uoff_t v_offset;
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
16
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
17 v_offset = lstream->istream.parent_start_offset +
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
18 lstream->istream.istream.v_offset;
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
19 if (lstream->istream.parent->seekable ||
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
20 v_offset > lstream->istream.parent->v_offset) {
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
21 /* get to same position in parent stream */
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
22 i_stream_seek(lstream->istream.parent, v_offset);
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
23 }
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
24 i_stream_unref(&lstream->istream.parent);
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
25 }
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
26
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
27 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
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 uoff_t left;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 ssize_t ret;
10875
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
32 size_t pos;
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
14904
aba24a5cc9ff istream-limit: Move parent stream to expected offset also at EOF.
Timo Sirainen <tss@iki.fi>
parents: 14701
diff changeset
34 i_stream_seek(stream->parent, lstream->istream.parent_start_offset +
aba24a5cc9ff istream-limit: Move parent stream to expected offset also at EOF.
Timo Sirainen <tss@iki.fi>
parents: 14701
diff changeset
35 stream->istream.v_offset);
aba24a5cc9ff istream-limit: Move parent stream to expected offset also at EOF.
Timo Sirainen <tss@iki.fi>
parents: 14701
diff changeset
36
10875
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
37 if (stream->istream.v_offset +
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
38 (stream->pos - stream->skip) >= lstream->v_size) {
2441
b65224a24696 When we reach the limit, set eof = true
Timo Sirainen <tss@iki.fi>
parents: 2431
diff changeset
39 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
40 return -1;
2441
b65224a24696 When we reach the limit, set eof = true
Timo Sirainen <tss@iki.fi>
parents: 2431
diff changeset
41 }
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42
10875
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
43 stream->pos -= stream->skip;
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
44 stream->skip = 0;
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
45
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
46 stream->buffer = i_stream_get_data(stream->parent, &pos);
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
47 if (pos > stream->pos)
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
48 ret = 0;
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
49 else do {
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
50 if ((ret = i_stream_read(stream->parent)) == -2)
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
51 return -2;
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
52
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
53 stream->istream.stream_errno = stream->parent->stream_errno;
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
54 stream->istream.eof = stream->parent->eof;
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
55 stream->buffer = i_stream_get_data(stream->parent, &pos);
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
56 } while (pos <= stream->pos && ret > 0);
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
57
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
58 if (lstream->v_size != (uoff_t)-1) {
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
59 left = lstream->v_size - stream->istream.v_offset;
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
60 if (pos >= left) {
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
61 pos = left;
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
62 stream->istream.eof = TRUE;
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
63 }
2166
ed6b3d59ce93 minor fix
Timo Sirainen <tss@iki.fi>
parents: 2160
diff changeset
64 }
10875
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
65
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
66 ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
67 (ret == 0 ? 0 : -1);
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
68 stream->pos = pos;
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
69 i_assert(ret != -1 || stream->istream.eof ||
1473de6ba383 Reverted recent istream-limit cleanup. It broke things.
Timo Sirainen <tss@iki.fi>
parents: 10854
diff changeset
70 stream->istream.stream_errno != 0);
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 return ret;
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 }
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73
14964
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14943
diff changeset
74 static int
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
75 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
76 {
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 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
78 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
79
18896
ac64c307d179 istream filters: If parent's i_stream_stat() fails, copy the stream_errno.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
80 if (i_stream_stat(stream->parent, exact, &st) < 0) {
ac64c307d179 istream filters: If parent's i_stream_stat() fails, copy the stream_errno.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
81 stream->istream.stream_errno = stream->parent->stream_errno;
14964
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14943
diff changeset
82 return -1;
18896
ac64c307d179 istream filters: If parent's i_stream_stat() fails, copy the stream_errno.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
83 }
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
84
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
85 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
86 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
87 stream->statbuf.st_size = lstream->v_size;
14964
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14943
diff changeset
88 return 0;
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 }
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90
8922
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
91 static int i_stream_limit_get_size(struct istream_private *stream,
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
92 bool exact, uoff_t *size_r)
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
93 {
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
94 struct limit_istream *lstream = (struct limit_istream *) stream;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
95 const struct stat *st;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
96
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
97 if (lstream->v_size != (uoff_t)-1) {
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
98 *size_r = lstream->v_size;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
99 return 1;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
100 }
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
101
14964
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14943
diff changeset
102 if (i_stream_stat(&stream->istream, exact, &st) < 0)
8922
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
103 return -1;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
104 if (st->st_size == -1)
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
105 return 0;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
106
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
107 *size_r = st->st_size;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
108 return 1;
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
109 }
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
110
7031
4b51ee73ed51 Removed v_start_offset parameter from i_stream_create_limit(). We'll always
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
111 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
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
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);
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 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
117 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
118
9525
02badd89127e istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents: 9519
diff changeset
119 lstream->istream.iostream.destroy = i_stream_limit_destroy;
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
120 lstream->istream.read = i_stream_limit_read;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
121 lstream->istream.stat = i_stream_limit_stat;
8922
5106852f552a Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
122 lstream->istream.get_size = i_stream_limit_get_size;
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123
9540
622509c562e8 Added struct istream.readable_fd, which is used to determine if sendfile() can be used.
Timo Sirainen <tss@iki.fi>
parents: 9525
diff changeset
124 lstream->istream.istream.readable_fd = input->readable_fd;
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
125 lstream->istream.istream.blocking = input->blocking;
3239
904a268921af Added seekable variable to struct istream.
Timo Sirainen <tss@iki.fi>
parents: 2983
diff changeset
126 lstream->istream.istream.seekable = input->seekable;
7032
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7031
diff changeset
127 return i_stream_create(&lstream->istream, input,
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7031
diff changeset
128 i_stream_get_fd(input));
1870
c972ea085643 istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 }
14943
34e4c04ae679 Added i_stream_create_range()
Timo Sirainen <tss@iki.fi>
parents: 14904
diff changeset
130
34e4c04ae679 Added i_stream_create_range()
Timo Sirainen <tss@iki.fi>
parents: 14904
diff changeset
131 struct istream *i_stream_create_range(struct istream *input,
34e4c04ae679 Added i_stream_create_range()
Timo Sirainen <tss@iki.fi>
parents: 14904
diff changeset
132 uoff_t v_offset, uoff_t v_size)
34e4c04ae679 Added i_stream_create_range()
Timo Sirainen <tss@iki.fi>
parents: 14904
diff changeset
133 {
34e4c04ae679 Added i_stream_create_range()
Timo Sirainen <tss@iki.fi>
parents: 14904
diff changeset
134 uoff_t orig_offset = input->v_offset;
34e4c04ae679 Added i_stream_create_range()
Timo Sirainen <tss@iki.fi>
parents: 14904
diff changeset
135 struct istream *ret;
34e4c04ae679 Added i_stream_create_range()
Timo Sirainen <tss@iki.fi>
parents: 14904
diff changeset
136
34e4c04ae679 Added i_stream_create_range()
Timo Sirainen <tss@iki.fi>
parents: 14904
diff changeset
137 input->v_offset = v_offset;
34e4c04ae679 Added i_stream_create_range()
Timo Sirainen <tss@iki.fi>
parents: 14904
diff changeset
138 ret = i_stream_create_limit(input, v_size);
34e4c04ae679 Added i_stream_create_range()
Timo Sirainen <tss@iki.fi>
parents: 14904
diff changeset
139 input->v_offset = orig_offset;
34e4c04ae679 Added i_stream_create_range()
Timo Sirainen <tss@iki.fi>
parents: 14904
diff changeset
140 return ret;
34e4c04ae679 Added i_stream_create_range()
Timo Sirainen <tss@iki.fi>
parents: 14904
diff changeset
141 }