summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorDwayne Boone <dwayne@zeroc.com>2005-10-06 15:21:18 +0000
committerDwayne Boone <dwayne@zeroc.com>2005-10-06 15:21:18 +0000
commit3a8c1051d39e2d5dae76dd7d146be46ca85e1ecf (patch)
tree3f90cde49d025a2f6afb05cfe77f1f6f36bb9f66 /cpp
parentUpdated properties. (diff)
downloadice-3a8c1051d39e2d5dae76dd7d146be46ca85e1ecf.tar.bz2
ice-3a8c1051d39e2d5dae76dd7d146be46ca85e1ecf.tar.xz
ice-3a8c1051d39e2d5dae76dd7d146be46ca85e1ecf.zip
Bug 395 - Added pseudo INVADDR_ANY support
Diffstat (limited to 'cpp')
-rw-r--r--cpp/CHANGES7
-rw-r--r--cpp/include/Ice/EndpointFactory.h2
-rw-r--r--cpp/src/Ice/DefaultsAndOverrides.cpp4
-rw-r--r--cpp/src/Ice/EndpointFactoryManager.cpp4
-rw-r--r--cpp/src/Ice/EndpointFactoryManager.h2
-rw-r--r--cpp/src/Ice/EndpointI.h15
-rw-r--r--cpp/src/Ice/Network.cpp135
-rw-r--r--cpp/src/Ice/Network.h3
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp36
-rw-r--r--cpp/src/Ice/ReferenceFactory.cpp2
-rw-r--r--cpp/src/Ice/TcpEndpointI.cpp61
-rw-r--r--cpp/src/Ice/TcpEndpointI.h9
-rw-r--r--cpp/src/Ice/UdpEndpointI.cpp60
-rw-r--r--cpp/src/Ice/UdpEndpointI.h9
-rw-r--r--cpp/src/Ice/UnknownEndpointI.cpp12
-rw-r--r--cpp/src/Ice/UnknownEndpointI.h2
-rw-r--r--cpp/src/IceSSL/SslEndpointI.cpp64
-rw-r--r--cpp/src/IceSSL/SslEndpointI.h9
18 files changed, 308 insertions, 128 deletions
diff --git a/cpp/CHANGES b/cpp/CHANGES
index 278305c56bc..567151f9c1b 100644
--- a/cpp/CHANGES
+++ b/cpp/CHANGES
@@ -1,6 +1,13 @@
Changes since version 2.1.2
---------------------------
+- Ice will now listen on all local interfaces if no -h parameter
+ is present in the endpoint configuration and no default host has
+ been set. It will also listen to all interfaces if the -h parameter
+ is set to 0.0.0.0. In such configurations the endpoints published
+ in proxies will not contain the loopback interface (127.0.0.1)
+ unless it is the only local interface present.
+
- Added ability to subscribe to an IceStorm topic using a bi-directional
connection.
diff --git a/cpp/include/Ice/EndpointFactory.h b/cpp/include/Ice/EndpointFactory.h
index 9aa7a9b3ece..7049caa086a 100644
--- a/cpp/include/Ice/EndpointFactory.h
+++ b/cpp/include/Ice/EndpointFactory.h
@@ -27,7 +27,7 @@ public:
virtual ::Ice::Short type() const = 0;
virtual ::std::string protocol() const = 0;
- virtual EndpointIPtr create(const std::string&) const = 0;
+ virtual EndpointIPtr create(const std::string&, bool) const = 0;
virtual EndpointIPtr read(BasicStream*) const = 0;
virtual void destroy() = 0;
diff --git a/cpp/src/Ice/DefaultsAndOverrides.cpp b/cpp/src/Ice/DefaultsAndOverrides.cpp
index 96ecd323a3b..5f0b11a79a3 100644
--- a/cpp/src/Ice/DefaultsAndOverrides.cpp
+++ b/cpp/src/Ice/DefaultsAndOverrides.cpp
@@ -29,10 +29,6 @@ IceInternal::DefaultsAndOverrides::DefaultsAndOverrides(const PropertiesPtr& pro
const_cast<string&>(defaultProtocol) = properties->getPropertyWithDefault("Ice.Default.Protocol", "tcp");
const_cast<string&>(defaultHost) = properties->getProperty("Ice.Default.Host");
- if(defaultHost.empty())
- {
- const_cast<string&>(defaultHost) = getLocalHost(true);
- }
const_cast<string&>(defaultRouter) = properties->getProperty("Ice.Default.Router");
diff --git a/cpp/src/Ice/EndpointFactoryManager.cpp b/cpp/src/Ice/EndpointFactoryManager.cpp
index 8536c6d0381..0c11e9170dc 100644
--- a/cpp/src/Ice/EndpointFactoryManager.cpp
+++ b/cpp/src/Ice/EndpointFactoryManager.cpp
@@ -64,7 +64,7 @@ IceInternal::EndpointFactoryManager::get(Short type) const
}
EndpointIPtr
-IceInternal::EndpointFactoryManager::create(const string& str) const
+IceInternal::EndpointFactoryManager::create(const string& str, bool adapterEndp) const
{
IceUtil::Mutex::Lock sync(*this); // TODO: Necessary?
@@ -98,7 +98,7 @@ IceInternal::EndpointFactoryManager::create(const string& str) const
{
if(_factories[i]->protocol() == protocol)
{
- return _factories[i]->create(str.substr(end));
+ return _factories[i]->create(str.substr(end), adapterEndp);
}
}
diff --git a/cpp/src/Ice/EndpointFactoryManager.h b/cpp/src/Ice/EndpointFactoryManager.h
index b51c3484bc6..93f44710688 100644
--- a/cpp/src/Ice/EndpointFactoryManager.h
+++ b/cpp/src/Ice/EndpointFactoryManager.h
@@ -28,7 +28,7 @@ public:
void add(const EndpointFactoryPtr&);
EndpointFactoryPtr get(::Ice::Short) const;
- EndpointIPtr create(const std::string&) const;
+ EndpointIPtr create(const std::string&, bool) const;
EndpointIPtr read(BasicStream*) const;
private:
diff --git a/cpp/src/Ice/EndpointI.h b/cpp/src/Ice/EndpointI.h
index 2114bd0f35c..3bd40802423 100644
--- a/cpp/src/Ice/EndpointI.h
+++ b/cpp/src/Ice/EndpointI.h
@@ -109,6 +109,19 @@ public:
virtual AcceptorPtr acceptor(EndpointIPtr&) const = 0;
//
+ // Expand endpoint out in to separate endpoints for each local
+ // host if endpoint was configured with no host set. This
+ // only applies for ObjectAdapter endpoints.
+ //
+ virtual std::vector<EndpointIPtr> expand() const = 0;
+
+ //
+ // Return whether the endpoint should be published in proxies
+ // created by the Object Adapter.
+ //
+ virtual bool publish() const = 0;
+
+ //
// Check whether the endpoint is equivalent to a specific
// Transceiver or Acceptor.
//
@@ -124,7 +137,7 @@ public:
private:
-#if defined(__SUNPRO_CC)
+#if defined(__SUNPRO_CC) || defined(__HP_aCC)
//
// COMPILERFIX: prevent the compiler from emitting a warning about
// hidding these operators.
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp
index feaf6c91115..8a6e1cdc519 100644
--- a/cpp/src/Ice/Network.cpp
+++ b/cpp/src/Ice/Network.cpp
@@ -33,8 +33,8 @@ using namespace IceInternal;
static IceUtil::StaticMutex inetMutex = ICE_STATIC_MUTEX_INITIALIZER;
-static string
-inetAddrToString(struct in_addr in)
+string
+inetAddrToString(const struct in_addr& in)
{
//
// inet_ntoa uses static memory on some platforms so we protect
@@ -1318,7 +1318,7 @@ IceInternal::fdToString(SOCKET fd)
return s.str();
}
-std::string
+string
IceInternal::addrToString(const struct sockaddr_in& addr)
{
ostringstream s;
@@ -1326,60 +1326,17 @@ IceInternal::addrToString(const struct sockaddr_in& addr)
return s.str();
}
-
-vector<struct sockaddr_in>
-IceInternal::getLocalAddresses()
+vector<string>
+IceInternal::getLocalHosts()
{
- vector<struct sockaddr_in> result;
+ vector<string> result;
#if defined(_WIN32)
- SOCKET fd = createSocket(false);
-
- vector<unsigned char> buffer;
- buffer.resize(1024);
- unsigned long len = 0;
- DWORD rs = WSAIoctl(fd, SIO_ADDRESS_LIST_QUERY, 0, 0, &buffer[0], buffer.size(), &len, 0, 0);
- if(rs == SOCKET_ERROR)
+ vector<struct sockaddr_in> addrs = getLocalAddresses();
+ for(unsigned int i = 0; i < addrs.size(); ++i)
{
- //
- // If the buffer wasn't big enough, resize it to the
- // required length and try again.
- //
- if(getSocketErrno() == WSAEFAULT)
- {
- buffer.resize(len);
- rs = WSAIoctl(fd, SIO_ADDRESS_LIST_QUERY, 0, 0, &buffer[0], buffer.size(), &len, 0, 0);
- }
-
- if(rs == SOCKET_ERROR)
- {
- closeSocketNoThrow(fd);
- SocketException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
+ result.push_back(inetAddrToString(addrs[i].sin_addr));
}
-
- //
- // Add the local interface addresses.
- //
- SOCKET_ADDRESS_LIST* addrs = reinterpret_cast<SOCKET_ADDRESS_LIST*>(&buffer[0]);
- for (int i = 0; i < addrs->iAddressCount; ++i)
- {
- result.push_back(*reinterpret_cast<struct sockaddr_in*>(addrs->Address[i].lpSockaddr));
- }
-
- //
- // Add the loopback interface address.
- //
- struct sockaddr_in addr;
- memset(&addr, 0, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_port = htons(0);
- addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- result.push_back(addr);
-
- closeSocket(fd);
#elif defined(__linux) || defined(__APPLE__) || defined(__FreeBSD__)
struct ifaddrs* ifap;
if(::getifaddrs(&ifap) == SOCKET_ERROR)
@@ -1395,11 +1352,11 @@ IceInternal::getLocalAddresses()
if(curr->ifa_addr && curr->ifa_addr->sa_family == AF_INET)
{
struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>(curr->ifa_addr);
- if(addr->sin_addr.s_addr != 0)
- {
- result.push_back(*addr);
- }
- }
+ if(addr->sin_addr.s_addr != 0)
+ {
+ result.push_back(inetAddrToString((*addr).sin_addr));
+ }
+ }
curr = curr->ifa_next;
}
@@ -1462,7 +1419,7 @@ IceInternal::getLocalAddresses()
struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>(&ifr[i].ifr_addr);
if(addr->sin_addr.s_addr != 0)
{
- result.push_back(*addr);
+ result.push_back(inetAddrToString((*addr).sin_addr));
}
}
}
@@ -1475,6 +1432,68 @@ IceInternal::getLocalAddresses()
}
#ifdef _WIN32
+vector<struct sockaddr_in>
+IceInternal::getLocalAddresses()
+{
+ vector<struct sockaddr_in> result;
+ try
+ {
+ SOCKET fd = createSocket();
+
+ vector<unsigned char> buffer;
+ buffer.resize(1024);
+ unsigned long len = 0;
+ DWORD rs = WSAIoctl(fd, SIO_ADDRESS_LIST_QUERY, 0, 0, &buffer[0], buffer.size(), &len, 0, 0);
+ if(rs == SOCKET_ERROR)
+ {
+ //
+ // If the buffer wasn't big enough, resize it to the
+ // required length and try again.
+ //
+ if(getSocketErrno() == WSAEFAULT)
+ {
+ buffer.resize(len);
+ rs = WSAIoctl(fd, SIO_ADDRESS_LIST_QUERY, 0, 0, &buffer[0], buffer.size(), &len, 0, 0);
+ }
+
+ if(rs == SOCKET_ERROR)
+ {
+ closeSocketNoThrow(fd);
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ }
+ //
+ // Add the local interface addresses.
+ //
+ SOCKET_ADDRESS_LIST* addrs = reinterpret_cast<SOCKET_ADDRESS_LIST*>(&buffer[0]);
+ for (int i = 0; i < addrs->iAddressCount; ++i)
+ {
+ result.push_back(*reinterpret_cast<struct sockaddr_in*>(addrs->Address[i].lpSockaddr));
+ }
+
+ //
+ // Add the loopback interface address.
+ //
+ struct sockaddr_in addr;
+ memset(&addr, 0, sizeof(addr));
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(0);
+ addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ result.push_back(addr);
+
+ closeSocket(fd);
+ }
+ catch(const Ice::LocalException&)
+ {
+ //
+ // TODO: Warning?
+ //
+ }
+ return result;
+}
+
bool
IceInternal::isLocalAddress(const struct sockaddr_in& addr)
{
diff --git a/cpp/src/Ice/Network.h b/cpp/src/Ice/Network.h
index acfe086048c..3b06ab69247 100644
--- a/cpp/src/Ice/Network.h
+++ b/cpp/src/Ice/Network.h
@@ -111,8 +111,9 @@ ICE_API std::string lastErrorToString();
ICE_API std::string fdToString(SOCKET);
ICE_API std::string addrToString(const struct sockaddr_in&);
-ICE_API std::vector<struct sockaddr_in> getLocalAddresses();
+ICE_API std::vector<std::string> getLocalHosts();
#ifdef _WIN32
+ICE_API std::vector<struct sockaddr_in> getLocalAddresses();
ICE_API bool isLocalAddress(const struct sockaddr_in&);
ICE_API bool isPeerLocal(SOCKET);
#endif
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp
index be2e6375575..36bae61cca3 100644
--- a/cpp/src/Ice/ObjectAdapterI.cpp
+++ b/cpp/src/Ice/ObjectAdapterI.cpp
@@ -766,11 +766,22 @@ Ice::ObjectAdapterI::ObjectAdapterI(const InstancePtr& instance, const Communica
}
//
- // Parse published endpoints. These are used in proxies
- // instead of the connection factory endpoints.
+ // Parse published endpoints. If set, these are used in proxies
+ // instead of the connection factory endpoints.
//
string endpts = _instance->properties()->getProperty(name + ".PublishedEndpoints");
_publishedEndpoints = parseEndpoints(endpts);
+ if(_publishedEndpoints.empty())
+ {
+ transform(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(),
+ back_inserter(_publishedEndpoints), Ice::constMemFun(&IncomingConnectionFactory::endpoint));
+ }
+
+ //
+ // Filter out any endpoints that are not meant to be published.
+ //
+ _publishedEndpoints.erase(remove_if(_publishedEndpoints.begin(), _publishedEndpoints.end(),
+ not1(Ice::constMemFun(&EndpointI::publish))), _publishedEndpoints.end());
string router = _instance->properties()->getProperty(_name + ".Router");
if(!router.empty())
@@ -857,22 +868,8 @@ Ice::ObjectAdapterI::newProxy(const Identity& ident, const string& facet) const
ObjectPrx
Ice::ObjectAdapterI::newDirectProxy(const Identity& ident, const string& facet) const
{
- vector<EndpointIPtr> endpoints;
+ vector<EndpointIPtr> endpoints = _publishedEndpoints;
- //
- // Use the published endpoints, otherwise use the endpoints from all
- // incoming connection factories.
- //
- if(!_publishedEndpoints.empty())
- {
- endpoints = _publishedEndpoints;
- }
- else
- {
- transform(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(), back_inserter(endpoints),
- Ice::constMemFun(&IncomingConnectionFactory::endpoint));
- }
-
//
// Now we also add the endpoints of the router's server proxy, if
// any. This way, object references created by this object adapter
@@ -945,14 +942,15 @@ Ice::ObjectAdapterI::parseEndpoints(const string& str) const
}
string s = endpts.substr(beg, end - beg);
- EndpointIPtr endp = _instance->endpointFactoryManager()->create(s);
+ EndpointIPtr endp = _instance->endpointFactoryManager()->create(s, true);
if(endp == 0)
{
EndpointParseException ex(__FILE__, __LINE__);
ex.str = s;
throw ex;
}
- endpoints.push_back(endp);
+ vector<EndpointIPtr> endps = endp->expand();
+ endpoints.insert(endpoints.end(), endps.begin(), endps.end());
++end;
}
diff --git a/cpp/src/Ice/ReferenceFactory.cpp b/cpp/src/Ice/ReferenceFactory.cpp
index 126786c92af..c3601a6d1a3 100644
--- a/cpp/src/Ice/ReferenceFactory.cpp
+++ b/cpp/src/Ice/ReferenceFactory.cpp
@@ -433,7 +433,7 @@ IceInternal::ReferenceFactory::create(const string& str)
}
string es = s.substr(beg, end - beg);
- EndpointIPtr endp = _instance->endpointFactoryManager()->create(es);
+ EndpointIPtr endp = _instance->endpointFactoryManager()->create(es, false);
if(endp != 0)
{
endpoints.push_back(endp);
diff --git a/cpp/src/Ice/TcpEndpointI.cpp b/cpp/src/Ice/TcpEndpointI.cpp
index 599fb4379ea..1ac21660e7a 100644
--- a/cpp/src/Ice/TcpEndpointI.cpp
+++ b/cpp/src/Ice/TcpEndpointI.cpp
@@ -21,20 +21,23 @@ using namespace std;
using namespace Ice;
using namespace IceInternal;
-IceInternal::TcpEndpointI::TcpEndpointI(const InstancePtr& instance, const string& ho, Int po, Int ti, bool co) :
+IceInternal::TcpEndpointI::TcpEndpointI(const InstancePtr& instance, const string& ho, Int po, Int ti, bool co,
+ bool pub) :
_instance(instance),
_host(ho),
_port(po),
_timeout(ti),
- _compress(co)
+ _compress(co),
+ _publish(pub)
{
}
-IceInternal::TcpEndpointI::TcpEndpointI(const InstancePtr& instance, const string& str) :
+IceInternal::TcpEndpointI::TcpEndpointI(const InstancePtr& instance, const string& str, bool adapterEndp) :
_instance(instance),
_port(0),
_timeout(-1),
- _compress(false)
+ _compress(false),
+ _publish(true)
{
const string delim = " \t\n\r";
@@ -138,6 +141,17 @@ IceInternal::TcpEndpointI::TcpEndpointI(const InstancePtr& instance, const strin
if(_host.empty())
{
const_cast<string&>(_host) = _instance->defaultsAndOverrides()->defaultHost;
+ if(_host.empty())
+ {
+ if(adapterEndp)
+ {
+ const_cast<string&>(_host) = "0.0.0.0";
+ }
+ else
+ {
+ const_cast<string&>(_host) = getLocalHost(true);
+ }
+ }
}
}
@@ -145,7 +159,8 @@ IceInternal::TcpEndpointI::TcpEndpointI(BasicStream* s) :
_instance(s->instance()),
_port(0),
_timeout(-1),
- _compress(false)
+ _compress(false),
+ _publish(true)
{
s->startReadEncaps();
s->read(const_cast<string&>(_host));
@@ -204,7 +219,7 @@ IceInternal::TcpEndpointI::timeout(Int timeout) const
}
else
{
- return new TcpEndpointI(_instance, _host, _port, timeout, _compress);
+ return new TcpEndpointI(_instance, _host, _port, timeout, _compress, _publish);
}
}
@@ -223,7 +238,7 @@ IceInternal::TcpEndpointI::compress(bool compress) const
}
else
{
- return new TcpEndpointI(_instance, _host, _port, _timeout, compress);
+ return new TcpEndpointI(_instance, _host, _port, _timeout, compress, _publish);
}
}
@@ -268,10 +283,36 @@ AcceptorPtr
IceInternal::TcpEndpointI::acceptor(EndpointIPtr& endp) const
{
TcpAcceptor* p = new TcpAcceptor(_instance, _host, _port);
- endp = new TcpEndpointI(_instance, _host, p->effectivePort(), _timeout, _compress);
+ endp = new TcpEndpointI(_instance, _host, p->effectivePort(), _timeout, _compress, _publish);
return p;
}
+vector<EndpointIPtr>
+IceInternal::TcpEndpointI::expand() const
+{
+ vector<EndpointIPtr> endps;
+ if(_host == "0.0.0.0")
+ {
+ vector<string> hosts = getLocalHosts();
+ for(unsigned int i = 0; i < hosts.size(); ++i)
+ {
+ endps.push_back(new TcpEndpointI(_instance, hosts[i], _port, _timeout, _compress,
+ hosts.size() == 1 || hosts[i] != "127.0.0.1"));
+ }
+ }
+ else
+ {
+ endps.push_back(const_cast<TcpEndpointI*>(this));
+ }
+ return endps;
+}
+
+bool
+IceInternal::TcpEndpointI::publish() const
+{
+ return _publish;
+}
+
bool
IceInternal::TcpEndpointI::equivalent(const TransceiverPtr&) const
{
@@ -446,9 +487,9 @@ IceInternal::TcpEndpointFactory::protocol() const
}
EndpointIPtr
-IceInternal::TcpEndpointFactory::create(const std::string& str) const
+IceInternal::TcpEndpointFactory::create(const std::string& str, bool adapterEndp) const
{
- return new TcpEndpointI(_instance, str);
+ return new TcpEndpointI(_instance, str, adapterEndp);
}
EndpointIPtr
diff --git a/cpp/src/Ice/TcpEndpointI.h b/cpp/src/Ice/TcpEndpointI.h
index f85607bc648..af32ea6a9c6 100644
--- a/cpp/src/Ice/TcpEndpointI.h
+++ b/cpp/src/Ice/TcpEndpointI.h
@@ -22,8 +22,8 @@ class TcpEndpointI : public EndpointI
{
public:
- TcpEndpointI(const InstancePtr&, const std::string&, Ice::Int, Ice::Int, bool);
- TcpEndpointI(const InstancePtr&, const std::string&);
+ TcpEndpointI(const InstancePtr&, const std::string&, Ice::Int, Ice::Int, bool, bool);
+ TcpEndpointI(const InstancePtr&, const std::string&, bool);
TcpEndpointI(BasicStream*);
virtual void streamWrite(BasicStream*) const;
@@ -40,6 +40,8 @@ public:
virtual TransceiverPtr serverTransceiver(EndpointIPtr&) const;
virtual ConnectorPtr connector() const;
virtual AcceptorPtr acceptor(EndpointIPtr&) const;
+ virtual std::vector<EndpointIPtr> expand() const;
+ virtual bool publish() const;
virtual bool equivalent(const TransceiverPtr&) const;
virtual bool equivalent(const AcceptorPtr&) const;
@@ -67,6 +69,7 @@ private:
const Ice::Int _port;
const Ice::Int _timeout;
const bool _compress;
+ const bool _publish;
};
class TcpEndpointFactory : public EndpointFactory
@@ -77,7 +80,7 @@ public:
virtual Ice::Short type() const;
virtual std::string protocol() const;
- virtual EndpointIPtr create(const std::string&) const;
+ virtual EndpointIPtr create(const std::string&, bool) const;
virtual EndpointIPtr read(BasicStream*) const;
virtual void destroy();
diff --git a/cpp/src/Ice/UdpEndpointI.cpp b/cpp/src/Ice/UdpEndpointI.cpp
index d601f717bb7..4be0dc69e45 100644
--- a/cpp/src/Ice/UdpEndpointI.cpp
+++ b/cpp/src/Ice/UdpEndpointI.cpp
@@ -20,7 +20,7 @@ using namespace std;
using namespace Ice;
using namespace IceInternal;
-IceInternal::UdpEndpointI::UdpEndpointI(const InstancePtr& instance, const string& ho, Int po, bool co) :
+IceInternal::UdpEndpointI::UdpEndpointI(const InstancePtr& instance, const string& ho, Int po, bool co, bool pub) :
_instance(instance),
_host(ho),
_port(po),
@@ -29,11 +29,12 @@ IceInternal::UdpEndpointI::UdpEndpointI(const InstancePtr& instance, const strin
_encodingMajor(encodingMajor),
_encodingMinor(encodingMinor),
_connect(false),
- _compress(co)
+ _compress(co),
+ _publish(pub)
{
}
-IceInternal::UdpEndpointI::UdpEndpointI(const InstancePtr& instance, const string& str) :
+IceInternal::UdpEndpointI::UdpEndpointI(const InstancePtr& instance, const string& str, bool adapterEndp) :
_instance(instance),
_port(0),
_protocolMajor(protocolMajor),
@@ -41,7 +42,8 @@ IceInternal::UdpEndpointI::UdpEndpointI(const InstancePtr& instance, const strin
_encodingMajor(encodingMajor),
_encodingMinor(encodingMinor),
_connect(false),
- _compress(false)
+ _compress(false),
+ _publish(true)
{
const string delim = " \t\n\r";
@@ -257,7 +259,18 @@ IceInternal::UdpEndpointI::UdpEndpointI(const InstancePtr& instance, const strin
if(_host.empty())
{
- const_cast<string&>(_host) = _instance->defaultsAndOverrides()->defaultHost;
+ const_cast<string&>(_host) = _instance->defaultsAndOverrides()->defaultHost;
+ if(_host.empty())
+ {
+ if(adapterEndp)
+ {
+ const_cast<string&>(_host) = "0.0.0.0";
+ }
+ else
+ {
+ const_cast<string&>(_host) = getLocalHost(true);
+ }
+ }
}
}
@@ -269,7 +282,8 @@ IceInternal::UdpEndpointI::UdpEndpointI(BasicStream* s) :
_encodingMajor(encodingMajor),
_encodingMinor(encodingMinor),
_connect(false),
- _compress(false)
+ _compress(false),
+ _publish(true)
{
s->startReadEncaps();
s->read(const_cast<string&>(_host));
@@ -388,7 +402,7 @@ IceInternal::UdpEndpointI::compress(bool compress) const
}
else
{
- return new UdpEndpointI(_instance, _host, _port, compress);
+ return new UdpEndpointI(_instance, _host, _port, compress, _publish);
}
}
@@ -420,7 +434,7 @@ TransceiverPtr
IceInternal::UdpEndpointI::serverTransceiver(EndpointIPtr& endp) const
{
UdpTransceiver* p = new UdpTransceiver(_instance, _host, _port, _connect);
- endp = new UdpEndpointI(_instance, _host, p->effectivePort(), _compress);
+ endp = new UdpEndpointI(_instance, _host, p->effectivePort(), _compress, _publish);
return p;
}
@@ -437,6 +451,32 @@ IceInternal::UdpEndpointI::acceptor(EndpointIPtr& endp) const
return 0;
}
+vector<EndpointIPtr>
+IceInternal::UdpEndpointI::expand() const
+{
+ vector<EndpointIPtr> endps;
+ if(_host == "0.0.0.0")
+ {
+ vector<string> hosts = getLocalHosts();
+ for(unsigned int i = 0; i < hosts.size(); ++i)
+ {
+ endps.push_back(new UdpEndpointI(_instance, hosts[i], _port, _compress,
+ hosts.size() == 1 || hosts[i] != "127.0.0.1"));
+ }
+ }
+ else
+ {
+ endps.push_back(const_cast<UdpEndpointI*>(this));
+ }
+ return endps;
+}
+
+bool
+IceInternal::UdpEndpointI::publish() const
+{
+ return _publish;
+}
+
bool
IceInternal::UdpEndpointI::equivalent(const TransceiverPtr& transceiver) const
{
@@ -667,9 +707,9 @@ IceInternal::UdpEndpointFactory::protocol() const
}
EndpointIPtr
-IceInternal::UdpEndpointFactory::create(const std::string& str) const
+IceInternal::UdpEndpointFactory::create(const std::string& str, bool adapterEndp) const
{
- return new UdpEndpointI(_instance, str);
+ return new UdpEndpointI(_instance, str, adapterEndp);
}
EndpointIPtr
diff --git a/cpp/src/Ice/UdpEndpointI.h b/cpp/src/Ice/UdpEndpointI.h
index 9dc1856adea..3288ab0ea49 100644
--- a/cpp/src/Ice/UdpEndpointI.h
+++ b/cpp/src/Ice/UdpEndpointI.h
@@ -22,8 +22,8 @@ class UdpEndpointI : public EndpointI
{
public:
- UdpEndpointI(const InstancePtr&, const std::string&, Ice::Int, bool);
- UdpEndpointI(const InstancePtr&, const std::string&);
+ UdpEndpointI(const InstancePtr&, const std::string&, Ice::Int, bool, bool);
+ UdpEndpointI(const InstancePtr&, const std::string&, bool);
UdpEndpointI(BasicStream*);
virtual void streamWrite(BasicStream*) const;
@@ -40,6 +40,8 @@ public:
virtual TransceiverPtr serverTransceiver(EndpointIPtr&) const;
virtual ConnectorPtr connector() const;
virtual AcceptorPtr acceptor(EndpointIPtr&) const;
+ virtual std::vector<EndpointIPtr> expand() const;
+ virtual bool publish() const;
virtual bool equivalent(const TransceiverPtr&) const;
virtual bool equivalent(const AcceptorPtr&) const;
@@ -71,6 +73,7 @@ private:
const Ice::Byte _encodingMinor;
const bool _connect;
const bool _compress;
+ const bool _publish;
};
class UdpEndpointFactory : public EndpointFactory
@@ -81,7 +84,7 @@ public:
virtual Ice::Short type() const;
virtual std::string protocol() const;
- virtual EndpointIPtr create(const std::string&) const;
+ virtual EndpointIPtr create(const std::string&, bool) const;
virtual EndpointIPtr read(BasicStream*) const;
virtual void destroy();
diff --git a/cpp/src/Ice/UnknownEndpointI.cpp b/cpp/src/Ice/UnknownEndpointI.cpp
index 3f3916cbe04..38aff132f81 100644
--- a/cpp/src/Ice/UnknownEndpointI.cpp
+++ b/cpp/src/Ice/UnknownEndpointI.cpp
@@ -115,6 +115,18 @@ IceInternal::UnknownEndpointI::acceptor(EndpointIPtr& endp) const
return 0;
}
+vector<EndpointIPtr>
+IceInternal::UnknownEndpointI::expand() const
+{
+ assert(false);
+}
+
+bool
+IceInternal::UnknownEndpointI::publish() const
+{
+ return false;
+}
+
bool
IceInternal::UnknownEndpointI::equivalent(const TransceiverPtr&) const
{
diff --git a/cpp/src/Ice/UnknownEndpointI.h b/cpp/src/Ice/UnknownEndpointI.h
index d87d1a2ab2a..7b69c7a8c2e 100644
--- a/cpp/src/Ice/UnknownEndpointI.h
+++ b/cpp/src/Ice/UnknownEndpointI.h
@@ -36,6 +36,8 @@ public:
virtual TransceiverPtr serverTransceiver(EndpointIPtr&) const;
virtual ConnectorPtr connector() const;
virtual AcceptorPtr acceptor(EndpointIPtr&) const;
+ virtual std::vector<EndpointIPtr> expand() const;
+ virtual bool publish() const;
virtual bool equivalent(const TransceiverPtr&) const;
virtual bool equivalent(const AcceptorPtr&) const;
diff --git a/cpp/src/IceSSL/SslEndpointI.cpp b/cpp/src/IceSSL/SslEndpointI.cpp
index d5824e8585a..86be4440b1b 100644
--- a/cpp/src/IceSSL/SslEndpointI.cpp
+++ b/cpp/src/IceSSL/SslEndpointI.cpp
@@ -21,20 +21,23 @@ using namespace std;
using namespace Ice;
using namespace IceInternal;
-IceSSL::SslEndpointI::SslEndpointI(const OpenSSLPluginIPtr& plugin, const string& ho, Int po, Int ti, bool co) :
+IceSSL::SslEndpointI::SslEndpointI(const OpenSSLPluginIPtr& plugin, const string& ho, Int po, Int ti, bool co,
+ bool pub) :
_plugin(plugin),
_host(ho),
_port(po),
_timeout(ti),
- _compress(co)
+ _compress(co),
+ _publish(pub)
{
}
-IceSSL::SslEndpointI::SslEndpointI(const OpenSSLPluginIPtr& plugin, const string& str) :
+IceSSL::SslEndpointI::SslEndpointI(const OpenSSLPluginIPtr& plugin, const string& str, bool adapterEndp) :
_plugin(plugin),
_port(0),
_timeout(-1),
- _compress(false)
+ _compress(false),
+ _publish(true)
{
const string delim = " \t\n\r";
@@ -137,7 +140,18 @@ IceSSL::SslEndpointI::SslEndpointI(const OpenSSLPluginIPtr& plugin, const string
if(_host.empty())
{
- const_cast<string&>(_host) = _plugin->getProtocolPluginFacade()->getDefaultHost();
+ const_cast<string&>(_host) = _plugin->getProtocolPluginFacade()->getDefaultHost();
+ if(_host.empty())
+ {
+ if(adapterEndp)
+ {
+ const_cast<string&>(_host) = "0.0.0.0";
+ }
+ else
+ {
+ const_cast<string&>(_host) = getLocalHost(true);
+ }
+ }
}
}
@@ -145,7 +159,8 @@ IceSSL::SslEndpointI::SslEndpointI(const OpenSSLPluginIPtr& plugin, BasicStream*
_plugin(plugin),
_port(0),
_timeout(-1),
- _compress(false)
+ _compress(false),
+ _publish(true)
{
s->startReadEncaps();
s->read(const_cast<string&>(_host));
@@ -204,7 +219,7 @@ IceSSL::SslEndpointI::timeout(Int timeout) const
}
else
{
- return new SslEndpointI(_plugin, _host, _port, timeout, _compress);
+ return new SslEndpointI(_plugin, _host, _port, timeout, _compress, _publish);
}
}
@@ -223,7 +238,7 @@ IceSSL::SslEndpointI::compress(bool compress) const
}
else
{
- return new SslEndpointI(_plugin, _host, _port, _timeout, compress);
+ return new SslEndpointI(_plugin, _host, _port, _timeout, compress, _publish);
}
}
@@ -268,10 +283,37 @@ AcceptorPtr
IceSSL::SslEndpointI::acceptor(EndpointIPtr& endp) const
{
SslAcceptor* p = new SslAcceptor(_plugin, _host, _port);
- endp = new SslEndpointI(_plugin, _host, p->effectivePort(), _timeout, _compress);
+ endp = new SslEndpointI(_plugin, _host, p->effectivePort(), _timeout, _compress, _publish);
return p;
}
+vector<EndpointIPtr>
+IceSSL::SslEndpointI::expand() const
+{
+ vector<EndpointIPtr> endps;
+ if(_host == "0.0.0.0")
+ {
+ vector<string> hosts = getLocalHosts();
+ for(unsigned int i = 0; i < hosts.size(); ++i)
+ {
+ endps.push_back(new SslEndpointI(_plugin, hosts[i], _port, _timeout, _compress,
+ hosts.size() == 1 || hosts[i] != "127.0.0.1"));
+ }
+ }
+ else
+ {
+ endps.push_back(const_cast<SslEndpointI*>(this));
+ }
+ return endps;
+
+}
+
+bool
+IceSSL::SslEndpointI::publish() const
+{
+ return _publish;
+}
+
bool
IceSSL::SslEndpointI::equivalent(const TransceiverPtr&) const
{
@@ -446,9 +488,9 @@ IceSSL::SslEndpointFactory::protocol() const
}
EndpointIPtr
-IceSSL::SslEndpointFactory::create(const std::string& str) const
+IceSSL::SslEndpointFactory::create(const std::string& str, bool adapterEndp) const
{
- return new SslEndpointI(_plugin, str);
+ return new SslEndpointI(_plugin, str, adapterEndp);
}
EndpointIPtr
diff --git a/cpp/src/IceSSL/SslEndpointI.h b/cpp/src/IceSSL/SslEndpointI.h
index d3f2b19260a..a945bd28ab8 100644
--- a/cpp/src/IceSSL/SslEndpointI.h
+++ b/cpp/src/IceSSL/SslEndpointI.h
@@ -23,8 +23,8 @@ class SslEndpointI : public IceInternal::EndpointI
{
public:
- SslEndpointI(const IceSSL::OpenSSLPluginIPtr&, const std::string&, Ice::Int, Ice::Int, bool);
- SslEndpointI(const IceSSL::OpenSSLPluginIPtr&, const std::string&);
+ SslEndpointI(const IceSSL::OpenSSLPluginIPtr&, const std::string&, Ice::Int, Ice::Int, bool, bool);
+ SslEndpointI(const IceSSL::OpenSSLPluginIPtr&, const std::string&, bool);
SslEndpointI(const IceSSL::OpenSSLPluginIPtr&, IceInternal::BasicStream*);
virtual void streamWrite(IceInternal::BasicStream*) const;
@@ -41,6 +41,8 @@ public:
virtual IceInternal::TransceiverPtr serverTransceiver(IceInternal::EndpointIPtr&) const;
virtual IceInternal::ConnectorPtr connector() const;
virtual IceInternal::AcceptorPtr acceptor(IceInternal::EndpointIPtr&) const;
+ virtual std::vector<IceInternal::EndpointIPtr> expand() const;
+ virtual bool publish() const;
virtual bool equivalent(const IceInternal::TransceiverPtr&) const;
virtual bool equivalent(const IceInternal::AcceptorPtr&) const;
@@ -68,6 +70,7 @@ private:
const Ice::Int _port;
const Ice::Int _timeout;
const bool _compress;
+ const bool _publish;
};
class SslEndpointFactory : public IceInternal::EndpointFactory
@@ -79,7 +82,7 @@ public:
virtual Ice::Short type() const;
virtual std::string protocol() const;
- virtual IceInternal::EndpointIPtr create(const std::string&) const;
+ virtual IceInternal::EndpointIPtr create(const std::string&, bool) const;
virtual IceInternal::EndpointIPtr read(IceInternal::BasicStream*) const;
virtual void destroy();