| 732 | } |
| 733 | |
| 734 | NetSocket Net::openConnectTo(const char *addressString) |
| 735 | { |
| 736 | if (Journal::IsPlaying()) |
| 737 | { |
| 738 | U32 ret; |
| 739 | Journal::Read(&ret); |
| 740 | return NetSocket::fromHandle(ret); |
| 741 | } |
| 742 | |
| 743 | NetAddress address; |
| 744 | NetSocket handleFd = NetSocket::INVALID; |
| 745 | Net::Error error = NoError; |
| 746 | |
| 747 | error = Net::stringToAddress(addressString, &address, false); |
| 748 | |
| 749 | if (error == NoError && address.type != NetAddress::IPAddress && address.type != NetAddress::IPV6Address) |
| 750 | { |
| 751 | error = Net::WrongProtocolType; |
| 752 | } |
| 753 | |
| 754 | // Open socket |
| 755 | if (error == NoError || error == NeedHostLookup) |
| 756 | { |
| 757 | handleFd = openSocket(); |
| 758 | } |
| 759 | |
| 760 | // Attempt to connect or queue a lookup |
| 761 | if (error == NoError && address.type == NetAddress::IPAddress) |
| 762 | { |
| 763 | sockaddr_in ipAddr; |
| 764 | NetAddressToIPSocket(&address, &ipAddr); |
| 765 | SOCKET socketFd = PlatformNetState::smReservedSocketList.activate(handleFd, AF_INET, false, true); |
| 766 | if (socketFd != InvalidSocketHandle) |
| 767 | { |
| 768 | setBlocking(handleFd, false); |
| 769 | if (::connect(socketFd, (struct sockaddr *)&ipAddr, sizeof(ipAddr)) == -1) |
| 770 | { |
| 771 | Net::Error err = PlatformNetState::getLastError(); |
| 772 | if (err != Net::WouldBlock) |
| 773 | { |
| 774 | Con::errorf("Error connecting to %s: %u", |
| 775 | addressString, err); |
| 776 | closeSocket(handleFd); |
| 777 | handleFd = NetSocket::INVALID; |
| 778 | } |
| 779 | } |
| 780 | } |
| 781 | else |
| 782 | { |
| 783 | PlatformNetState::smReservedSocketList.remove(handleFd); |
| 784 | handleFd = NetSocket::INVALID; |
| 785 | } |
| 786 | |
| 787 | if (handleFd != NetSocket::INVALID) |
| 788 | { |
| 789 | // add this socket to our list of polled sockets |
| 790 | addPolledSocket(handleFd, socketFd, PolledSocket::ConnectionPending); |
| 791 | } |
nothing calls this directly
no test coverage detected