Mercurial > dovecot > core-2.2
annotate src/lib/ostream.c @ 23007:36e01285b5b8
lib: buffer - Improve header comment for buffer_insert() and buffer_delete().
author | Stephan Bosch <stephan.bosch@dovecot.fi> |
---|---|
date | Mon, 18 Mar 2019 00:52:37 +0100 |
parents | cb108f786fb4 |
children |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21777
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" |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "istream.h" |
13529
cf77e448295c
Renamed lib/*-internal.h files to lib/*-private.h for consistency.
Timo Sirainen <tss@iki.fi>
parents:
13417
diff
changeset
|
5 #include "ostream-private.h" |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 |
10847
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10708
diff
changeset
|
7 void o_stream_set_name(struct ostream *stream, const char *name) |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10708
diff
changeset
|
8 { |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10708
diff
changeset
|
9 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:
10708
diff
changeset
|
10 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:
10708
diff
changeset
|
11 } |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10708
diff
changeset
|
12 |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10708
diff
changeset
|
13 const char *o_stream_get_name(struct ostream *stream) |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10708
diff
changeset
|
14 { |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
15 while (stream->real_stream->iostream.name == NULL) { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
16 stream = stream->real_stream->parent; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
17 if (stream == NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
18 return ""; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
19 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
20 return stream->real_stream->iostream.name; |
10847
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10708
diff
changeset
|
21 } |
5f16e488e7f6
i/ostreams can now have a name (e.g. file path).
Timo Sirainen <tss@iki.fi>
parents:
10708
diff
changeset
|
22 |
14851 | 23 int o_stream_get_fd(struct ostream *stream) |
24 { | |
25 return stream->real_stream->fd; | |
26 } | |
27 | |
16772
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
28 const char *o_stream_get_error(struct ostream *stream) |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
29 { |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
30 struct ostream *s; |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
31 |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
32 /* we'll only return errors for streams that have stream_errno set. |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
33 we might be returning unintended error otherwise. */ |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
34 if (stream->stream_errno == 0) |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
35 return "<no error>"; |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
36 |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
37 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:
16020
diff
changeset
|
38 if (s->stream_errno == 0) |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
39 break; |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
40 if (s->real_stream->iostream.error != NULL) |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
41 return s->real_stream->iostream.error; |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
42 } |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
43 return strerror(stream->stream_errno); |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
44 } |
e35be66003e2
iostream: Added ability to set/get error strings for streams.
Timo Sirainen <tss@iki.fi>
parents:
16020
diff
changeset
|
45 |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
46 static void o_stream_close_full(struct ostream *stream, bool close_parents) |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
47 { |
16998
e3a87c25e0b2
ostream: Don't mark the stream closed too early after all.
Timo Sirainen <tss@iki.fi>
parents:
16932
diff
changeset
|
48 if (!stream->closed && !stream->real_stream->closing) { |
e3a87c25e0b2
ostream: Don't mark the stream closed too early after all.
Timo Sirainen <tss@iki.fi>
parents:
16932
diff
changeset
|
49 /* first mark the stream as being closed so the |
e3a87c25e0b2
ostream: Don't mark the stream closed too early after all.
Timo Sirainen <tss@iki.fi>
parents:
16932
diff
changeset
|
50 o_stream_copy_error_from_parent() won't recurse us back |
e3a87c25e0b2
ostream: Don't mark the stream closed too early after all.
Timo Sirainen <tss@iki.fi>
parents:
16932
diff
changeset
|
51 here. but don't immediately mark the stream closed, because |
e3a87c25e0b2
ostream: Don't mark the stream closed too early after all.
Timo Sirainen <tss@iki.fi>
parents:
16932
diff
changeset
|
52 we may still want to write something to it. */ |
e3a87c25e0b2
ostream: Don't mark the stream closed too early after all.
Timo Sirainen <tss@iki.fi>
parents:
16932
diff
changeset
|
53 stream->real_stream->closing = TRUE; |
e3a87c25e0b2
ostream: Don't mark the stream closed too early after all.
Timo Sirainen <tss@iki.fi>
parents:
16932
diff
changeset
|
54 io_stream_close(&stream->real_stream->iostream, close_parents); |
16932
10c0aae82d0d
ostream: Mark stream closed before handling its callback to avoid infinite loops.
Timo Sirainen <tss@iki.fi>
parents:
16843
diff
changeset
|
55 stream->closed = TRUE; |
16843
ff2452560ef0
liblib: If parent ostream closes itself on error, close our ostream as well.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
56 } |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
57 |
18034
39e2455a5e2d
lib: Make sure ostream.last_failed_errno is always set when stream_errno is set.
Timo Sirainen <tss@iki.fi>
parents:
18033
diff
changeset
|
58 if (stream->stream_errno != 0) |
39e2455a5e2d
lib: Make sure ostream.last_failed_errno is always set when stream_errno is set.
Timo Sirainen <tss@iki.fi>
parents:
18033
diff
changeset
|
59 i_assert(stream->last_failed_errno != 0); |
39e2455a5e2d
lib: Make sure ostream.last_failed_errno is always set when stream_errno is set.
Timo Sirainen <tss@iki.fi>
parents:
18033
diff
changeset
|
60 else { |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
61 stream->stream_errno = EPIPE; |
18034
39e2455a5e2d
lib: Make sure ostream.last_failed_errno is always set when stream_errno is set.
Timo Sirainen <tss@iki.fi>
parents:
18033
diff
changeset
|
62 stream->last_failed_errno = EPIPE; |
39e2455a5e2d
lib: Make sure ostream.last_failed_errno is always set when stream_errno is set.
Timo Sirainen <tss@iki.fi>
parents:
18033
diff
changeset
|
63 } |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
64 } |
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
65 |
4070
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
66 void o_stream_destroy(struct ostream **stream) |
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
67 { |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
68 o_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
|
69 o_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
|
70 } |
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
71 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
807
diff
changeset
|
72 void o_stream_ref(struct ostream *stream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
74 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
|
75 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
77 void o_stream_unref(struct ostream **_stream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 { |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
79 struct ostream *stream = *_stream; |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
80 |
14696
b1a0e44e1dac
Fixed ostream's new error handling not to always assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
81 if (stream->real_stream->last_errors_not_checked && |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
82 !stream->real_stream->error_handling_disabled && |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
83 stream->real_stream->iostream.refcount == 1) { |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
84 i_panic("output stream %s is missing error handling", |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
85 o_stream_get_name(stream)); |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
86 } |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
87 |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
88 io_stream_unref(&stream->real_stream->iostream); |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
89 *_stream = NULL; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 |
18164
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
92 #undef o_stream_add_destroy_callback |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
93 void o_stream_add_destroy_callback(struct ostream *stream, |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
94 ostream_callback_t *callback, void *context) |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
95 { |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
96 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
|
97 callback, context); |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
98 } |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
99 |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
100 void o_stream_remove_destroy_callback(struct ostream *stream, |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
101 void (*callback)()) |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
102 { |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
103 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
|
104 callback); |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
105 } |
4723cecff76c
lib: Added o_stream_add_destroy_callback()
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
106 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
807
diff
changeset
|
107 void o_stream_close(struct ostream *stream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 { |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
109 o_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
|
110 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 |
4903
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4838
diff
changeset
|
112 #undef o_stream_set_flush_callback |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
113 void o_stream_set_flush_callback(struct ostream *stream, |
2790
02c0b8d532c2
Changed ostream's flush callback to have return value which can tell if
Timo Sirainen <tss@iki.fi>
parents:
2454
diff
changeset
|
114 stream_flush_callback_t *callback, |
02c0b8d532c2
Changed ostream's flush callback to have return value which can tell if
Timo Sirainen <tss@iki.fi>
parents:
2454
diff
changeset
|
115 void *context) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
116 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
117 struct ostream_private *_stream = stream->real_stream; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
118 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
119 _stream->set_flush_callback(_stream, callback, context); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
120 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
121 |
4903
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4838
diff
changeset
|
122 void o_stream_unset_flush_callback(struct ostream *stream) |
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4838
diff
changeset
|
123 { |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14391
diff
changeset
|
124 struct ostream_private *_stream = stream->real_stream; |
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14391
diff
changeset
|
125 |
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14391
diff
changeset
|
126 _stream->set_flush_callback(_stream, NULL, NULL); |
4903
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4838
diff
changeset
|
127 } |
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4838
diff
changeset
|
128 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
807
diff
changeset
|
129 void o_stream_set_max_buffer_size(struct ostream *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
|
130 { |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
131 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
|
132 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 |
17250
6abe16ff8108
Added o_stream_get_max_buffer_size()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
134 size_t o_stream_get_max_buffer_size(struct ostream *stream) |
6abe16ff8108
Added o_stream_get_max_buffer_size()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
135 { |
6abe16ff8108
Added o_stream_get_max_buffer_size()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
136 return stream->real_stream->max_buffer_size; |
6abe16ff8108
Added o_stream_get_max_buffer_size()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
137 } |
6abe16ff8108
Added o_stream_get_max_buffer_size()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
138 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
807
diff
changeset
|
139 void o_stream_cork(struct ostream *stream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
141 struct ostream_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
|
142 |
18080
4d8a52f5839a
lib: ostream.stream_errno is now exactly the same as last_failed_errno.
Timo Sirainen <tss@iki.fi>
parents:
18034
diff
changeset
|
143 if (unlikely(stream->closed || stream->stream_errno != 0)) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 return; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
146 _stream->cork(_stream, TRUE); |
21777
ad5fd5b950db
lib: Add missing error handling to o_stream_cork()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
147 if (stream->stream_errno != 0) |
ad5fd5b950db
lib: Add missing error handling to o_stream_cork()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
148 errno = stream->last_failed_errno = stream->stream_errno; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
149 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
150 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
151 void o_stream_uncork(struct ostream *stream) |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
152 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
153 struct ostream_private *_stream = stream->real_stream; |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
154 |
18080
4d8a52f5839a
lib: ostream.stream_errno is now exactly the same as last_failed_errno.
Timo Sirainen <tss@iki.fi>
parents:
18034
diff
changeset
|
155 if (unlikely(stream->closed || stream->stream_errno != 0)) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
156 return; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
157 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
158 _stream->cork(_stream, FALSE); |
18033
3402a3d19f40
lib: o_stream_uncork() could also cause write errors. Make sure last_failed_errno is updated.
Timo Sirainen <tss@iki.fi>
parents:
17929
diff
changeset
|
159 if (stream->stream_errno != 0) |
3402a3d19f40
lib: o_stream_uncork() could also cause write errors. Make sure last_failed_errno is updated.
Timo Sirainen <tss@iki.fi>
parents:
17929
diff
changeset
|
160 errno = stream->last_failed_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
|
161 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 |
17384
8ab8327400cd
lib: Added o_stream_is_corked().
Timo Sirainen <tss@iki.fi>
parents:
17250
diff
changeset
|
163 bool o_stream_is_corked(struct ostream *stream) |
8ab8327400cd
lib: Added o_stream_is_corked().
Timo Sirainen <tss@iki.fi>
parents:
17250
diff
changeset
|
164 { |
8ab8327400cd
lib: Added o_stream_is_corked().
Timo Sirainen <tss@iki.fi>
parents:
17250
diff
changeset
|
165 struct ostream_private *_stream = stream->real_stream; |
8ab8327400cd
lib: Added o_stream_is_corked().
Timo Sirainen <tss@iki.fi>
parents:
17250
diff
changeset
|
166 |
8ab8327400cd
lib: Added o_stream_is_corked().
Timo Sirainen <tss@iki.fi>
parents:
17250
diff
changeset
|
167 return _stream->corked; |
8ab8327400cd
lib: Added o_stream_is_corked().
Timo Sirainen <tss@iki.fi>
parents:
17250
diff
changeset
|
168 } |
8ab8327400cd
lib: Added o_stream_is_corked().
Timo Sirainen <tss@iki.fi>
parents:
17250
diff
changeset
|
169 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
807
diff
changeset
|
170 int o_stream_flush(struct ostream *stream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
172 struct ostream_private *_stream = stream->real_stream; |
10083
bad043de6a7a
ostream: Simplified implementing ostreams.
Timo Sirainen <tss@iki.fi>
parents:
9557
diff
changeset
|
173 int ret = 1; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 |
18080
4d8a52f5839a
lib: ostream.stream_errno is now exactly the same as last_failed_errno.
Timo Sirainen <tss@iki.fi>
parents:
18034
diff
changeset
|
175 if (unlikely(stream->closed || stream->stream_errno != 0)) { |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
176 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
|
177 return -1; |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
178 } |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
180 if (unlikely((ret = _stream->flush(_stream)) < 0)) { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
181 i_assert(stream->stream_errno != 0); |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
182 stream->last_failed_errno = stream->stream_errno; |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
183 errno = stream->stream_errno; |
6850
c8f6eec5e996
Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents:
6849
diff
changeset
|
184 } |
c8f6eec5e996
Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents:
6849
diff
changeset
|
185 return ret; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3618
diff
changeset
|
188 void o_stream_set_flush_pending(struct ostream *stream, bool set) |
3336
a3a72d5bdfce
o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents:
2790
diff
changeset
|
189 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
190 struct ostream_private *_stream = stream->real_stream; |
3336
a3a72d5bdfce
o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents:
2790
diff
changeset
|
191 |
18080
4d8a52f5839a
lib: ostream.stream_errno is now exactly the same as last_failed_errno.
Timo Sirainen <tss@iki.fi>
parents:
18034
diff
changeset
|
192 if (unlikely(stream->closed || stream->stream_errno != 0)) |
6825
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
193 return; |
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
194 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
195 _stream->flush_pending(_stream, set); |
3336
a3a72d5bdfce
o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents:
2790
diff
changeset
|
196 } |
a3a72d5bdfce
o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents:
2790
diff
changeset
|
197 |
7912
81806d402514
Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
198 size_t o_stream_get_buffer_used_size(const struct ostream *stream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 { |
7912
81806d402514
Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
200 const struct ostream_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
|
201 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
202 return _stream->get_used_size(_stream); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 |
10084
ede6701cfe7a
Added o_stream_get_buffer_avail_size().
Timo Sirainen <tss@iki.fi>
parents:
10083
diff
changeset
|
205 size_t o_stream_get_buffer_avail_size(const struct ostream *stream) |
ede6701cfe7a
Added o_stream_get_buffer_avail_size().
Timo Sirainen <tss@iki.fi>
parents:
10083
diff
changeset
|
206 { |
ede6701cfe7a
Added o_stream_get_buffer_avail_size().
Timo Sirainen <tss@iki.fi>
parents:
10083
diff
changeset
|
207 size_t used = o_stream_get_buffer_used_size(stream); |
ede6701cfe7a
Added o_stream_get_buffer_avail_size().
Timo Sirainen <tss@iki.fi>
parents:
10083
diff
changeset
|
208 |
ede6701cfe7a
Added o_stream_get_buffer_avail_size().
Timo Sirainen <tss@iki.fi>
parents:
10083
diff
changeset
|
209 return stream->real_stream->max_buffer_size <= used ? 0 : |
ede6701cfe7a
Added o_stream_get_buffer_avail_size().
Timo Sirainen <tss@iki.fi>
parents:
10083
diff
changeset
|
210 stream->real_stream->max_buffer_size - used; |
ede6701cfe7a
Added o_stream_get_buffer_avail_size().
Timo Sirainen <tss@iki.fi>
parents:
10083
diff
changeset
|
211 } |
ede6701cfe7a
Added o_stream_get_buffer_avail_size().
Timo Sirainen <tss@iki.fi>
parents:
10083
diff
changeset
|
212 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
807
diff
changeset
|
213 int o_stream_seek(struct ostream *stream, uoff_t offset) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
215 struct ostream_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
|
216 |
18080
4d8a52f5839a
lib: ostream.stream_errno is now exactly the same as last_failed_errno.
Timo Sirainen <tss@iki.fi>
parents:
18034
diff
changeset
|
217 if (unlikely(stream->closed || stream->stream_errno != 0)) { |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
218 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
|
219 return -1; |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
220 } |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
222 if (unlikely(_stream->seek(_stream, offset) < 0)) { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
223 i_assert(stream->stream_errno != 0); |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
224 stream->last_failed_errno = stream->stream_errno; |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
225 errno = stream->stream_errno; |
10083
bad043de6a7a
ostream: Simplified implementing ostreams.
Timo Sirainen <tss@iki.fi>
parents:
9557
diff
changeset
|
226 return -1; |
6850
c8f6eec5e996
Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents:
6849
diff
changeset
|
227 } |
c8f6eec5e996
Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents:
6849
diff
changeset
|
228 return 1; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 |
2454
db92fc0bdf67
o_stream_send* functions return type is ssize_t, not int.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
231 ssize_t o_stream_send(struct ostream *stream, const void *data, size_t size) |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
232 { |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
233 struct const_iovec iov; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
234 |
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:
20860
diff
changeset
|
235 i_zero(&iov); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
236 iov.iov_base = data; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
237 iov.iov_len = size; |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
238 |
14391
ba1fc76e3a2c
Changes to make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
239 return o_stream_sendv(stream, &iov, 1); |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
240 } |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
241 |
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
242 ssize_t o_stream_sendv(struct ostream *stream, const struct const_iovec *iov, |
3618
a16f27ce2eda
Changed iov_count to be unsigned int, it's large enough. Added overflow-flag
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
243 unsigned int iov_count) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
245 struct ostream_private *_stream = stream->real_stream; |
3618
a16f27ce2eda
Changed iov_count to be unsigned int, it's large enough. Added overflow-flag
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
246 unsigned int i; |
a16f27ce2eda
Changed iov_count to be unsigned int, it's large enough. Added overflow-flag
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
247 size_t total_size; |
a16f27ce2eda
Changed iov_count to be unsigned int, it's large enough. Added overflow-flag
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
248 ssize_t ret; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 |
18080
4d8a52f5839a
lib: ostream.stream_errno is now exactly the same as last_failed_errno.
Timo Sirainen <tss@iki.fi>
parents:
18034
diff
changeset
|
250 if (unlikely(stream->closed || stream->stream_errno != 0)) { |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
251 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
|
252 return -1; |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
253 } |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 |
3618
a16f27ce2eda
Changed iov_count to be unsigned int, it's large enough. Added overflow-flag
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
255 for (i = 0, total_size = 0; i < iov_count; i++) |
a16f27ce2eda
Changed iov_count to be unsigned int, it's large enough. Added overflow-flag
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
256 total_size += iov[i].iov_len; |
6853
7717e03db8b3
o_stream_sendv(): If we're trying to send 0 bytes, just return 0
Timo Sirainen <tss@iki.fi>
parents:
6850
diff
changeset
|
257 if (total_size == 0) |
7717e03db8b3
o_stream_sendv(): If we're trying to send 0 bytes, just return 0
Timo Sirainen <tss@iki.fi>
parents:
6850
diff
changeset
|
258 return 0; |
3618
a16f27ce2eda
Changed iov_count to be unsigned int, it's large enough. Added overflow-flag
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
259 |
a16f27ce2eda
Changed iov_count to be unsigned int, it's large enough. Added overflow-flag
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
260 ret = _stream->sendv(_stream, iov, iov_count); |
6850
c8f6eec5e996
Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents:
6849
diff
changeset
|
261 if (unlikely(ret != (ssize_t)total_size)) { |
c8f6eec5e996
Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents:
6849
diff
changeset
|
262 if (ret < 0) { |
c8f6eec5e996
Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents:
6849
diff
changeset
|
263 i_assert(stream->stream_errno != 0); |
c8f6eec5e996
Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents:
6849
diff
changeset
|
264 stream->last_failed_errno = stream->stream_errno; |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
265 errno = stream->stream_errno; |
6850
c8f6eec5e996
Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents:
6849
diff
changeset
|
266 } else { |
20860
668274a98b48
lib: Added ostream.blocking boolean
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
267 i_assert(!stream->blocking); |
6850
c8f6eec5e996
Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents:
6849
diff
changeset
|
268 stream->overflow = TRUE; |
c8f6eec5e996
Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents:
6849
diff
changeset
|
269 } |
c8f6eec5e996
Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents:
6849
diff
changeset
|
270 } |
3618
a16f27ce2eda
Changed iov_count to be unsigned int, it's large enough. Added overflow-flag
Timo Sirainen <tss@iki.fi>
parents:
3336
diff
changeset
|
271 return ret; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 |
2454
db92fc0bdf67
o_stream_send* functions return type is ssize_t, not int.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
274 ssize_t o_stream_send_str(struct ostream *stream, const char *str) |
807
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
275 { |
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
276 return o_stream_send(stream, str, strlen(str)); |
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
277 } |
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
278 |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
279 void o_stream_nsend(struct ostream *stream, const void *data, size_t size) |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
280 { |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
281 struct const_iovec iov; |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
282 |
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:
20860
diff
changeset
|
283 i_zero(&iov); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
284 iov.iov_base = data; |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
285 iov.iov_len = size; |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
286 |
14689
096e4c4d62bb
Try to avoid (void) casts by adding more ATTR_NOWARN_UNUSED_RESULT.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
287 o_stream_nsendv(stream, &iov, 1); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
288 } |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
289 |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
290 void o_stream_nsendv(struct ostream *stream, const struct const_iovec *iov, |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
291 unsigned int iov_count) |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
292 { |
18080
4d8a52f5839a
lib: ostream.stream_errno is now exactly the same as last_failed_errno.
Timo Sirainen <tss@iki.fi>
parents:
18034
diff
changeset
|
293 if (unlikely(stream->closed || stream->stream_errno != 0)) |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
294 return; |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
295 (void)o_stream_sendv(stream, iov, iov_count); |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
296 stream->real_stream->last_errors_not_checked = TRUE; |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
297 } |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
298 |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
299 void o_stream_nsend_str(struct ostream *stream, const char *str) |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
300 { |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
301 o_stream_nsend(stream, str, strlen(str)); |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
302 } |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
303 |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
304 void o_stream_nflush(struct ostream *stream) |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
305 { |
18080
4d8a52f5839a
lib: ostream.stream_errno is now exactly the same as last_failed_errno.
Timo Sirainen <tss@iki.fi>
parents:
18034
diff
changeset
|
306 if (unlikely(stream->closed || stream->stream_errno != 0)) |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
307 return; |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
308 (void)o_stream_flush(stream); |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
309 stream->real_stream->last_errors_not_checked = TRUE; |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
310 } |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
311 |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
312 int o_stream_nfinish(struct ostream *stream) |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
313 { |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
314 o_stream_nflush(stream); |
14741
558db9e46789
o_stream_ignore_last_errors() / o_stream_nfinish() now marks parent streams also as checked.
Timo Sirainen <tss@iki.fi>
parents:
14696
diff
changeset
|
315 o_stream_ignore_last_errors(stream); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
316 errno = stream->last_failed_errno; |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
317 return stream->last_failed_errno != 0 ? -1 : 0; |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
318 } |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
319 |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
320 void o_stream_ignore_last_errors(struct ostream *stream) |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
321 { |
14741
558db9e46789
o_stream_ignore_last_errors() / o_stream_nfinish() now marks parent streams also as checked.
Timo Sirainen <tss@iki.fi>
parents:
14696
diff
changeset
|
322 while (stream != NULL) { |
558db9e46789
o_stream_ignore_last_errors() / o_stream_nfinish() now marks parent streams also as checked.
Timo Sirainen <tss@iki.fi>
parents:
14696
diff
changeset
|
323 stream->real_stream->last_errors_not_checked = FALSE; |
558db9e46789
o_stream_ignore_last_errors() / o_stream_nfinish() now marks parent streams also as checked.
Timo Sirainen <tss@iki.fi>
parents:
14696
diff
changeset
|
324 stream = stream->real_stream->parent; |
558db9e46789
o_stream_ignore_last_errors() / o_stream_nfinish() now marks parent streams also as checked.
Timo Sirainen <tss@iki.fi>
parents:
14696
diff
changeset
|
325 } |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
326 } |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
327 |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
328 void o_stream_set_no_error_handling(struct ostream *stream, bool set) |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
329 { |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
330 stream->real_stream->error_handling_disabled = set; |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
331 } |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
332 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
807
diff
changeset
|
333 off_t o_stream_send_istream(struct ostream *outstream, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
807
diff
changeset
|
334 struct istream *instream) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 { |
6415
b0096861c390
Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
336 struct ostream_private *_outstream = outstream->real_stream; |
5183
68808a3021b0
If o_stream_send_istream() fails, make sure errno is set to
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
337 off_t ret; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 |
18080
4d8a52f5839a
lib: ostream.stream_errno is now exactly the same as last_failed_errno.
Timo Sirainen <tss@iki.fi>
parents:
18034
diff
changeset
|
339 if (unlikely(outstream->closed || instream->closed || |
4d8a52f5839a
lib: ostream.stream_errno is now exactly the same as last_failed_errno.
Timo Sirainen <tss@iki.fi>
parents:
18034
diff
changeset
|
340 outstream->stream_errno != 0)) { |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
341 errno = outstream->stream_errno; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 return -1; |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
343 } |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 |
5183
68808a3021b0
If o_stream_send_istream() fails, make sure errno is set to
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
345 ret = _outstream->send_istream(_outstream, instream); |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
346 if (unlikely(ret < 0)) { |
17929
c36cfd735d60
lib: Fixed assert-crash in o_stream_send_istream() if input stream was the one that failed.
Timo Sirainen <tss@iki.fi>
parents:
17921
diff
changeset
|
347 if (outstream->stream_errno != 0) { |
c36cfd735d60
lib: Fixed assert-crash in o_stream_send_istream() if input stream was the one that failed.
Timo Sirainen <tss@iki.fi>
parents:
17921
diff
changeset
|
348 outstream->last_failed_errno = outstream->stream_errno; |
c36cfd735d60
lib: Fixed assert-crash in o_stream_send_istream() if input stream was the one that failed.
Timo Sirainen <tss@iki.fi>
parents:
17921
diff
changeset
|
349 errno = outstream->stream_errno; |
c36cfd735d60
lib: Fixed assert-crash in o_stream_send_istream() if input stream was the one that failed.
Timo Sirainen <tss@iki.fi>
parents:
17921
diff
changeset
|
350 } else { |
c36cfd735d60
lib: Fixed assert-crash in o_stream_send_istream() if input stream was the one that failed.
Timo Sirainen <tss@iki.fi>
parents:
17921
diff
changeset
|
351 i_assert(instream->stream_errno != 0); |
c36cfd735d60
lib: Fixed assert-crash in o_stream_send_istream() if input stream was the one that failed.
Timo Sirainen <tss@iki.fi>
parents:
17921
diff
changeset
|
352 } |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
353 } |
5183
68808a3021b0
If o_stream_send_istream() fails, make sure errno is set to
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
354 return ret; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 } |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
356 |
8923 | 357 int o_stream_pwrite(struct ostream *stream, const void *data, size_t size, |
358 uoff_t offset) | |
359 { | |
360 int ret; | |
361 | |
18080
4d8a52f5839a
lib: ostream.stream_errno is now exactly the same as last_failed_errno.
Timo Sirainen <tss@iki.fi>
parents:
18034
diff
changeset
|
362 if (unlikely(stream->closed || stream->stream_errno != 0)) { |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
363 errno = stream->stream_errno; |
8923 | 364 return -1; |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
365 } |
8923 | 366 |
367 ret = stream->real_stream->write_at(stream->real_stream, | |
368 data, size, offset); | |
369 if (unlikely(ret < 0)) { | |
370 i_assert(stream->stream_errno != 0); | |
371 stream->last_failed_errno = stream->stream_errno; | |
14076
d4e7052af42a
iostreams: Set errno to stream_errno when exiting from failing functions.
Timo Sirainen <tss@iki.fi>
parents:
13532
diff
changeset
|
372 errno = stream->stream_errno; |
8923 | 373 } |
374 return ret; | |
375 } | |
376 | |
17698
e593dce9468d
lib: io_stream_copy() no longer attempts to read full block sizes from input.
Timo Sirainen <tss@iki.fi>
parents:
17590
diff
changeset
|
377 off_t io_stream_copy(struct ostream *outstream, struct istream *instream) |
9557
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
378 { |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
379 uoff_t start_offset; |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
380 struct const_iovec iov; |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
381 const unsigned char *data; |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
382 ssize_t ret; |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
383 |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
384 start_offset = instream->v_offset; |
17698
e593dce9468d
lib: io_stream_copy() no longer attempts to read full block sizes from input.
Timo Sirainen <tss@iki.fi>
parents:
17590
diff
changeset
|
385 do { |
e593dce9468d
lib: io_stream_copy() no longer attempts to read full block sizes from input.
Timo Sirainen <tss@iki.fi>
parents:
17590
diff
changeset
|
386 (void)i_stream_read_data(instream, &data, &iov.iov_len, 0); |
9557
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
387 if (iov.iov_len == 0) { |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
388 /* all sent */ |
17921
5e53b6d55f63
lib: o_stream_send_istream() should return -1 if there was an error reading input stream.
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
389 if (instream->stream_errno != 0) |
5e53b6d55f63
lib: o_stream_send_istream() should return -1 if there was an error reading input stream.
Timo Sirainen <tss@iki.fi>
parents:
17698
diff
changeset
|
390 return -1; |
9557
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
391 break; |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
392 } |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
393 |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
394 iov.iov_base = data; |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
395 ret = o_stream_sendv(outstream, &iov, 1); |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
396 if (ret <= 0) { |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
397 if (ret == 0) |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
398 break; |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
399 return -1; |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
400 } |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
401 i_stream_skip(instream, ret); |
17698
e593dce9468d
lib: io_stream_copy() no longer attempts to read full block sizes from input.
Timo Sirainen <tss@iki.fi>
parents:
17590
diff
changeset
|
402 } while ((size_t)ret == iov.iov_len); |
9557
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
403 |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
404 return (off_t)(instream->v_offset - start_offset); |
e41c648a2f4c
ostreams: Moved generic o_stream_send_istream() implementation to ostream.c.
Timo Sirainen <tss@iki.fi>
parents:
8923
diff
changeset
|
405 } |
13417
977dcd541f69
Added o_stream_switch_ioloop() and implemented it to all ostreams.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
406 |
977dcd541f69
Added o_stream_switch_ioloop() and implemented it to all ostreams.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
407 void o_stream_switch_ioloop(struct ostream *stream) |
977dcd541f69
Added o_stream_switch_ioloop() and implemented it to all ostreams.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
408 { |
977dcd541f69
Added o_stream_switch_ioloop() and implemented it to all ostreams.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
409 struct ostream_private *_stream = stream->real_stream; |
977dcd541f69
Added o_stream_switch_ioloop() and implemented it to all ostreams.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
410 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
411 _stream->switch_ioloop(_stream); |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
412 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
413 |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
414 static void o_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:
15715
diff
changeset
|
415 bool close_parent) |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
416 { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
417 struct ostream_private *_stream = (struct ostream_private *)stream; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
418 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
419 (void)o_stream_flush(&_stream->ostream); |
16020
6cabb95d32ec
iostreams: Added close_parent flag to close() handler and clarified close/destroy APIs.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
420 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:
15715
diff
changeset
|
421 o_stream_close(_stream->parent); |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
422 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
423 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
424 static void o_stream_default_destroy(struct iostream_private *stream) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
425 { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
426 struct ostream_private *_stream = (struct ostream_private *)stream; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
427 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
428 if (_stream->parent != NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
429 o_stream_unref(&_stream->parent); |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
430 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
431 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
432 static void |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
433 o_stream_default_set_max_buffer_size(struct iostream_private *stream, |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
434 size_t max_size) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
435 { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
436 struct ostream_private *_stream = (struct ostream_private *)stream; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
437 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
438 if (_stream->parent != NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
439 o_stream_set_max_buffer_size(_stream->parent, max_size); |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
440 _stream->max_buffer_size = max_size; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
441 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
442 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
443 static void o_stream_default_cork(struct ostream_private *_stream, bool set) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
444 { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
445 _stream->corked = set; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
446 if (set) { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
447 if (_stream->parent != NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
448 o_stream_cork(_stream->parent); |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
449 } else { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
450 (void)o_stream_flush(&_stream->ostream); |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
451 if (_stream->parent != NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
452 o_stream_uncork(_stream->parent); |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
453 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
454 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
455 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
456 void o_stream_copy_error_from_parent(struct ostream_private *_stream) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
457 { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
458 struct ostream *src = _stream->parent; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
459 struct ostream *dest = &_stream->ostream; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
460 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
461 dest->stream_errno = src->stream_errno; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
462 dest->last_failed_errno = src->last_failed_errno; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
463 dest->overflow = src->overflow; |
16843
ff2452560ef0
liblib: If parent ostream closes itself on error, close our ostream as well.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
464 if (src->closed) |
ff2452560ef0
liblib: If parent ostream closes itself on error, close our ostream as well.
Timo Sirainen <tss@iki.fi>
parents:
16813
diff
changeset
|
465 o_stream_close(dest); |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
466 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
467 |
17590
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
468 int o_stream_flush_parent_if_needed(struct ostream_private *_stream) |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
469 { |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
470 if (o_stream_get_buffer_used_size(_stream->parent) >= IO_BLOCK_SIZE) { |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
471 /* we already have quite a lot of data in parent stream. |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
472 unless we can flush it, don't add any more to it or we |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
473 could keep wasting memory by just increasing the buffer |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
474 size all the time. */ |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
475 if (o_stream_flush(_stream->parent) < 0) { |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
476 o_stream_copy_error_from_parent(_stream); |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
477 return -1; |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
478 } |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
479 if (o_stream_get_buffer_used_size(_stream->parent) >= IO_BLOCK_SIZE) |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
480 return 0; |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
481 } |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
482 return 1; |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
483 } |
5740cb57d02c
lib: Added o_stream_flush_parent_if_needed() for wrapper ostreams.
Timo Sirainen <tss@iki.fi>
parents:
17384
diff
changeset
|
484 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
485 static int o_stream_default_flush(struct ostream_private *_stream) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
486 { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
487 int ret; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
488 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
489 if (_stream->parent == NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
490 return 1; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
491 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
492 if ((ret = o_stream_flush(_stream->parent)) < 0) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
493 o_stream_copy_error_from_parent(_stream); |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
494 return ret; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
495 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
496 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
497 static void |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
498 o_stream_default_set_flush_callback(struct ostream_private *_stream, |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
499 stream_flush_callback_t *callback, |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
500 void *context) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
501 { |
13532
62e1c575b16a
ostream: Keep track of flush callback for filter ostreams as well.
Timo Sirainen <tss@iki.fi>
parents:
13530
diff
changeset
|
502 if (_stream->parent != NULL) |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
503 o_stream_set_flush_callback(_stream->parent, callback, context); |
13532
62e1c575b16a
ostream: Keep track of flush callback for filter ostreams as well.
Timo Sirainen <tss@iki.fi>
parents:
13530
diff
changeset
|
504 |
62e1c575b16a
ostream: Keep track of flush callback for filter ostreams as well.
Timo Sirainen <tss@iki.fi>
parents:
13530
diff
changeset
|
505 _stream->callback = callback; |
62e1c575b16a
ostream: Keep track of flush callback for filter ostreams as well.
Timo Sirainen <tss@iki.fi>
parents:
13530
diff
changeset
|
506 _stream->context = context; |
13417
977dcd541f69
Added o_stream_switch_ioloop() and implemented it to all ostreams.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
507 } |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
508 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
509 static void |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
510 o_stream_default_set_flush_pending(struct ostream_private *_stream, bool set) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
511 { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
512 if (_stream->parent != NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
513 o_stream_set_flush_pending(_stream->parent, set); |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
514 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
515 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
516 static size_t |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
517 o_stream_default_get_used_size(const struct ostream_private *_stream) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
518 { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
519 if (_stream->parent == NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
520 return 0; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
521 else |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
522 return o_stream_get_buffer_used_size(_stream->parent); |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
523 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
524 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
525 static int |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
526 o_stream_default_seek(struct ostream_private *_stream, |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
527 uoff_t offset ATTR_UNUSED) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
528 { |
15707
07ee9842a00b
ostream: Default seek&write_at implementations should fail with ESPIPE, not EPIPE.
Timo Sirainen <tss@iki.fi>
parents:
15174
diff
changeset
|
529 _stream->ostream.stream_errno = ESPIPE; |
18034
39e2455a5e2d
lib: Make sure ostream.last_failed_errno is always set when stream_errno is set.
Timo Sirainen <tss@iki.fi>
parents:
18033
diff
changeset
|
530 _stream->ostream.last_failed_errno = ESPIPE; |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
531 return -1; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
532 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
533 |
18165
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
534 static ssize_t |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
535 o_stream_default_sendv(struct ostream_private *stream, |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
536 const struct const_iovec *iov, unsigned int iov_count) |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
537 { |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
538 ssize_t ret; |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
539 |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
540 if ((ret = o_stream_sendv(stream->parent, iov, iov_count)) < 0) { |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
541 o_stream_copy_error_from_parent(stream); |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
542 return -1; |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
543 } |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
544 stream->ostream.offset += ret; |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
545 return ret; |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
546 } |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
547 |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
548 static int |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
549 o_stream_default_write_at(struct ostream_private *_stream, |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
550 const void *data ATTR_UNUSED, |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
551 size_t size ATTR_UNUSED, uoff_t offset ATTR_UNUSED) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
552 { |
15707
07ee9842a00b
ostream: Default seek&write_at implementations should fail with ESPIPE, not EPIPE.
Timo Sirainen <tss@iki.fi>
parents:
15174
diff
changeset
|
553 _stream->ostream.stream_errno = ESPIPE; |
18034
39e2455a5e2d
lib: Make sure ostream.last_failed_errno is always set when stream_errno is set.
Timo Sirainen <tss@iki.fi>
parents:
18033
diff
changeset
|
554 _stream->ostream.last_failed_errno = ESPIPE; |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
555 return -1; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
556 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
557 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
558 static off_t o_stream_default_send_istream(struct ostream_private *outstream, |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
559 struct istream *instream) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
560 { |
17698
e593dce9468d
lib: io_stream_copy() no longer attempts to read full block sizes from input.
Timo Sirainen <tss@iki.fi>
parents:
17590
diff
changeset
|
561 return io_stream_copy(&outstream->ostream, instream); |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
562 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
563 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
564 static void o_stream_default_switch_ioloop(struct ostream_private *_stream) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
565 { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
566 if (_stream->parent != NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
567 o_stream_switch_ioloop(_stream->parent); |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
568 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
569 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
570 struct ostream * |
14851 | 571 o_stream_create(struct ostream_private *_stream, struct ostream *parent, int fd) |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
572 { |
14851 | 573 _stream->fd = fd; |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
574 _stream->ostream.real_stream = _stream; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
575 if (parent != NULL) { |
20860
668274a98b48
lib: Added ostream.blocking boolean
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
576 _stream->ostream.blocking = parent->blocking; |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
577 _stream->parent = parent; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
578 o_stream_ref(parent); |
13532
62e1c575b16a
ostream: Keep track of flush callback for filter ostreams as well.
Timo Sirainen <tss@iki.fi>
parents:
13530
diff
changeset
|
579 |
62e1c575b16a
ostream: Keep track of flush callback for filter ostreams as well.
Timo Sirainen <tss@iki.fi>
parents:
13530
diff
changeset
|
580 _stream->callback = parent->real_stream->callback; |
62e1c575b16a
ostream: Keep track of flush callback for filter ostreams as well.
Timo Sirainen <tss@iki.fi>
parents:
13530
diff
changeset
|
581 _stream->context = parent->real_stream->context; |
62e1c575b16a
ostream: Keep track of flush callback for filter ostreams as well.
Timo Sirainen <tss@iki.fi>
parents:
13530
diff
changeset
|
582 _stream->max_buffer_size = parent->real_stream->max_buffer_size; |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
583 _stream->error_handling_disabled = |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
584 parent->real_stream->error_handling_disabled; |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
585 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
586 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
587 if (_stream->iostream.close == NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
588 _stream->iostream.close = o_stream_default_close; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
589 if (_stream->iostream.destroy == NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
590 _stream->iostream.destroy = o_stream_default_destroy; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
591 if (_stream->iostream.set_max_buffer_size == NULL) { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
592 _stream->iostream.set_max_buffer_size = |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
593 o_stream_default_set_max_buffer_size; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
594 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
595 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
596 if (_stream->cork == NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
597 _stream->cork = o_stream_default_cork; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
598 if (_stream->flush == NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
599 _stream->flush = o_stream_default_flush; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
600 if (_stream->set_flush_callback == NULL) { |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
601 _stream->set_flush_callback = |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
602 o_stream_default_set_flush_callback; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
603 } |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
604 if (_stream->flush_pending == NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
605 _stream->flush_pending = o_stream_default_set_flush_pending; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
606 if (_stream->get_used_size == NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
607 _stream->get_used_size = o_stream_default_get_used_size; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
608 if (_stream->seek == NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
609 _stream->seek = o_stream_default_seek; |
18165
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
610 if (_stream->sendv == NULL) |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
611 _stream->sendv = o_stream_default_sendv; |
13530
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
612 if (_stream->write_at == NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
613 _stream->write_at = o_stream_default_write_at; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
614 if (_stream->send_istream == NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
615 _stream->send_istream = o_stream_default_send_istream; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
616 if (_stream->switch_ioloop == NULL) |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
617 _stream->switch_ioloop = o_stream_default_switch_ioloop; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
618 |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
619 io_stream_init(&_stream->iostream); |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
620 return &_stream->ostream; |
8c3c0e01e00d
Simplified creating filter ostreams.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
621 } |
15174
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14851
diff
changeset
|
622 |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14851
diff
changeset
|
623 struct ostream *o_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:
14851
diff
changeset
|
624 { |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14851
diff
changeset
|
625 struct ostream_private *stream; |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14851
diff
changeset
|
626 struct ostream *output; |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14851
diff
changeset
|
627 |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14851
diff
changeset
|
628 stream = i_new(struct ostream_private, 1); |
20860
668274a98b48
lib: Added ostream.blocking boolean
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
629 stream->ostream.blocking = TRUE; |
15174
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14851
diff
changeset
|
630 stream->ostream.closed = TRUE; |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14851
diff
changeset
|
631 stream->ostream.stream_errno = stream_errno; |
16812
52d77a3d38b5
ostream-errno: last_failed_errno wasn't set, causing problems with some functions.
Timo Sirainen <tss@iki.fi>
parents:
16772
diff
changeset
|
632 stream->ostream.last_failed_errno = stream_errno; |
15174
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14851
diff
changeset
|
633 |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14851
diff
changeset
|
634 output = o_stream_create(stream, NULL, -1); |
16813
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
635 o_stream_set_no_error_handling(output, TRUE); |
15174
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14851
diff
changeset
|
636 o_stream_set_name(output, "(error)"); |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14851
diff
changeset
|
637 return output; |
f860cdf156cf
Added [io]_stream_create_error() for creating streams that always fail reads/writes.
Timo Sirainen <tss@iki.fi>
parents:
14851
diff
changeset
|
638 } |
16813
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
639 |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
640 struct ostream * |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
641 o_stream_create_error_str(int stream_errno, const char *fmt, ...) |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
642 { |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
643 struct ostream *output; |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
644 va_list args; |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
645 |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
646 va_start(args, fmt); |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
647 output = o_stream_create_error(stream_errno); |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
648 io_stream_set_verror(&output->real_stream->iostream, fmt, args); |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
649 va_end(args); |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
650 return output; |
a919c43ab91b
lib: Added [io]_stream_create_error_str()
Timo Sirainen <tss@iki.fi>
parents:
16812
diff
changeset
|
651 } |
18165
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
652 |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
653 struct ostream *o_stream_create_passthrough(struct ostream *output) |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
654 { |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
655 struct ostream_private *stream; |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
656 |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
657 stream = i_new(struct ostream_private, 1); |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
658 return o_stream_create(stream, output, o_stream_get_fd(output)); |
071e46b032c8
lib: Added o_stream_create_passthrough() for creating simple wrapper ostreams
Timo Sirainen <tss@iki.fi>
parents:
18164
diff
changeset
|
659 } |