From c33aee1667bd037068674bd354ffd0feb1d13de1 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 27 Apr 2011 13:07:49 +0200 Subject: treaded-resolver: better error messages Now use gai_strerror() to get proper error messages when getaddrinfo() has failed. Detect the function in configure. Code based on work and suggestions by Jeff Pohlmeyer and Guenter Knauf --- lib/asyn-thread.c | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) (limited to 'lib/asyn-thread.c') diff --git a/lib/asyn-thread.c b/lib/asyn-thread.c index be3b2b51e..689eb9583 100644 --- a/lib/asyn-thread.c +++ b/lib/asyn-thread.c @@ -64,6 +64,12 @@ #define in_addr_t unsigned long #endif +#ifdef HAVE_GETADDRINFO +# define RESOLVER_ENOMEM EAI_MEMORY +#else +# define RESOLVER_ENOMEM ENOMEM +#endif + #include "urldata.h" #include "sendf.h" #include "hostip.h" @@ -281,9 +287,9 @@ static unsigned int CURL_STDCALL getaddrinfo_thread (void *arg) rc = Curl_getaddrinfo_ex(tsd->hostname, service, &tsd->hints, &tsd->res); if(rc != 0) { - tsd->sock_error = SOCKERRNO; + tsd->sock_error = SOCKERRNO?SOCKERRNO:rc; if(tsd->sock_error == 0) - tsd->sock_error = ENOMEM; + tsd->sock_error = RESOLVER_ENOMEM; } Curl_mutex_acquire(tsd->mtx); @@ -307,7 +313,7 @@ static unsigned int CURL_STDCALL gethostbyname_thread (void *arg) if(!tsd->res) { tsd->sock_error = SOCKERRNO; if(tsd->sock_error == 0) - tsd->sock_error = ENOMEM; + tsd->sock_error = RESOLVER_ENOMEM; } Curl_mutex_acquire(tsd->mtx); @@ -355,7 +361,7 @@ static bool init_resolve_thread (struct connectdata *conn, const struct addrinfo *hints) { struct thread_data *td = calloc(1, sizeof(struct thread_data)); - int err = ENOMEM; + int err = RESOLVER_ENOMEM; conn->async.os_specific = (void*) td; if(!td) @@ -409,6 +415,24 @@ static bool init_resolve_thread (struct connectdata *conn, return FALSE; } +/* + * resolver_error() calls failf() with the appropriate message after a resolve + * error + */ + +static void resolver_error(struct connectdata *conn, const char *host_or_proxy) +{ + failf(conn->data, "Could not resolve %s: %s; %s", host_or_proxy, + conn->async.hostname, +#ifdef HAVE_GAI_STRERROR + /* NetWare doesn't have gai_strerror and on Windows it isn't deemed + thread-safe */ + gai_strerror(conn->async.status) +#else + Curl_strerror(conn, conn->async.status); +#endif + ); +} /* * Curl_resolver_wait_resolv() @@ -443,13 +467,11 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn, if(!conn->async.dns) { /* a name was not resolved */ if(conn->bits.httpproxy) { - failf(data, "Could not resolve proxy: %s; %s", - conn->async.hostname, Curl_strerror(conn, conn->async.status)); + resolver_error(conn, "proxy"); rc = CURLE_COULDNT_RESOLVE_PROXY; } else { - failf(data, "Could not resolve host: %s; %s", - conn->async.hostname, Curl_strerror(conn, conn->async.status)); + resolver_error(conn, "host"); rc = CURLE_COULDNT_RESOLVE_HOST; } } @@ -490,8 +512,7 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn, destroy_async_data(&conn->async); if(!conn->async.dns) { - failf(data, "Could not resolve host: %s; %s", - conn->host.name, Curl_strerror(conn, conn->async.status)); + resolver_error(conn, "host"); return CURLE_COULDNT_RESOLVE_HOST; } *entry = conn->async.dns; -- cgit v1.2.3