Now uses sigsetjmp() and siglongjmp() to bail out from slow name lookups in
authorDaniel Stenberg <daniel@haxx.se>
Tue, 11 Jun 2002 15:10:18 +0000 (15:10 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 11 Jun 2002 15:10:18 +0000 (15:10 +0000)
case a timeout is set. This seems to work. God knows if it is good enough
or what kind of side-effects we introduce here and now.

I'll close my eyes and cross my fingers. Hard.

configure.in
lib/hostip.c
lib/url.c

index d83affc..409ae66 100644 (file)
@@ -56,26 +56,6 @@ dnl AC_PROG_INSTALL
 AC_PROG_MAKE_SET
 
 dnl ************************************************************
-dnl lame option to switch on debug options
-dnl
-AC_MSG_CHECKING([whether to enable debug options])
-AC_ARG_ENABLE(debug,
-[  --enable-debug      Enable pedantic debug options
-  --disable-debug      Disable debug options],
-[ case "$enableval" in
-  no)
-       AC_MSG_RESULT(no)
-       ;;
-  *)   AC_MSG_RESULT(yes)
-
-    CPPFLAGS="$CPPFLAGS -DMALLOCDEBUG"
-    CFLAGS="-W -Wall -Wwrite-strings -pedantic -Wundef -Wpointer-arith -Wcast-align -Wnested-externs -g" 
-       ;;
-  esac ],
-       AC_MSG_RESULT(no)
-)
-
-dnl ************************************************************
 dnl switch off particular protocols
 dnl
 AC_MSG_CHECKING([whether to support http])
@@ -623,7 +603,8 @@ AC_CHECK_HEADERS( \
         io.h \
         pwd.h \
         utime.h \
-        sys/utime.h
+        sys/utime.h \
+        setjmp.h
 )
 
 dnl Check for libz header
@@ -678,9 +659,23 @@ AC_CHECK_FUNCS( socket \
                 getpwuid \
                 geteuid \
                 dlopen \
-                utime
+                utime \
+                sigsetjmp
 )
 
+dnl sigsetjmp() might be a macro and no function so if it isn't found already
+dnl we make an extra check here!
+if test "$ac_cv_func_sigsetjmp" != "yes"; then
+  AC_MSG_CHECKING([for sigsetjmp defined as macro])
+  AC_TRY_LINK( [#include <setjmp.h>],
+               [sigjmp_buf jmpenv;
+                sigsetjmp(jmpenv, 1);],
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_SIGSETJMP),
+               AC_MSG_RESULT(no)
+               )
+fi
+
 dnl removed 'getpass' check on October 26, 2000
 
 if test "$ac_cv_func_select" != "yes"; then
@@ -704,6 +699,26 @@ dnl AC_PATH_PROG( RANLIB, ranlib, /usr/bin/ranlib,
 dnl   $PATH:/usr/bin/:/usr/local/bin )
 dnl AC_SUBST(RANLIB)
 
+dnl ************************************************************
+dnl lame option to switch on debug options
+dnl
+AC_MSG_CHECKING([whether to enable debug options])
+AC_ARG_ENABLE(debug,
+[  --enable-debug      Enable pedantic debug options
+  --disable-debug      Disable debug options],
+[ case "$enableval" in
+  no)
+       AC_MSG_RESULT(no)
+       ;;
+  *)   AC_MSG_RESULT(yes)
+
+    CPPFLAGS="$CPPFLAGS -DMALLOCDEBUG"
+    CFLAGS="-W -Wall -Wwrite-strings -pedantic -Wundef -Wpointer-arith -Wcast-align -Wnested-externs -g" 
+       ;;
+  esac ],
+       AC_MSG_RESULT(no)
+)
+
 AC_CONFIG_FILES([Makefile \
           docs/Makefile \
            docs/examples/Makefile \
index c6cd28b..84ced78 100644 (file)
 #endif
 #endif
 
+#ifdef HAVE_SETJMP_H
+#include <setjmp.h>
+#endif
+
 #include "urldata.h"
 #include "sendf.h"
 #include "hostip.h"
@@ -191,6 +195,11 @@ hostcache_prune(curl_hash *hostcache, int cache_timeout, int now)
   return (__v); \
 }
 
+#ifdef HAVE_SIGSETJMP
+/* Beware this is a global and unique instance */
+sigjmp_buf curl_jmpenv;
+#endif
+
 Curl_addrinfo *Curl_resolv(struct SessionHandle *data,
                            char *hostname,
                            int port)
@@ -201,6 +210,14 @@ Curl_addrinfo *Curl_resolv(struct SessionHandle *data,
   time_t now;
   char *bufp;
 
+#ifdef HAVE_SIGSETJMP
+  if(sigsetjmp(curl_jmpenv, 1) != 0) {
+    /* this is coming from a siglongjmp() */
+    failf(data, "name lookup time-outed");
+    return NULL;
+  }
+#endif
+
   /* If the host cache timeout is 0, we don't do DNS cach'ing
      so fall through */
   if (data->set.dns_cache_timeout == 0) {
index fc4529c..44c13cc 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
 #include <inet.h>
 #endif
 
+#ifdef HAVE_SETJMP_H
+#include <setjmp.h>
+#endif
+
 #ifndef HAVE_SELECT
 #error "We can't compile without select() support!"
 #endif
 #ifdef KRB4
 #include "security.h"
 #endif
+
 /* The last #include file should be: */
 #ifdef MALLOCDEBUG
 #include "memdebug.h"
@@ -143,6 +148,10 @@ RETSIGTYPE alarmfunc(int signal)
 {
   /* this is for "-ansi -Wall -pedantic" to stop complaining!   (rabe) */
   (void)signal;
+#ifdef HAVE_SIGSETJMP
+  extern sigjmp_buf curl_jmpenv;
+  siglongjmp(curl_jmpenv, 1);
+#endif
   return;
 }
 #endif