summaryrefslogtreecommitdiff
path: root/src/network/core/address.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2009-04-03 00:33:00 +0000
committerrubidium <rubidium@openttd.org>2009-04-03 00:33:00 +0000
commitba5aafb9bba4887b502dba32e56747fe10af604e (patch)
treeaed246d3f133b865c118d25907878c21f972bbf4 /src/network/core/address.cpp
parentc7b6469dabe5018775d075bee0a5293175024b42 (diff)
downloadopenttd-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.cpp17
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);