From e1298bd1f676342a78014fb27823f3944f96f9f7 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Fri, 21 Feb 1997 04:32:42 +0000 Subject: Localize the effect of DNS errors. svn path=/trunk/; revision=908 --- NEWS | 3 +++ driver.c | 24 +++++++++++++++--------- fetchmail.man | 13 +++++++------ 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/NEWS b/NEWS index ce3cab03..3e63c249 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,9 @@ features -- * Treat unexpected EOF as a protocol error. +* DNS errors no longer abort an entire poll. Instead they just cause + forwarding and deletion of the current message. + * -v output now includes the version/pl numbers (help for harried maintainer!). bugs -- diff --git a/driver.c b/driver.c index 24f7125a..3628e266 100644 --- a/driver.c +++ b/driver.c @@ -146,7 +146,6 @@ static int is_host_alias(const char *name, struct query *ctl) "nameserver failure while looking for `%s' during poll of %s.", name, ctl->server.names->id); ctl->errcount++; - longjmp(restart, 2); /* try again next poll cycle */ break; } @@ -172,7 +171,6 @@ static int is_host_alias(const char *name, struct query *ctl) "nameserver failure while looking for `%s' during poll of %s.", name, ctl->server.names->id); ctl->errcount++; - longjmp(restart, 2); /* try again next poll cycle */ break; } } @@ -435,10 +433,12 @@ char *realname; /* real name of host */ #ifdef HAVE_RES_SEARCH int no_local_matches = FALSE; #endif /* HAVE_RES_SEARCH */ + int olderrs; sizeticker = 0; delete_ok = TRUE; remaining = len; + olderrs = ctl->errcount; /* read message headers */ headers = received_for = return_path = NULL; @@ -627,8 +627,18 @@ char *realname; /* real name of host */ #endif /* HAVE_RES_SEARCH */ save_str(&xmit_names, -1, ctl->localnames->id); - /* time to address the message */ - if (ctl->mda) /* we have a declared MDA */ + + /* + * Time to either address the message or decide we can't deliver it yet. + */ + if (ctl->errcount > olderrs) /* there were DNS errors above */ + { + delete_ok = FALSE; + sinkfp = (FILE *)NULL; + if (outlevel == O_VERBOSE) + error(0,0, "forwarding and deletion suppressed due to DNS errors"); + } + else if (ctl->mda) /* we have a declared MDA */ { int length = 0; char *names, *cmd; @@ -1045,6 +1055,7 @@ char *realname; /* real name of host */ if (SMTP_eom(sinkfp) != SM_OK) { error(0, 0, "SMTP listener refused delivery"); + ctl->errcount++; return(PS_TRANSIENT); } } @@ -1146,11 +1157,6 @@ const struct method *proto; /* protocol method table */ ctl->server.timeout, ctl->server.names->id); ok = PS_ERROR; } - else if (js == 2) - { - /* error message printed at point of longjmp */ - ok = PS_ERROR; - } else { char buf [POPBUFSIZE+1]; diff --git a/fetchmail.man b/fetchmail.man index 2546a800..ebc68127 100644 --- a/fetchmail.man +++ b/fetchmail.man @@ -464,13 +464,14 @@ The or --nodetach option suppresses detachment of the daemon process from its control terminal. This is primarily useful for debugging. .PP -Note that while running in daemon mode, transient errors (such as DNS -failures or sendmail delivery refusals) may force the fetchall -option on for the duration of the next polling cycle. +Note that while running in daemon mode polling a POP server, transient +errors (such as DNS failures or sendmail delivery refusals) may force +the fetchall option on for the duration of the next polling cycle. This is a robustness feature. It means that if a message is fetched -(and thus marked seen by the mailserver) but not delivered locally -due to some transient error, it will be re-fetched during the next -poll cycle. +(and thus marked seen by the mailserver) but not delivered locally due +to some transient error, it will be re-fetched during the next poll +cycle. (The IMAP logic doesn't delete messages until they're +delivered, so this problem does not arise.) .SH RETRIEVAL FAILURE MODES The protocols \fIfetchmail\fR uses to talk to mailservers are next to -- cgit v1.2.3