From 1529aa80917fd187250f7126d0f8ef0770830506 Mon Sep 17 00:00:00 2001
From: "Eric S. Raymond" <esr@thyrsus.com>
Date: Thu, 5 Jun 1997 20:29:46 +0000
Subject: Deal with 0-length response.

svn path=/trunk/; revision=1065
---
 imap.c | 28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/imap.c b/imap.c
index 552e33a2..a593039f 100644
--- a/imap.c
+++ b/imap.c
@@ -499,7 +499,7 @@ static int imap_fetch_headers(int sock, struct query *ctl,int number,int *lenp)
 static int imap_fetch_body(int sock, struct query *ctl, int number, int *lenp)
 /* request body of nth message */
 {
-    char buf [POPBUFSIZE+1];
+    char buf [POPBUFSIZE+1], *cp;
     int	num;
 
     /* expunges change the fetch numbers */
@@ -543,24 +543,40 @@ static int imap_fetch_body(int sock, struct query *ctl, int number, int *lenp)
 	if ((ok = gen_recv(sock, buf, sizeof(buf))))
 	    return(ok);
     } while
-	/* third token can be "RFC822" or "BODY[]" */
-	(sscanf(buf+2, "%d FETCH (%*s {%d}", &num, lenp) != 2);
+	(sscanf(buf+2, "%d FETCH", &num) != 1);
 
     if (num != number)
 	return(PS_ERROR);
+
+    /* try to extract a length */
+    if ((cp = strchr(buf, '{')))
+	*lenp = atoi(cp + 1);
     else
-	return(PS_SUCCESS);
+	*lenp = 0;
+
+    return(PS_SUCCESS);
 }
 
 static int imap_trail(int sock, struct query *ctl, int number)
 /* discard tail of FETCH response after reading message text */
 {
-    char buf [POPBUFSIZE+1];
+    int	num;
 
     /* expunges change the fetch numbers */
     /* number -= deletecount; */
 
-    return(gen_recv(sock, buf, sizeof(buf)));
+    for (;;)
+    {
+	char buf[POPBUFSIZE+1];
+	int ok;
+
+	if ((ok = gen_recv(sock, buf, sizeof(buf))))
+	    return(ok);
+	if (strstr(buf, "OK FETCH"))
+	    break;
+    }
+
+    return(PS_SUCCESS);
 }
 
 static int imap_delete(int sock, struct query *ctl, int number)
-- 
cgit v1.2.3