summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--imap.c22
-rw-r--r--imap.h8
2 files changed, 30 insertions, 0 deletions
diff --git a/imap.c b/imap.c
index e21141d..e875595 100644
--- a/imap.c
+++ b/imap.c
@@ -28,6 +28,7 @@
 #include <err.h>
 #include <netdb.h>
 #include <netinet/in.h>
+#include <poll.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -265,3 +266,24 @@ struct Resp imapResp(struct IMAP *imap) {
 
 	return resp;
 }
+
+struct Resp imapIdle(struct IMAP *imap, enum Atom tag) {
+	for (;;) {
+		fprintf(imap->w, "%s IDLE\r\n", Atoms[tag]);
+		struct Resp resp = imapResp(imap);
+		if (resp.tag != AtomContinue) {
+			fprintf(imap->w, "DONE\r\n");
+			return resp;
+		}
+		respFree(resp);
+
+		struct pollfd pfd = { .fd = imap->sock, .events = POLLIN };
+		int ready = poll(&pfd, 1, 29 * 60 * 1000);
+		if (ready < 0) err(EX_IOERR, "poll");
+
+		fprintf(imap->w, "DONE\r\n");
+		resp = imapResp(imap);
+		if (ready || resp.tag != tag) return resp;
+		respFree(resp);
+	}
+}
diff --git a/imap.h b/imap.h
index 4cd7691..015c8b8 100644
--- a/imap.h
+++ b/imap.h
@@ -162,6 +162,13 @@ struct Resp {
 	const char *text;
 };
 
+static inline struct Resp respOk(struct Resp resp) {
+	if (resp.resp == AtomNo || resp.resp == AtomBad || resp.resp == AtomBye) {
+		errx(EX_CONFIG, "%s: %s", Atoms[resp.tag], resp.text);
+	}
+	return resp;
+}
+
 static inline void respFree(struct Resp resp) {
 	listFree(resp.code);
 	listFree(resp.data);
@@ -180,5 +187,6 @@ struct IMAP {
 
 struct IMAP imapOpen(const char *host, const char *port);
 struct Resp imapResp(struct IMAP *imap);
+struct Resp imapIdle(struct IMAP *imap, enum Atom tag);
 
 #endif /* IMAP_H */
catgirl/commit/input.c?id=41e7105fecdb3516a1711003ba3fccdf9d3cfd3d&follow=1'>Remove extraneous slash from unrecognized commandJune McEnroe 2018-08-07Highlight and beep pingsJune McEnroe 2018-08-07Factor out allocating conversion between wcs and mbsJune McEnroe 2018-08-07Match commands case-insensitivelyJune McEnroe 2018-08-07Convert input to multibyte before handlingJune McEnroe 2018-08-07Populate tab-complete listJune McEnroe 2018-08-07Fix /me formatting side-effectsJune McEnroe 2018-08-07Define ui.c BUF_LEN with enumJune McEnroe 2018-08-07Hack clang into checking uiFmt format stringsJune McEnroe 2018-08-07Handle PART and QUIT without messagesJune McEnroe 2018-08-07Make safe filling the who bufferJune McEnroe 2018-08-07Add reverse and reset IRC formatting codesJune McEnroe 2018-08-06Rewrite line editing again, add formattingJune McEnroe 2018-08-06Fix allocation size in vaswprintfJune McEnroe 2018-08-06Implement word wrappingJune McEnroe 2018-08-06Use wchar_t strings for all of UIJune McEnroe 2018-08-06Rename line editing functionsJune McEnroe 2018-08-05Initialize all possible color pairsJune McEnroe 2018-08-05Refactor color initializationJune McEnroe 2018-08-05Add ^L redrawJune McEnroe 2018-08-05Use 16 colors if availableJune McEnroe 2018-08-05Limit parsed colors to number of mIRC colorsJune McEnroe 2018-08-04Show source link on exitJune McEnroe 2018-08-04Implement line editing, scrollingJune McEnroe 2018-08-04Handle /topicJune McEnroe