コード例 #1
0
ファイル: istream-raw-mbox.c プロジェクト: Distrotech/dovecot
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;
}
コード例 #2
0
ファイル: istream-raw-mbox.c プロジェクト: bsmr-dovecot/core
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;
}