Mercurial > dovecot > core-2.2
annotate src/lib/istream.c @ 22955:812e5c961328
fts: Indexing virtual mailbox didn't always index the last mails
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 03 May 2018 18:33:00 +0300 |
parents | e94be670bd18 |
children | fed657e0b156 |
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) 2002-2018 Dovecot authors, see the included COPYING file */ |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3240
diff
changeset
|
4 #include "ioloop.h" |
16236
81d87e43e167
istream API change: Added support for multiple destroy callbacks.
Timo Sirainen <tss@iki.fi>
parents:
16169
diff
changeset
|
5 #include "array.h" |
3240
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
6 #include "str.h" |
13529
cf77e448295c
Renamed lib/*-internal.h files to lib/*-private.h for consistency.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
7 #include "istream-private.h" |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
19431
69cb603dec84
lib: Added extra assert to i_stream_read()
Timo Sirainen <tss@iki.fi>
parents:
18896
diff
changeset
|
9 static bool i_stream_is_buffer_invalid(const struct istream_private *stream); |
69cb603dec84
lib: Added extra assert to i_stream_read()
Timo Sirainen <tss@iki.fi>
parents:
18896
diff
changeset
|
10 |
10847
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
11 void i_stream_set_name(struct istream *stream, const char *name) |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
12 { |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
13 i_free(stream->real_stream->iostream.name); |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
14 stream->real_stream->iostream.name = i_strdup(name); |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
15 } |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
16 |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
17 const char *i_stream_get_name(struct istream *stream) |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
18 { |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
19 while (stream->real_stream->iostream.name == NULL) { |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
20 stream = stream->real_stream->parent; |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
21 if (stream == NULL) |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
22 return ""; |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
23 } |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
24 return stream->real_stream->iostream.name; |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
25 } |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10810
diff
changeset
|
26 |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
27 static void i_stream_close_full(struct istream *stream, bool close_parents) |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
28 { |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
29 io_stream_close(&stream->real_stream->iostream, close_parents); |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
30 stream->closed = TRUE; |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
31 |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
32 if (stream->stream_errno == 0) |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
33 stream->stream_errno = EPIPE; |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
34 } |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
35 |
4070
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
36 void i_stream_destroy(struct istream **stream) |
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
37 { |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
38 i_stream_close_full(*stream, FALSE); |
4070
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
39 i_stream_unref(stream); |
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
40 } |
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
41 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
42 void i_stream_ref(struct istream *stream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
44 io_stream_ref(&stream->real_stream->iostream); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
47 void i_stream_unref(struct istream **stream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
49 struct istream_private *_stream = (*stream)->real_stream; |
3240
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
50 |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
51 if (_stream->iostream.refcount == 1) { |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
52 if (_stream->line_str != NULL) |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
53 str_free(&_stream->line_str); |
3240
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
54 } |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
55 io_stream_unref(&(*stream)->real_stream->iostream); |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
56 *stream = NULL; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 |
16236
81d87e43e167
istream API change: Added support for multiple destroy callbacks.
Timo Sirainen <tss@iki.fi>
parents:
16169
diff
changeset
|
59 #undef i_stream_add_destroy_callback |
81d87e43e167
istream API change: Added support for multiple destroy callbacks.
Timo Sirainen <tss@iki.fi>
parents:
16169
diff
changeset
|
60 void i_stream_add_destroy_callback(struct istream *stream, |
7023
56a5a00e490c
Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents:
6825
diff
changeset
|
61 istream_callback_t *callback, void *context) |
56a5a00e490c
Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents:
6825
diff
changeset
|
62 { |
18164
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
63 io_stream_add_destroy_callback(&stream->real_stream->iostream, |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
64 callback, context); |
7023
56a5a00e490c
Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents:
6825
diff
changeset
|
65 } |
56a5a00e490c
Added i_stream_set_destroy_callback().
Timo Sirainen <tss@iki.fi>
parents:
6825
diff
changeset
|
66 |
16236
81d87e43e167
istream API change: Added support for multiple destroy callbacks.
Timo Sirainen <tss@iki.fi>
parents:
16169
diff
changeset
|
67 void i_stream_remove_destroy_callback(struct istream *stream, |
81d87e43e167
istream API change: Added support for multiple destroy callbacks.
Timo Sirainen <tss@iki.fi>
parents:
16169
diff
changeset
|
68 void (*callback)()) |
13861
46a1f211ef84
Added i_stream_unset_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
13531
diff
changeset
|
69 { |
18164
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
70 io_stream_remove_destroy_callback(&stream->real_stream->iostream, |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
71 callback); |
13861
46a1f211ef84
Added i_stream_unset_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
13531
diff
changeset
|
72 } |
46a1f211ef84
Added i_stream_unset_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
13531
diff
changeset
|
73 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
74 int i_stream_get_fd(struct istream *stream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
76 struct istream_private *_stream = stream->real_stream; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 return _stream->fd; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 |
16772
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
81 const char *i_stream_get_error(struct istream *stream) |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
82 { |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
83 struct istream *s; |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
84 |
19549
dd68e15cdc22
lib: i_stream_get_error() now returns "EOF" if stream_errno==0 and eof==TRUE.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19431
diff
changeset
|
85 /* we'll only return errors for streams that have stream_errno set or |
dd68e15cdc22
lib: i_stream_get_error() now returns "EOF" if stream_errno==0 and eof==TRUE.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19431
diff
changeset
|
86 that have reached EOF. we might be returning unintended error |
dd68e15cdc22
lib: i_stream_get_error() now returns "EOF" if stream_errno==0 and eof==TRUE.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19431
diff
changeset
|
87 otherwise. */ |
16772
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
88 if (stream->stream_errno == 0) |
19549
dd68e15cdc22
lib: i_stream_get_error() now returns "EOF" if stream_errno==0 and eof==TRUE.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19431
diff
changeset
|
89 return stream->eof ? "EOF" : "<no error>"; |
16772
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
90 |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
91 for (s = stream; s != NULL; s = s->real_stream->parent) { |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
92 if (s->stream_errno == 0) |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
93 break; |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
94 if (s->real_stream->iostream.error != NULL) |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
95 return s->real_stream->iostream.error; |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
96 } |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
97 return strerror(stream->stream_errno); |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
98 } |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16725
diff
changeset
|
99 |
20145
f2fba1ef02c4
lib: Added i_stream_get_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19751
diff
changeset
|
100 const char *i_stream_get_disconnect_reason(struct istream *stream) |
f2fba1ef02c4
lib: Added i_stream_get_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19751
diff
changeset
|
101 { |
f2fba1ef02c4
lib: Added i_stream_get_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19751
diff
changeset
|
102 return io_stream_get_disconnect_reason(stream, NULL); |
f2fba1ef02c4
lib: Added i_stream_get_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19751
diff
changeset
|
103 } |
f2fba1ef02c4
lib: Added i_stream_get_disconnect_reason()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19751
diff
changeset
|
104 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
105 void i_stream_close(struct istream *stream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 { |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
107 i_stream_close_full(stream, TRUE); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 |
9777
85abd99007c3
Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents:
9525
diff
changeset
|
110 void i_stream_set_init_buffer_size(struct istream *stream, size_t size) |
85abd99007c3
Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents:
9525
diff
changeset
|
111 { |
85abd99007c3
Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents:
9525
diff
changeset
|
112 stream->real_stream->init_buffer_size = size; |
85abd99007c3
Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents:
9525
diff
changeset
|
113 } |
85abd99007c3
Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents:
9525
diff
changeset
|
114 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
115 void i_stream_set_max_buffer_size(struct istream *stream, size_t max_size) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
117 io_stream_set_max_buffer_size(&stream->real_stream->iostream, max_size); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 |
11992
136ce9b2e039
Added i_stream_get_max_buffer_size().
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
120 size_t i_stream_get_max_buffer_size(struct istream *stream) |
136ce9b2e039
Added i_stream_get_max_buffer_size().
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
121 { |
20244
fd39559c4533
lib: i_stream_get_max_buffer_size() checks also parents' max sizes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20234
diff
changeset
|
122 size_t max_size = 0; |
fd39559c4533
lib: i_stream_get_max_buffer_size() checks also parents' max sizes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20234
diff
changeset
|
123 |
fd39559c4533
lib: i_stream_get_max_buffer_size() checks also parents' max sizes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20234
diff
changeset
|
124 do { |
fd39559c4533
lib: i_stream_get_max_buffer_size() checks also parents' max sizes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20234
diff
changeset
|
125 if (max_size < stream->real_stream->max_buffer_size) |
fd39559c4533
lib: i_stream_get_max_buffer_size() checks also parents' max sizes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20234
diff
changeset
|
126 max_size = stream->real_stream->max_buffer_size; |
fd39559c4533
lib: i_stream_get_max_buffer_size() checks also parents' max sizes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20234
diff
changeset
|
127 stream = stream->real_stream->parent; |
fd39559c4533
lib: i_stream_get_max_buffer_size() checks also parents' max sizes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20234
diff
changeset
|
128 } while (stream != NULL); |
fd39559c4533
lib: i_stream_get_max_buffer_size() checks also parents' max sizes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20234
diff
changeset
|
129 return max_size; |
11992
136ce9b2e039
Added i_stream_get_max_buffer_size().
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
130 } |
136ce9b2e039
Added i_stream_get_max_buffer_size().
Timo Sirainen <tss@iki.fi>
parents:
10847
diff
changeset
|
131 |
8438
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
132 void i_stream_set_return_partial_line(struct istream *stream, bool set) |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
133 { |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
134 stream->real_stream->return_nolf_line = set; |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
135 } |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
136 |
19751
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
137 void i_stream_set_persistent_buffers(struct istream *stream, bool set) |
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
138 { |
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
139 do { |
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
140 stream->real_stream->nonpersistent_buffers = !set; |
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
141 stream = stream->real_stream->parent; |
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
142 } while (stream != NULL); |
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
143 } |
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
144 |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
145 static void i_stream_update(struct istream_private *stream) |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
146 { |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
147 if (stream->parent == NULL) |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
148 stream->access_counter++; |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
149 else { |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
150 stream->access_counter = |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
151 stream->parent->real_stream->access_counter; |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
152 stream->parent_expected_offset = stream->parent->v_offset; |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
153 } |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
154 } |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
155 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
156 ssize_t i_stream_read(struct istream *stream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
158 struct istream_private *_stream = stream->real_stream; |
8885
5e513d6612e0
istream: Added one more assert to make sure return value is correct.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
159 size_t old_size; |
8196
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
160 ssize_t ret; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 |
17184
2e275f4e51c3
i_stream_read(): If stream_errno is set, fail immediately.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
162 if (unlikely(stream->closed || stream->stream_errno != 0)) { |
18251
d76d4351762b
lib: If i_stream_read() sets stream_errno even if it didn't return -1, make sure we set eof=TRUE
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
163 stream->eof = TRUE; |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13885
diff
changeset
|
164 errno = stream->stream_errno; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 return -1; |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13885
diff
changeset
|
166 } |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 |
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
|
168 stream->eof = FALSE; |
8196
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
169 |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
170 if (_stream->parent != NULL) |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
171 i_stream_seek(_stream->parent, _stream->parent_expected_offset); |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
172 |
8885
5e513d6612e0
istream: Added one more assert to make sure return value is correct.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
173 old_size = _stream->pos - _stream->skip; |
8196
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
174 ret = _stream->read(_stream); |
16169
285e1c6a2115
i_stream_read(): Added assert.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
175 i_assert(old_size <= _stream->pos - _stream->skip); |
8277 | 176 switch (ret) { |
177 case -2: | |
178 i_assert(_stream->skip != _stream->pos); | |
179 break; | |
180 case -1: | |
8196
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
181 if (stream->stream_errno != 0) { |
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
182 /* error handling should be easier if we now just |
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
183 assume the stream is now at EOF */ |
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
184 stream->eof = TRUE; |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13885
diff
changeset
|
185 errno = stream->stream_errno; |
8196
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
186 } else { |
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
187 i_assert(stream->eof); |
14717
2a12a8f589c4
i_stream_read(): Added assert to make sure EOF isn't returned too early.
Timo Sirainen <tss@iki.fi>
parents:
14701
diff
changeset
|
188 i_assert(old_size == _stream->pos - _stream->skip); |
8196
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
189 } |
8277 | 190 break; |
191 case 0: | |
192 i_assert(!stream->blocking); | |
193 break; | |
8721
3d8e70cbf224
i_stream_read(): Added a few more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
194 default: |
3d8e70cbf224
i_stream_read(): Added a few more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
195 i_assert(ret > 0); |
12693
fdb79a873e37
i_stream_read(): Added extra assert.
Timo Sirainen <tss@iki.fi>
parents:
12415
diff
changeset
|
196 i_assert(_stream->skip < _stream->pos); |
8885
5e513d6612e0
istream: Added one more assert to make sure return value is correct.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
197 i_assert((size_t)ret+old_size == _stream->pos - _stream->skip); |
8721
3d8e70cbf224
i_stream_read(): Added a few more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
198 break; |
8196
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
199 } |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
200 |
18251
d76d4351762b
lib: If i_stream_read() sets stream_errno even if it didn't return -1, make sure we set eof=TRUE
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
201 if (stream->stream_errno != 0) { |
d76d4351762b
lib: If i_stream_read() sets stream_errno even if it didn't return -1, make sure we set eof=TRUE
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
202 /* error handling should be easier if we now just |
d76d4351762b
lib: If i_stream_read() sets stream_errno even if it didn't return -1, make sure we set eof=TRUE
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
203 assume the stream is now at EOF. Note that we could get here |
d76d4351762b
lib: If i_stream_read() sets stream_errno even if it didn't return -1, make sure we set eof=TRUE
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
204 even if read() didn't return -1, although that's a little |
d76d4351762b
lib: If i_stream_read() sets stream_errno even if it didn't return -1, make sure we set eof=TRUE
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
205 bit sloppy istream implementation. */ |
d76d4351762b
lib: If i_stream_read() sets stream_errno even if it didn't return -1, make sure we set eof=TRUE
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
206 stream->eof = TRUE; |
d76d4351762b
lib: If i_stream_read() sets stream_errno even if it didn't return -1, make sure we set eof=TRUE
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
207 } |
d76d4351762b
lib: If i_stream_read() sets stream_errno even if it didn't return -1, make sure we set eof=TRUE
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
208 |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
209 i_stream_update(_stream); |
19431
69cb603dec84
lib: Added extra assert to i_stream_read()
Timo Sirainen <tss@iki.fi>
parents:
18896
diff
changeset
|
210 /* verify that parents' access_counters are valid. the parent's |
69cb603dec84
lib: Added extra assert to i_stream_read()
Timo Sirainen <tss@iki.fi>
parents:
18896
diff
changeset
|
211 i_stream_read() should guarantee this. */ |
69cb603dec84
lib: Added extra assert to i_stream_read()
Timo Sirainen <tss@iki.fi>
parents:
18896
diff
changeset
|
212 i_assert(!i_stream_is_buffer_invalid(_stream)); |
8196
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
213 return ret; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 |
9196
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
216 ssize_t i_stream_read_copy_from_parent(struct istream *istream) |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
217 { |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
218 struct istream_private *stream = istream->real_stream; |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
219 size_t pos; |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
220 ssize_t ret; |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
221 |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
222 stream->pos -= stream->skip; |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
223 stream->skip = 0; |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
224 |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
225 stream->buffer = i_stream_get_data(stream->parent, &pos); |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
226 if (pos > stream->pos) |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
227 ret = 0; |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
228 else do { |
17607
1a38a85d952e
lib: i_stream_read_copy_from_parent() needs to update access counter also when returning -2
Timo Sirainen <tss@iki.fi>
parents:
17512
diff
changeset
|
229 if ((ret = i_stream_read(stream->parent)) == -2) { |
1a38a85d952e
lib: i_stream_read_copy_from_parent() needs to update access counter also when returning -2
Timo Sirainen <tss@iki.fi>
parents:
17512
diff
changeset
|
230 i_stream_update(stream); |
9196
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
231 return -2; |
17607
1a38a85d952e
lib: i_stream_read_copy_from_parent() needs to update access counter also when returning -2
Timo Sirainen <tss@iki.fi>
parents:
17512
diff
changeset
|
232 } |
9196
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
233 |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
234 stream->istream.stream_errno = stream->parent->stream_errno; |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
235 stream->istream.eof = stream->parent->eof; |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
236 stream->buffer = i_stream_get_data(stream->parent, &pos); |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
237 /* check again, in case the parent stream had been seeked |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
238 backwards and the previous read() didn't get us far |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
239 enough. */ |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
240 } while (pos <= stream->pos && ret > 0); |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
241 |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
242 ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) : |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
243 (ret == 0 ? 0 : -1); |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
244 stream->pos = pos; |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
245 i_assert(ret != -1 || stream->istream.eof || |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
246 stream->istream.stream_errno != 0); |
17512
467a4d19f873
lib: i_stream_read_copy_from_parent() now directly updates the access counter
Timo Sirainen <tss@iki.fi>
parents:
17511
diff
changeset
|
247 i_stream_update(stream); |
9196
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
248 return ret; |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
249 } |
ef0c861608d9
istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents:
9001
diff
changeset
|
250 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
251 void i_stream_skip(struct istream *stream, uoff_t count) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
253 struct istream_private *_stream = stream->real_stream; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 size_t data_size; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 |
1853 | 256 data_size = _stream->pos - _stream->skip; |
257 if (count <= data_size) { | |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
1861
diff
changeset
|
258 /* within buffer */ |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 stream->v_offset += count; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 _stream->skip += count; |
19751
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
261 if (_stream->nonpersistent_buffers && |
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
262 _stream->skip == _stream->pos) { |
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
263 _stream->skip = _stream->pos = 0; |
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
264 _stream->buffer_size = 0; |
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
265 i_free_and_null(_stream->w_buffer); |
1e0cfc3dc89a
lib: Added i_stream_set_persistent_buffers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
266 } |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 return; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
1861
diff
changeset
|
270 /* have to seek forward */ |
1853 | 271 count -= data_size; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 _stream->skip = _stream->pos; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 stream->v_offset += data_size; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 |
6825
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6720
diff
changeset
|
275 if (unlikely(stream->closed)) |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
1861
diff
changeset
|
276 return; |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
1861
diff
changeset
|
277 |
3629
e05a1af4bbc7
Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents:
3241
diff
changeset
|
278 _stream->seek(_stream, stream->v_offset + count, FALSE); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
281 static bool i_stream_can_optimize_seek(struct istream_private *stream) |
7034
e527ac1a7b4b
i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents:
7032
diff
changeset
|
282 { |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
283 if (stream->parent == NULL) |
7034
e527ac1a7b4b
i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents:
7032
diff
changeset
|
284 return TRUE; |
e527ac1a7b4b
i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents:
7032
diff
changeset
|
285 |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
286 /* use the fast route only if the parent stream hasn't been changed */ |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
287 if (stream->access_counter != |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
288 stream->parent->real_stream->access_counter) |
7034
e527ac1a7b4b
i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents:
7032
diff
changeset
|
289 return FALSE; |
e527ac1a7b4b
i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents:
7032
diff
changeset
|
290 |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
291 return i_stream_can_optimize_seek(stream->parent->real_stream); |
7034
e527ac1a7b4b
i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents:
7032
diff
changeset
|
292 } |
e527ac1a7b4b
i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents:
7032
diff
changeset
|
293 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
294 void i_stream_seek(struct istream *stream, uoff_t v_offset) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
296 struct istream_private *_stream = stream->real_stream; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 |
7034
e527ac1a7b4b
i_stream_seek(): If parent stream is set, use skip optimization only if all
Timo Sirainen <tss@iki.fi>
parents:
7032
diff
changeset
|
298 if (v_offset >= stream->v_offset && |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
299 i_stream_can_optimize_seek(_stream)) |
1874 | 300 i_stream_skip(stream, v_offset - stream->v_offset); |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
301 else { |
21092
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
302 if (unlikely(stream->closed || stream->stream_errno != 0)) { |
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
303 stream->eof = TRUE; |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
304 return; |
21092
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
305 } |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
306 stream->eof = FALSE; |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
307 _stream->seek(_stream, v_offset, FALSE); |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
308 } |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
309 i_stream_update(_stream); |
3629
e05a1af4bbc7
Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents:
3241
diff
changeset
|
310 } |
e05a1af4bbc7
Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents:
3241
diff
changeset
|
311 |
e05a1af4bbc7
Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents:
3241
diff
changeset
|
312 void i_stream_seek_mark(struct istream *stream, uoff_t v_offset) |
e05a1af4bbc7
Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents:
3241
diff
changeset
|
313 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
314 struct istream_private *_stream = stream->real_stream; |
3629
e05a1af4bbc7
Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents:
3241
diff
changeset
|
315 |
6825
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6720
diff
changeset
|
316 if (unlikely(stream->closed)) |
3629
e05a1af4bbc7
Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents:
3241
diff
changeset
|
317 return; |
e05a1af4bbc7
Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents:
3241
diff
changeset
|
318 |
e05a1af4bbc7
Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents:
3241
diff
changeset
|
319 stream->eof = FALSE; |
e05a1af4bbc7
Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents:
3241
diff
changeset
|
320 _stream->seek(_stream, v_offset, TRUE); |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
321 i_stream_update(_stream); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3240
diff
changeset
|
324 void i_stream_sync(struct istream *stream) |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
1861
diff
changeset
|
325 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
326 struct istream_private *_stream = stream->real_stream; |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
1861
diff
changeset
|
327 |
6825
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6720
diff
changeset
|
328 if (unlikely(stream->closed)) |
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6720
diff
changeset
|
329 return; |
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6720
diff
changeset
|
330 |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
331 if (_stream->sync != NULL) { |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3240
diff
changeset
|
332 _stream->sync(_stream); |
10810
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
333 i_stream_update(_stream); |
de2798fbbae6
istreams: Reading sometimes returned wrong data, if parent istream had been modified.
Timo Sirainen <tss@iki.fi>
parents:
10808
diff
changeset
|
334 } |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3240
diff
changeset
|
335 } |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3240
diff
changeset
|
336 |
14964 | 337 int i_stream_stat(struct istream *stream, bool exact, const struct stat **st_r) |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3240
diff
changeset
|
338 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
339 struct istream_private *_stream = stream->real_stream; |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3240
diff
changeset
|
340 |
6825
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6720
diff
changeset
|
341 if (unlikely(stream->closed)) |
14964 | 342 return -1; |
3630
7a9ae11167de
i_stream_stat() should return NULL for closed istreams
Timo Sirainen <tss@iki.fi>
parents:
3629
diff
changeset
|
343 |
21092
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
344 if (_stream->stat(_stream, exact) < 0) { |
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
345 stream->eof = TRUE; |
14964 | 346 return -1; |
21092
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
347 } |
14964 | 348 *st_r = &_stream->statbuf; |
349 return 0; | |
1870
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
1861
diff
changeset
|
350 } |
c972ea085643
istream rewrite. instead of directly setting any limits to stream, you now
Timo Sirainen <tss@iki.fi>
parents:
1861
diff
changeset
|
351 |
8922
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
352 int i_stream_get_size(struct istream *stream, 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:
8721
diff
changeset
|
353 { |
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
354 struct istream_private *_stream = stream->real_stream; |
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
355 |
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
356 if (unlikely(stream->closed)) |
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
357 return -1; |
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
358 |
21092
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
359 int ret; |
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
360 if ((ret = _stream->get_size(_stream, exact, size_r)) < 0) |
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
361 stream->eof = TRUE; |
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
362 return ret; |
8922
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
363 } |
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
364 |
17511
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
365 bool i_stream_have_bytes_left(struct istream *stream) |
2788
f322b24da429
Added i_stream_have_bytes_left().
Timo Sirainen <tss@iki.fi>
parents:
2626
diff
changeset
|
366 { |
17511
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
367 return i_stream_get_data_size(stream) > 0 || !stream->eof; |
2788
f322b24da429
Added i_stream_have_bytes_left().
Timo Sirainen <tss@iki.fi>
parents:
2626
diff
changeset
|
368 } |
f322b24da429
Added i_stream_have_bytes_left().
Timo Sirainen <tss@iki.fi>
parents:
2626
diff
changeset
|
369 |
8969 | 370 bool i_stream_is_eof(struct istream *stream) |
371 { | |
17511
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
372 if (i_stream_get_data_size(stream) == 0) |
8969 | 373 (void)i_stream_read(stream); |
374 return !i_stream_have_bytes_left(stream); | |
375 } | |
376 | |
12225
0c82fe7ce578
Added i_stream_get_absolute_offset().
Timo Sirainen <tss@iki.fi>
parents:
12057
diff
changeset
|
377 uoff_t i_stream_get_absolute_offset(struct istream *stream) |
0c82fe7ce578
Added i_stream_get_absolute_offset().
Timo Sirainen <tss@iki.fi>
parents:
12057
diff
changeset
|
378 { |
0c82fe7ce578
Added i_stream_get_absolute_offset().
Timo Sirainen <tss@iki.fi>
parents:
12057
diff
changeset
|
379 return stream->real_stream->abs_start_offset + stream->v_offset; |
0c82fe7ce578
Added i_stream_get_absolute_offset().
Timo Sirainen <tss@iki.fi>
parents:
12057
diff
changeset
|
380 } |
0c82fe7ce578
Added i_stream_get_absolute_offset().
Timo Sirainen <tss@iki.fi>
parents:
12057
diff
changeset
|
381 |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
382 static char *i_stream_next_line_finish(struct istream_private *stream, size_t i) |
3240
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
383 { |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
384 char *ret; |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
385 size_t end; |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
386 |
14875
2e88cfd8b595
Added i_stream_last_line_crlf()
Timo Sirainen <tss@iki.fi>
parents:
14717
diff
changeset
|
387 if (i > 0 && stream->buffer[i-1] == '\r') { |
3240
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
388 end = i - 1; |
14875
2e88cfd8b595
Added i_stream_last_line_crlf()
Timo Sirainen <tss@iki.fi>
parents:
14717
diff
changeset
|
389 stream->line_crlf = TRUE; |
2e88cfd8b595
Added i_stream_last_line_crlf()
Timo Sirainen <tss@iki.fi>
parents:
14717
diff
changeset
|
390 } else { |
3240
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
391 end = i; |
14875
2e88cfd8b595
Added i_stream_last_line_crlf()
Timo Sirainen <tss@iki.fi>
parents:
14717
diff
changeset
|
392 stream->line_crlf = FALSE; |
2e88cfd8b595
Added i_stream_last_line_crlf()
Timo Sirainen <tss@iki.fi>
parents:
14717
diff
changeset
|
393 } |
3240
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
394 |
20535
82f11b614b99
Calling i_stream_next_line() on a chain stream would sometimes erroneously use the stream->w_buffer.
Stephan Bosch <stephan@dovecot.fi>
parents:
20245
diff
changeset
|
395 if (stream->buffer == stream->w_buffer) { |
3240
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
396 /* modify the buffer directly */ |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
397 stream->w_buffer[end] = '\0'; |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
398 ret = (char *)stream->w_buffer + stream->skip; |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
399 } else { |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
400 /* use a temporary string to return it */ |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
401 if (stream->line_str == NULL) |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
402 stream->line_str = str_new(default_pool, 256); |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
403 str_truncate(stream->line_str, 0); |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
404 str_append_n(stream->line_str, stream->buffer + stream->skip, |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
405 end - stream->skip); |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4070
diff
changeset
|
406 ret = str_c_modifiable(stream->line_str); |
3240
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
407 } |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
408 |
8438
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
409 if (i < stream->pos) |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
410 i++; |
3240
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
411 stream->istream.v_offset += i - stream->skip; |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
412 stream->skip = i; |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
413 return ret; |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
414 } |
a6af023db10d
i_stream_next_line() works now even if the stream buffer can't be directly
Timo Sirainen <tss@iki.fi>
parents:
2788
diff
changeset
|
415 |
8438
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
416 static char *i_stream_last_line(struct istream_private *_stream) |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
417 { |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
418 if (_stream->istream.eof && _stream->skip != _stream->pos && |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
419 _stream->return_nolf_line) { |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
420 /* the last line is missing LF and we want to return it. */ |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
421 return i_stream_next_line_finish(_stream, _stream->pos); |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
422 } |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
423 return NULL; |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
424 } |
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
425 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
426 char *i_stream_next_line(struct istream *stream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
427 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
428 struct istream_private *_stream = stream->real_stream; |
12053
e9358064c45e
istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents:
11992
diff
changeset
|
429 const unsigned char *pos; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
430 |
18077
e3b52d11d038
lib: Never implicitly clear istream's stream_errno.
Timo Sirainen <tss@iki.fi>
parents:
18020
diff
changeset
|
431 if (_stream->skip >= _stream->pos) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
432 return NULL; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
433 |
12053
e9358064c45e
istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents:
11992
diff
changeset
|
434 pos = memchr(_stream->buffer + _stream->skip, '\n', |
e9358064c45e
istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents:
11992
diff
changeset
|
435 _stream->pos - _stream->skip); |
12057
0c73829cd1f8
i_stream_next_line(): Fix for the previous optimization.
Timo Sirainen <tss@iki.fi>
parents:
12053
diff
changeset
|
436 if (pos != NULL) { |
12053
e9358064c45e
istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents:
11992
diff
changeset
|
437 return i_stream_next_line_finish(_stream, |
e9358064c45e
istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents:
11992
diff
changeset
|
438 pos - _stream->buffer); |
e9358064c45e
istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents:
11992
diff
changeset
|
439 } else { |
e9358064c45e
istream_next_line() optimization.
Timo Sirainen <tss@iki.fi>
parents:
11992
diff
changeset
|
440 return i_stream_last_line(_stream); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
441 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
442 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
443 |
1293
2f2c6335ed6d
Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents:
1027
diff
changeset
|
444 char *i_stream_read_next_line(struct istream *stream) |
2f2c6335ed6d
Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents:
1027
diff
changeset
|
445 { |
2f2c6335ed6d
Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents:
1027
diff
changeset
|
446 char *line; |
2f2c6335ed6d
Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents:
1027
diff
changeset
|
447 |
6720
e1ec38002b2b
i_stream_read_next_line(): Try to read the next line until we get it or
Timo Sirainen <tss@iki.fi>
parents:
6558
diff
changeset
|
448 for (;;) { |
e1ec38002b2b
i_stream_read_next_line(): Try to read the next line until we get it or
Timo Sirainen <tss@iki.fi>
parents:
6558
diff
changeset
|
449 line = i_stream_next_line(stream); |
e1ec38002b2b
i_stream_read_next_line(): Try to read the next line until we get it or
Timo Sirainen <tss@iki.fi>
parents:
6558
diff
changeset
|
450 if (line != NULL) |
e1ec38002b2b
i_stream_read_next_line(): Try to read the next line until we get it or
Timo Sirainen <tss@iki.fi>
parents:
6558
diff
changeset
|
451 break; |
1293
2f2c6335ed6d
Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents:
1027
diff
changeset
|
452 |
15640
20a545f932e3
i_stream_read_next_line() now sets stream_errno=ENOBUFS if input buffer gets full.
Timo Sirainen <tss@iki.fi>
parents:
15479
diff
changeset
|
453 switch (i_stream_read(stream)) { |
20a545f932e3
i_stream_read_next_line() now sets stream_errno=ENOBUFS if input buffer gets full.
Timo Sirainen <tss@iki.fi>
parents:
15479
diff
changeset
|
454 case -2: |
17947
a2c5aabc49a9
lib: i_stream_read_next_line() now sets a better error message if line is too long.
Timo Sirainen <tss@iki.fi>
parents:
17848
diff
changeset
|
455 io_stream_set_error(&stream->real_stream->iostream, |
a2c5aabc49a9
lib: i_stream_read_next_line() now sets a better error message if line is too long.
Timo Sirainen <tss@iki.fi>
parents:
17848
diff
changeset
|
456 "Line is too long (over %"PRIuSIZE_T |
a2c5aabc49a9
lib: i_stream_read_next_line() now sets a better error message if line is too long.
Timo Sirainen <tss@iki.fi>
parents:
17848
diff
changeset
|
457 " bytes at offset %"PRIuUOFF_T")", |
a2c5aabc49a9
lib: i_stream_read_next_line() now sets a better error message if line is too long.
Timo Sirainen <tss@iki.fi>
parents:
17848
diff
changeset
|
458 i_stream_get_data_size(stream), stream->v_offset); |
17260
aec6f57b8cf8
i_stream_read_next_line(): Set also errno=ENOBUFS on too large line.
Timo Sirainen <tss@iki.fi>
parents:
17188
diff
changeset
|
459 stream->stream_errno = errno = ENOBUFS; |
15654
ee177df07178
i_stream_read_next_line() should have also set eof=TRUE on ENOBUFS errors.
Timo Sirainen <tss@iki.fi>
parents:
15640
diff
changeset
|
460 stream->eof = TRUE; |
15640
20a545f932e3
i_stream_read_next_line() now sets stream_errno=ENOBUFS if input buffer gets full.
Timo Sirainen <tss@iki.fi>
parents:
15479
diff
changeset
|
461 return NULL; |
20a545f932e3
i_stream_read_next_line() now sets stream_errno=ENOBUFS if input buffer gets full.
Timo Sirainen <tss@iki.fi>
parents:
15479
diff
changeset
|
462 case -1: |
8438
1baa595093f5
Added i_stream_set_return_partial_line().
Timo Sirainen <tss@iki.fi>
parents:
8277
diff
changeset
|
463 return i_stream_last_line(stream->real_stream); |
15640
20a545f932e3
i_stream_read_next_line() now sets stream_errno=ENOBUFS if input buffer gets full.
Timo Sirainen <tss@iki.fi>
parents:
15479
diff
changeset
|
464 case 0: |
20a545f932e3
i_stream_read_next_line() now sets stream_errno=ENOBUFS if input buffer gets full.
Timo Sirainen <tss@iki.fi>
parents:
15479
diff
changeset
|
465 return NULL; |
20a545f932e3
i_stream_read_next_line() now sets stream_errno=ENOBUFS if input buffer gets full.
Timo Sirainen <tss@iki.fi>
parents:
15479
diff
changeset
|
466 } |
6720
e1ec38002b2b
i_stream_read_next_line(): Try to read the next line until we get it or
Timo Sirainen <tss@iki.fi>
parents:
6558
diff
changeset
|
467 } |
1293
2f2c6335ed6d
Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents:
1027
diff
changeset
|
468 return line; |
2f2c6335ed6d
Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents:
1027
diff
changeset
|
469 } |
2f2c6335ed6d
Added i_stream_read_next_line()
Timo Sirainen <tss@iki.fi>
parents:
1027
diff
changeset
|
470 |
14875
2e88cfd8b595
Added i_stream_last_line_crlf()
Timo Sirainen <tss@iki.fi>
parents:
14717
diff
changeset
|
471 bool i_stream_last_line_crlf(struct istream *stream) |
2e88cfd8b595
Added i_stream_last_line_crlf()
Timo Sirainen <tss@iki.fi>
parents:
14717
diff
changeset
|
472 { |
2e88cfd8b595
Added i_stream_last_line_crlf()
Timo Sirainen <tss@iki.fi>
parents:
14717
diff
changeset
|
473 return stream->real_stream->line_crlf; |
2e88cfd8b595
Added i_stream_last_line_crlf()
Timo Sirainen <tss@iki.fi>
parents:
14717
diff
changeset
|
474 } |
2e88cfd8b595
Added i_stream_last_line_crlf()
Timo Sirainen <tss@iki.fi>
parents:
14717
diff
changeset
|
475 |
17508
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
476 static bool i_stream_is_buffer_invalid(const struct istream_private *stream) |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
477 { |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
478 if (stream->parent == NULL) { |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
479 /* the buffer can't point to parent, because it doesn't exist */ |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
480 return FALSE; |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
481 } |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
482 if (stream->w_buffer != NULL) { |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
483 /* we can pretty safely assume that the stream is using its |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
484 own private buffer, so it can never become invalid. */ |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
485 return FALSE; |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
486 } |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
487 if (stream->access_counter != |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
488 stream->parent->real_stream->access_counter) { |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
489 /* parent has been modified behind this stream, we can't trust |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
490 that our buffer is valid */ |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
491 return TRUE; |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
492 } |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
493 return i_stream_is_buffer_invalid(stream->parent->real_stream); |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
494 } |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
495 |
7912
81806d402514
Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents:
7348
diff
changeset
|
496 const unsigned char * |
17511
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
497 i_stream_get_data(struct istream *stream, size_t *size_r) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
498 { |
17511
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
499 struct istream_private *_stream = stream->real_stream; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
500 |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
501 if (_stream->skip >= _stream->pos) { |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
502 *size_r = 0; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
503 return NULL; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
504 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
505 |
17508
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
506 if (i_stream_is_buffer_invalid(_stream)) { |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
507 /* This stream may be using parent's buffer directly as |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
508 _stream->buffer, but the parent stream has already been |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
509 modified indirectly. This means that the buffer might no |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
510 longer point to where we assume it points to. So we'll |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
511 just return the stream as empty until it's read again. |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
512 |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
513 It's a bit ugly to suddenly drop data from the stream that |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
514 was already read, but since this happens only with shared |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
515 parent istreams the caller is hopefully aware enough that |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
516 something like this might happen. The other solutions would |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
517 be to a) try to automatically read the data back (but we |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
518 can't handle errors..) or b) always copy data to stream's |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
519 own buffer instead of pointing to parent's buffer (but this |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
520 causes data copying that is nearly always unnecessary). */ |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
521 *size_r = 0; |
17511
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
522 /* if we had already read until EOF, mark the stream again as |
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
523 not being at the end of file. */ |
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
524 if (stream->stream_errno == 0) { |
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
525 _stream->skip = _stream->pos = 0; |
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
526 stream->eof = FALSE; |
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
527 } |
17508
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
528 return NULL; |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
529 } |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
530 |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
531 *size_r = _stream->pos - _stream->skip; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
532 return _stream->buffer + _stream->skip; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
533 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
534 |
17511
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
535 size_t i_stream_get_data_size(struct istream *stream) |
14683
9646f80ac3e9
Added i_stream_get_data_size(). Used it where possible.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
536 { |
17508
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
537 size_t size; |
14683
9646f80ac3e9
Added i_stream_get_data_size(). Used it where possible.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
538 |
17508
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
539 (void)i_stream_get_data(stream, &size); |
01061ac25fe1
lib: If two istreams share one parent, i_stream_get_data() may have returned corrupted data to another.
Timo Sirainen <tss@iki.fi>
parents:
17353
diff
changeset
|
540 return size; |
14683
9646f80ac3e9
Added i_stream_get_data_size(). Used it where possible.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
541 } |
9646f80ac3e9
Added i_stream_get_data_size(). Used it where possible.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
542 |
17511
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
543 unsigned char *i_stream_get_modifiable_data(struct istream *stream, |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
544 size_t *size_r) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
545 { |
17511
0d072ade062d
lib: i_stream_get_data() should also reset eof=FALSE if it truncates the output.
Timo Sirainen <tss@iki.fi>
parents:
17509
diff
changeset
|
546 struct istream_private *_stream = stream->real_stream; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
547 |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
548 if (_stream->skip >= _stream->pos || _stream->w_buffer == NULL) { |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
549 *size_r = 0; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
550 return NULL; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
551 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
552 |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
553 *size_r = _stream->pos - _stream->skip; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
554 return _stream->w_buffer + _stream->skip; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
555 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
556 |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
557 int i_stream_read_data(struct istream *stream, const unsigned char **data_r, |
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
558 size_t *size_r, size_t threshold) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
559 { |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
560 ssize_t ret = 0; |
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
|
561 bool read_more = FALSE; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
562 |
2165
4c5732a9e2bc
i_stream_read_data(): don't call read() unless we have to
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
563 do { |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
564 *data_r = i_stream_get_data(stream, size_r); |
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
565 if (*size_r > threshold) |
2165
4c5732a9e2bc
i_stream_read_data(): don't call read() unless we have to
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
566 return 1; |
4c5732a9e2bc
i_stream_read_data(): don't call read() unless we have to
Timo Sirainen <tss@iki.fi>
parents:
2160
diff
changeset
|
567 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
568 /* we need more data */ |
1312
c893ba64db07
Fixes for resetting stream limits. Should fix some APPEND problems.
Timo Sirainen <tss@iki.fi>
parents:
1293
diff
changeset
|
569 ret = i_stream_read(stream); |
2573
d10ad1e5a5aa
i_stream_read_data(): return -1 if we didn't read more data, even if buffer
Timo Sirainen <tss@iki.fi>
parents:
2459
diff
changeset
|
570 if (ret > 0) |
d10ad1e5a5aa
i_stream_read_data(): return -1 if we didn't read more data, even if buffer
Timo Sirainen <tss@iki.fi>
parents:
2459
diff
changeset
|
571 read_more = TRUE; |
2452
963d95591b49
i_stream_read_data(): don't loop if read() returns 0.
Timo Sirainen <tss@iki.fi>
parents:
2431
diff
changeset
|
572 } while (ret > 0); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
573 |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
574 *data_r = i_stream_get_data(stream, size_r); |
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
575 if (ret == -2) |
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
576 return -2; |
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
577 |
8194
1ee313158639
i_stream_read_data(): Error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
7925
diff
changeset
|
578 if (ret == 0) { |
1ee313158639
i_stream_read_data(): Error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
7925
diff
changeset
|
579 /* need to read more */ |
1ee313158639
i_stream_read_data(): Error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
7925
diff
changeset
|
580 i_assert(!stream->blocking); |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
581 return 0; |
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
582 } |
8196
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
583 if (stream->eof) { |
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
584 if (read_more) { |
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
585 /* we read at least some new data */ |
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
586 return 0; |
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
587 } |
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
588 } else { |
40a07553606c
Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents:
8194
diff
changeset
|
589 i_assert(stream->stream_errno != 0); |
8194
1ee313158639
i_stream_read_data(): Error handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
7925
diff
changeset
|
590 } |
5106
81394e71f92a
Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
591 return -1; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
592 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
593 |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
594 void i_stream_compress(struct istream_private *stream) |
5481
460d6aeee7af
Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents:
5479
diff
changeset
|
595 { |
21213
10a77a6881cd
global: Code cleanup - avoid passing NULL to functions with non-null parameter
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21092
diff
changeset
|
596 if (stream->skip != stream->pos) { |
10a77a6881cd
global: Code cleanup - avoid passing NULL to functions with non-null parameter
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21092
diff
changeset
|
597 memmove(stream->w_buffer, stream->w_buffer + stream->skip, |
10a77a6881cd
global: Code cleanup - avoid passing NULL to functions with non-null parameter
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21092
diff
changeset
|
598 stream->pos - stream->skip); |
10a77a6881cd
global: Code cleanup - avoid passing NULL to functions with non-null parameter
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21092
diff
changeset
|
599 } |
5481
460d6aeee7af
Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents:
5479
diff
changeset
|
600 stream->pos -= stream->skip; |
460d6aeee7af
Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents:
5479
diff
changeset
|
601 |
460d6aeee7af
Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents:
5479
diff
changeset
|
602 stream->skip = 0; |
460d6aeee7af
Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents:
5479
diff
changeset
|
603 } |
460d6aeee7af
Moved i_stream_compress() to generic code
Timo Sirainen <tss@iki.fi>
parents:
5479
diff
changeset
|
604 |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
605 void i_stream_grow_buffer(struct istream_private *stream, size_t bytes) |
5479
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
606 { |
20245
57078d325d01
global: Use i_stream_get_max_buffer_size() wherever possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20244
diff
changeset
|
607 size_t old_size, max_size; |
13885
59f5238c6e61
istream: Don't treat max_block_size=0 as unlimited.
Timo Sirainen <tss@iki.fi>
parents:
13861
diff
changeset
|
608 |
5479
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
609 old_size = stream->buffer_size; |
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
610 |
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
611 stream->buffer_size = stream->pos + bytes; |
9777
85abd99007c3
Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents:
9525
diff
changeset
|
612 if (stream->buffer_size <= stream->init_buffer_size) |
85abd99007c3
Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents:
9525
diff
changeset
|
613 stream->buffer_size = stream->init_buffer_size; |
6142
6c0bfc35af03
Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents:
5675
diff
changeset
|
614 else |
6c0bfc35af03
Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents:
5675
diff
changeset
|
615 stream->buffer_size = nearest_power(stream->buffer_size); |
5479
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
616 |
20245
57078d325d01
global: Use i_stream_get_max_buffer_size() wherever possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20244
diff
changeset
|
617 max_size = i_stream_get_max_buffer_size(&stream->istream); |
57078d325d01
global: Use i_stream_get_max_buffer_size() wherever possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20244
diff
changeset
|
618 i_assert(max_size > 0); |
57078d325d01
global: Use i_stream_get_max_buffer_size() wherever possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20244
diff
changeset
|
619 if (stream->buffer_size > max_size) |
57078d325d01
global: Use i_stream_get_max_buffer_size() wherever possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20244
diff
changeset
|
620 stream->buffer_size = max_size; |
5479
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
621 |
10691
fe70069debcb
i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
622 if (stream->buffer_size <= old_size) |
fe70069debcb
i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
623 stream->buffer_size = old_size; |
fe70069debcb
i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
624 else { |
fe70069debcb
i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
625 stream->w_buffer = i_realloc(stream->w_buffer, old_size, |
fe70069debcb
i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
626 stream->buffer_size); |
fe70069debcb
i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
627 stream->buffer = stream->w_buffer; |
fe70069debcb
i_stream_grow_buffer(): Never shrink the buffer.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
628 } |
5479
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
629 } |
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
630 |
14693
d7d1f24dde34
istreams: Renamed i_stream_get_buffer_space() to i_stream_try_alloc()
Timo Sirainen <tss@iki.fi>
parents:
14688
diff
changeset
|
631 bool i_stream_try_alloc(struct istream_private *stream, |
d7d1f24dde34
istreams: Renamed i_stream_get_buffer_space() to i_stream_try_alloc()
Timo Sirainen <tss@iki.fi>
parents:
14688
diff
changeset
|
632 size_t wanted_size, size_t *size_r) |
6558
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
633 { |
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
634 i_assert(wanted_size > 0); |
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
635 |
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
636 if (wanted_size > stream->buffer_size - stream->pos) { |
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
637 if (stream->skip > 0) { |
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
638 /* remove the unused bytes from beginning of buffer */ |
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
639 i_stream_compress(stream); |
20245
57078d325d01
global: Use i_stream_get_max_buffer_size() wherever possible
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20244
diff
changeset
|
640 } else if (stream->buffer_size < i_stream_get_max_buffer_size(&stream->istream)) { |
6558
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
641 /* buffer is full - grow it */ |
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
642 i_stream_grow_buffer(stream, I_STREAM_MIN_SIZE); |
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
643 } |
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
644 } |
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
645 |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
646 *size_r = stream->buffer_size - stream->pos; |
15215
cafdd35ac437
istream: Added internal try_alloc_limit to limit size returned by i_stream_try_alloc()
Timo Sirainen <tss@iki.fi>
parents:
15174
diff
changeset
|
647 if (stream->try_alloc_limit > 0 && |
cafdd35ac437
istream: Added internal try_alloc_limit to limit size returned by i_stream_try_alloc()
Timo Sirainen <tss@iki.fi>
parents:
15174
diff
changeset
|
648 *size_r > stream->try_alloc_limit) |
cafdd35ac437
istream: Added internal try_alloc_limit to limit size returned by i_stream_try_alloc()
Timo Sirainen <tss@iki.fi>
parents:
15174
diff
changeset
|
649 *size_r = stream->try_alloc_limit; |
cafdd35ac437
istream: Added internal try_alloc_limit to limit size returned by i_stream_try_alloc()
Timo Sirainen <tss@iki.fi>
parents:
15174
diff
changeset
|
650 return *size_r > 0; |
6558
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
651 } |
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
652 |
14694 | 653 void *i_stream_alloc(struct istream_private *stream, size_t size) |
654 { | |
655 size_t old_size, avail_size; | |
656 | |
657 i_stream_try_alloc(stream, size, &avail_size); | |
658 if (avail_size < size) { | |
659 old_size = stream->buffer_size; | |
660 stream->buffer_size = nearest_power(stream->pos + size); | |
661 stream->w_buffer = i_realloc(stream->w_buffer, old_size, | |
662 stream->buffer_size); | |
663 stream->buffer = stream->w_buffer; | |
664 i_stream_try_alloc(stream, size, &avail_size); | |
665 i_assert(avail_size >= size); | |
666 } | |
667 return stream->w_buffer + stream->pos; | |
6558
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
668 } |
4a1caf69ca14
Added i_stream_get_buffer_space() to remove code duplication.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
669 |
7925 | 670 bool i_stream_add_data(struct istream *_stream, const unsigned char *data, |
671 size_t size) | |
672 { | |
673 struct istream_private *stream = _stream->real_stream; | |
674 size_t size2; | |
675 | |
14693
d7d1f24dde34
istreams: Renamed i_stream_get_buffer_space() to i_stream_try_alloc()
Timo Sirainen <tss@iki.fi>
parents:
14688
diff
changeset
|
676 i_stream_try_alloc(stream, size, &size2); |
7925 | 677 if (size > size2) |
678 return FALSE; | |
679 | |
680 memcpy(stream->w_buffer + stream->pos, data, size); | |
681 stream->pos += size; | |
682 return TRUE; | |
683 } | |
684 | |
22839
e94be670bd18
lib: Add i_stream_get_root_io() and use it to deduplicate code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22713
diff
changeset
|
685 struct istream *i_stream_get_root_io(struct istream *stream) |
e94be670bd18
lib: Add i_stream_get_root_io() and use it to deduplicate code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22713
diff
changeset
|
686 { |
e94be670bd18
lib: Add i_stream_get_root_io() and use it to deduplicate code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22713
diff
changeset
|
687 while (stream->real_stream->parent != NULL) { |
e94be670bd18
lib: Add i_stream_get_root_io() and use it to deduplicate code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22713
diff
changeset
|
688 i_assert(stream->real_stream->io == NULL); |
e94be670bd18
lib: Add i_stream_get_root_io() and use it to deduplicate code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22713
diff
changeset
|
689 stream = stream->real_stream->parent; |
e94be670bd18
lib: Add i_stream_get_root_io() and use it to deduplicate code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22713
diff
changeset
|
690 } |
e94be670bd18
lib: Add i_stream_get_root_io() and use it to deduplicate code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22713
diff
changeset
|
691 return stream; |
e94be670bd18
lib: Add i_stream_get_root_io() and use it to deduplicate code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22713
diff
changeset
|
692 } |
e94be670bd18
lib: Add i_stream_get_root_io() and use it to deduplicate code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22713
diff
changeset
|
693 |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
694 void i_stream_set_input_pending(struct istream *stream, bool pending) |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
695 { |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
696 if (!pending) |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
697 return; |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
698 |
22839
e94be670bd18
lib: Add i_stream_get_root_io() and use it to deduplicate code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22713
diff
changeset
|
699 stream = i_stream_get_root_io(stream); |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
700 if (stream->real_stream->io != NULL) |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
701 io_set_pending(stream->real_stream->io); |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
702 } |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
703 |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
704 void i_stream_switch_ioloop(struct istream *stream) |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
705 { |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
706 do { |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
707 if (stream->real_stream->switch_ioloop != NULL) |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
708 stream->real_stream->switch_ioloop(stream->real_stream); |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
709 stream = stream->real_stream->parent; |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
710 } while (stream != NULL); |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
711 } |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
712 |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
713 void i_stream_set_io(struct istream *stream, struct io *io) |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
714 { |
22839
e94be670bd18
lib: Add i_stream_get_root_io() and use it to deduplicate code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22713
diff
changeset
|
715 stream = i_stream_get_root_io(stream); |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
716 |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
717 i_assert(stream->real_stream->io == NULL); |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
718 stream->real_stream->io = io; |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
719 } |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
720 |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
721 void i_stream_unset_io(struct istream *stream, struct io *io) |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
722 { |
22839
e94be670bd18
lib: Add i_stream_get_root_io() and use it to deduplicate code
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22713
diff
changeset
|
723 stream = i_stream_get_root_io(stream); |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
724 |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
725 i_assert(stream->real_stream->io == io); |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
726 stream->real_stream->io = NULL; |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
727 } |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17184
diff
changeset
|
728 |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
729 static void |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
730 i_stream_default_set_max_buffer_size(struct iostream_private *stream, |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
731 size_t max_size) |
5479
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
732 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
733 struct istream_private *_stream = (struct istream_private *)stream; |
5479
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
734 |
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
735 _stream->max_buffer_size = max_size; |
9519
c0c3dcb5a6f0
Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents:
9196
diff
changeset
|
736 if (_stream->parent != NULL) |
c0c3dcb5a6f0
Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents:
9196
diff
changeset
|
737 i_stream_set_max_buffer_size(_stream->parent, max_size); |
c0c3dcb5a6f0
Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents:
9196
diff
changeset
|
738 } |
c0c3dcb5a6f0
Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents:
9196
diff
changeset
|
739 |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
740 static void i_stream_default_close(struct iostream_private *stream, |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
741 bool close_parent) |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
742 { |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
743 struct istream_private *_stream = (struct istream_private *)stream; |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
744 |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
745 if (close_parent && _stream->parent != NULL) |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
746 i_stream_close(_stream->parent); |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
747 } |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
748 |
9519
c0c3dcb5a6f0
Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents:
9196
diff
changeset
|
749 static void i_stream_default_destroy(struct iostream_private *stream) |
c0c3dcb5a6f0
Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents:
9196
diff
changeset
|
750 { |
c0c3dcb5a6f0
Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents:
9196
diff
changeset
|
751 struct istream_private *_stream = (struct istream_private *)stream; |
c0c3dcb5a6f0
Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents:
9196
diff
changeset
|
752 |
c0c3dcb5a6f0
Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents:
9196
diff
changeset
|
753 i_free(_stream->w_buffer); |
9525
02badd89127e
istream: Changed default destroy() implementation not to do parent stream seeking.
Timo Sirainen <tss@iki.fi>
parents:
9522
diff
changeset
|
754 if (_stream->parent != NULL) |
9519
c0c3dcb5a6f0
Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents:
9196
diff
changeset
|
755 i_stream_unref(&_stream->parent); |
5479
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
756 } |
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
757 |
14700
11e774a9d22c
istreams: Added default seek() implementation for seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
14694
diff
changeset
|
758 static void |
11e774a9d22c
istreams: Added default seek() implementation for seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
14694
diff
changeset
|
759 i_stream_default_seek_seekable(struct istream_private *stream, |
11e774a9d22c
istreams: Added default seek() implementation for seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
14694
diff
changeset
|
760 uoff_t v_offset, bool mark ATTR_UNUSED) |
11e774a9d22c
istreams: Added default seek() implementation for seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
14694
diff
changeset
|
761 { |
11e774a9d22c
istreams: Added default seek() implementation for seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
14694
diff
changeset
|
762 stream->istream.v_offset = v_offset; |
11e774a9d22c
istreams: Added default seek() implementation for seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
14694
diff
changeset
|
763 stream->skip = stream->pos = 0; |
11e774a9d22c
istreams: Added default seek() implementation for seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
14694
diff
changeset
|
764 } |
11e774a9d22c
istreams: Added default seek() implementation for seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
14694
diff
changeset
|
765 |
11e774a9d22c
istreams: Added default seek() implementation for seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
14694
diff
changeset
|
766 void i_stream_default_seek_nonseekable(struct istream_private *stream, |
11e774a9d22c
istreams: Added default seek() implementation for seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
14694
diff
changeset
|
767 uoff_t v_offset, bool mark ATTR_UNUSED) |
9522
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
768 { |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
769 size_t available; |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
770 |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
771 if (stream->istream.v_offset > v_offset) |
16725
262fbb878ed4
istream: Improved "stream not seekable" panic message.
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
772 i_panic("stream %s doesn't support seeking backwards", |
262fbb878ed4
istream: Improved "stream not seekable" panic message.
Timo Sirainen <tss@iki.fi>
parents:
16236
diff
changeset
|
773 i_stream_get_name(&stream->istream)); |
9522
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
774 |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
775 while (stream->istream.v_offset < v_offset) { |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
776 (void)i_stream_read(&stream->istream); |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
777 |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
778 available = stream->pos - stream->skip; |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
779 if (available == 0) { |
18020
503b4b1b7aa1
lib: If i_stream_seek() works by reading forward and read() fails, don't override the error message.
Timo Sirainen <tss@iki.fi>
parents:
17947
diff
changeset
|
780 if (stream->istream.stream_errno != 0) { |
503b4b1b7aa1
lib: If i_stream_seek() works by reading forward and read() fails, don't override the error message.
Timo Sirainen <tss@iki.fi>
parents:
17947
diff
changeset
|
781 /* read failed */ |
503b4b1b7aa1
lib: If i_stream_seek() works by reading forward and read() fails, don't override the error message.
Timo Sirainen <tss@iki.fi>
parents:
17947
diff
changeset
|
782 return; |
503b4b1b7aa1
lib: If i_stream_seek() works by reading forward and read() fails, don't override the error message.
Timo Sirainen <tss@iki.fi>
parents:
17947
diff
changeset
|
783 } |
17848
ee9cebb11e0e
lib: If i_stream_default_seek_nonseekable() can't seek, set a more readable error message.
Timo Sirainen <tss@iki.fi>
parents:
17607
diff
changeset
|
784 io_stream_set_error(&stream->iostream, |
ee9cebb11e0e
lib: If i_stream_default_seek_nonseekable() can't seek, set a more readable error message.
Timo Sirainen <tss@iki.fi>
parents:
17607
diff
changeset
|
785 "Can't seek to offset %"PRIuUOFF_T |
ee9cebb11e0e
lib: If i_stream_default_seek_nonseekable() can't seek, set a more readable error message.
Timo Sirainen <tss@iki.fi>
parents:
17607
diff
changeset
|
786 ", because we have data only up to offset %" |
ee9cebb11e0e
lib: If i_stream_default_seek_nonseekable() can't seek, set a more readable error message.
Timo Sirainen <tss@iki.fi>
parents:
17607
diff
changeset
|
787 PRIuUOFF_T" (eof=%d)", v_offset, |
ee9cebb11e0e
lib: If i_stream_default_seek_nonseekable() can't seek, set a more readable error message.
Timo Sirainen <tss@iki.fi>
parents:
17607
diff
changeset
|
788 stream->istream.v_offset, stream->istream.eof); |
9522
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
789 stream->istream.stream_errno = ESPIPE; |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
790 return; |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
791 } |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
792 if (available <= v_offset - stream->istream.v_offset) |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
793 i_stream_skip(&stream->istream, available); |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
794 else { |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
795 i_stream_skip(&stream->istream, |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
796 v_offset - stream->istream.v_offset); |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
797 } |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
798 } |
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
799 } |
12415
236ed6d5b391
istream: Exported i_stream_default_seek()
Timo Sirainen <tss@iki.fi>
parents:
12225
diff
changeset
|
800 |
14964 | 801 static int |
14701
89e0aad6ba88
istreams: Added default stat() implementation for filter streams.
Timo Sirainen <tss@iki.fi>
parents:
14700
diff
changeset
|
802 i_stream_default_stat(struct istream_private *stream, bool exact) |
5479
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
803 { |
14964 | 804 const struct stat *st; |
805 | |
14701
89e0aad6ba88
istreams: Added default stat() implementation for filter streams.
Timo Sirainen <tss@iki.fi>
parents:
14700
diff
changeset
|
806 if (stream->parent == NULL) |
15725
d4bf15bbf182
istream: Fail in the default stat() implementation if stream_errno is set.
Timo Sirainen <tss@iki.fi>
parents:
15720
diff
changeset
|
807 return stream->istream.stream_errno == 0 ? 0 : -1; |
14701
89e0aad6ba88
istreams: Added default stat() implementation for filter streams.
Timo Sirainen <tss@iki.fi>
parents:
14700
diff
changeset
|
808 |
18896
ac64c307d179
istream filters: If parent's i_stream_stat() fails, copy the stream_errno.
Timo Sirainen <tss@iki.fi>
parents:
18251
diff
changeset
|
809 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:
18251
diff
changeset
|
810 stream->istream.stream_errno = stream->parent->stream_errno; |
14964 | 811 return -1; |
18896
ac64c307d179
istream filters: If parent's i_stream_stat() fails, copy the stream_errno.
Timo Sirainen <tss@iki.fi>
parents:
18251
diff
changeset
|
812 } |
14964 | 813 stream->statbuf = *st; |
15420
fee60a91d586
i_stream_default_stat(): If we can't know the size, return -1 instead of assert crash.
Timo Sirainen <tss@iki.fi>
parents:
15215
diff
changeset
|
814 if (exact && !stream->stream_size_passthrough) { |
fee60a91d586
i_stream_default_stat(): If we can't know the size, return -1 instead of assert crash.
Timo Sirainen <tss@iki.fi>
parents:
15215
diff
changeset
|
815 /* exact size is not known, even if parent returned something */ |
fee60a91d586
i_stream_default_stat(): If we can't know the size, return -1 instead of assert crash.
Timo Sirainen <tss@iki.fi>
parents:
15215
diff
changeset
|
816 stream->statbuf.st_size = -1; |
fee60a91d586
i_stream_default_stat(): If we can't know the size, return -1 instead of assert crash.
Timo Sirainen <tss@iki.fi>
parents:
15215
diff
changeset
|
817 } |
14964 | 818 return 0; |
5479
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
819 } |
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
820 |
8922
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
821 static int |
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
822 i_stream_default_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:
8721
diff
changeset
|
823 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:
8721
diff
changeset
|
824 { |
20170
058f5c828ab5
lib: Fixed potential crash in i_stream_stat() failures.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20145
diff
changeset
|
825 if (stream->stat(stream, exact) < 0) |
8922
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
826 return -1; |
14964 | 827 if (stream->statbuf.st_size == -1) |
8922
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
828 return 0; |
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
829 |
14964 | 830 *size_r = stream->statbuf.st_size; |
8922
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
831 return 1; |
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
832 } |
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
833 |
16942
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
834 void i_stream_init_parent(struct istream_private *_stream, |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
835 struct istream *parent) |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
836 { |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
837 _stream->access_counter = parent->real_stream->access_counter; |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
838 _stream->parent = parent; |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
839 _stream->parent_start_offset = parent->v_offset; |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
840 _stream->parent_expected_offset = parent->v_offset; |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
841 _stream->abs_start_offset = parent->v_offset + |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
842 parent->real_stream->abs_start_offset; |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
843 /* if parent stream is an istream-error, copy the error */ |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
844 _stream->istream.stream_errno = parent->stream_errno; |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
845 _stream->istream.eof = parent->eof; |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
846 i_stream_ref(parent); |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
847 } |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
848 |
6142
6c0bfc35af03
Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents:
5675
diff
changeset
|
849 struct istream * |
7032
85cf52f0bc64
i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents:
7023
diff
changeset
|
850 i_stream_create(struct istream_private *_stream, struct istream *parent, int fd) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
851 { |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
852 _stream->fd = fd; |
16942
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
853 if (parent != NULL) |
1c9ecb6bcccc
istream: Added i_stream_init_parent() to lazily initialize the parent stream.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
854 i_stream_init_parent(_stream, parent); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
855 _stream->istream.real_stream = _stream; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
856 |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
857 if (_stream->iostream.close == NULL) |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15814
diff
changeset
|
858 _stream->iostream.close = i_stream_default_close; |
9519
c0c3dcb5a6f0
Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents:
9196
diff
changeset
|
859 if (_stream->iostream.destroy == NULL) |
c0c3dcb5a6f0
Moved some common istream functionality to default istream implementation.
Timo Sirainen <tss@iki.fi>
parents:
9196
diff
changeset
|
860 _stream->iostream.destroy = i_stream_default_destroy; |
9522
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
861 if (_stream->seek == NULL) { |
14700
11e774a9d22c
istreams: Added default seek() implementation for seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
14694
diff
changeset
|
862 _stream->seek = _stream->istream.seekable ? |
11e774a9d22c
istreams: Added default seek() implementation for seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
14694
diff
changeset
|
863 i_stream_default_seek_seekable : |
11e774a9d22c
istreams: Added default seek() implementation for seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
14694
diff
changeset
|
864 i_stream_default_seek_nonseekable; |
9522
85912a6031a0
istreams: Added a default seek() implementation for non-seekable streams.
Timo Sirainen <tss@iki.fi>
parents:
9519
diff
changeset
|
865 } |
5479
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
866 if (_stream->stat == NULL) |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
867 _stream->stat = i_stream_default_stat; |
8922
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
868 if (_stream->get_size == NULL) |
5106852f552a
Added i_stream_get_size(). Use it instead of i_stream_stat() where possible.
Timo Sirainen <tss@iki.fi>
parents:
8721
diff
changeset
|
869 _stream->get_size = i_stream_default_get_size; |
6420
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
870 if (_stream->iostream.set_max_buffer_size == NULL) { |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
871 _stream->iostream.set_max_buffer_size = |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
872 i_stream_default_set_max_buffer_size; |
a8b515e1a26f
Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents:
6415
diff
changeset
|
873 } |
9777
85abd99007c3
Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents:
9525
diff
changeset
|
874 if (_stream->init_buffer_size == 0) |
85abd99007c3
Added i_stream_set_init_buffer_size().
Timo Sirainen <tss@iki.fi>
parents:
9525
diff
changeset
|
875 _stream->init_buffer_size = I_STREAM_MIN_SIZE; |
5479
b3999af65adb
If istream implementation doesn't set set_max_buffer_size() or stat(),
Timo Sirainen <tss@iki.fi>
parents:
5106
diff
changeset
|
876 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21213
diff
changeset
|
877 i_zero(&_stream->statbuf); |
3241
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3240
diff
changeset
|
878 _stream->statbuf.st_size = -1; |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3240
diff
changeset
|
879 _stream->statbuf.st_atime = |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3240
diff
changeset
|
880 _stream->statbuf.st_mtime = |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3240
diff
changeset
|
881 _stream->statbuf.st_ctime = ioloop_time; |
b79853b4b005
Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents:
3240
diff
changeset
|
882 |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
883 io_stream_init(&_stream->iostream); |
21092
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
884 |
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
885 if (_stream->istream.stream_errno != 0) |
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
886 _stream->istream.eof = TRUE; |
f4d0e0562765
lib: Mark istream with eof=TRUE on all errors
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20535
diff
changeset
|
887 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
888 return &_stream->istream; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
889 } |
15174
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
890 |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
891 struct istream *i_stream_create_error(int stream_errno) |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
892 { |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
893 struct istream_private *stream; |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
894 |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
895 stream = i_new(struct istream_private, 1); |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
896 stream->istream.closed = TRUE; |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
897 stream->istream.readable_fd = FALSE; |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
898 stream->istream.blocking = TRUE; |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
899 stream->istream.seekable = TRUE; |
15720
42e152c01ace
i_stream_create_error() should have set eof=TRUE immediately.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
900 stream->istream.eof = TRUE; |
15174
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
901 stream->istream.stream_errno = stream_errno; |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
902 i_stream_create(stream, NULL, -1); |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
903 i_stream_set_name(&stream->istream, "(error)"); |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
904 return &stream->istream; |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14964
diff
changeset
|
905 } |
16813
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
906 |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
907 struct istream * |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
908 i_stream_create_error_str(int stream_errno, const char *fmt, ...) |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
909 { |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
910 struct istream *input; |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
911 va_list args; |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
912 |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
913 va_start(args, fmt); |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
914 input = i_stream_create_error(stream_errno); |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
915 io_stream_set_verror(&input->real_stream->iostream, fmt, args); |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
916 va_end(args); |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
917 return input; |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
918 } |