about summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--notemap.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/notemap.c b/notemap.c
index 99a1418..b448a2a 100644
--- a/notemap.c
+++ b/notemap.c
@@ -348,10 +348,7 @@ next:
 				errx(EX_CONFIG, "multiple messages matching %s", uuid);
 			}
 			if (resp.data.len) {
-				if (resp.data.ptr[0].type != Number) {
-					errx(EX_PROTOCOL, "invalid search result");
-				}
-				seq = resp.data.ptr[0].number;
+				seq = dataCheck(resp.data.ptr[0], Number).number;
 				fprintf(
 					imap, "%s FETCH %" PRIu32 " ENVELOPE\r\n",
 					Atoms[AtomFetch], seq
@@ -364,19 +361,21 @@ next:
 				);
 			}
 		}
+		
+		if (resp.resp == AtomFetch) {
+			if (!resp.data.len) errx(EX_PROTOCOL, "missing fetch data");
+			struct List items = dataCheck(resp.data.ptr[0], List).list;
+			if (items.len < 2) errx(EX_PROTOCOL, "missing fetch data items");
+			enum Atom item = dataCheck(items.ptr[0], Atom).atom;
+			if (item != AtomEnvelope) continue;
+
+			struct List envelope = dataCheck(items.ptr[1], List).list;
+			if (envelope.len < 1) errx(EX_PROTOCOL, "missing envelope date");
 
-		if (
-			resp.resp == AtomFetch &&
-			resp.data.len &&
-			resp.data.ptr[0].type == List &&
-			resp.data.ptr[0].list.len > 1 &&
-			resp.data.ptr[0].list.ptr[0].type == Atom &&
-			resp.data.ptr[0].list.ptr[0].atom == AtomEnvelope &&
-			resp.data.ptr[0].list.ptr[1].type == List
-		) {
-			struct List envelope = resp.data.ptr[0].list.ptr[1].list;
 			struct tm date = {0};
-			char *rest = strptime(envelope.ptr[0].string, DATE_FORMAT, &date);
+			char *rest = strptime(
+				dataCheck(envelope.ptr[0], String).string, DATE_FORMAT, &date
+			);
 			if (!rest) errx(EX_PROTOCOL, "invalid envelope date format");
 
 			struct stat status;