[dovecot-cvs] dovecot/src/lib-mail istream-header-filter.c, 1.6, 1.7 message-body-search.c, 1.17, 1.18 message-parser.c, 1.56, 1.57 message-parser.h, 1.26, 1.27

cras at dovecot.org cras at dovecot.org
Sun Aug 22 06:20:01 EEST 2004


Update of /home/cvs/dovecot/src/lib-mail
In directory talvi:/tmp/cvs-serv28081/lib-mail

Modified Files:
	istream-header-filter.c message-body-search.c message-parser.c 
	message-parser.h 
Log Message:
message_parse_header_next() can now return "need more data" with nonblocking
input streams.



Index: istream-header-filter.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-mail/istream-header-filter.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- istream-header-filter.c	22 Aug 2004 02:58:40 -0000	1.6
+++ istream-header-filter.c	22 Aug 2004 03:19:58 -0000	1.7
@@ -59,7 +59,7 @@
 	struct message_header_line *hdr;
 	size_t pos;
 	ssize_t ret;
-	int matched;
+	int matched, hdr_ret;
 
 	if (mstream->header_read &&
 	    mstream->istream.istream.v_offset + mstream->istream.pos ==
@@ -82,7 +82,8 @@
 
 	buffer_set_used_size(mstream->hdr_buf, mstream->istream.pos);
 
-	while ((hdr = message_parse_header_next(mstream->hdr_ctx)) != NULL) {
+	while ((hdr_ret = message_parse_header_next(mstream->hdr_ctx,
+						    &hdr)) > 0) {
 		mstream->cur_line++;
 
 		if (hdr->eoh) {
@@ -128,10 +129,14 @@
 		}
 	}
 
+	mstream->istream.istream.disconnected = mstream->input->disconnected;
 	mstream->istream.buffer = buffer_get_data(mstream->hdr_buf, &pos);
 	ret = (ssize_t)(pos - mstream->istream.pos - mstream->istream.skip);
 	mstream->istream.pos = pos;
 
+	if (hdr_ret == 0)
+		return ret;
+
 	if (hdr == NULL) {
 		/* finished */
 		mstream->header_read = TRUE;

Index: message-body-search.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-mail/message-body-search.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- message-body-search.c	17 Jun 2004 21:28:23 -0000	1.17
+++ message-body-search.c	22 Aug 2004 03:19:58 -0000	1.18
@@ -105,7 +105,7 @@
 	struct header_search_context *hdr_search_ctx;
 	struct message_header_parser_ctx *hdr_ctx;
 	struct message_header_line *hdr;
-	int found = FALSE;
+	int ret, found = FALSE;
 
 	hdr_search_ctx = message_header_search_init(pool_datastack_create(),
 						    ctx->body_ctx->key,
@@ -116,7 +116,7 @@
 	ctx->content_type_text = TRUE;
 
 	hdr_ctx = message_parse_header_init(input, NULL, TRUE);
-	while ((hdr = message_parse_header_next(hdr_ctx)) != NULL) {
+	while ((ret = message_parse_header_next(hdr_ctx, &hdr)) > 0) {
 		if (hdr->eoh)
 			continue;
 
@@ -152,6 +152,7 @@
 						     NULL, ctx);
 		}
 	}
+	i_assert(ret != 0);
 	message_parse_header_deinit(hdr_ctx);
 
 	return found;

Index: message-parser.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-mail/message-parser.c,v
retrieving revision 1.56
retrieving revision 1.57
diff -u -d -r1.56 -r1.57
--- message-parser.c	31 Jul 2004 00:33:53 -0000	1.56
+++ message-parser.c	22 Aug 2004 03:19:58 -0000	1.57
@@ -213,10 +213,11 @@
 	struct message_part *part = parser_ctx->part;
 	struct message_header_parser_ctx *hdr_ctx;
 	struct message_header_line *hdr;
+	int ret;
 
 	hdr_ctx = message_parse_header_init(parser_ctx->input,
 					    &part->header_size, TRUE);
-	while ((hdr = message_parse_header_next(hdr_ctx)) != NULL) {
+	while ((ret = message_parse_header_next(hdr_ctx, &hdr)) > 0) {
 		/* call the user-defined header parser */
 		if (parser_ctx->callback != NULL)
 			parser_ctx->callback(part, hdr, parser_ctx->context);
@@ -239,6 +240,7 @@
 						     parser_ctx);
 		}
 	}
+	i_assert(ret != 0);
 
 	if ((part->flags & MESSAGE_PART_FLAG_IS_MIME) == 0) {
 		/* It's not MIME. Reset everything we found from
@@ -634,10 +636,12 @@
 {
 	struct message_header_parser_ctx *hdr_ctx;
 	struct message_header_line *hdr;
+	int ret;
 
 	hdr_ctx = message_parse_header_init(input, hdr_size, TRUE);
-	while ((hdr = message_parse_header_next(hdr_ctx)) != NULL)
+	while ((ret = message_parse_header_next(hdr_ctx, &hdr)) > 0)
 		callback(part, hdr, context);
+	i_assert(ret != 0);
 	message_parse_header_deinit(hdr_ctx);
 
 	/* call after the final skipping */
@@ -670,16 +674,17 @@
 	i_free(ctx);
 }
 
-struct message_header_line *
-message_parse_header_next(struct message_header_parser_ctx *ctx)
+int message_parse_header_next(struct message_header_parser_ctx *ctx,
+			      struct message_header_line **hdr_r)
 {
         struct message_header_line *line = &ctx->line;
 	const unsigned char *msg;
 	size_t i, size, startpos, colon_pos, parse_size;
 	int ret;
 
+	*hdr_r = NULL;
 	if (line->eoh)
-		return NULL;
+		return -1;
 
 	if (ctx->skip > 0) {
 		i_stream_skip(ctx->input, ctx->skip);
@@ -727,7 +732,11 @@
 		if (ret <= 0 && (ret != 0 || startpos == size)) {
 			if (ret == -1) {
 				/* error / EOF with no bytes */
-				return NULL;
+				return -1;
+			}
+			if (ret == 0) {
+				/* stream is nonblocking - need more data */
+				return 0;
 			}
 
 			if (msg[0] == '\n' ||
@@ -918,5 +927,7 @@
 		ctx->hdr_size->physical_size += ctx->skip;
 		ctx->hdr_size->virtual_size += ctx->skip;
 	}
-	return line;
+
+	*hdr_r = line;
+	return 1;
 }

Index: message-parser.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-mail/message-parser.h,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- message-parser.h	31 Jul 2004 00:33:53 -0000	1.26
+++ message-parser.h	22 Aug 2004 03:19:58 -0000	1.27
@@ -108,8 +108,10 @@
 			 int skip_initial_lwsp);
 void message_parse_header_deinit(struct message_header_parser_ctx *ctx);
 
-/* Read and return next header line. */
-struct message_header_line *
-message_parse_header_next(struct message_header_parser_ctx *ctx);
+/* Read and return next header line. Returns 1 if header is returned, 0 if
+   input stream is non-blocking and more data needs to be read, -1 when all is
+   done or error occured (see stream's error status). */
+int message_parse_header_next(struct message_header_parser_ctx *ctx,
+			      struct message_header_line **hdr_r);
 
 #endif



More information about the dovecot-cvs mailing list