summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ObjectAdapterI.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2017-04-10 19:33:17 +0200
committerBenoit Foucher <benoit@zeroc.com>2017-04-10 19:33:17 +0200
commit1fa97b799b91fa6b0842e3267fec3d6e3a240df5 (patch)
tree1bc3abfddbcb66b51c776da15e2d88586ca2bbf4 /cpp/src/Ice/ObjectAdapterI.cpp
parentFix (ICE-7771) - UWP build fails, missing targets file (diff)
downloadice-1fa97b799b91fa6b0842e3267fec3d6e3a240df5.tar.bz2
ice-1fa97b799b91fa6b0842e3267fec3d6e3a240df5.tar.xz
ice-1fa97b799b91fa6b0842e3267fec3d6e3a240df5.zip
Fixed ICE-7755 - listen on all IPs associated with a DNS name
Diffstat (limited to 'cpp/src/Ice/ObjectAdapterI.cpp')
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp33
1 files changed, 26 insertions, 7 deletions
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp
index 5de6bf0acaa..bc22131f8cf 100644
--- a/cpp/src/Ice/ObjectAdapterI.cpp
+++ b/cpp/src/Ice/ObjectAdapterI.cpp
@@ -787,7 +787,7 @@ Ice::ObjectAdapterI::isLocal(const ObjectPrxPtr& proxy) const
for(vector<IncomingConnectionFactoryPtr>::const_iterator q = _incomingConnectionFactories.begin();
q != _incomingConnectionFactories.end(); ++q)
{
- if((*p)->equivalent((*q)->endpoint()))
+ if((*q)->isLocal(*p))
{
return true;
}
@@ -1102,11 +1102,19 @@ Ice::ObjectAdapterI::initialize(const RouterPrxPtr& router)
vector<EndpointIPtr> endpoints = parseEndpoints(properties->getProperty(_name + ".Endpoints"), true);
for(vector<EndpointIPtr>::iterator p = endpoints.begin(); p != endpoints.end(); ++p)
{
- IncomingConnectionFactoryPtr factory = ICE_MAKE_SHARED(IncomingConnectionFactory, _instance, *p, ICE_SHARED_FROM_THIS);
- factory->initialize();
- _incomingConnectionFactories.push_back(factory);
+ EndpointIPtr publishedEndpoint;
+ vector<EndpointIPtr> expanded = (*p)->expandHost(publishedEndpoint);
+ for(vector<EndpointIPtr>::iterator q = expanded.begin(); q != expanded.end(); ++q)
+ {
+ IncomingConnectionFactoryPtr factory = ICE_MAKE_SHARED(IncomingConnectionFactory,
+ _instance,
+ *q,
+ publishedEndpoint,
+ ICE_SHARED_FROM_THIS);
+ factory->initialize();
+ _incomingConnectionFactories.push_back(factory);
+ }
}
-
if(endpoints.empty())
{
TraceLevelsPtr tl = _instance->traceLevels();
@@ -1322,8 +1330,19 @@ ObjectAdapterI::parsePublishedEndpoints()
//
for(unsigned int i = 0; i < _incomingConnectionFactories.size(); ++i)
{
- vector<EndpointIPtr> endps = _incomingConnectionFactories[i]->endpoint()->expand();
- endpoints.insert(endpoints.end(), endps.begin(), endps.end());
+ vector<EndpointIPtr> endps = _incomingConnectionFactories[i]->endpoint()->expandIfWildcard();
+ for(vector<EndpointIPtr>::const_iterator p = endps.begin(); p != endps.end(); ++p)
+ {
+ //
+ // Check for duplicate endpoints, this might occur if an endpoint with a DNS name
+ // expands to multiple addresses. In this case, multiple incoming connection
+ // factories can point to the same published endpoint.
+ //
+ if(::find(endpoints.begin(), endpoints.end(), *p) == endpoints.end())
+ {
+ endpoints.push_back(*p);
+ }
+ }
}
}