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;