diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib/istream-data.c | 62 |
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; +} |