void istream_raw_mbox_next(struct istream *stream, uoff_t expected_body_size) { struct raw_mbox_istream *rstream = (struct raw_mbox_istream *)stream->real_stream; uoff_t body_size; body_size = istream_raw_mbox_get_body_size(stream, expected_body_size); rstream->mail_size = (uoff_t)-1; rstream->received_time = rstream->next_received_time; rstream->next_received_time = (time_t)-1; i_free(rstream->sender); rstream->sender = rstream->next_sender; rstream->next_sender = NULL; rstream->from_offset = rstream->body_offset + body_size; rstream->hdr_offset = rstream->from_offset; rstream->body_offset = (uoff_t)-1; rstream->header_missing_eoh = FALSE; if (stream->v_offset != rstream->from_offset) i_stream_seek_mark(stream, rstream->from_offset); i_stream_seek_mark(rstream->istream.parent, rstream->from_offset); rstream->eof = FALSE; rstream->istream.istream.eof = FALSE; }
int istream_raw_mbox_seek(struct istream *stream, uoff_t offset) { struct raw_mbox_istream *rstream = (struct raw_mbox_istream *)stream->real_stream; bool check; i_assert(rstream->locked); /* reset any (corruption) errors */ stream->stream_errno = 0; i_free_and_null(stream->real_stream->iostream.error); rstream->corrupted = FALSE; rstream->eof = FALSE; rstream->istream.istream.eof = FALSE; /* if seeked is FALSE, we unlocked in the middle. don't try to use any cached state then. */ if (rstream->mail_size != (uoff_t)-1 && rstream->seeked && rstream->hdr_offset + rstream->mail_size == offset) return istream_raw_mbox_next(stream, (uoff_t)-1); if (offset == rstream->from_offset && rstream->seeked) { /* back to beginning of current message */ offset = rstream->hdr_offset; check = offset == 0; } else { 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->header_missing_eoh = FALSE; i_free(rstream->sender); rstream->sender = NULL; i_free(rstream->next_sender); rstream->next_sender = NULL; rstream->from_offset = offset; rstream->hdr_offset = offset; check = TRUE; } rstream->seeked = TRUE; i_stream_seek_mark(stream, offset); i_stream_seek_mark(rstream->istream.parent, offset); if (check) (void)i_stream_read(stream); return rstream->corrupted ? -1 : 0; }