aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2002-06-11 15:10:18 +0000
committerDaniel Stenberg <daniel@haxx.se>2002-06-11 15:10:18 +0000
commit3c49b405de4fbf1fd7127f91908261268640e54f (patch)
tree935a71bd0bfc907bd5046fdb84e2f48ea3795465
parent4cfffd6c4a50df7de82bfcaa2c0466be07801290 (diff)
Now uses sigsetjmp() and siglongjmp() to bail out from slow name lookups in
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.
-rw-r--r--configure.in59
-rw-r--r--lib/hostip.c17
-rw-r--r--lib/url.c9
3 files changed, 63 insertions, 22 deletions
diff --git a/configure.in b/configure.in
index d83affc37..409ae66e5 100644
--- a/configure.in
+++ b/configure.in
@@ -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 \
diff --git a/lib/hostip.c b/lib/hostip.c
index c6cd28b75..84ced78de 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -56,6 +56,10 @@
#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) {
diff --git a/lib/url.c b/lib/url.c
index fc4529c8e..44c13ccb1 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -72,6 +72,10 @@
#include <inet.h>
#endif
+#ifdef HAVE_SETJMP_H
+#include <setjmp.h>
+#endif
+
#ifndef HAVE_SELECT
#error "We can't compile without select() support!"
#endif
@@ -120,6 +124,7 @@
#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