in platform/posix/transport/src/sockets_posix.c [62:143]
static SocketStatus_t resolveHostName( const char * pHostName,
size_t hostNameLength,
struct addrinfo ** pListHead );
/**
* @brief Traverse list of DNS records until a connection is established.
*
* @param[in] pListHead List containing resolved DNS records.
* @param[in] pHostName Server host name.
* @param[in] hostNameLength Length associated with host name.
* @param[in] port Server port in host-order.
* @param[out] pTcpSocket The output parameter to return the created socket.
*
* @return #SOCKETS_SUCCESS if successful; #SOCKETS_CONNECT_FAILURE on error.
*/
static SocketStatus_t attemptConnection( struct addrinfo * pListHead,
const char * pHostName,
size_t hostNameLength,
uint16_t port,
int32_t * pTcpSocket );
/**
* @brief Connect to server using the provided address record.
*
* @param[in, out] pAddrInfo Address record of the server.
* @param[in] port Server port in host-order.
* @param[in] pTcpSocket Socket handle.
*
* @return #SOCKETS_SUCCESS if successful; #SOCKETS_CONNECT_FAILURE on error.
*/
static SocketStatus_t connectToAddress( struct sockaddr * pAddrInfo,
uint16_t port,
int32_t tcpSocket );
/**
* @brief Log possible error using errno and return appropriate status.
*
* @param[in] errorNumber Error number.
*
* @return #SOCKETS_API_ERROR, #SOCKETS_INSUFFICIENT_MEMORY, #SOCKETS_INVALID_PARAMETER on error.
*/
static SocketStatus_t retrieveError( int32_t errorNumber );
/*-----------------------------------------------------------*/
static SocketStatus_t resolveHostName( const char * pHostName,
size_t hostNameLength,
struct addrinfo ** pListHead )
{
SocketStatus_t returnStatus = SOCKETS_SUCCESS;
int32_t dnsStatus = -1;
struct addrinfo hints;
assert( pHostName != NULL );
assert( hostNameLength > 0 );
/* Unused parameter. These parameters are used only for logging. */
( void ) hostNameLength;
/* Add hints to retrieve only TCP sockets in getaddrinfo. */
( void ) memset( &hints, 0, sizeof( hints ) );
/* Address family of either IPv4 or IPv6. */
hints.ai_family = AF_UNSPEC;
/* TCP Socket. */
hints.ai_socktype = ( int32_t ) SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
/* Perform a DNS lookup on the given host name. */
dnsStatus = getaddrinfo( pHostName, NULL, &hints, pListHead );
if( dnsStatus != 0 )
{
LogError( ( "Failed to resolve DNS: Hostname=%.*s, ErrorCode=%d.\n",
( int32_t ) hostNameLength,
pHostName,
dnsStatus ) );
returnStatus = SOCKETS_DNS_FAILURE;
}
return returnStatus;
}