| 790 | } |
| 791 | |
| 792 | NetSocket Net::openConnectTo(const char *addressString) |
| 793 | { |
| 794 | if (Journal::IsPlaying()) |
| 795 | { |
| 796 | U32 ret; |
| 797 | Journal::Read(&ret); |
| 798 | return NetSocket::fromHandle(ret); |
| 799 | } |
| 800 | |
| 801 | NetAddress address; |
| 802 | NetSocket handleFd = NetSocket::INVALID; |
| 803 | Net::Error error = NoError; |
| 804 | |
| 805 | error = Net::stringToAddress(addressString, &address, false); |
| 806 | |
| 807 | if (error == NoError && address.type != NetAddress::IPAddress && address.type != NetAddress::IPV6Address) |
| 808 | { |
| 809 | error = Net::WrongProtocolType; |
| 810 | } |
| 811 | |
| 812 | if (error != NoError || error == NeedHostLookup) |
| 813 | { |
| 814 | handleFd = openSocket(); |
| 815 | } |
| 816 | |
| 817 | // Attempt to connect or queue a lookup |
| 818 | if (error == NoError && address.type == NetAddress::IPAddress) |
| 819 | { |
| 820 | sockaddr_in ipAddr; |
| 821 | NetAddressToIPSocket(&address, &ipAddr); |
| 822 | SOCKET socketFd = PlatformNetState::smReservedSocketList.activate(handleFd, AF_INET, false, true); |
| 823 | if (socketFd != InvalidSocketHandle) |
| 824 | { |
| 825 | setBlocking(handleFd, false); |
| 826 | if (::connect(socketFd, (struct sockaddr *)&ipAddr, sizeof(ipAddr)) == -1 && |
| 827 | errno != EINPROGRESS) |
| 828 | { |
| 829 | Con::errorf("Error connecting %s: %s", |
| 830 | addressString, strerror(errno)); |
| 831 | closeSocket(handleFd); |
| 832 | handleFd = NetSocket::INVALID; |
| 833 | } |
| 834 | } |
| 835 | else |
| 836 | { |
| 837 | PlatformNetState::smReservedSocketList.remove(handleFd); |
| 838 | handleFd = NetSocket::INVALID; |
| 839 | } |
| 840 | |
| 841 | if (handleFd != NetSocket::INVALID) |
| 842 | { |
| 843 | // add this socket to our list of polled sockets |
| 844 | addPolledSocket(handleFd, socketFd, PolledSocket::ConnectionPending); |
| 845 | } |
| 846 | } |
| 847 | else if (error == NoError && address.type == NetAddress::IPV6Address) |
| 848 | { |
| 849 | sockaddr_in6 ipAddr6; |
nothing calls this directly
no test coverage detected