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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
1 /* Copyright (c) 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
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
176 switch (ret) {
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
177 case -2:
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
178 i_assert(_stream->skip != _stream->pos);
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
179 break;
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
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
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
190 break;
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
191 case 0:
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
192 i_assert(!stream->blocking);
943955343653 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8210
diff changeset
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
0fd7dbda6704 cleanup
Timo Sirainen <tss@iki.fi>
parents: 1846
diff changeset
256 data_size = _stream->pos - _stream->skip;
0fd7dbda6704 cleanup
Timo Sirainen <tss@iki.fi>
parents: 1846
diff changeset
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
0fd7dbda6704 cleanup
Timo Sirainen <tss@iki.fi>
parents: 1846
diff changeset
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
Timo Sirainen <tss@iki.fi>
parents: 1870
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14875
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14875
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14875
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14875
diff changeset
348 *st_r = &_stream->statbuf;
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14875
diff changeset
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
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
370 bool i_stream_is_eof(struct istream *stream)
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
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
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
373 (void)i_stream_read(stream);
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
374 return !i_stream_have_bytes_left(stream);
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
375 }
5deb3ee1d655 Added i_stream_is_eof().
Timo Sirainen <tss@iki.fi>
parents: 8922
diff changeset
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
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
653 void *i_stream_alloc(struct istream_private *stream, size_t size)
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
654 {
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
655 size_t old_size, avail_size;
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
656
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
657 i_stream_try_alloc(stream, size, &avail_size);
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
658 if (avail_size < size) {
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
659 old_size = stream->buffer_size;
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
660 stream->buffer_size = nearest_power(stream->pos + size);
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
661 stream->w_buffer = i_realloc(stream->w_buffer, old_size,
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
662 stream->buffer_size);
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
663 stream->buffer = stream->w_buffer;
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
664 i_stream_try_alloc(stream, size, &avail_size);
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
665 i_assert(avail_size >= size);
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
666 }
8909e8428b82 Added i_stream_alloc()
Timo Sirainen <tss@iki.fi>
parents: 14693
diff changeset
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
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
670 bool i_stream_add_data(struct istream *_stream, const unsigned char *data,
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
671 size_t size)
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
672 {
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
673 struct istream_private *stream = _stream->real_stream;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
674 size_t size2;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
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
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
677 if (size > size2)
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
678 return FALSE;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
679
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
680 memcpy(stream->w_buffer + stream->pos, data, size);
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
681 stream->pos += size;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
682 return TRUE;
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
683 }
4a166ccec256 Added i_stream_add_data().
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14875
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14875
diff changeset
804 const struct stat *st;
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14875
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14875
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14875
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14875
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14875
diff changeset
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
6d2be8d8891c i_stream_stat() API changed.
Timo Sirainen <tss@iki.fi>
parents: 14875
diff changeset
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 }