getaddrinfo() cleanups
This commit is contained in:
Родитель
9d066935e5
Коммит
5d9ae88f58
11
lib/ftp.c
11
lib/ftp.c
|
@ -906,7 +906,8 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||
2.1.X doesn't do*/
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_flags = AI_PASSIVE;
|
||||
if (getaddrinfo(hbuf, "0", &hints, &res))
|
||||
|
||||
if (getaddrinfo(hbuf, (char *)"0", &hints, &res))
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
|
||||
portsock = -1;
|
||||
|
@ -929,16 +930,15 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||
|
||||
break;
|
||||
}
|
||||
freeaddrinfo(res);
|
||||
if (portsock < 0) {
|
||||
failf(data, strerror(errno));
|
||||
freeaddrinfo(res);
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
|
||||
sslen = sizeof(ss);
|
||||
if (getsockname(portsock, sa, &sslen) < 0) {
|
||||
failf(data, strerror(errno));
|
||||
freeaddrinfo(res);
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
|
||||
|
@ -1047,7 +1047,6 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||
|
||||
if (!*modep) {
|
||||
sclose(portsock);
|
||||
freeaddrinfo(res);
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
/* we set the secondary socket variable to this for now, it
|
||||
|
@ -1134,7 +1133,7 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||
}
|
||||
if(hostdataptr)
|
||||
/* free the memory used for name lookup */
|
||||
free(hostdataptr);
|
||||
Curl_freeaddrinfo(hostdataptr);
|
||||
}
|
||||
else {
|
||||
failf(data, "could't find my own IP address (%s)", myhost);
|
||||
|
@ -1285,7 +1284,7 @@ CURLcode ftp_use_pasv(struct connectdata *conn)
|
|||
ftp_pasv_verbose(conn, conninfo, newhost, connectport);
|
||||
|
||||
if(hostdataptr)
|
||||
free(hostdataptr);
|
||||
Curl_freeaddrinfo(hostdataptr);
|
||||
|
||||
if(CURLE_OK != result)
|
||||
return result;
|
||||
|
|
60
lib/hostip.c
60
lib/hostip.c
|
@ -5,7 +5,7 @@
|
|||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* In order to be useful for every potential user, curl and libcurl are
|
||||
* dual-licensed under the MPL and the MIT/X-derivate licenses.
|
||||
|
@ -69,6 +69,58 @@
|
|||
/* --- resolve name or IP-number --- */
|
||||
|
||||
#ifdef ENABLE_IPV6
|
||||
|
||||
#ifdef MALLOCDEBUG
|
||||
/* These two are strictly for memory tracing and are using the same
|
||||
* style as the family otherwise present in memdebug.c. I put these ones
|
||||
* here since they require a bunch of struct types I didn't wanna include
|
||||
* in memdebug.c
|
||||
*/
|
||||
int curl_getaddrinfo(char *hostname, char *service,
|
||||
struct addrinfo *hints,
|
||||
struct addrinfo **result,
|
||||
int line, const char *source)
|
||||
{
|
||||
int res=(getaddrinfo)(hostname, service, hints, result);
|
||||
if(0 == res)
|
||||
/* success */
|
||||
fprintf(logfile?logfile:stderr, "ADDR %s:%d getaddrinfo() = %p\n",
|
||||
source, line, *result);
|
||||
else
|
||||
fprintf(logfile?logfile:stderr, "ADDR %s:%d getaddrinfo() failed\n",
|
||||
source, line);
|
||||
return res;
|
||||
}
|
||||
void curl_freeaddrinfo(struct addrinfo *freethis,
|
||||
int line, const char *source)
|
||||
{
|
||||
(freeaddrinfo)(freethis);
|
||||
fprintf(logfile?logfile:stderr, "ADDR %s:%d freeaddrinfo(%p)\n",
|
||||
source, line, freethis);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This is a wrapper function for freeing name information in a protocol
|
||||
* independent way. This takes care of using the appropriate underlaying
|
||||
* proper function.
|
||||
*/
|
||||
void Curl_freeaddrinfo(void *freethis)
|
||||
{
|
||||
#ifdef ENABLE_IPV6
|
||||
freeaddrinfo(freethis);
|
||||
#else
|
||||
free(freethis);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Return name information about the given hostname and port number. If
|
||||
* successful, the 'addrinfo' is returned and the forth argument will point to
|
||||
* memory we need to free after use. That meory *MUST* be freed with
|
||||
* Curl_freeaddrinfo(), nothing else.
|
||||
*/
|
||||
Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
||||
char *hostname,
|
||||
int port,
|
||||
|
@ -78,8 +130,6 @@ Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
|||
int error;
|
||||
char sbuf[NI_MAXSERV];
|
||||
|
||||
*bufp=NULL; /* pointer unused with IPv6 */
|
||||
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = PF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
|
@ -87,9 +137,11 @@ Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
|||
snprintf(sbuf, sizeof(sbuf), "%d", port);
|
||||
error = getaddrinfo(hostname, sbuf, &hints, &res);
|
||||
if (error) {
|
||||
infof(data, "getaddrinfo(3) failed for %s\n", hostname);
|
||||
infof(data, "getaddrinfo(3) failed for %s\n", hostname);
|
||||
return NULL;
|
||||
}
|
||||
*bufp=(char *)res; /* make it point to the result struct */
|
||||
|
||||
return res;
|
||||
}
|
||||
#else /* following code is IPv4-only */
|
||||
|
|
12
lib/hostip.h
12
lib/hostip.h
|
@ -27,9 +27,21 @@ struct addrinfo;
|
|||
struct hostent;
|
||||
struct SessionHandle;
|
||||
|
||||
/* Get name info */
|
||||
Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
||||
char *hostname,
|
||||
int port,
|
||||
char **bufp);
|
||||
/* free name info */
|
||||
void Curl_freeaddrinfo(void *freethis);
|
||||
|
||||
#ifdef MALLOCDEBUG
|
||||
void curl_freeaddrinfo(struct addrinfo *freethis,
|
||||
int line, const char *source);
|
||||
int curl_getaddrinfo(char *hostname, char *service,
|
||||
struct addrinfo *hints,
|
||||
struct addrinfo **result,
|
||||
int line, const char *source);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#include <memory.h>
|
||||
#endif
|
||||
|
||||
extern FILE *logfile;
|
||||
|
||||
/* memory functions */
|
||||
void *curl_domalloc(size_t size, int line, const char *source);
|
||||
void *curl_dorealloc(void *ptr, size_t size, int line, const char *source);
|
||||
|
@ -35,6 +37,11 @@ int curl_fclose(FILE *file, int line, const char *source);
|
|||
#define accept(sock,addr,len)\
|
||||
curl_accept(sock,addr,len,__LINE__,__FILE__)
|
||||
|
||||
#define getaddrinfo(host,serv,hint,res) \
|
||||
curl_getaddrinfo(host,serv,hint,res,__LINE__,__FILE__)
|
||||
#define freeaddrinfo(data) \
|
||||
curl_freeaddrinfo(data,__LINE__,__FILE__)
|
||||
|
||||
/* sclose is probably already defined, redefine it! */
|
||||
#undef sclose
|
||||
#define sclose(sockfd) curl_sclose(sockfd,__LINE__,__FILE__)
|
||||
|
|
|
@ -879,13 +879,8 @@ CURLcode Curl_disconnect(struct connectdata *conn)
|
|||
if(conn->proto.generic)
|
||||
free(conn->proto.generic);
|
||||
|
||||
#ifdef ENABLE_IPV6
|
||||
if(conn->hostaddr) /* host name info */
|
||||
freeaddrinfo(conn->hostaddr);
|
||||
#else
|
||||
if(conn->hostent_buf) /* host name info */
|
||||
free(conn->hostent_buf);
|
||||
#endif
|
||||
Curl_freeaddrinfo(conn->hostent_buf);
|
||||
|
||||
if(conn->newurl)
|
||||
free(conn->newurl);
|
||||
|
|
Загрузка…
Ссылка в новой задаче