dovecot-2.0: Added o_stream_create_buffer() for having output st...
dovecot at dovecot.org
dovecot at dovecot.org
Tue Jun 30 05:04:32 EEST 2009
details: http://hg.dovecot.org/dovecot-2.0/rev/320d2164bc17
changeset: 9558:320d2164bc17
user: Timo Sirainen <tss at iki.fi>
date: Mon Jun 29 21:57:54 2009 -0400
description:
Added o_stream_create_buffer() for having output stream write to a buffer.
diffstat:
3 files changed, 111 insertions(+)
src/lib/Makefile.am | 1
src/lib/ostream-buffer.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++
src/lib/ostream.h | 2
diffs (135 lines):
diff -r e41c648a2f4c -r 320d2164bc17 src/lib/Makefile.am
--- a/src/lib/Makefile.am Mon Jun 29 21:57:27 2009 -0400
+++ b/src/lib/Makefile.am Mon Jun 29 21:57:54 2009 -0400
@@ -80,6 +80,7 @@ liblib_la_SOURCES = \
nfs-workarounds.c \
ostream.c \
ostream-file.c \
+ ostream-buffer.c \
primes.c \
printf-format-fix.c \
process-title.c \
diff -r e41c648a2f4c -r 320d2164bc17 src/lib/ostream-buffer.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib/ostream-buffer.c Mon Jun 29 21:57:54 2009 -0400
@@ -0,0 +1,108 @@
+/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "buffer.h"
+#include "ostream-internal.h"
+
+struct buffer_ostream {
+ struct ostream_private ostream;
+ buffer_t *buf;
+ size_t max_buffer_size;
+};
+
+static void
+o_stream_buffer_set_max_buffer_size(struct iostream_private *stream,
+ size_t max_size)
+{
+ struct buffer_ostream *bstream = (struct buffer_ostream *)stream;
+
+ bstream->max_buffer_size = max_size;
+}
+
+static void o_stream_buffer_cork(struct ostream_private *stream ATTR_UNUSED,
+ bool set ATTR_UNUSED)
+{
+}
+
+static int o_stream_buffer_flush(struct ostream_private *stream ATTR_UNUSED)
+{
+ return 1;
+}
+
+static void
+o_stream_buffer_flush_pending(struct ostream_private *stream ATTR_UNUSED,
+ bool set ATTR_UNUSED)
+{
+}
+
+static size_t
+o_stream_buffer_get_used_size(const struct ostream_private *stream ATTR_UNUSED)
+{
+ return 0;
+}
+
+static int o_stream_buffer_seek(struct ostream_private *stream, uoff_t offset)
+{
+ stream->ostream.offset = offset;
+ return 1;
+}
+
+static int
+o_stream_buffer_write_at(struct ostream_private *stream,
+ const void *data, size_t size, uoff_t offset)
+{
+ struct buffer_ostream *bstream = (struct buffer_ostream *)stream;
+
+ buffer_write(bstream->buf, offset, data, size);
+ return 0;
+}
+
+static ssize_t
+o_stream_buffer_sendv(struct ostream_private *stream,
+ const struct const_iovec *iov, unsigned int iov_count)
+{
+ struct buffer_ostream *bstream = (struct buffer_ostream *)stream;
+ size_t left, n;
+ ssize_t ret = 0;
+ unsigned int i;
+
+ for (i = 0; i < iov_count; i++) {
+ left = bstream->max_buffer_size - stream->ostream.offset;
+ n = I_MIN(left, iov[i].iov_len);
+ buffer_write(bstream->buf, stream->ostream.offset,
+ iov[i].iov_base, iov[i].iov_len);
+ ret += n;
+ if (n != iov[i].iov_len)
+ break;
+ }
+ stream->ostream.offset += ret;
+ return ret;
+}
+
+static off_t o_stream_buffer_send_istream(struct ostream_private *outstream,
+ struct istream *instream)
+{
+ return io_stream_copy(&outstream->ostream, instream, 1024);
+}
+
+struct ostream *o_stream_create_buffer(buffer_t *buf)
+{
+ struct buffer_ostream *bstream;
+
+ bstream = i_new(struct buffer_ostream, 1);
+ bstream->ostream.iostream.set_max_buffer_size =
+ o_stream_buffer_set_max_buffer_size;
+
+ bstream->ostream.cork = o_stream_buffer_cork;
+ bstream->ostream.flush = o_stream_buffer_flush;
+ bstream->ostream.flush_pending = o_stream_buffer_flush_pending;
+ bstream->ostream.get_used_size = o_stream_buffer_get_used_size;
+ bstream->ostream.seek = o_stream_buffer_seek;
+ bstream->ostream.sendv = o_stream_buffer_sendv;
+ bstream->ostream.write_at = o_stream_buffer_write_at;
+ bstream->ostream.send_istream = o_stream_buffer_send_istream;
+
+ bstream->buf = buf;
+ bstream->max_buffer_size = (size_t)-1;
+ return o_stream_create(&bstream->ostream);
+}
diff -r e41c648a2f4c -r 320d2164bc17 src/lib/ostream.h
--- a/src/lib/ostream.h Mon Jun 29 21:57:27 2009 -0400
+++ b/src/lib/ostream.h Mon Jun 29 21:57:54 2009 -0400
@@ -34,6 +34,8 @@ o_stream_create_fd(int fd, size_t max_bu
If offset==(uoff_t)-1, the current offset isn't known. */
struct ostream *
o_stream_create_fd_file(int fd, uoff_t offset, bool autoclose_fd);
+/* Create an output stream to a buffer. */
+struct ostream *o_stream_create_buffer(buffer_t *buf);
/* o_stream_close() + o_stream_unref() */
void o_stream_destroy(struct ostream **stream);
More information about the dovecot-cvs
mailing list