annotate src/lib/ostream.c @ 9658:8ba4253adc9b HEAD tip

*-login: SSL connections didn't get closed when the client got destroyed.
author Timo Sirainen <tss@iki.fi>
date Thu, 08 May 2014 16:41:29 +0300
parents 00cd9aacd03c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9532
00cd9aacd03c Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
1 /* Copyright (c) 2002-2010 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"
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "ostream-internal.h"
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6
4070
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
7 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
8 {
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
9 o_stream_close(*stream);
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
10 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
11 }
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
12
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 807
diff changeset
13 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
14 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
15 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
16 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
18 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
19 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
20 io_stream_unref(&(*stream)->real_stream->iostream);
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
21 *stream = NULL;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 807
diff changeset
24 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
25 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
26 io_stream_close(&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
27 stream->closed = TRUE;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4838
diff changeset
30 #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
31 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
32 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
33 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
34 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
35 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
36
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
37 _stream->callback = callback;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
38 _stream->context = context;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
39 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
40
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4838
diff changeset
41 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
42 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
43 struct ostream_private *_stream = stream->real_stream;
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4838
diff changeset
44
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4838
diff changeset
45 _stream->callback = NULL;
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4838
diff changeset
46 _stream->context = NULL;
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4838
diff changeset
47 }
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4838
diff changeset
48
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 807
diff changeset
49 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
50 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
51 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
52 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 807
diff changeset
54 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
55 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
56 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
57
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
58 if (unlikely(stream->closed))
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 return;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
61 _stream->cork(_stream, TRUE);
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
62 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
63
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
64 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
65 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
66 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
67
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
68 if (unlikely(stream->closed))
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
69 return;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
70
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
71 _stream->cork(_stream, FALSE);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 807
diff changeset
74 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
75 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
76 struct ostream_private *_stream = stream->real_stream;
6850
c8f6eec5e996 Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
77 int ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
79 if (unlikely(stream->closed))
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 return -1;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81
6849
e722bcdd426e Moved stream_errno clearing to common functions in ostream.c.
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
82 stream->stream_errno = 0;
6850
c8f6eec5e996 Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
83 if (unlikely((ret = _stream->flush(_stream)) < 0)) {
c8f6eec5e996 Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
84 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
85 stream->last_failed_errno = stream->stream_errno;
c8f6eec5e996 Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
86 }
c8f6eec5e996 Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
87 return ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89
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
90 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
91 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
92 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
93
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
94 if (unlikely(stream->closed))
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
95 return;
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
96
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
97 _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
98 }
a3a72d5bdfce o_stream_uncork() was previously always setting IO_WRITE handler even if
Timo Sirainen <tss@iki.fi>
parents: 2790
diff changeset
99
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
100 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
101 {
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
102 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
103
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
104 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
105 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
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 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
108 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
109 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
110
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
111 if (unlikely(stream->closed))
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 return -1;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
6849
e722bcdd426e Moved stream_errno clearing to common functions in ostream.c.
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
114 stream->stream_errno = 0;
6850
c8f6eec5e996 Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
115 if (unlikely(_stream->seek(_stream, offset) < 0)) {
c8f6eec5e996 Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
116 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
117 stream->last_failed_errno = stream->stream_errno;
c8f6eec5e996 Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
118 }
c8f6eec5e996 Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
119 return 1;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121
2454
db92fc0bdf67 o_stream_send* functions return type is ssize_t, not int.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
122 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
123 {
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
124 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
125
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
126 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
127 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
128
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
129 return o_stream_sendv(stream, &iov, 1);
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
130 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
131
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
132 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
133 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
134 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
135 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
136 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
137 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
138 ssize_t ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
140 if (unlikely(stream->closed))
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 return -1;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142
6849
e722bcdd426e Moved stream_errno clearing to common functions in ostream.c.
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
143 stream->stream_errno = 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
144 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
145 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
146 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
147 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
148
a16f27ce2eda Changed iov_count to be unsigned int, it's large enough. Added overflow-flag
Timo Sirainen <tss@iki.fi>
parents: 3336
diff changeset
149 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
150 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
151 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
152 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
153 stream->last_failed_errno = stream->stream_errno;
c8f6eec5e996 Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
154 } else {
c8f6eec5e996 Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
155 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
156 }
c8f6eec5e996 Added last_failed_errno to ostream to make error handling easier with files.
Timo Sirainen <tss@iki.fi>
parents: 6849
diff changeset
157 }
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
158 return ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160
2454
db92fc0bdf67 o_stream_send* functions return type is ssize_t, not int.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
161 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
162 {
35abd7a5d381 Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
163 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
164 }
35abd7a5d381 Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents: 764
diff changeset
165
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 807
diff changeset
166 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
167 struct istream *instream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
169 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
170 off_t ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
172 if (unlikely(outstream->closed || instream->closed))
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 return -1;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174
6849
e722bcdd426e Moved stream_errno clearing to common functions in ostream.c.
Timo Sirainen <tss@iki.fi>
parents: 6825
diff changeset
175 outstream->stream_errno = 0;
5183
68808a3021b0 If o_stream_send_istream() fails, make sure errno is set to
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
176 ret = _outstream->send_istream(_outstream, instream);
6825
85385079b044 Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
177 if (unlikely(ret < 0))
5183
68808a3021b0 If o_stream_send_istream() fails, make sure errno is set to
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
178 errno = outstream->stream_errno;
68808a3021b0 If o_stream_send_istream() fails, make sure errno is set to
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
179 return ret;
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 }
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
182 struct ostream *o_stream_create(struct ostream_private *_stream)
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 {
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 _stream->ostream.real_stream = _stream;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
186 io_stream_init(&_stream->iostream);
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 return &_stream->ostream;
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 }