ResponseCode OpenSSLConnection::ConnectTCPSocket()

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;
        }