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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 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
4bcd507e8907 Added o_stream_get_fd().
Timo Sirainen <tss@iki.fi>
parents: 14741
diff changeset
23 int o_stream_get_fd(struct ostream *stream)
4bcd507e8907 Added o_stream_get_fd().
Timo Sirainen <tss@iki.fi>
parents: 14741
diff changeset
24 {
4bcd507e8907 Added o_stream_get_fd().
Timo Sirainen <tss@iki.fi>
parents: 14741
diff changeset
25 return stream->real_stream->fd;
4bcd507e8907 Added o_stream_get_fd().
Timo Sirainen <tss@iki.fi>
parents: 14741
diff changeset
26 }
4bcd507e8907 Added o_stream_get_fd().
Timo Sirainen <tss@iki.fi>
parents: 14741
diff changeset
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
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
357 int o_stream_pwrite(struct ostream *stream, const void *data, size_t size,
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
358 uoff_t offset)
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
359 {
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
360 int ret;
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
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
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
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
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
366
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
367 ret = stream->real_stream->write_at(stream->real_stream,
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
368 data, size, offset);
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
369 if (unlikely(ret < 0)) {
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
370 i_assert(stream->stream_errno != 0);
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
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
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
373 }
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
374 return ret;
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
375 }
47076db1f911 Added o_stream_pwrite().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
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
4bcd507e8907 Added o_stream_get_fd().
Timo Sirainen <tss@iki.fi>
parents: 14741
diff changeset
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
4bcd507e8907 Added o_stream_get_fd().
Timo Sirainen <tss@iki.fi>
parents: 14741
diff changeset
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 }