istream-data.c revision a9a928e40e3b691924c8e5e444e3e1a4320aa3bd
b22a4a60c59146081d6d32e37aa9e8cd10f4dab2Timo Sirainen/* Copyright (c) 2002-2016 Dovecot authors, see the included COPYING file */
b22a4a60c59146081d6d32e37aa9e8cd10f4dab2Timo Sirainen
b22a4a60c59146081d6d32e37aa9e8cd10f4dab2Timo Sirainen#include "lib.h"
5b6e0b6569d5e79ddb868525063cfd04009437b4Timo Sirainen#include "istream-private.h"
5b6e0b6569d5e79ddb868525063cfd04009437b4Timo Sirainen
b22a4a60c59146081d6d32e37aa9e8cd10f4dab2Timo Sirainenstatic ssize_t i_stream_data_read(struct istream_private *stream)
a5f1628ad97ad649bfef86c84c3afc1d9cb0f326Timo Sirainen{
a5f1628ad97ad649bfef86c84c3afc1d9cb0f326Timo Sirainen stream->istream.eof = TRUE;
b22a4a60c59146081d6d32e37aa9e8cd10f4dab2Timo Sirainen return -1;
b22a4a60c59146081d6d32e37aa9e8cd10f4dab2Timo Sirainen}
5b6e0b6569d5e79ddb868525063cfd04009437b4Timo Sirainen
5b6e0b6569d5e79ddb868525063cfd04009437b4Timo Sirainenstatic void i_stream_data_seek(struct istream_private *stream, uoff_t v_offset,
b22a4a60c59146081d6d32e37aa9e8cd10f4dab2Timo Sirainen bool mark ATTR_UNUSED)
5b6e0b6569d5e79ddb868525063cfd04009437b4Timo Sirainen{
b22a4a60c59146081d6d32e37aa9e8cd10f4dab2Timo Sirainen stream->skip = v_offset;
5b6e0b6569d5e79ddb868525063cfd04009437b4Timo Sirainen stream->istream.v_offset = v_offset;
b22a4a60c59146081d6d32e37aa9e8cd10f4dab2Timo Sirainen}
b22a4a60c59146081d6d32e37aa9e8cd10f4dab2Timo Sirainen
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_t)-1;
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);
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;
}