istream-nonuls.c revision 3785910c303507db5f629684e6dde2cc7f83668e
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen/* Copyright (c) 2007-2012 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);
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen if (!i_stream_get_buffer_space(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 Sirainenstatic const struct stat *
e587908c556b449e5bb874e520e1d23993db3ae0Timo Siraineni_stream_nonuls_stat(struct istream_private *stream, bool exact)
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;
e587908c556b449e5bb874e520e1d23993db3ae0Timo Sirainen nstream->istream.istream.blocking = input->blocking;