diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2005-10-06 15:21:18 +0000 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2005-10-06 15:21:18 +0000 |
commit | 3a8c1051d39e2d5dae76dd7d146be46ca85e1ecf (patch) | |
tree | 3f90cde49d025a2f6afb05cfe77f1f6f36bb9f66 /cpp | |
parent | Updated properties. (diff) | |
download | ice-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/CHANGES | 7 | ||||
-rw-r--r-- | cpp/include/Ice/EndpointFactory.h | 2 | ||||
-rw-r--r-- | cpp/src/Ice/DefaultsAndOverrides.cpp | 4 | ||||
-rw-r--r-- | cpp/src/Ice/EndpointFactoryManager.cpp | 4 | ||||
-rw-r--r-- | cpp/src/Ice/EndpointFactoryManager.h | 2 | ||||
-rw-r--r-- | cpp/src/Ice/EndpointI.h | 15 | ||||
-rw-r--r-- | cpp/src/Ice/Network.cpp | 135 | ||||
-rw-r--r-- | cpp/src/Ice/Network.h | 3 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.cpp | 36 | ||||
-rw-r--r-- | cpp/src/Ice/ReferenceFactory.cpp | 2 | ||||
-rw-r--r-- | cpp/src/Ice/TcpEndpointI.cpp | 61 | ||||
-rw-r--r-- | cpp/src/Ice/TcpEndpointI.h | 9 | ||||
-rw-r--r-- | cpp/src/Ice/UdpEndpointI.cpp | 60 | ||||
-rw-r--r-- | cpp/src/Ice/UdpEndpointI.h | 9 | ||||
-rw-r--r-- | cpp/src/Ice/UnknownEndpointI.cpp | 12 | ||||
-rw-r--r-- | cpp/src/Ice/UnknownEndpointI.h | 2 | ||||
-rw-r--r-- | cpp/src/IceSSL/SslEndpointI.cpp | 64 | ||||
-rw-r--r-- | cpp/src/IceSSL/SslEndpointI.h | 9 |
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(); |