diff options
author | rubidium <rubidium@openttd.org> | 2009-04-03 00:33:00 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2009-04-03 00:33:00 +0000 |
commit | ba5aafb9bba4887b502dba32e56747fe10af604e (patch) | |
tree | aed246d3f133b865c118d25907878c21f972bbf4 /src/network/core/address.cpp | |
parent | c7b6469dabe5018775d075bee0a5293175024b42 (diff) | |
download | openttd-ba5aafb9bba4887b502dba32e56747fe10af604e.tar.xz |
(svn r15921) -Fix: some OSes don't like sizeof(sockaddr_storage) but want sizeof(sockaddr) or whatever is 'valid' for the given protocol
Diffstat (limited to 'src/network/core/address.cpp')
-rw-r--r-- | src/network/core/address.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/network/core/address.cpp b/src/network/core/address.cpp index 28ab98887..c1313fe74 100644 --- a/src/network/core/address.cpp +++ b/src/network/core/address.cpp @@ -15,8 +15,10 @@ const char *NetworkAddress::GetHostname() { if (this->hostname == NULL) { + assert(this->address_length != 0); + char buf[NETWORK_HOSTNAME_LENGTH] = { '\0' }; - getnameinfo((struct sockaddr *)&this->address, sizeof(this->address), buf, sizeof(buf), NULL, 0, NI_NUMERICHOST); + getnameinfo((struct sockaddr *)&this->address, this->address_length, buf, sizeof(buf), NULL, 0, NI_NUMERICHOST); this->hostname = strdup(buf); } return this->hostname; @@ -56,9 +58,9 @@ const char *NetworkAddress::GetAddressAsString() const sockaddr_storage *NetworkAddress::GetAddress() { - if (!this->resolved) { + if (!this->IsResolved()) { ((struct sockaddr_in *)&this->address)->sin_addr.s_addr = NetworkResolveHost(this->hostname); - this->resolved = true; + this->address_length = sizeof(sockaddr); } return &this->address; } @@ -90,11 +92,18 @@ SOCKET NetworkAddress::Connect() if (!SetNoDelay(sock)) DEBUG(net, 1, "Setting TCP_NODELAY failed"); - if (connect(sock, runp->ai_addr, runp->ai_addrlen) != 0) continue; + if (connect(sock, runp->ai_addr, runp->ai_addrlen) != 0) { + closesocket(sock); + sock = INVALID_SOCKET; + continue; + } /* Connection succeeded */ if (!SetNonBlocking(sock)) DEBUG(net, 0, "Setting non-blocking mode failed"); + this->address_length = runp->ai_addrlen; + assert(sizeof(this->address) >= runp->ai_addrlen); + memcpy(&this->address, runp->ai_addr, runp->ai_addrlen); break; } freeaddrinfo (ai); |