mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-03-12 20:27:19 +00:00
FS-4003 --resolve add IPv6 support to ESL client library, thanks to Steven Ayre
This commit is contained in:
parent
5bc9fa8a66
commit
3c249b012e
@ -916,6 +916,8 @@ ESL_DECLARE(esl_status_t) esl_connect_timeout(esl_handle_t *handle, const char *
|
|||||||
int rval = 0;
|
int rval = 0;
|
||||||
const char *hval;
|
const char *hval;
|
||||||
struct addrinfo hints = { 0 }, *result;
|
struct addrinfo hints = { 0 }, *result;
|
||||||
|
struct sockaddr_in *sockaddr_in;
|
||||||
|
struct sockaddr_in6 *sockaddr_in6;
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
int fd_flags = 0;
|
int fd_flags = 0;
|
||||||
#else
|
#else
|
||||||
@ -936,27 +938,36 @@ ESL_DECLARE(esl_status_t) esl_connect_timeout(esl_handle_t *handle, const char *
|
|||||||
if (!handle->packet_buf) {
|
if (!handle->packet_buf) {
|
||||||
esl_buffer_create(&handle->packet_buf, BUF_CHUNK, BUF_START, 0);
|
esl_buffer_create(&handle->packet_buf, BUF_CHUNK, BUF_START, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
handle->sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
|
||||||
|
|
||||||
if (handle->sock == ESL_SOCK_INVALID) {
|
|
||||||
snprintf(handle->err, sizeof(handle->err), "Socket Error");
|
|
||||||
return ESL_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
hints.ai_family = AF_INET;
|
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
|
||||||
if (getaddrinfo(host, NULL, &hints, &result)) {
|
if (getaddrinfo(host, NULL, &hints, &result)) {
|
||||||
strncpy(handle->err, "Cannot resolve host", sizeof(handle->err));
|
strncpy(handle->err, "Cannot resolve host", sizeof(handle->err));
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(&handle->sockaddr, result->ai_addr, sizeof(handle->sockaddr));
|
memcpy(&handle->sockaddr, result->ai_addr, sizeof(handle->sockaddr));
|
||||||
handle->sockaddr.sin_family = AF_INET;
|
switch(handle->sockaddr.ss_family) {
|
||||||
handle->sockaddr.sin_port = htons(port);
|
case AF_INET:
|
||||||
|
sockaddr_in = (struct sockaddr_in*)&(handle->sockaddr);
|
||||||
|
sockaddr_in->sin_port = htons(port);
|
||||||
|
break;
|
||||||
|
case AF_INET6:
|
||||||
|
sockaddr_in6 = (struct sockaddr_in6*)&(handle->sockaddr);
|
||||||
|
sockaddr_in6->sin6_port = htons(port);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
strncpy(handle->err, "Host resolves to unsupported address family", sizeof(handle->err));
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
freeaddrinfo(result);
|
freeaddrinfo(result);
|
||||||
|
|
||||||
|
handle->sock = socket(handle->sockaddr.ss_family, SOCK_STREAM, IPPROTO_TCP);
|
||||||
|
|
||||||
|
if (handle->sock == ESL_SOCK_INVALID) {
|
||||||
|
snprintf(handle->err, sizeof(handle->err), "Socket Error");
|
||||||
|
return ESL_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
if (timeout) {
|
if (timeout) {
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
@ -288,7 +288,7 @@ typedef enum {
|
|||||||
/*! \brief A handle that will hold the socket information and
|
/*! \brief A handle that will hold the socket information and
|
||||||
different events received. */
|
different events received. */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct sockaddr_in sockaddr;
|
struct sockaddr_storage sockaddr;
|
||||||
struct hostent hostent;
|
struct hostent hostent;
|
||||||
char hostbuf[256];
|
char hostbuf[256];
|
||||||
esl_socket_t sock;
|
esl_socket_t sock;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user