diff options
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | fetchmail.h | 2 | ||||
-rw-r--r-- | fetchmail.man | 2 | ||||
-rw-r--r-- | imap.c | 26 | ||||
-rw-r--r-- | socket.c | 2 | ||||
-rw-r--r-- | todo.html | 12 | ||||
-rw-r--r-- | transact.c | 5 |
7 files changed, 39 insertions, 14 deletions
@@ -7,6 +7,10 @@ STARTTLS negotiation. * Sunil's patch to make handling of failed STARTTLS more graceful. * Sunil's JF2 fix patch for .fetchmailrc security fix. +* Christophe GIAUME <christophe@giaume.com> finished the implementation + of RFC2177 IDLE. +* Jason Tishler's fix patch for Cygwin. +* Spanish and Polish translations updated. fetchmail-6.2.1 (Tue Jan 14 08:17:19 EST 2003), 22219 lines: diff --git a/fetchmail.h b/fetchmail.h index 309e611c..df6563c2 100644 --- a/fetchmail.h +++ b/fetchmail.h @@ -94,6 +94,7 @@ #define PS_BSMTP 12 /* output batch could not be opened */ #define PS_MAXFETCH 13 /* poll ended by fetch limit */ #define PS_SERVBUSY 14 /* server is busy */ +#define PS_IDLETIMEOUT 15 /* timeout on imap IDLE */ /* leave space for more codes */ #define PS_UNDEFINED 23 /* something I hadn't thought of */ #define PS_TRANSIENT 24 /* transient failure (internal use) */ @@ -426,6 +427,7 @@ void report_at_line (); /* driver.c -- main driver loop */ void set_timeout(int); +int isidletimeout(void); int do_protocol(struct query *, const struct method *); /* transact.c: transaction support */ diff --git a/fetchmail.man b/fetchmail.man index 3a5e29bb..3d707a9d 100644 --- a/fetchmail.man +++ b/fetchmail.man @@ -1240,7 +1240,7 @@ T} set syslog \& T{ Do error logging through syslog(3). T} -set nosyslog \& T{ +set no syslog \& T{ Turn off error logging through syslog(3). T} set properties \& T{ @@ -544,11 +544,33 @@ static int internal_expunge(int sock) static int imap_idle(int sock) /* start an RFC2177 IDLE */ { + int ok; + + /* special timeout to terminate the IDLE and re-issue it + * at least every 28 minutes: + * (the server may have an inactivity timeout) */ stage = STAGE_IDLE; saved_timeout = mytimeout; - mytimeout = 0; + mytimeout = 1680; /* 28 min */ + + /* enter IDLE mode */ + ok = gen_transact(sock, "IDLE"); - return (gen_transact(sock, "IDLE")); + if(ok == PS_IDLETIMEOUT) { + /* send "DONE" continuation */ + SockWrite(sock, "DONE\r\n", 6); + if (outlevel >= O_MONITOR) + report(stdout, "IMAP> DONE\n"); + + /* restore normal timeout value */ + mytimeout = saved_timeout; + stage = STAGE_FETCH; + + /* get OK IDLE message */ + return imap_ok(sock, NULL); + } else + /* not idle timeout */ + return ok; } static int imap_getrange(int sock, @@ -1018,6 +1018,8 @@ static ssize_t cygwin_read(int sock, void *buf, size_t count) return(-1); } } + + return count; } #endif /* __CYGWIN__ */ @@ -19,7 +19,7 @@ content="Known bugs and to-do items in fetchmail" /> <tr> <td width="30%">Back to <a href="/~esr">Eric's Home Page</a></td> <td width="30%" align="center">Up to <a href="/~esr/sitemap.html">Site Map</a></td> -<td width="30%" align="right">$Date: 2002/09/17 09:36:00 $</td> +<td width="30%" align="right">$Date: 2003/02/28 11:02:51 $</td> </tr> </table> @@ -31,14 +31,6 @@ fetchmail is now pretty mature and I have many other projects, so I don't personally chase obscure or marginal problems. Help with any of these will be cheerfully accepted.</p> -<p>IDLE is not fully implemented. Fetchmail does not time out the -idle connection every 30 minutes or less as required by RFC2177. -Some servers (including UW IMAPD compiled without the -MICROSOFT_BRAIN_DAMAGE option, as is the default) will drop the -connection after 30 minutes, resulting in a spurious socket error -in your logs and no mail being picked up until the next poll -cycle.</p> - <p>POP3 can't presently distinguish a wedged or down server from an authentication failure. Possible fix: after issuing a PASS command. wait 300 (xx) seconds for a "-ERR" or a "+OK" . If nothing comes @@ -79,7 +71,7 @@ reports.</p> <tr> <td width="30%">Back to <a href="/~esr">Eric's Home Page</a></td> <td width="30%" align="center">Up to <a href="/~esr/sitemap.html">Site Map</a></td> -<td width="30%" align="right">$Date: 2002/09/17 09:36:00 $</td> +<td width="30%" align="right">$Date: 2003/02/28 11:02:51 $</td> </tr> </table> @@ -1446,7 +1446,10 @@ int size; /* length of buffer */ { set_timeout(0); phase = oldphase; - return(PS_SOCKET); + if(isidletimeout()) + return(PS_IDLETIMEOUT); + else + return(PS_SOCKET); } else { |