Curl_addrinfo?_callback() and addrinfo_callback() now returns

CURLE_OK or CURLE_OUT_OF_MEMORY.
Add typecast in hostares.c.
This commit is contained in:
Gisle Vanem
2005-02-08 12:36:13 +00:00
parent 82b93e4945
commit d118312922
4 changed files with 38 additions and 32 deletions

View File

@@ -291,7 +291,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
/* areschannel is already setup in the Curl_open() function */ /* areschannel is already setup in the Curl_open() function */
ares_gethostbyname(data->state.areschannel, hostname, PF_INET, ares_gethostbyname(data->state.areschannel, hostname, PF_INET,
Curl_addrinfo4_callback, conn); (ares_callback)Curl_addrinfo4_callback, conn);
*waitp = TRUE; /* please wait for the response */ *waitp = TRUE; /* please wait for the response */
} }

View File

@@ -108,12 +108,13 @@
* *
* The storage operation locks and unlocks the DNS cache. * The storage operation locks and unlocks the DNS cache.
*/ */
static void addrinfo_callback(void *arg, /* "struct connectdata *" */ static CURLcode addrinfo_callback(void *arg, /* "struct connectdata *" */
int status, int status,
void *addr) void *addr)
{ {
struct connectdata *conn = (struct connectdata *)arg; struct connectdata *conn = (struct connectdata *)arg;
struct Curl_dns_entry *dns = NULL; struct Curl_dns_entry *dns = NULL;
CURLcode rc = CURLE_OK;
conn->async.status = status; conn->async.status = status;
@@ -135,13 +136,17 @@ static void addrinfo_callback(void *arg, /* "struct connectdata *" */
dns = Curl_cache_addr(data, ai, dns = Curl_cache_addr(data, ai,
conn->async.hostname, conn->async.hostname,
conn->async.port); conn->async.port);
if(!dns) if(!dns) {
/* failed to store, cleanup and return error */ /* failed to store, cleanup and return error */
Curl_freeaddrinfo(ai); Curl_freeaddrinfo(ai);
rc = CURLE_OUT_OF_MEMORY;
}
if(data->share) if(data->share)
Curl_share_unlock(data, CURL_LOCK_DATA_DNS); Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
} }
else
rc = CURLE_OUT_OF_MEMORY;
} }
conn->async.dns = dns; conn->async.dns = dns;
@@ -153,21 +158,22 @@ static void addrinfo_callback(void *arg, /* "struct connectdata *" */
/* ipv4: The input hostent struct will be freed by ares when we return from /* ipv4: The input hostent struct will be freed by ares when we return from
this function */ this function */
return rc;
} }
void Curl_addrinfo4_callback(void *arg, /* "struct connectdata *" */ CURLcode Curl_addrinfo4_callback(void *arg, /* "struct connectdata *" */
int status, int status,
struct hostent *hostent) struct hostent *hostent)
{ {
addrinfo_callback(arg, status, hostent); return addrinfo_callback(arg, status, hostent);
} }
#ifdef CURLRES_IPV6 #ifdef CURLRES_IPV6
void Curl_addrinfo6_callback(void *arg, /* "struct connectdata *" */ CURLcode Curl_addrinfo6_callback(void *arg, /* "struct connectdata *" */
int status, int status,
struct addrinfo *ai) struct addrinfo *ai)
{ {
addrinfo_callback(arg, status, ai); return addrinfo_callback(arg, status, ai);
} }
#endif #endif

View File

