# HG changeset patch # User Timo Sirainen # Date 1198291713 -7200 # Node ID 1a89a1509e8144a2a92c7a098d16bff27272be65 # Parent 595b600ddf8be4bea44cbe6847e0803ea7247435 Use istream_private->parent pointer globally instead of each filter stream having its own. diff -r 595b600ddf8b -r 1a89a1509e81 src/lib-mail/istream-header-filter.c --- a/src/lib-mail/istream-header-filter.c Sat Dec 22 03:52:30 2007 +0200 +++ b/src/lib-mail/istream-header-filter.c Sat Dec 22 04:48:33 2007 +0200 @@ -12,7 +12,6 @@ struct istream_private istream; pool_t pool; - struct istream *input; struct message_header_parser_ctx *hdr_ctx; uoff_t start_offset; @@ -45,7 +44,7 @@ if (mstream->hdr_ctx != NULL) message_parse_header_deinit(&mstream->hdr_ctx); - i_stream_unref(&mstream->input); + i_stream_unref(&mstream->istream.parent); if (array_is_created(&mstream->match_change_lines)) array_free(&mstream->match_change_lines); pool_unref(&mstream->pool); @@ -59,7 +58,7 @@ (struct header_filter_istream *)stream; mstream->istream.max_buffer_size = max_size; - i_stream_set_max_buffer_size(mstream->input, max_size); + i_stream_set_max_buffer_size(mstream->istream.parent, max_size); } static ssize_t @@ -74,17 +73,17 @@ return -1; } - data = i_stream_get_data(mstream->input, &pos); + data = i_stream_get_data(mstream->istream.parent, &pos); if (pos == body_highwater_size) { - ret = i_stream_read(mstream->input); + ret = i_stream_read(mstream->istream.parent); mstream->istream.istream.stream_errno = - mstream->input->stream_errno; - mstream->istream.istream.eof = mstream->input->eof; + mstream->istream.parent->stream_errno; + mstream->istream.istream.eof = mstream->istream.parent->eof; if (ret <= 0) return ret; - data = i_stream_get_data(mstream->input, &pos); + data = i_stream_get_data(mstream->istream.parent, &pos); } i_assert(pos > body_highwater_size); buffer_append(mstream->hdr_buf, data + body_highwater_size, @@ -128,7 +127,8 @@ if (mstream->hdr_ctx == NULL) { mstream->hdr_ctx = - message_parse_header_init(mstream->input, NULL, 0); + message_parse_header_init(mstream->istream.parent, + NULL, 0); } /* remove skipped data from hdr_buf */ @@ -250,7 +250,8 @@ mstream->header_parsed = TRUE; mstream->header_read = TRUE; - mstream->header_size.physical_size = mstream->input->v_offset; + mstream->header_size.physical_size = + mstream->istream.parent->v_offset; mstream->header_size.virtual_size = mstream->istream.istream.v_offset + pos; } @@ -287,7 +288,7 @@ return -1; } - i_stream_seek(mstream->input, mstream->start_offset + + i_stream_seek(stream->parent, mstream->start_offset + stream->istream.v_offset - mstream->header_size.virtual_size + mstream->header_size.physical_size); @@ -295,13 +296,13 @@ stream->pos -= stream->skip; stream->skip = 0; - stream->buffer = i_stream_get_data(mstream->input, &pos); + stream->buffer = i_stream_get_data(stream->parent, &pos); if (pos <= stream->pos) { - if ((ret = i_stream_read(mstream->input)) == -2) + if ((ret = i_stream_read(stream->parent)) == -2) return -2; - stream->istream.stream_errno = mstream->input->stream_errno; - stream->istream.eof = mstream->input->eof; - stream->buffer = i_stream_get_data(mstream->input, &pos); + stream->istream.stream_errno = stream->parent->stream_errno; + stream->istream.eof = stream->parent->eof; + stream->buffer = i_stream_get_data(stream->parent, &pos); } else { ret = 0; } @@ -345,7 +346,7 @@ if (v_offset < mstream->header_size.virtual_size) { /* seek into headers. we'll have to re-parse them, use skip_count to set the wanted position */ - i_stream_seek(mstream->input, mstream->start_offset); + i_stream_seek(stream->parent, mstream->start_offset); mstream->skip_count = v_offset; mstream->cur_line = 0; mstream->header_read = FALSE; @@ -353,7 +354,7 @@ /* body */ v_offset += mstream->header_size.physical_size - mstream->header_size.virtual_size; - i_stream_seek(mstream->input, mstream->start_offset + v_offset); + i_stream_seek(stream->parent, mstream->start_offset + v_offset); } } @@ -370,7 +371,7 @@ (struct header_filter_istream *)stream; const struct stat *st; - st = i_stream_stat(mstream->input, exact); + st = i_stream_stat(stream->parent, exact); if (st == NULL || st->st_size == -1 || !exact) return st; @@ -400,8 +401,8 @@ mstream->pool = pool_alloconly_create("header filter stream", 4096); mstream->istream.max_buffer_size = input->real_stream->max_buffer_size; - mstream->input = input; - i_stream_ref(mstream->input); + mstream->istream.parent = input; + i_stream_ref(mstream->istream.parent); mstream->headers = headers_count == 0 ? NULL : p_new(mstream->pool, const char *, headers_count); diff -r 595b600ddf8b -r 1a89a1509e81 src/lib-storage/index/mbox/istream-raw-mbox.c --- a/src/lib-storage/index/mbox/istream-raw-mbox.c Sat Dec 22 03:52:30 2007 +0200 +++ b/src/lib-storage/index/mbox/istream-raw-mbox.c Sat Dec 22 04:48:33 2007 +0200 @@ -13,7 +13,6 @@ char *sender, *next_sender; uoff_t from_offset, hdr_offset, body_offset, mail_size; - struct istream *input; uoff_t input_peak_offset; unsigned int crlf_ending:1; @@ -28,8 +27,9 @@ i_free(rstream->sender); i_free(rstream->next_sender); - i_stream_seek(rstream->input, rstream->istream.istream.v_offset); - i_stream_unref(&rstream->input); + i_stream_seek(rstream->istream.parent, + rstream->istream.istream.v_offset); + i_stream_unref(&rstream->istream.parent); } static void @@ -39,7 +39,7 @@ struct raw_mbox_istream *rstream = (struct raw_mbox_istream *)stream; rstream->istream.max_buffer_size = max_size; - i_stream_set_max_buffer_size(rstream->input, max_size); + i_stream_set_max_buffer_size(rstream->istream.parent, max_size); } static int mbox_read_from_line(struct raw_mbox_istream *rstream) @@ -50,7 +50,7 @@ size_t pos, line_pos; int skip; - buf = i_stream_get_data(rstream->input, &pos); + buf = i_stream_get_data(rstream->istream.parent, &pos); i_assert(pos > 0); /* from_offset points to "\nFrom ", so unless we're at the beginning @@ -60,11 +60,11 @@ skip++; while ((p = memchr(buf+skip, '\n', pos-skip)) == NULL) { - if (i_stream_read(rstream->input) < 0) { + if (i_stream_read(rstream->istream.parent) < 0) { /* EOF - shouldn't happen */ return -1; } - buf = i_stream_get_data(rstream->input, &pos); + buf = i_stream_get_data(rstream->istream.parent, &pos); i_assert(pos > 0); } line_pos = (size_t)(p - buf); @@ -94,7 +94,7 @@ /* we'll skip over From-line */ rstream->istream.istream.v_offset += line_pos+1; - i_stream_skip(rstream->input, line_pos+1); + i_stream_skip(rstream->istream.parent, line_pos+1); rstream->hdr_offset = rstream->istream.istream.v_offset; return 0; } @@ -137,7 +137,7 @@ if (stream->istream.eof) return -1; - i_stream_seek(rstream->input, stream->istream.v_offset); + i_stream_seek(stream->parent, stream->istream.v_offset); stream->pos -= stream->skip; stream->skip = 0; @@ -145,7 +145,7 @@ ret = 0; do { - buf = i_stream_get_data(rstream->input, &pos); + buf = i_stream_get_data(stream->parent, &pos); if (pos > 1 && stream->istream.v_offset + pos > rstream->input_peak_offset) { /* fake our read count. needed because if in the end @@ -155,9 +155,9 @@ ret = pos; break; } - ret = i_stream_read(rstream->input); + ret = i_stream_read(stream->parent); } while (ret > 0); - stream->istream.stream_errno = rstream->input->stream_errno; + stream->istream.stream_errno = stream->parent->stream_errno; if (ret < 0) { if (ret == -2) { @@ -214,7 +214,7 @@ /* got it. we don't want to return it however, so start again from headers */ - buf = i_stream_get_data(rstream->input, &pos); + buf = i_stream_get_data(stream->parent, &pos); if (pos == 0) return i_stream_raw_mbox_read(stream); } @@ -321,7 +321,7 @@ { struct raw_mbox_istream *rstream = (struct raw_mbox_istream *)stream; - i_stream_sync(rstream->input); + i_stream_sync(stream->parent); rstream->istream.skip = 0; rstream->istream.pos = 0; @@ -330,10 +330,9 @@ static const struct stat * i_stream_raw_mbox_stat(struct istream_private *stream, bool exact) { - struct raw_mbox_istream *rstream = (struct raw_mbox_istream *)stream; const struct stat *st; - st = i_stream_stat(rstream->input, exact); + st = i_stream_stat(stream->parent, exact); if (st == NULL) return NULL; @@ -350,17 +349,17 @@ rstream = i_new(struct raw_mbox_istream, 1); - rstream->input = input; rstream->body_offset = (uoff_t)-1; rstream->mail_size = (uoff_t)-1; rstream->received_time = (time_t)-1; rstream->next_received_time = (time_t)-1; - rstream->istream.max_buffer_size = input->real_stream->max_buffer_size; rstream->istream.iostream.destroy = i_stream_raw_mbox_destroy; rstream->istream.iostream.set_max_buffer_size = i_stream_raw_mbox_set_max_buffer_size; + rstream->istream.parent = input; + rstream->istream.max_buffer_size = input->real_stream->max_buffer_size; rstream->istream.read = i_stream_raw_mbox_read; rstream->istream.seek = i_stream_raw_mbox_seek; rstream->istream.sync = i_stream_raw_mbox_sync; @@ -380,7 +379,7 @@ char *sender; /* minimal: "From x Thu Nov 29 22:33:52 2001" = 31 chars */ - if (i_stream_read_data(rstream->input, &data, &size, 30) == -1) + if (i_stream_read_data(rstream->istream.parent, &data, &size, 30) == -1) return -1; if ((size == 1 && data[0] == '\n') || @@ -400,7 +399,8 @@ } while (memchr(data, '\n', size) == NULL) { - if (i_stream_read_data(rstream->input, &data, &size, size) < 0) + if (i_stream_read_data(rstream->istream.parent, + &data, &size, size) < 0) break; } @@ -485,7 +485,8 @@ } if (body_size != (uoff_t)-1) { - i_stream_seek(rstream->input, rstream->body_offset + body_size); + i_stream_seek(rstream->istream.parent, + rstream->body_offset + body_size); if (istream_raw_mbox_is_valid_from(rstream) > 0) { rstream->mail_size = body_size + (rstream->body_offset - rstream->hdr_offset); @@ -551,7 +552,7 @@ if (stream->v_offset != rstream->from_offset) i_stream_seek_mark(stream, rstream->from_offset); - i_stream_seek_mark(rstream->input, rstream->from_offset); + i_stream_seek_mark(rstream->istream.parent, rstream->from_offset); rstream->eof = FALSE; rstream->istream.istream.eof = FALSE; @@ -594,7 +595,7 @@ } i_stream_seek_mark(stream, offset); - i_stream_seek_mark(rstream->input, offset); + i_stream_seek_mark(rstream->istream.parent, offset); if (check) (void)i_stream_raw_mbox_read(&rstream->istream); diff -r 595b600ddf8b -r 1a89a1509e81 src/lib/istream-crlf.c --- a/src/lib/istream-crlf.c Sat Dec 22 03:52:30 2007 +0200 +++ b/src/lib/istream-crlf.c Sat Dec 22 04:48:33 2007 +0200 @@ -7,7 +7,6 @@ struct crlf_istream { struct istream_private istream; - struct istream *input; unsigned int pending_cr:1; unsigned int last_cr:1; }; @@ -17,7 +16,7 @@ struct crlf_istream *cstream = (struct crlf_istream *)stream; i_free(cstream->istream.w_buffer); - i_stream_unref(&cstream->input); + i_stream_unref(&cstream->istream.parent); } static void @@ -27,7 +26,7 @@ struct crlf_istream *cstream = (struct crlf_istream *)stream; cstream->istream.max_buffer_size = max_size; - i_stream_set_max_buffer_size(cstream->input, max_size); + i_stream_set_max_buffer_size(cstream->istream.parent, max_size); } static int i_stream_crlf_read_common(struct crlf_istream *cstream) @@ -37,16 +36,16 @@ size_t size; ssize_t ret; - data = i_stream_get_data(cstream->input, &size); + data = i_stream_get_data(stream->parent, &size); if (size == 0) { - ret = i_stream_read(cstream->input); + ret = i_stream_read(stream->parent); if (ret <= 0 && (ret != -2 || stream->skip == 0)) { stream->istream.stream_errno = - cstream->input->stream_errno; - stream->istream.eof = cstream->input->eof; + stream->parent->stream_errno; + stream->istream.eof = stream->parent->eof; return ret; } - data = i_stream_get_data(cstream->input, &size); + data = i_stream_get_data(stream->parent, &size); i_assert(size != 0); } @@ -66,7 +65,7 @@ if (ret <= 0) return ret; - data = i_stream_get_data(cstream->input, &size); + data = i_stream_get_data(stream->parent, &size); /* @UNSAFE: add missing CRs */ dest = stream->pos; @@ -85,7 +84,7 @@ stream->w_buffer[dest++] = data[i]; } cstream->last_cr = stream->w_buffer[dest-1] == '\r'; - i_stream_skip(cstream->input, i); + i_stream_skip(stream->parent, i); ret = dest - stream->pos; i_assert(ret != 0); @@ -105,7 +104,7 @@ if (ret <= 0) return ret; - data = i_stream_get_data(cstream->input, &size); + data = i_stream_get_data(stream->parent, &size); /* @UNSAFE */ dest = stream->pos; @@ -141,7 +140,7 @@ stream->w_buffer[dest++] = data[i]; } cstream->pending_cr = data[i+diff] == '\r'; - i_stream_skip(cstream->input, i); + i_stream_skip(stream->parent, i); ret = dest - stream->pos; if (ret == 0) { @@ -162,9 +161,7 @@ static const struct stat * i_stream_crlf_stat(struct istream_private *stream, bool exact) { - struct crlf_istream *cstream = (struct crlf_istream *)stream; - - return i_stream_stat(cstream->input, exact); + return i_stream_stat(stream->parent, exact); } static struct istream * @@ -175,13 +172,13 @@ i_stream_ref(input); cstream = i_new(struct crlf_istream, 1); - cstream->input = input; cstream->istream.max_buffer_size = input->real_stream->max_buffer_size; cstream->istream.iostream.destroy = i_stream_crlf_destroy; cstream->istream.iostream.set_max_buffer_size = i_stream_crlf_set_max_buffer_size; + cstream->istream.parent = input; cstream->istream.read = crlf ? i_stream_crlf_read_crlf : i_stream_crlf_read_lf; cstream->istream.seek = i_stream_crlf_seek; diff -r 595b600ddf8b -r 1a89a1509e81 src/lib/istream-internal.h --- a/src/lib/istream-internal.h Sat Dec 22 03:52:30 2007 +0200 +++ b/src/lib/istream-internal.h Sat Dec 22 04:48:33 2007 +0200 @@ -30,6 +30,7 @@ size_t buffer_size, max_buffer_size; size_t skip, pos; + struct istream *parent; /* for filter streams */ string_t *line_str; /* for i_stream_next_line() if w_buffer == NULL */ }; diff -r 595b600ddf8b -r 1a89a1509e81 src/lib/istream-limit.c --- a/src/lib/istream-limit.c Sat Dec 22 03:52:30 2007 +0200 +++ b/src/lib/istream-limit.c Sat Dec 22 04:48:33 2007 +0200 @@ -6,7 +6,6 @@ struct limit_istream { struct istream_private istream; - struct istream *input; uoff_t v_start_offset, v_size; }; @@ -15,9 +14,9 @@ struct limit_istream *lstream = (struct limit_istream *) stream; /* get to same position in parent stream */ - i_stream_seek(lstream->input, lstream->v_start_offset + + i_stream_seek(lstream->istream.parent, lstream->v_start_offset + lstream->istream.istream.v_offset); - i_stream_unref(&lstream->input); + i_stream_unref(&lstream->istream.parent); } static void @@ -27,7 +26,7 @@ struct limit_istream *lstream = (struct limit_istream *) stream; lstream->istream.max_buffer_size = max_size; - i_stream_set_max_buffer_size(lstream->input, max_size); + i_stream_set_max_buffer_size(lstream->istream.parent, max_size); } static ssize_t i_stream_limit_read(struct istream_private *stream) @@ -43,21 +42,21 @@ return -1; } - if (lstream->input->v_offset != + if (stream->parent->v_offset != lstream->v_start_offset + stream->istream.v_offset) { - i_stream_seek(lstream->input, + i_stream_seek(stream->parent, lstream->v_start_offset + stream->istream.v_offset); } - stream->buffer = i_stream_get_data(lstream->input, &pos); + stream->buffer = i_stream_get_data(stream->parent, &pos); if (pos <= stream->pos) { - if ((ret = i_stream_read(lstream->input)) == -2) + if ((ret = i_stream_read(stream->parent)) == -2) return -2; - stream->istream.stream_errno = lstream->input->stream_errno; - stream->istream.eof = lstream->input->eof; - stream->buffer = i_stream_get_data(lstream->input, &pos); + stream->istream.stream_errno = stream->parent->stream_errno; + stream->istream.eof = stream->parent->eof; + stream->buffer = i_stream_get_data(stream->parent, &pos); } else { ret = 0; } @@ -97,7 +96,7 @@ struct limit_istream *lstream = (struct limit_istream *) stream; const struct stat *st; - st = i_stream_stat(lstream->input, exact); + st = i_stream_stat(stream->parent, exact); if (st == NULL) return NULL; @@ -115,7 +114,6 @@ i_stream_ref(input); lstream = i_new(struct limit_istream, 1); - lstream->input = input; lstream->v_start_offset = v_start_offset; lstream->v_size = v_size; lstream->istream.max_buffer_size = input->real_stream->max_buffer_size; @@ -129,6 +127,7 @@ lstream->istream.iostream.set_max_buffer_size = i_stream_limit_set_max_buffer_size; + lstream->istream.parent = input; lstream->istream.read = i_stream_limit_read; lstream->istream.seek = i_stream_limit_seek; lstream->istream.stat = i_stream_limit_stat;