diff options
author | Daniel Stenberg <daniel@haxx.se> | 2002-06-11 15:10:18 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2002-06-11 15:10:18 +0000 |
commit | 3c49b405de4fbf1fd7127f91908261268640e54f (patch) | |
tree | 935a71bd0bfc907bd5046fdb84e2f48ea3795465 /lib/hostip.c | |
parent | 4cfffd6c4a50df7de82bfcaa2c0466be07801290 (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.
Diffstat (limited to 'lib/hostip.c')
-rw-r--r-- | lib/hostip.c | 17 |
1 files changed, 17 insertions, 0 deletions
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) { |