From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Madhu Newsgroups: gmane.emacs.devel Subject: Re: Persistent failure to lookup hostname Date: Tue, 04 Oct 2022 09:10:07 +0530 Message-ID: References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="38189"; mail-complaints-to="usenet@ciao.gmane.io" To: emacs-devel@gnu.org Cancel-Lock: sha1:h4jujki+NV9pawyvgqHTTPBt9sE= Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Tue Oct 04 07:26:53 2022 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ofaSD-0009of-7J for ged-emacs-devel@m.gmane-mx.org; Tue, 04 Oct 2022 07:26:53 +0200 Original-Received: from localhost ([::1]:44434 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ofaSB-0004UY-Fv for ged-emacs-devel@m.gmane-mx.org; Tue, 04 Oct 2022 01:26:51 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:40710) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ofYnB-0004n5-Av for emacs-devel@gnu.org; Mon, 03 Oct 2022 23:40:25 -0400 Original-Received: from ciao.gmane.io ([116.202.254.214]:41878) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ofYn5-0006I5-Jm for emacs-devel@gnu.org; Mon, 03 Oct 2022 23:40:24 -0400 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1ofYmz-00062y-AU for emacs-devel@gnu.org; Tue, 04 Oct 2022 05:40:13 +0200 X-Injected-Via-Gmane: http://gmane.org/ Received-SPF: pass client-ip=116.202.254.214; envelope-from=ged-emacs-devel@m.gmane-mx.org; helo=ciao.gmane.io X-Mailman-Approved-At: Tue, 04 Oct 2022 01:22:16 -0400 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:296834 Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit * Stefan Monnier : Wrote on Mon, 03 Oct 2022 19:44:29 -0400: > My Gnus session occasionally gets into a state where it insists that my > mail server's DNS name isn't found. I haven't yet managed to get close > to the source of the problem, in large part because I don't know how to > reproduce it. It seems to be associated with network failures (or > captive portals, which are basically purposefully broken networks). > > That a DNS lookup would fail while the network is having problem is of > course normal, but the problem is that the failure seems to persist "for > ever", or more specifically until I restart Emacs. E.g. the old Gnus > sessions will keep giving me a hostname error while at the very same > time all other processes on the system (Firefox, `host`, a fresh new > Emacs, you name it) have no problem finding the IP address of (and even > connecting to) the very same host. > > The last two times this occurred I tried to look a bit more into it, but > I realized that I don't know enough about how this works to know where > to look. > > The error itself is signaled by `make-network-process` and I suspect the > error is actually raised by the following piece of code (tho I couldn't > confirm it because I somehow ended up killing the process while trying to > attach GDB to it): > > msg = network_lookup_address_info_1 (host, portstring, &hints, &res); > if (!EQ (msg, Qt)) > error ("%s", SSDATA (msg)); > > Looking at `network_lookup_address_info_1` it seems it doesn't do much > more than call `getaddrinfo` (I couldn't copy&paste the actual error > message but it basically contains my host name plus some error message > in French, which seems consistent with an error message taken straight > from `gai_strerror`). > > Does anyone here have an idea why `getaddrinfo` might return an outdated > error, or whether it could come from elsewhere? Or how/where I might > find a kind of DNS cache that would be process-local rather > than systemwide? * commit: commit 93bf7d52841c60ffc10e0c9c789a7987812ce55e | Author: Paul Eggert | AuthorDate: Mon Feb 29 09:39:45 2016 -0800 | Commit: Paul Eggert | CommitDate: Mon Feb 29 09:40:58 2016 -0800 | | Stop calling res_init | | Emacs shouldn’t need to call res_init any more, now that nscd or | equivalent is everywhere. On modern systems, calling res_init simply | slows Emacs down. On ancient systems lacking nscd Emacs will still | work well enough with this change; it’s just that it won’t respond to | changes in /etc/resolv.conf Perhaps the expected results result from changes to resolv.conf, and you aren't running glibc's nscd (I don't because it generates a lot of bogus traffic) The attached patch reverts that commit and reinstates res_init, maybe you could try it to see if it helps --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=reinstate_res_init.patch Content-Description: reinstate res_init diff --git a/admin/CPP-DEFINES b/admin/CPP-DEFINES index 06986ec8f48..a9860608076 100644 --- a/admin/CPP-DEFINES +++ b/admin/CPP-DEFINES @@ -236,6 +236,7 @@ HAVE_RANDOM HAVE_READLINK HAVE_READLINKAT HAVE_RECVFROM +HAVE_RES_INIT HAVE_RINT HAVE_RSVG HAVE_SELECT diff --git a/configure.ac b/configure.ac index 4590ed3506e..38530f19ed3 100644 --- a/configure.ac +++ b/configure.ac @@ -5167,13 +5167,44 @@ AC_DEFUN [emacs_cv_alternate_stack=yes], [emacs_cv_alternate_stack=no])]) +# Do we have res_init, for detecting changes in /etc/resolv.conf? +# On Darwin, res_init appears not to be useful: see bug#562 and +# http://lists.gnu.org/archive/html/emacs-devel/2007-11/msg01467.html +resolv=no + +if test $opsys != darwin; then + + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include +#include +#include ]], + [[return res_init();]])], + have_res_init=yes, have_res_init=no) + if test "$have_res_init" = no; then + OLIBS="$LIBS" + LIBS="$LIBS -lresolv" + AC_MSG_CHECKING(for res_init with -lresolv) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include +#include +#include ]], + [[return res_init();]])], + have_res_init=yes, have_res_init=no) + AC_MSG_RESULT($have_res_init) + if test "$have_res_init" = yes ; then + resolv=yes + fi + LIBS="$OLIBS" + fi + + if test "$have_res_init" = yes; then + AC_DEFINE(HAVE_RES_INIT, 1, [Define to 1 if res_init is available.]) + fi +fi dnl !darwin + # Do we need the Hesiod library to provide the support routines? dnl FIXME? Should we be skipping this on Darwin too? LIBHESIOD= -LIBRESOLV= if test "$with_hesiod" != no ; then # Don't set $LIBS here -- see comments above. FIXME which comments? - resolv=no AC_CHECK_FUNC([res_send], [], [AC_CHECK_FUNC([__res_send], [], [AC_CHECK_LIB([resolv], [res_send], [resolv=yes], [AC_CHECK_LIB([resolv], [__res_send], [resolv=yes])])])]) @@ -5189,10 +5220,16 @@ AC_DEFUN if test x"$hesiod" = xyes; then LIBHESIOD=-lhesiod - LIBRESOLV=$RESOLVLIB fi fi AC_SUBST([LIBHESIOD]) + +# Do we need libresolv (due to res_init or Hesiod)? +if test "$resolv" = yes && test $opsys != darwin; then + LIBRESOLV=-lresolv +else + LIBRESOLV= +fi AC_SUBST([LIBRESOLV]) # These tell us which Kerberos-related libraries to use. diff --git a/src/Makefile.in b/src/Makefile.in index 1f941874ea8..e0375b43205 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -331,6 +331,9 @@ CM_OBJ= LIBGPM = @LIBGPM@ +## -lresolv, or empty. +LIBRESOLV = @LIBRESOLV@ + LIBSELINUX_LIBS = @LIBSELINUX_LIBS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ @@ -559,7 +562,7 @@ LIBES = $(LIB_EACCESS) $(LIB_TIMER_TIME) $(DBUS_LIBS) \ $(LIB_EXECINFO) $(XRANDR_LIBS) $(XINERAMA_LIBS) $(XFIXES_LIBS) \ $(XDBE_LIBS) $(XSYNC_LIBS) \ - $(LIBXML2_LIBS) $(LIBGPM) $(LIBS_SYSTEM) $(CAIRO_LIBS) \ + $(LIBXML2_LIBS) $(LIBGPM) $(LIBRESILV) $(LIBS_SYSTEM) $(CAIRO_LIBS) \ $(LIBS_TERMCAP) $(GETLOADAVG_LIBS) $(SETTINGS_LIBS) $(LIBSELINUX_LIBS) \ $(FREETYPE_LIBS) $(FONTCONFIG_LIBS) $(HARFBUZZ_LIBS) $(LIBOTF_LIBS) $(M17N_FLT_LIBS) \ $(LIBGNUTLS_LIBS) $(LIB_PTHREAD) $(GETADDRINFO_A_LIBS) $(LCMS2_LIBS) \ diff --git a/src/process.c b/src/process.c index 9dfb98d8f38..8e4a27fd16b 100644 --- a/src/process.c +++ b/src/process.c @@ -83,6 +83,11 @@ #define HAVE_LOCAL_SOCKETS #endif +#ifdef HAVE_RES_INIT +#include +#include +#endif + #ifdef HAVE_UTIL_H #include #endif @@ -4137,6 +4142,9 @@ DEFUN ("make-network-process", Fmake_network_process, Smake_network_process, strcpy (req->str, SSDATA (host)); strcpy (req->str + hostlen + 1, portstring); +#ifdef HAVE_RES_INIT + res_init (); +#endif int ret = getaddrinfo_a (GAI_NOWAIT, &dns_request, 1, NULL); if (ret) error ("%s/%s getaddrinfo_a error %d", @@ -4157,6 +4165,10 @@ DEFUN ("make-network-process", Fmake_network_process, Smake_network_process, maybe_quit (); +#ifdef HAVE_RES_INIT + res_init (); +#endif + struct addrinfo hints; memset (&hints, 0, sizeof hints); hints.ai_family = family; --=-=-=--