summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/Network.cpp
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2002-04-12 15:10:24 +0000
committerMarc Laukien <marc@zeroc.com>2002-04-12 15:10:24 +0000
commit23a9e91ab61541591254d2f8fceb7c1d8e2cbe9e (patch)
treedc57e5457b0d19447c080f7e55c8ac6f9edeae74 /cpp/src/Ice/Network.cpp
parentWIN32->_WIN32 (diff)
downloadice-23a9e91ab61541591254d2f8fceb7c1d8e2cbe9e.tar.bz2
ice-23a9e91ab61541591254d2f8fceb7c1d8e2cbe9e.tar.xz
ice-23a9e91ab61541591254d2f8fceb7c1d8e2cbe9e.zip
brought getLocalHost() back; changes to IcePatch (not finished)
Diffstat (limited to 'cpp/src/Ice/Network.cpp')
-rw-r--r--cpp/src/Ice/Network.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp
index f774fa8b8f5..6b20964273c 100644
--- a/cpp/src/Ice/Network.cpp
+++ b/cpp/src/Ice/Network.cpp
@@ -43,7 +43,9 @@ bool
IceInternal::acceptInterrupted()
{
if (interrupted())
+ {
return true;
+ }
#ifdef _WIN32
int error = WSAGetLastError();
@@ -610,6 +612,54 @@ IceInternal::getAddress(const string& host, int port, struct sockaddr_in& addr)
}
}
+string
+IceInternal::getLocalHost(bool numeric)
+{
+ char host[1024 + 1];
+ if (gethostname(host, 1024) == SOCKET_ERROR)
+ {
+ SystemException ex(__FILE__, __LINE__);
+ ex.error = getSystemErrno();
+ throw ex;
+ }
+
+ {
+ IceUtil::Mutex::Lock sync(getHostByNameMutex);
+
+ struct hostent* entry;
+ int retry = 5;
+
+ do
+ {
+ entry = gethostbyname(host);
+ }
+#ifdef WIN32
+ while (!entry && WSAGetLastError() == WSATRY_AGAIN && --retry >= 0);
+#else
+ while (!entry && h_errno == TRY_AGAIN && --retry >= 0);
+#endif
+
+ if (!entry)
+ {
+ DNSException ex(__FILE__, __LINE__);
+ ex.error = getDNSErrno();
+ throw ex;
+ }
+
+ if (numeric)
+ {
+ struct sockaddr_in addr;
+ memset(&addr, 0, sizeof(struct sockaddr_in));
+ memcpy(&addr.sin_addr, entry->h_addr, entry->h_length);
+ return string(inet_ntoa(addr.sin_addr));
+ }
+ else
+ {
+ return string(entry->h_name);
+ }
+ }
+}
+
bool
IceInternal::compareAddress(const struct sockaddr_in& addr1, const struct sockaddr_in& addr2)
{