istream-crlf.c revision da2aa032ccfa8e7e4a4380ef738014549f4d2c2d
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainenstatic int i_stream_crlf_read_common(struct crlf_istream *cstream)
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainen struct istream_private *stream = &cstream->istream;
a425baf62f30f4b62250227ff97b4b01c4b01affTimo Sirainen (void)i_stream_get_data(stream->parent, &size);
e815af0640b38444b31eadfaa1673bcb422e1573Timo Sirainen if (ret <= 0 && (ret != -2 || stream->skip == 0)) {
a425baf62f30f4b62250227ff97b4b01c4b01affTimo Sirainen (void)i_stream_get_data(stream->parent, &size);
14175321ddb88619015866978c05a27786ca4814Timo Sirainen if (!i_stream_get_buffer_space(stream, size, NULL))
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainenstatic ssize_t i_stream_crlf_read_crlf(struct istream_private *stream)
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainen struct crlf_istream *cstream = (struct crlf_istream *)stream;
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainen const unsigned char *data;
1de2b5a16a455e018d8cbf72ee114d4b5d557a48Timo Sirainen data = i_stream_get_data(stream->parent, &size);
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainen /* @UNSAFE: add missing CRs */
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainen for (i = 0; i < size && dest < stream->buffer_size; i++) {
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainen if (i == 0) {
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainen cstream->last_cr = stream->w_buffer[dest-1] == '\r';
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainenstatic ssize_t i_stream_crlf_read_lf(struct istream_private *stream)
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainen struct crlf_istream *cstream = (struct crlf_istream *)stream;
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainen const unsigned char *data;
1de2b5a16a455e018d8cbf72ee114d4b5d557a48Timo Sirainen data = i_stream_get_data(stream->parent, &size);
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen /* @UNSAFE */
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen /* CR without LF */
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainen for (i = 1; i < size && dest < stream->buffer_size; i++) {
4d6c99647852146fec4f2663767b17593ef73a47Timo Sirainen } else if (data[i-1] == '\r' && data[i] != '\n') {
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainenstatic const struct stat *
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Siraineni_stream_crlf_stat(struct istream_private *stream, bool exact)
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainenstatic struct istream *
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Siraineni_stream_create_crlf_full(struct istream *input, bool crlf)
597dba3488c648ffb375ee4a552bd52ac4346979Timo Sirainen cstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
a33b41b1dc19c692b1283049ec4de492fdadeb9aTimo Sirainen cstream->istream.read = crlf ? i_stream_crlf_read_crlf :
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen cstream->istream.istream.blocking = input->blocking;
9511a40d933181045343110c8101b75887062aaeTimo Sirainen return i_stream_create(&cstream->istream, input,
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainenstruct istream *i_stream_create_crlf(struct istream *input)
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainen return i_stream_create_crlf_full(input, TRUE);
5fe5ea74285e2fc0fbf7568c53f251aa894650fbTimo Sirainenstruct istream *i_stream_create_lf(struct istream *input)