diff options
-rw-r--r-- | imap.c | 22 |
1 files changed, 16 insertions, 6 deletions
@@ -1044,6 +1044,16 @@ static int internal_expunge(int sock) return(PS_SUCCESS); } +static int imap_idle(int sock) +/* start an RFC2177 IDLE */ +{ + stage = STAGE_IDLE; + saved_timeout = mytimeout; + mytimeout = 0; + + return (gen_transact(sock, "IDLE")); +} + static int imap_getrange(int sock, struct query *ctl, const char *folder, @@ -1069,12 +1079,8 @@ static int imap_getrange(int sock, ok = internal_expunge(sock); count = -1; if (do_idle) - { - stage = STAGE_IDLE; - saved_timeout = mytimeout; - mytimeout = 0; - } - if (ok || gen_transact(sock, do_idle ? "IDLE" : "NOOP")) + ok = imap_idle(sock); + if (ok || gen_transact(sock, "NOOP")) { report(stderr, _("re-poll failed\n")); return(ok); @@ -1098,6 +1104,10 @@ static int imap_getrange(int sock, } else if (outlevel >= O_DEBUG) report(stdout, "%d messages waiting after first poll\n", count); + + /* no messages? then we may need to idle until we get some */ + if (count == 0 && do_idle) + imap_idle(sock); } *countp = count; |