in network/OpenSSL/OpenSSLConnection.cpp [208:286]
ResponseCode OpenSSLConnection::ConnectTCPSocket() {
const char *endpoint_char = endpoint_.c_str();
if (nullptr == endpoint_char) {
AWS_LOG_ERROR(OPENSSL_WRAPPER_LOG_TAG, "Hostname was null or empty.");
return ResponseCode::NETWORK_TCP_NO_ENDPOINT_SPECIFIED;
}
#ifndef WIN32
if (res_init() == -1) {
AWS_LOG_ERROR(OPENSSL_WRAPPER_LOG_TAG, "DNS initialize error");
}
#endif
sockaddr_in dest_addr{};
sockaddr_in6 dest_addr6{};
void *addressPointer = nullptr;
if (address_family_ == AF_INET6) {
memset(&dest_addr6, 0, sizeof(struct sockaddr_in6));
dest_addr6.sin6_family = AF_INET6;
dest_addr6.sin6_port = htons(endpoint_port_);
} else {
memset(&(dest_addr.sin_zero), '\0', 8);
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(endpoint_port_);
}
//gethostbyname is not to be used anymore.
struct addrinfo hints{}, *result_add, *iterator;
memset(&hints, 0, sizeof(hints));
hints.ai_family = address_family_;
int error = getaddrinfo(endpoint_char, nullptr, &hints, &result_add);
if ((error != 0) || (result_add == nullptr)) {
// found no ip address for the server
AWS_LOG_ERROR(OPENSSL_WRAPPER_LOG_TAG, "Error resolving hostname: %i", error);
return ResponseCode::NETWORK_TCP_UNKNOWN_HOST;
}
// getaddrinfo can return multiple ip addresses.
iterator = result_add;
int connect_status;
do {
// init structs for address data
socklen_t socketLength;
sockaddr *sock_addr;
// add the address to the service used.
if (address_family_ == AF_INET6) {
dest_addr6.sin6_addr = ((struct sockaddr_in6 *) (iterator->ai_addr))->sin6_addr;
sock_addr = reinterpret_cast<sockaddr *>(&dest_addr6);
socketLength = sizeof(dest_addr6);
addressPointer = &dest_addr6.sin6_addr;
} else {
dest_addr.sin_addr.s_addr =
((struct sockaddr_in *) (iterator->ai_addr))->sin_addr.s_addr;//set ip address
sock_addr = reinterpret_cast<sockaddr *>(&dest_addr);
socketLength = sizeof(dest_addr);
addressPointer = &dest_addr.sin_addr;
}
char straddr[INET6_ADDRSTRLEN];
inet_ntop(address_family_, addressPointer, straddr, sizeof(straddr));
AWS_LOG_INFO(OPENSSL_WRAPPER_LOG_TAG, "resolved %s to %s", endpoint_.c_str(), straddr);
connect_status = connect(server_tcp_socket_fd_, sock_addr, socketLength);
iterator = iterator->ai_next; //next value in address array
} while (connect_status == -1 && iterator != nullptr);
// free address info
freeaddrinfo(result_add);
if (-1 != connect_status) {
return ResponseCode::SUCCESS;
}
AWS_LOG_ERROR(OPENSSL_WRAPPER_LOG_TAG, "connect - %s", strerror(errno));
return ResponseCode::NETWORK_TCP_CONNECT_ERROR;
}