From 6aee1918ce18f22aa93b62e58f3151c82cc00eb0 Mon Sep 17 00:00:00 2001 From: Matthias Andree Date: Fri, 8 Dec 2006 18:43:22 +0000 Subject: Call res_init() at the beginning of the poll, if the computer has res_search(). This is supposed to re-read /etc/resolv.conf in order to pick up changes made by dhcpcd, dhclient, pppd, openvpn or similar. To fix Debian Bug #389270 (DNS errors in daemon mode) and others. svn path=/branches/BRANCH_6-3/; revision=4986 --- NEWS | 6 ++++++ TODO.txt | 3 --- fetchmail.c | 21 +++++++++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 278c6f4f..142b0f22 100644 --- a/NEWS +++ b/NEWS @@ -79,6 +79,12 @@ fetchmail 6.3.6 (not yet released): * RPOP: The password is now shrouded in the local logs. * Robustness: If a stale lockfile cannot be deleted, truncate it to avoid trouble later if the PID is recycled by a non-fetchmail process. +* On systems that have res_search(), assume we also have res_init() and call it + (suggested by Ulrich Drepper, glibc bug #3675) in order to make libc or + libresolv reread the resolver configuration at the beginning of a poll cycle. + This is important when fetchmail is in daemon mode and /etc/resolv.conf is + changed later by dhcpcd, dhclient, pppd, openvpn or other ip-up/ipchange + scripts. Should fix Debian Bug#389270, Bug#391698. # TRANSLATIONS: * New en_GB (British English) translation by David Lodge. diff --git a/TODO.txt b/TODO.txt index 146fbffb..a282d2d0 100644 --- a/TODO.txt +++ b/TODO.txt @@ -5,9 +5,6 @@ Götz Nimrill's authenticate external patch. - check manpage/fetchmail.h and code which exit statuses are actually used and clean up -- does libresolv or libc (glibc) or something cache resolver - addresses??? If so, that's a severe bug in the resp. lib. - Debian Bug #389270 (perhaps related to #391698). 6.3.7: - more SMTP/LMTP error detail on message rejections even outside verbose mode. diff --git a/fetchmail.c b/fetchmail.c index 443b1feb..6a33c3d7 100644 --- a/fetchmail.c +++ b/fetchmail.c @@ -45,6 +45,11 @@ #include "i18n.h" #include "lock.h" +/* need these (and sys/types.h) for res_init() */ +#include +#include +#include + #ifndef ENETUNREACH #define ENETUNREACH 128 /* Interactive doesn't know this */ #endif /* ENETUNREACH */ @@ -669,6 +674,22 @@ int main(int argc, char **argv) sethostent(TRUE); /* use TCP/IP for mailserver queries */ #endif /* HAVE_RES_SEARCH */ +#ifdef HAVE_RES_SEARCH + /* Boldly assume that we also have res_init() if we have + * res_search(), and call res_init() to re-read the resolv.conf + * file, so that we can pick up changes to that file that are + * written by dhpccd, dhclient, pppd, openvpn and similar. */ + + /* NOTE: This assumes that /etc/resolv.conf is written + * atomically (i. e. a temporary file is written, flushed and + * then renamed into place). To fix Debian Bug#389270. */ + + /* NOTE: If this leaks memory or doesn't re-read + * /etc/resolv.conf, we're in trouble. The res_init() interface + * is only lightly documented :-( */ + res_init(); +#endif + activecount = 0; batchcount = 0; for (ctl = querylist; ctl; ctl = ctl->next) -- cgit v1.2.3