|
|
|
@ -41,7 +41,7 @@
|
|
|
|
|
# include <openssl/err.h> |
|
|
|
|
# include <openssl/x509v3.h> |
|
|
|
|
# if OPENSSL_VERSION_NUMBER < 0x10100000L \ |
|
|
|
|
|| (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x2070100fL) |
|
|
|
|
|| (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070100fL) |
|
|
|
|
# define X509_OBJECT_get0_X509(o) ((o)->data.x509) |
|
|
|
|
# define X509_STORE_get0_objects(o) ((o)->objs) |
|
|
|
|
# endif |
|
|
|
@ -430,6 +430,32 @@ socket_close_internal( conn_t *sock )
|
|
|
|
|
sock->fd = -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifndef HAVE_IPV6 |
|
|
|
|
struct addr_info { |
|
|
|
|
struct addr_info *ai_next; |
|
|
|
|
struct sockaddr_in ai_addr[1]; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
#define freeaddrinfo(ai) free( ai ) |
|
|
|
|
|
|
|
|
|
static struct addr_info * |
|
|
|
|
init_addrinfo( struct hostent *he ) |
|
|
|
|
{ |
|
|
|
|
uint naddr = 0; |
|
|
|
|
for (char **addr = he->h_addr_list; *addr; addr++) |
|
|
|
|
naddr++; |
|
|
|
|
struct addr_info *caddr = nfcalloc( naddr * sizeof(struct addrinfo) ); |
|
|
|
|
struct addr_info *ret, **caddrp = &ret; |
|
|
|
|
for (char **addr = he->h_addr_list; *addr; addr++, caddr++) { |
|
|
|
|
caddr->ai_addr->sin_family = AF_INET; |
|
|
|
|
memcpy( &caddr->ai_addr->sin_addr.s_addr, *addr, sizeof(struct in_addr) ); |
|
|
|
|
*caddrp = caddr; |
|
|
|
|
caddrp = &caddr->ai_next; |
|
|
|
|
} |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
socket_connect( conn_t *sock, void (*cb)( int ok, void *aux ) ) |
|
|
|
|
{ |
|
|
|
@ -479,8 +505,6 @@ socket_connect( conn_t *sock, void (*cb)( int ok, void *aux ) )
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
info( "\vok\n" ); |
|
|
|
|
|
|
|
|
|
sock->curr_addr = sock->addrs; |
|
|
|
|
#else |
|
|
|
|
struct hostent *he; |
|
|
|
|
|
|
|
|
@ -493,8 +517,9 @@ socket_connect( conn_t *sock, void (*cb)( int ok, void *aux ) )
|
|
|
|
|
} |
|
|
|
|
info( "\vok\n" ); |
|
|
|
|
|
|
|
|
|
sock->curr_addr = he->h_addr_list; |
|
|
|
|
sock->addrs = init_addrinfo( he ); |
|
|
|
|
#endif |
|
|
|
|
sock->curr_addr = sock->addrs; |
|
|
|
|
socket_connect_one( sock ); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -506,16 +531,10 @@ socket_connect_one( conn_t *sock )
|
|
|
|
|
#ifdef HAVE_IPV6 |
|
|
|
|
struct addrinfo *ai; |
|
|
|
|
#else |
|
|
|
|
struct { |
|
|
|
|
struct sockaddr_in ai_addr[1]; |
|
|
|
|
} ai[1]; |
|
|
|
|
struct addr_info *ai; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_IPV6 |
|
|
|
|
if (!(ai = sock->curr_addr)) { |
|
|
|
|
#else |
|
|
|
|
if (!*sock->curr_addr) { |
|
|
|
|
#endif |
|
|
|
|
error( "No working address found for %s\n", sock->conf->host ); |
|
|
|
|
socket_connect_bail( sock ); |
|
|
|
|
return; |
|
|
|
@ -532,11 +551,6 @@ socket_connect_one( conn_t *sock )
|
|
|
|
|
#endif |
|
|
|
|
{ |
|
|
|
|
struct sockaddr_in *in = ((struct sockaddr_in *)ai->ai_addr); |
|
|
|
|
#ifndef HAVE_IPV6 |
|
|
|
|
memset( in, 0, sizeof(*in) ); |
|
|
|
|
in->sin_family = AF_INET; |
|
|
|
|
in->sin_addr.s_addr = *((int *)*sock->curr_addr); |
|
|
|
|
#endif |
|
|
|
|
in->sin_port = htons( sock->conf->port ); |
|
|
|
|
nfasprintf( &sock->name, "%s (%s:%hu)", |
|
|
|
|
sock->conf->host, inet_ntoa( in->sin_addr ), sock->conf->port ); |
|
|
|
@ -579,11 +593,7 @@ socket_connect_next( conn_t *conn )
|
|
|
|
|
sys_error( "Cannot connect to %s", conn->name ); |
|
|
|
|
free( conn->name ); |
|
|
|
|
conn->name = 0; |
|
|
|
|
#ifdef HAVE_IPV6 |
|
|
|
|
conn->curr_addr = conn->curr_addr->ai_next; |
|
|
|
|
#else |
|
|
|
|
conn->curr_addr++; |
|
|
|
|
#endif |
|
|
|
|
socket_connect_one( conn ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -597,12 +607,10 @@ socket_connect_failed( conn_t *conn )
|
|
|
|
|
static void |
|
|
|
|
socket_connected( conn_t *conn ) |
|
|
|
|
{ |
|
|
|
|
#ifdef HAVE_IPV6 |
|
|
|
|
if (conn->addrs) { |
|
|
|
|
freeaddrinfo( conn->addrs ); |
|
|
|
|
conn->addrs = 0; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
conf_notifier( &conn->notify, 0, POLLIN ); |
|
|
|
|
socket_expect_read( conn, 0 ); |
|
|
|
|
conn->state = SCK_READY; |
|
|
|
@ -612,12 +620,10 @@ socket_connected( conn_t *conn )
|
|
|
|
|
static void |
|
|
|
|
socket_cleanup_names( conn_t *conn ) |
|
|
|
|
{ |
|
|
|
|
#ifdef HAVE_IPV6 |
|
|
|
|
if (conn->addrs) { |
|
|
|
|
freeaddrinfo( conn->addrs ); |
|
|
|
|
conn->addrs = 0; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
free( conn->name ); |
|
|
|
|
conn->name = 0; |
|
|
|
|
} |
|
|
|
|