emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Persistent failure to lookup hostname


From: Madhu
Subject: Re: Persistent failure to lookup hostname
Date: Tue, 04 Oct 2022 09:10:07 +0530

* Stefan Monnier <jwvfsg4v66f.fsf-monnier+emacs@gnu.org> :
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 <eggert@cs.ucla.edu>
|            AuthorDate: Mon Feb 29 09:39:45 2016 -0800
|            Commit:     Paul Eggert <eggert@cs.ucla.edu>
|            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

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 <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>]],
+    [[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 <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>]],
+      [[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 <arpa/nameser.h>
+#include <resolv.h>
+#endif
+
 #ifdef HAVE_UTIL_H
 #include <util.h>
 #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;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]