@@ -199,14 +199,14 @@ int curl_dogetnameinfo(const struct sockaddr *sa, socklen_t salen,
/* This is the callback function that is used when we build with asynch /* This is the callback function that is used when we build with asynch
resolve, ipv4 */ resolve, ipv4 */
void Curl_addrinfo4_callback(void *arg, CURLcode Curl_addrinfo4_callback(void *arg,
int status, int status,
struct hostent *hostent); struct hostent *hostent);
/* This is the callback function that is used when we build with asynch /* This is the callback function that is used when we build with asynch
resolve, ipv6 */ resolve, ipv6 */
void Curl_addrinfo6_callback(void *arg, CURLcode Curl_addrinfo6_callback(void *arg,
int status, int status,
struct addrinfo *ai); struct addrinfo *ai);
/* [ipv4 only] Creates a Curl_addrinfo struct from a numerical-only IP /* [ipv4 only] Creates a Curl_addrinfo struct from a numerical-only IP

View File

@@ -190,7 +190,7 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
curr_proc, &mutex_waiting, 0, FALSE, curr_proc, &mutex_waiting, 0, FALSE,
DUPLICATE_SAME_ACCESS)) { DUPLICATE_SAME_ACCESS)) {
/* failed to duplicate the mutex, no point in continuing */ /* failed to duplicate the mutex, no point in continuing */
return 0; return -1;
} }
/* Sharing the same _iob[] element with our parent thread should /* Sharing the same _iob[] element with our parent thread should
@@ -214,12 +214,10 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
SetEvent(td->event_resolved); SetEvent(td->event_resolved);
if (he) { if (he) {
Curl_addrinfo4_callback(conn, CURL_ASYNC_SUCCESS, he); rc = Curl_addrinfo4_callback(conn, CURL_ASYNC_SUCCESS, he);
rc = 1;
} }
else { else {
Curl_addrinfo4_callback(conn, (int)WSAGetLastError(), NULL); rc = Curl_addrinfo4_callback(conn, (int)WSAGetLastError(), NULL);
rc = 0;
} }
TRACE(("Winsock-error %d, addr %s\n", conn->async.status, TRACE(("Winsock-error %d, addr %s\n", conn->async.status,
he ? inet_ntoa(*(struct in_addr*)he->h_addr) : "unknown")); he ? inet_ntoa(*(struct in_addr*)he->h_addr) : "unknown"));
@@ -260,7 +258,7 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
curr_proc, &mutex_waiting, 0, FALSE, curr_proc, &mutex_waiting, 0, FALSE,
DUPLICATE_SAME_ACCESS)) { DUPLICATE_SAME_ACCESS)) {
/* failed to duplicate the mutex, no point in continuing */ /* failed to duplicate the mutex, no point in continuing */
return 0; return -1;
} }
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
@@ -286,10 +284,10 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
#ifdef DEBUG_THREADING_GETADDRINFO #ifdef DEBUG_THREADING_GETADDRINFO
dump_addrinfo (conn, res); dump_addrinfo (conn, res);
#endif #endif
Curl_addrinfo6_callback(conn, CURL_ASYNC_SUCCESS, res); rc = Curl_addrinfo6_callback(conn, CURL_ASYNC_SUCCESS, res);
} }
else { else {
Curl_addrinfo6_callback(conn, (int)WSAGetLastError(), NULL); rc = Curl_addrinfo6_callback(conn, (int)WSAGetLastError(), NULL);
TRACE(("Winsock-error %d, no address\n", conn->async.status)); TRACE(("Winsock-error %d, no address\n", conn->async.status));
} }
} }
@@ -493,7 +491,11 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
if (!conn->async.dns) { if (!conn->async.dns) {
/* a name was not resolved */ /* a name was not resolved */
if (td->thread_status == (DWORD)-1 || conn->async.status == NO_DATA) { if (td->thread_status == CURLE_OUT_OF_MEMORY) {
rc = CURLE_OUT_OF_MEMORY;
failf(data, "Could not resolve host: %s", curl_easy_strerror(rc));
}
else if (td->thread_status == (DWORD)-1 || conn->async.status == NO_DATA) {
failf(data, "Resolving host timed out: %s", conn->host.name); failf(data, "Resolving host timed out: %s", conn->host.name);
rc = CURLE_OPERATION_TIMEDOUT; rc = CURLE_OPERATION_TIMEDOUT;
} }
@@ -508,10 +510,8 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
destroy_thread_data(&conn->async); destroy_thread_data(&conn->async);
if(CURLE_OK != rc) if(!conn->async.dns)
/* close the connection, since we must not return failure from here conn->bits.close = TRUE;
without cleaning up this connection properly */
Curl_disconnect(conn);
return (rc); return (rc);
} }