istream-nonuls.c revision bcd286622779a93f809b11993db0550f8c7cc9b5
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2007-2017 Dovecot authors, see the included COPYING file */
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainenstatic int i_stream_read_parent(struct istream_private *stream)
3785910c303507db5f629684e6dde2cc7f83668eTimo Sirainen if (i_stream_get_data_size(stream->parent) > 0)
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen stream->istream.stream_errno = stream->parent->stream_errno;
3785910c303507db5f629684e6dde2cc7f83668eTimo Sirainen i_assert(i_stream_get_data_size(stream->parent) != 0);
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainenstatic ssize_t i_stream_nonuls_read(struct istream_private *stream)
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen struct nonuls_istream *nstream = (struct nonuls_istream *)stream;
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen const unsigned char *data, *p;
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen if ((ret = i_stream_read_parent(stream)) <= 0)
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen data = i_stream_get_data(stream->parent, &size);
dd2df6a67f10792ce31a3666197c0b6885893a3aTimo Sirainen if (!i_stream_try_alloc(stream, size, &avail_size))
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen /* no NULs in this block */
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen memcpy(stream->w_buffer+stream->pos, data, size);
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen memcpy(stream->w_buffer+stream->pos, data, i);
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen for (; i < size; i++) {
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen stream->w_buffer[stream->pos+i] = data[i] == '\0' ?
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainenstruct istream *i_stream_create_nonuls(struct istream *input, char replace_chr)
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen nstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
5df8396a7cbad0b38b83a86667fb3d4c223f6f7cTimo Sirainen nstream->istream.stream_size_passthrough = TRUE;
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen nstream->istream.istream.blocking = input->blocking;