summaryrefslogtreecommitdiffstats
path: root/src/lib/istream-data.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/istream-data.c')
-rw-r--r--src/lib/istream-data.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/lib/istream-data.c b/src/lib/istream-data.c
new file mode 100644
index 0000000..b97fc21
--- /dev/null
+++ b/src/lib/istream-data.c
@@ -0,0 +1,62 @@
+/* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "istream-private.h"
+
+static ssize_t i_stream_data_read(struct istream_private *stream)
+{
+ stream->istream.eof = TRUE;
+ return -1;
+}
+
+static void i_stream_data_seek(struct istream_private *stream, uoff_t v_offset,
+ bool mark ATTR_UNUSED)
+{
+ stream->skip = v_offset;
+ stream->istream.v_offset = v_offset;
+}
+
+struct istream *i_stream_create_from_data(const void *data, size_t size)
+{
+ struct istream_private *stream;
+
+ stream = i_new(struct istream_private, 1);
+ stream->buffer = data;
+ stream->pos = size;
+ stream->max_buffer_size = SIZE_MAX;
+
+ stream->read = i_stream_data_read;
+ stream->seek = i_stream_data_seek;
+
+ stream->istream.readable_fd = FALSE;
+ stream->istream.blocking = TRUE;
+ stream->istream.seekable = TRUE;
+ i_stream_create(stream, NULL, -1, ISTREAM_CREATE_FLAG_NOOP_SNAPSHOT);
+ stream->statbuf.st_size = size;
+ i_stream_set_name(&stream->istream, "(buffer)");
+ return &stream->istream;
+}
+
+static void i_stream_copied_data_free(void *data)
+{
+ i_free(data);
+}
+struct istream *
+i_stream_create_copy_from_data(const void *data, size_t size)
+{
+ struct istream *stream;
+ void *buffer;
+
+ if (size == 0) {
+ buffer = "";
+ } else {
+ buffer = i_malloc(size);
+ memcpy(buffer, data, size);
+ }
+ stream = i_stream_create_from_data(buffer, size);
+ if (size > 0) {
+ i_stream_add_destroy_callback
+ (stream, i_stream_copied_data_free, buffer);
+ }
+ return stream;
+}