Mercurial > dovecot > core-2.2
annotate src/lib/ostream-buffer.c @ 22664:fea53c2725c0
director: Fix director_max_parallel_moves/kicks type
Should be uint, not time.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 09 Nov 2017 12:24:16 +0200 |
parents | e3ba9312f75b |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20861
diff
changeset
|
1 /* Copyright (c) 2002-2017 Dovecot authors, see the included COPYING file */ |
9558
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "buffer.h" |
13529
cf77e448295c
Renamed lib/*-internal.h files to lib/*-private.h for consistency.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
5 #include "ostream-private.h" |
9558
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 struct buffer_ostream { |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 struct ostream_private ostream; |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 buffer_t *buf; |
17703
4968b36d9ac8
ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
10 bool seeked; |
9558
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 }; |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 static int o_stream_buffer_seek(struct ostream_private *stream, uoff_t offset) |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 { |
17703
4968b36d9ac8
ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
15 struct buffer_ostream *bstream = (struct buffer_ostream *)stream; |
4968b36d9ac8
ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
16 |
4968b36d9ac8
ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
17 bstream->seeked = TRUE; |
9558
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 stream->ostream.offset = offset; |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 return 1; |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 } |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 static int |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 o_stream_buffer_write_at(struct ostream_private *stream, |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 const void *data, size_t size, uoff_t offset) |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 { |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 struct buffer_ostream *bstream = (struct buffer_ostream *)stream; |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 buffer_write(bstream->buf, offset, data, size); |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 return 0; |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 } |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 static ssize_t |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 o_stream_buffer_sendv(struct ostream_private *stream, |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 const struct const_iovec *iov, unsigned int iov_count) |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 { |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 struct buffer_ostream *bstream = (struct buffer_ostream *)stream; |
17703
4968b36d9ac8
ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
37 size_t left, n, offset; |
9558
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 ssize_t ret = 0; |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 unsigned int i; |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
17703
4968b36d9ac8
ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
41 offset = bstream->seeked ? stream->ostream.offset : bstream->buf->used; |
4968b36d9ac8
ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
42 |
9558
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 for (i = 0; i < iov_count; i++) { |
10083
bad043de6a7a
ostream: Simplified implementing ostreams.
Timo Sirainen <tss@iki.fi>
parents:
9766
diff
changeset
|
44 left = bstream->ostream.max_buffer_size - |
bad043de6a7a
ostream: Simplified implementing ostreams.
Timo Sirainen <tss@iki.fi>
parents:
9766
diff
changeset
|
45 stream->ostream.offset; |
9558
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 n = I_MIN(left, iov[i].iov_len); |
17703
4968b36d9ac8
ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
47 buffer_write(bstream->buf, offset, iov[i].iov_base, n); |
4968b36d9ac8
ostream-buffer: Allow modifying the buffer outside ostream, unless o_stream_seek() is used.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
48 stream->ostream.offset += n; offset += n; |
9558
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 ret += n; |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 if (n != iov[i].iov_len) |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 break; |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 } |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 return ret; |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 } |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 |
22410
e3ba9312f75b
lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
56 static size_t |
e3ba9312f75b
lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
57 o_stream_buffer_get_used_size(const struct ostream_private *stream) |
e3ba9312f75b
lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
58 { |
e3ba9312f75b
lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
59 struct buffer_ostream *bstream = (struct buffer_ostream *)stream; |
e3ba9312f75b
lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
60 |
e3ba9312f75b
lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
61 return bstream->buf->used; |
e3ba9312f75b
lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
62 } |
e3ba9312f75b
lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
63 |
9558
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 struct ostream *o_stream_create_buffer(buffer_t *buf) |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 { |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 struct buffer_ostream *bstream; |
14697
69334bf138cf
istreams: Set (file), (fd) or (buffer) as default name for those input streams.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
67 struct ostream *output; |
9558
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 bstream = i_new(struct buffer_ostream, 1); |
20861
ddae63d7bc9c
lib: Don't set ostream buffer as blocking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20860
diff
changeset
|
70 /* we don't set buffer as blocking, because if max_buffer_size is |
ddae63d7bc9c
lib: Don't set ostream buffer as blocking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20860
diff
changeset
|
71 changed it can get truncated. this is used in various places in |
ddae63d7bc9c
lib: Don't set ostream buffer as blocking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20860
diff
changeset
|
72 unit tests. */ |
10083
bad043de6a7a
ostream: Simplified implementing ostreams.
Timo Sirainen <tss@iki.fi>
parents:
9766
diff
changeset
|
73 bstream->ostream.max_buffer_size = (size_t)-1; |
9558
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 bstream->ostream.seek = o_stream_buffer_seek; |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 bstream->ostream.sendv = o_stream_buffer_sendv; |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 bstream->ostream.write_at = o_stream_buffer_write_at; |
22410
e3ba9312f75b
lib: Fix ostream-buffer to return buffer contents size in o_stream_get_buffer_used_size().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
77 bstream->ostream.get_used_size = o_stream_buffer_get_used_size; |
9558
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 |
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 bstream->buf = buf; |
14851 | 80 output = o_stream_create(&bstream->ostream, NULL, -1); |
14697
69334bf138cf
istreams: Set (file), (fd) or (buffer) as default name for those input streams.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
81 o_stream_set_name(output, "(buffer)"); |
69334bf138cf
istreams: Set (file), (fd) or (buffer) as default name for those input streams.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
82 return output; |
9558
320d2164bc17
Added o_stream_create_buffer() for having output stream write to a buffer.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 } |