This patch allows for compilation and running of ZeroC Ice using Clang 3.1, C++11 and libc++ (tested under FreeBSD 9.1 RC1). To compile Ice you would typically set the following environment variables: CC=clang CXX=clang++ CXXFLAGS+=-std=c++11 -stdlib=libc++ CPP=clang-cpp The changes done include simple fixes for compile time issues as well as resolving more complicated runtime problems that only showed up while running unit tests. It is indeed possible that there are additional undiscovered problems. To apply the patch to a fresh Ice 3.4.2 source distribution: cd Ice-3.4.2 patch -p0 < ice_for_clang_c++11_libc++_2012-09-14.patch.txt For those who are interested, I've put up a more detailed description of the patch available at: http://blog.grem.de/dev/Making-ZeroC-Ice-Work-With-Clang-CPlusPlus11-libcpp-2012-09-09-04-00.html This patch also includes the following patches from the ZeroC forums: http://www.zeroc.com/forums/patches/5627-patch-3-ice-3-4-2-glacier2-memory-leak.html http://www.zeroc.com/forums/patches/5645-two-small-patches-freeze-icegrid-former-potentially-bad.html http://www.zeroc.com/forums/patches/5646-improvements-unit-tests-fix-encoding-freebsd-support.html http://www.zeroc.com/forums/patches/5647-patch-compiling-ice-clang-gcc4-7-a.html http://www.zeroc.com/forums/patches/5663-patch-prevent-icegrid-node-registry-replica-name-spoofing.html http://www.zeroc.com/forums/patches/5781-patch-4-ice-3-4-2-icestorm-assert-bug-fix.html http://www.zeroc.com/forums/patches/5815-improvements-python-unit-tests-fix-encoding-freebsd-jail-support.html It should also work with the OS X version of Ice (e.g. through MacPorts or Homebrew); minor adjustments might be necessary though. -- Michael Gmelin 2012-09-14 Due to the size and complexity of this patch, please let me remind you that there is NO WARRANTY WHATSOEVER (neither for GPL'ed Ice in general, nor for this patch in particular). THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --- cpp.orig/allTests.py 2011-06-15 21:43:58.000000000 +0200 +++ cpp/allTests.py 2012-03-04 20:14:52.000000000 +0100 @@ -25,6 +25,7 @@ # List of all basic tests. # tests = [ + ("IceUtil/condvar", ["once", "win32only"]), ("IceUtil/thread", ["once"]), ("IceUtil/unicode", ["once"]), @@ -62,7 +63,7 @@ ("Ice/servantLocator", ["core"]), ("Ice/interceptor", ["core"]), ("Ice/stringConverter", ["core"]), - ("Ice/udp", ["core"]), + ("Ice/udp", ["core", "nofreebsdjail"]), ("Ice/defaultServant", ["core"]), ("Ice/defaultValue", ["core"]), ("Ice/invoke", ["core", "novc6"]), @@ -106,8 +107,8 @@ # if TestUtil.isWin32() or os.getuid() == 0: tests += [ - ("IceUtil/priority", ["core", "nodarwin"]), - ("Ice/threadPoolPriority", ["core", "nodarwin"]) + ("IceUtil/priority", ["core", "nodarwin", "nofreebsd"]), + ("Ice/threadPoolPriority", ["core", "nodarwin", "nofreebsd"]) ] if __name__ == "__main__": --- cpp.orig/demo/Freeze/customEvictor/Evictor.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/demo/Freeze/customEvictor/Evictor.h 2012-09-10 11:43:58.000000000 +0200 @@ -66,6 +66,7 @@ class Evictor : public Ice::ServantLocator public: Evictor(CurrentDatabase&, int); + virtual ~Evictor() ICE_NOEXCEPT_TRUE {}; virtual Ice::ObjectPtr locate(const Ice::Current&, Ice::LocalObjectPtr&); virtual void finished(const Ice::Current&, const Ice::ObjectPtr&, const Ice::LocalObjectPtr&); --- cpp.orig/demo/IceGrid/secure/README 2011-06-15 21:44:00.000000000 +0200 +++ cpp/demo/IceGrid/secure/README 2012-03-04 19:55:44.000000000 +0100 @@ -31,9 +31,10 @@ the filesystem permissions to restrict access to the certificate. Once the certificates are generated, you can start the IceGrid -registry, node, and Glacier2 router: +registries, node, and Glacier2 router: -$ icegridregistry --Ice.Config=config.registry +$ icegridregistry --Ice.Config=config.master +$ icegridregistry --Ice.Config=config.slave $ icegridnode --Ice.Config=config.node $ glacier2router --Ice.Config=config.glacier2 --- cpp.orig/demo/IceGrid/secure/application.xml 2011-06-15 21:43:58.000000000 +0200 +++ cpp/demo/IceGrid/secure/application.xml 2012-03-04 19:55:44.000000000 +0100 @@ -20,8 +20,8 @@ - - + + --- cpp.orig/demo/IceGrid/secure/config.admin 2011-06-15 21:43:58.000000000 +0200 +++ cpp/demo/IceGrid/secure/config.admin 2012-03-04 19:55:44.000000000 +0100 @@ -14,7 +14,7 @@ # SSL Configuration # IceSSL.DefaultDir=certs -IceSSL.TrustOnly.Client=CN="IceGrid Registry";CN="Glacier2" +IceSSL.TrustOnly.Client=CN="Master";CN="Slave";CN="Glacier2" # C++ configuration Ice.Plugin.IceSSL.cpp=IceSSL:createIceSSL --- cpp.orig/demo/IceGrid/secure/config.client 2011-06-15 21:43:58.000000000 +0200 +++ cpp/demo/IceGrid/secure/config.client 2012-03-04 19:55:44.000000000 +0100 @@ -1,7 +1,7 @@ # # The IceGrid locator proxy. # -Ice.Default.Locator=DemoIceGrid/Locator:tcp -p 4061 +Ice.Default.Locator=DemoIceGrid/Locator:tcp -p 4061:tcp -p 14061 # # Trace properties. --- cpp.orig/demo/IceGrid/secure/config.master 2012-03-04 19:55:44.000000000 +0100 +++ cpp/demo/IceGrid/secure/config.master 2012-03-04 19:55:44.000000000 +0100 @@ -0,0 +1,61 @@ +# +# The IceGrid instance name. +# +IceGrid.InstanceName=DemoIceGrid + +# +# IceGrid registry configuration. +# +IceGrid.Registry.Client.Endpoints=tcp -p 4061 -t 10000:ssl -p 4062 -t 10000 +IceGrid.Registry.Server.Endpoints=ssl -t 10000 +IceGrid.Registry.Internal.Endpoints=ssl -t 10000 +IceGrid.Registry.Data=db/master + +# +# Ensure that nodes and slaves connecting to this registry have a name +# matching the certificate CN. +# +IceGrid.Registry.RequireNodeCertCN=1 +IceGrid.Registry.RequireReplicaCertCN=1 + +# +# IceGrid admin clients must use a secure connection to connect to the +# registry or use Glacier2. +# +IceGrid.Registry.AdminSessionManager.Endpoints=ssl -t 10000 +IceGrid.Registry.AdminPermissionsVerifier=DemoIceGrid/NullPermissionsVerifier + +# +# IceGrid SQL configuration if using SQL database. +# +#Ice.Plugin.DB=IceGridSqlDB:createSqlDB +#IceGrid.SQL.DatabaseType=QSQLITE +#IceGrid.SQL.DatabaseName=db/master/Registry.db + +# +# Trace properties. +# +Ice.ProgramName=Master +IceGrid.Registry.Trace.Node=2 +IceGrid.Registry.Trace.Replica=2 + +# +# SSL Configuration +# +Ice.Plugin.IceSSL=IceSSL:createIceSSL +IceSSL.DefaultDir=certs +IceSSL.CertAuthFile=ca_cert.pem +IceSSL.CertFile=master_cert.pem +IceSSL.KeyFile=master_key.pem + +# +# Don't require certificates. This is useful for admin clients that don't +# use certificate but still need to establish a secure connection for the +# username/password authentication +# +IceSSL.VerifyPeer=1 + +IceSSL.TrustOnly.Client=CN="Master";CN="Slave";CN="Node";CN="Glacier2" +IceSSL.TrustOnly.Server.IceGrid.Registry.Server=CN="Server" +IceSSL.TrustOnly.Server.IceGrid.Registry.Internal=CN="Node";CN="Master";CN="Slave" +IceSSL.TrustOnly.Server.IceGrid.Registry.AdminSessionManager=CN="Glacier2" --- cpp.orig/demo/IceGrid/secure/config.node 2011-06-15 21:43:58.000000000 +0200 +++ cpp/demo/IceGrid/secure/config.node 2012-03-04 19:55:44.000000000 +0100 @@ -1,7 +1,7 @@ # # The IceGrid locator proxy. # -Ice.Default.Locator=DemoIceGrid/Locator:ssl -p 4062 -t 10000 +Ice.Default.Locator=DemoIceGrid/Locator:ssl -p 4062 -t 10000:ssl -p 14062 -t 10000 # # IceGrid node configuration. @@ -26,5 +26,5 @@ IceSSL.CertFile=node_cert.pem IceSSL.KeyFile=node_key.pem -IceSSL.TrustOnly.Client=CN="Server";CN="IceGrid Registry" -IceSSL.TrustOnly.Server=CN="IceGrid Registry" +IceSSL.TrustOnly.Client=CN="Server";CN="Master";CN="Slave" +IceSSL.TrustOnly.Server=CN="Master";CN="Slave" --- cpp.orig/demo/IceGrid/secure/config.registry 2011-06-15 21:43:58.000000000 +0200 +++ cpp/demo/IceGrid/secure/config.registry 2012-03-04 19:55:44.000000000 +0100 @@ -1,54 +0,0 @@ -# -# The IceGrid instance name. -# -IceGrid.InstanceName=DemoIceGrid - -# -# IceGrid registry configuration. -# -IceGrid.Registry.Client.Endpoints=tcp -p 4061 -t 10000:ssl -p 4062 -t 10000 -IceGrid.Registry.Server.Endpoints=ssl -t 10000 -IceGrid.Registry.Internal.Endpoints=ssl -t 10000 -IceGrid.Registry.Data=db/registry - -# -# IceGrid admin clients must use a secure connection to connect to the -# registry or use Glacier2. -# -IceGrid.Registry.AdminSessionManager.Endpoints=ssl -t 10000 -IceGrid.Registry.AdminPermissionsVerifier=DemoIceGrid/NullPermissionsVerifier - -# -# IceGrid SQL configuration if using SQL database. -# -#Ice.Plugin.DB=IceGridSqlDB:createSqlDB -#IceGrid.SQL.DatabaseType=QSQLITE -#IceGrid.SQL.DatabaseName=db/registry/Registry.db - -# -# Trace properties. -# -Ice.ProgramName=Registry -IceGrid.Registry.Trace.Node=2 -IceGrid.Registry.Trace.Replica=2 - -# -# SSL Configuration -# -Ice.Plugin.IceSSL=IceSSL:createIceSSL -IceSSL.DefaultDir=certs -IceSSL.CertAuthFile=ca_cert.pem -IceSSL.CertFile=registry_cert.pem -IceSSL.KeyFile=registry_key.pem - -# -# Don't require certificates. This is useful for admin clients that don't -# use certificate but still need to establish a secure connection for the -# username/password authentication -# -IceSSL.VerifyPeer=1 - -IceSSL.TrustOnly.Client=CN="IceGrid Registry";CN="IceGrid Node";CN="Glacier2" -IceSSL.TrustOnly.Server.IceGrid.Registry.Server=CN="Server" -IceSSL.TrustOnly.Server.IceGrid.Registry.Internal=CN="IceGrid Node";CN="IceGrid Registry" -IceSSL.TrustOnly.Server.IceGrid.Registry.AdminSessionManager=CN="Glacier2" --- cpp.orig/demo/IceGrid/secure/config.slave 2012-03-04 19:55:44.000000000 +0100 +++ cpp/demo/IceGrid/secure/config.slave 2012-03-04 19:55:44.000000000 +0100 @@ -0,0 +1,66 @@ +# +# The IceGrid locator proxy. +# +Ice.Default.Locator=DemoIceGrid/Locator:ssl -p 4062 -t 10000 + +# +# The IceGrid instance name. +# +IceGrid.InstanceName=DemoIceGrid + +# +# IceGrid registry configuration. +# +IceGrid.Registry.Client.Endpoints=tcp -p 14061 -t 10000:ssl -p 14062 -t 10000 +IceGrid.Registry.Server.Endpoints=ssl -t 10000 +IceGrid.Registry.Internal.Endpoints=ssl -t 10000 +IceGrid.Registry.Data=db/slave +IceGrid.Registry.ReplicaName=Slave + +# +# Ensure that nodes connecting to this registry have a name matching +# the certificate CN. +# +IceGrid.Registry.RequireNodeCertCN=1 + +# +# IceGrid admin clients must use a secure connection to connect to the +# registry or use Glacier2. +# +IceGrid.Registry.AdminSessionManager.Endpoints=ssl -t 10000 +IceGrid.Registry.AdminPermissionsVerifier=DemoIceGrid/NullPermissionsVerifier + +# +# IceGrid SQL configuration if using SQL database. +# +#Ice.Plugin.DB=IceGridSqlDB:createSqlDB +#IceGrid.SQL.DatabaseType=QSQLITE +#IceGrid.SQL.DatabaseName=db/slave/Registry.db + +# +# Trace properties. +# +Ice.ProgramName=Slave +IceGrid.Registry.Trace.Node=2 +IceGrid.Registry.Trace.Replica=2 + +# +# SSL Configuration +# +Ice.Plugin.IceSSL=IceSSL:createIceSSL +IceSSL.DefaultDir=certs +IceSSL.CertAuthFile=ca_cert.pem +IceSSL.CertFile=slave_cert.pem +IceSSL.KeyFile=slave_key.pem + +# +# Don't require certificates. This is useful for admin clients that don't +# use certificate but still need to establish a secure connection for the +# username/password authentication +# +IceSSL.VerifyPeer=1 + +IceSSL.TrustOnly.Client=CN="Master";CN="Slave";CN="Node";CN="Glacier2" +IceSSL.TrustOnly.Server.IceGrid.Registry.Server=CN="Server" +IceSSL.TrustOnly.Server.IceGrid.Registry.Internal=CN="Node";CN="Master";CN="Slave" +IceSSL.TrustOnly.Server.IceGrid.Registry.AdminSessionManager=CN="Glacier2" --- cpp.orig/demo/IceGrid/secure/makecerts.py 2011-06-15 21:43:58.000000000 +0200 +++ cpp/demo/IceGrid/secure/makecerts.py 2012-03-04 19:55:44.000000000 +0100 @@ -44,8 +44,9 @@ print print -createCertificate("registry", "IceGrid Registry") -createCertificate("node", "IceGrid Node") +createCertificate("master", "Master") +createCertificate("slave", "Slave") +createCertificate("node", "Node") createCertificate("glacier2", "Glacier2") createCertificate("server", "Server") --- cpp.orig/include/Freeze/Map.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/Freeze/Map.h 2012-03-04 20:14:52.000000000 +0100 @@ -426,7 +426,7 @@ ConstIterator(MapHelper& mapHelper, const Ice::CommunicatorPtr& communicator) : _helper(IteratorHelper::create(mapHelper, true)), - _communicator(_communicator), + _communicator(communicator), _refValid(false) { } --- cpp.orig/include/Ice/Buffer.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/Ice/Buffer.h 2012-03-04 20:14:52.000000000 +0100 @@ -10,6 +10,7 @@ #ifndef ICEE_BUFFER_H #define ICEE_BUFFER_H +#include #include namespace IceInternal --- cpp.orig/include/Ice/ConnectionIF.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/Ice/ConnectionIF.h 2012-03-04 20:14:52.000000000 +0100 @@ -17,13 +17,13 @@ { class ConnectionI; +ICE_API Ice::LocalObject* upCast(Ice::ConnectionI*); } namespace IceInternal { -ICE_API Ice::LocalObject* upCast(Ice::ConnectionI*); enum AsyncStatus { --- cpp.orig/include/Ice/IconvStringConverter.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/Ice/IconvStringConverter.h 2012-03-04 20:14:52.000000000 +0100 @@ -225,10 +225,16 @@ template /*static*/ void IconvStringConverter::close(std::pair cdp) { - int rs = iconv_close(cdp.first); +#ifndef NDEBUG + int rs = +#endif + iconv_close(cdp.first); assert(rs == 0); - rs = iconv_close(cdp.second); +#ifndef NDEBUG + rs = +#endif + iconv_close(cdp.second); assert(rs == 0); } --- cpp.orig/include/Ice/IncomingAsyncF.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/Ice/IncomingAsyncF.h 2012-03-04 20:14:52.000000000 +0100 @@ -28,12 +28,6 @@ class AMD_Object_ice_invoke; class AMD_Array_Object_ice_invoke; - -} - -namespace IceInternal -{ - ICE_API IceUtil::Shared* upCast(::Ice::AMD_Object_ice_invoke*); ICE_API IceUtil::Shared* upCast(::Ice::AMD_Array_Object_ice_invoke*); --- cpp.orig/include/Ice/LocalObjectF.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/Ice/LocalObjectF.h 2012-03-04 20:14:52.000000000 +0100 @@ -18,12 +18,6 @@ { class LocalObject; - -} - -namespace IceInternal -{ - ICE_API IceUtil::Shared* upCast(::Ice::LocalObject*); } --- cpp.orig/include/Ice/ObjectF.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/Ice/ObjectF.h 2012-03-04 20:14:52.000000000 +0100 @@ -17,19 +17,8 @@ { class Object; - -} - -namespace IceInternal -{ - ICE_API IceUtil::Shared* upCast(::Ice::Object*); -} - -namespace Ice -{ - typedef IceInternal::Handle< Object > ObjectPtr; void ICE_API __patch__ObjectPtr(void*, ObjectPtr&); --- cpp.orig/include/Ice/OutgoingAsyncF.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/Ice/OutgoingAsyncF.h 2012-03-04 20:14:52.000000000 +0100 @@ -19,13 +19,13 @@ class AsyncResult; typedef IceInternal::Handle AsyncResultPtr; +ICE_API IceUtil::Shared* upCast(::Ice::AsyncResult*); } namespace IceInternal { -ICE_API IceUtil::Shared* upCast(::Ice::AsyncResult*); class OutgoingAsync; ICE_API IceUtil::Shared* upCast(OutgoingAsync*); --- cpp.orig/include/Ice/Proxy.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/Ice/Proxy.h 2012-03-04 20:14:52.000000000 +0100 @@ -38,6 +38,8 @@ class Locator; class Router; +ICE_API ::IceProxy::Ice::Object* upCast(::IceProxy::Ice::Locator*); +ICE_API ::IceProxy::Ice::Object* upCast(::IceProxy::Ice::Router*); } @@ -46,8 +48,6 @@ namespace IceInternal { -ICE_API ::IceProxy::Ice::Object* upCast(::IceProxy::Ice::Locator*); -ICE_API ::IceProxy::Ice::Object* upCast(::IceProxy::Ice::Router*); class LocalExceptionWrapper; @@ -1172,7 +1172,7 @@ TwowayCallbackNC(const TPtr& instance, bool cb, Exception excb, Sent sentcb) : CallbackNC(instance, excb, sentcb) { - checkCallback(instance, cb || excb != 0); + this->checkCallback(instance, cb || excb != 0); } }; @@ -1188,7 +1188,7 @@ TwowayCallback(const TPtr& instance, bool cb, Exception excb, Sent sentcb) : Callback(instance, excb, sentcb) { - checkCallback(instance, cb || excb != 0); + this->checkCallback(instance, cb || excb != 0); } }; @@ -1209,7 +1209,7 @@ OnewayCallbackNC(const TPtr& instance, Response cb, Exception excb, Sent sentcb) : CallbackNC(instance, excb, sentcb), response(cb) { - checkCallback(instance, cb != 0 || excb != 0); + this->checkCallback(instance, cb != 0 || excb != 0); } virtual void __completed(const ::Ice::AsyncResultPtr& result) const @@ -1254,7 +1254,7 @@ OnewayCallback(const TPtr& instance, Response cb, Exception excb, Sent sentcb) : Callback(instance, excb, sentcb), response(cb) { - checkCallback(instance, cb != 0 || excb != 0); + this->checkCallback(instance, cb != 0 || excb != 0); } virtual void __completed(const ::Ice::AsyncResultPtr& result) const --- cpp.orig/include/Ice/ProxyF.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/Ice/ProxyF.h 2012-03-04 20:14:52.000000000 +0100 @@ -22,6 +22,11 @@ { class Object; +inline ::IceProxy::Ice::Object* +upCast(::IceProxy::Ice::Object* o) +{ + return o; +} } @@ -34,6 +39,11 @@ { class Object; +inline ::IceDelegate::Ice::Object* +upCast(::IceDelegate::Ice::Object* o) +{ + return o; +} } @@ -47,6 +57,12 @@ class Object; +inline ::IceDelegateM::Ice::Object* +upCast(::IceDelegateM::Ice::Object* o) +{ + return o; +} + } } @@ -58,36 +74,12 @@ { class Object; - -} - -} - -namespace IceInternal -{ - -inline ::IceProxy::Ice::Object* -upCast(::IceProxy::Ice::Object* o) -{ - return o; -} - -inline ::IceDelegate::Ice::Object* -upCast(::IceDelegate::Ice::Object* o) -{ - return o; -} - inline ::IceDelegateD::Ice::Object* upCast(::IceDelegateD::Ice::Object* o) { return o; } -inline ::IceDelegateM::Ice::Object* -upCast(::IceDelegateM::Ice::Object* o) -{ - return o; } } --- cpp.orig/include/Ice/Stream.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/Ice/Stream.h 2012-03-04 20:14:52.000000000 +0100 @@ -17,6 +17,12 @@ #include #include +namespace IceInternal +{ + // Forward declaration required for writer specializations. + void delegateThrowMarshalException(const char*, int, const ::std::string&); +} + namespace Ice { @@ -45,9 +51,6 @@ StreamTraitTypeUnknown }; -// Forward declaration required for writer specializations. -class MarshalException; - // // Base trait template. This doesn't actually do anything -- we just // use it as a template that we can specialize. @@ -542,7 +545,7 @@ { if(static_cast(v) < 0 || static_cast(v) >= StreamTrait::enumLimit) { - throw MarshalException(__FILE__, __LINE__, "enumerator out of range"); + IceInternal::delegateThrowMarshalException(__FILE__, __LINE__, "enumerator out of range"); } outS->write(static_cast(v)); } @@ -558,7 +561,7 @@ inS->read(val); if(val > StreamTrait::enumLimit) { - throw MarshalException(__FILE__, __LINE__, "enumerator out of range"); + IceInternal::delegateThrowMarshalException(__FILE__, __LINE__, "enumerator out of range"); } v = static_cast(val); } @@ -573,7 +576,7 @@ { if(static_cast(v) < 0 || static_cast(v) >= StreamTrait::enumLimit) { - throw MarshalException(__FILE__, __LINE__, "enumerator out of range"); + IceInternal::delegateThrowMarshalException(__FILE__, __LINE__, "enumerator out of range"); } outS->write(static_cast(v)); } @@ -589,7 +592,7 @@ inS->read(val); if(val < 0 || val > StreamTrait::enumLimit) { - throw MarshalException(__FILE__, __LINE__, "enumerator out of range"); + IceInternal::delegateThrowMarshalException(__FILE__, __LINE__, "enumerator out of range"); } v = static_cast(val); } @@ -603,7 +606,7 @@ { if(static_cast(v) < 0 || static_cast(v) >= StreamTrait::enumLimit) { - throw MarshalException(__FILE__, __LINE__, "enumerator out of range"); + IceInternal::delegateThrowMarshalException(__FILE__, __LINE__, "enumerator out of range"); } outS->write(static_cast(v)); } @@ -619,7 +622,7 @@ inS->read(val); if(val < 0 || val > StreamTrait::enumLimit) { - throw MarshalException(__FILE__, __LINE__, "enumerator out of range"); + IceInternal::delegateThrowMarshalException(__FILE__, __LINE__, "enumerator out of range"); } v = static_cast(val); } --- cpp.orig/include/Ice/Stream.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/Ice/Stream.h 2012-09-10 11:43:58.000000000 +0200 @@ -664,7 +664,7 @@ struct StreamWriter outS->writeSize(static_cast(v.size())); for(typename T::const_iterator p = v.begin(); p != v.end(); ++p) { - outS->write(*p); + outS->write(static_cast(*p)); } } }; --- cpp.orig/include/Ice/StreamF.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/Ice/StreamF.h 2012-03-04 20:14:52.000000000 +0100 @@ -19,12 +19,6 @@ class InputStream; class OutputStream; - -} - -namespace IceInternal -{ - ICE_API IceUtil::Shared* upCast(::Ice::InputStream*); ICE_API IceUtil::Shared* upCast(::Ice::OutputStream*); --- cpp.orig/include/IceUtil/Cache.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/IceUtil/Cache.h 2012-09-10 11:43:58.000000000 +0200 @@ -77,6 +77,6 @@ protected: { } - virtual ~Cache() + virtual ~Cache() ICE_NOEXCEPT_FALSE { } --- cpp.orig/include/IceUtil/Config.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/IceUtil/Config.h 2012-09-10 11:43:58.000000000 +0200 @@ -248,3 +248,16 @@ public: #define ICE_DEFAULT_MUTEX_PROTOCOL PrioNone #endif + + +// +// Macro used for declaring destructors that might throw - required for C++11 +// +#if __cplusplus >= 201103L +#define ICE_DESTRUCTORS_DONT_THROW_BY_DEFAULT +#define ICE_NOEXCEPT_FALSE noexcept(false) +#define ICE_NOEXCEPT_TRUE noexcept(true) +#else +#define ICE_NOEXCEPT_FALSE +#define ICE_NOEXCEPT_TRUE +#endif --- cpp.orig/include/IceUtil/Mutex.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/IceUtil/Mutex.h 2012-03-04 20:14:52.000000000 +0100 @@ -251,8 +251,11 @@ inline Mutex::~Mutex() { +#ifndef NDEBUG int rc = 0; - rc = pthread_mutex_destroy(&_mutex); + rc = +#endif + pthread_mutex_destroy(&_mutex); assert(rc == 0); } --- cpp.orig/include/IceUtil/Shared.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/include/IceUtil/Shared.h 2012-09-10 11:43:58.000000000 +0200 @@ -50,6 +50,11 @@ // // A non thread-safe base class for reference-counted types. // +// IceUtil::SimpleSharedUnsafeDestructor +// ===================== +// +// A non thread-safe base class for reference-counted types - destructor might throw. +// // IceUtil::Shared // =============== // @@ -109,6 +114,57 @@ private: bool _noDelete; }; +class ICE_UTIL_API SimpleSharedUnsafeDestructor +{ +public: + + SimpleSharedUnsafeDestructor(); + SimpleSharedUnsafeDestructor(const SimpleSharedUnsafeDestructor&); + + virtual ~SimpleSharedUnsafeDestructor() ICE_NOEXCEPT_FALSE + { + } + + SimpleSharedUnsafeDestructor& operator=(const SimpleSharedUnsafeDestructor&) + { + return *this; + } + + void __incRef() + { + assert(_ref >= 0); + ++_ref; + } + + void __decRef() + { + assert(_ref > 0); + if(--_ref == 0) + { + if(!_noDelete) + { + _noDelete = true; + delete this; + } + } + } + + int __getRef() const + { + return _ref; + } + + void __setNoDelete(bool b) + { + _noDelete = b; + } + +private: + + int _ref; + bool _noDelete; +}; + class ICE_UTIL_API Shared { public: --- cpp.orig/src/Freeze/MapDb.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Freeze/MapDb.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -72,7 +72,13 @@ Freeze::MapDb::~MapDb() } catch(const ::DbException& dx) { +#if defined(ICE_DESTRUCTORS_DONT_THROW_BY_DEFAULT) + Error out(_communicator->getLogger()); + out << "DbException while closing database " << _dbName << ": " + << dx.what(); +#else throw DatabaseException(__FILE__, __LINE__, dx.what()); +#endif } } } @@ -229,7 +229,11 @@ #ifndef NDEBUG bool inserted = #endif - _indices.insert(IndexMap::value_type(indexBase->name(), indexI.get())).second; + _indices.insert(IndexMap::value_type(indexBase->name(), indexI.get())) +#ifndef NDEBUG + .second +#endif + ; assert(inserted); indexBase->_impl = indexI.release(); --- cpp.orig/src/Freeze/MapI.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Freeze/MapI.cpp 2012-03-04 20:14:52.000000000 +0100 @@ -749,8 +749,11 @@ try { +#ifndef NDEBUG int err; - err = _dbc->put(&dbKey, &dbValue, DB_CURRENT); + err = +#endif + _dbc->put(&dbKey, &dbValue, DB_CURRENT); assert(err == 0); } catch(const ::DbDeadlockException& dx) @@ -1023,7 +1026,11 @@ #ifndef NDEBUG bool inserted = #endif - _indices.insert(IndexMap::value_type(indexBase->name(), indexBase)).second; + _indices.insert(IndexMap::value_type(indexBase->name(), indexBase)) +#ifndef NDEBUG + .second +#endif + ; assert(inserted); indexBase->_map = this; } @@ -1360,8 +1367,11 @@ try { u_int32_t count; +#ifndef NDEBUG int err; - err = _db->truncate(txn, &count, txn != 0 ? 0 : DB_AUTO_COMMIT); + err = +#endif + _db->truncate(txn, &count, txn != 0 ? 0 : DB_AUTO_COMMIT); assert(err == 0); break; } --- cpp.orig/src/Freeze/MapI.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Freeze/MapI.h 2012-09-10 11:43:58.000000000 +0200 @@ -63,12 +63,13 @@ public: void close(); - class Tx : public IceUtil::SimpleShared + class Tx : public IceUtil::SimpleSharedUnsafeDestructor { public: Tx(const MapHelperI&); - ~Tx(); + ~Tx() ICE_NOEXCEPT_FALSE; + ; void dead(); --- cpp.orig/src/Freeze/ObjectStore.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Freeze/ObjectStore.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -189,7 +189,7 @@ Freeze::ObjectStoreBase::ObjectStoreBase(const string& facet, const string& face } } -Freeze::ObjectStoreBase::~ObjectStoreBase() +Freeze::ObjectStoreBase::~ObjectStoreBase() ICE_NOEXCEPT_FALSE { try { --- cpp.orig/src/Freeze/ObjectStore.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Freeze/ObjectStore.h 2012-09-10 11:43:58.000000000 +0200 @@ -36,7 +36,7 @@ public: ObjectStoreBase(const std::string&, const std::string&, bool, EvictorIBase*, const std::vector&, bool); - virtual ~ObjectStoreBase(); + virtual ~ObjectStoreBase() ICE_NOEXCEPT_FALSE; const Ice::ObjectPtr& sampleServant() const; --- cpp.orig/src/Freeze/SharedDbEnv.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Freeze/SharedDbEnv.cpp 2012-03-04 20:14:52.000000000 +0100 @@ -336,8 +336,11 @@ // Remove from map // +#ifndef NDEBUG size_t one; - one = sharedDbEnvMap->erase(key); + one = +#endif + sharedDbEnvMap->erase(key); assert(one == 1); if(sharedDbEnvMap->size() == 0) --- cpp.orig/src/Freeze/TransactionalEvictorContext.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Freeze/TransactionalEvictorContext.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -273,7 +273,7 @@ Freeze::TransactionalEvictorContext::ServantHolder::ServantHolder() : } -Freeze::TransactionalEvictorContext::ServantHolder::~ServantHolder() +Freeze::TransactionalEvictorContext::ServantHolder::~ServantHolder() ICE_NOEXCEPT_FALSE { if(_ownBody && _body.ownServant) { --- cpp.orig/src/Freeze/TransactionalEvictorContext.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Freeze/TransactionalEvictorContext.h 2012-09-10 11:43:58.000000000 +0200 @@ -34,7 +34,7 @@ public: public: ServantHolder(); - ~ServantHolder(); + ~ServantHolder() ICE_NOEXCEPT_FALSE; void init(const TransactionalEvictorContextPtr&, const Ice::Current&, ObjectStore*); --- cpp.orig/src/Freeze/TransactionalEvictorI.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Freeze/TransactionalEvictorI.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -346,7 +346,7 @@ Freeze::TransactionalEvictorI::dispatch(Request& request) { } - ~CtxHolder() + ~CtxHolder() ICE_NOEXCEPT_FALSE { if(_ownCtx) { --- cpp.orig/src/Glacier2/Blobject.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Glacier2/Blobject.cpp 2012-03-04 19:39:27.000000000 +0100 @@ -171,6 +171,15 @@ } void +Glacier2::Blobject::destroy() +{ + if(_requestQueue) + { + _requestQueue->destroy(); + } +} + +void Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Object_ice_invokePtr& amdCB, const std::pair& inParams, const Current& current) { --- cpp.orig/src/Glacier2/Blobject.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Glacier2/Blobject.h 2012-03-04 19:39:27.000000000 +0100 @@ -24,6 +24,8 @@ Blobject(const InstancePtr&, const Ice::ConnectionPtr&, const Ice::Context&); virtual ~Blobject(); + void destroy(); + protected: void invoke(Ice::ObjectPrx&, const Ice::AMD_Object_ice_invokePtr&, --- cpp.orig/src/Glacier2/RequestQueue.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Glacier2/RequestQueue.cpp 2012-03-04 19:39:27.000000000 +0100 @@ -185,7 +185,8 @@ _callback(newCallback_Object_ice_invoke(this, &RequestQueue::response, &RequestQueue::exception, &RequestQueue::sent)), _flushCallback(newCallback_Connection_flushBatchRequests(this, &RequestQueue::exception, &RequestQueue::sent)), - _pendingSend(false) + _pendingSend(false), + _destroyed(false) { } @@ -241,6 +242,37 @@ } void +Glacier2::RequestQueue::destroy() +{ + IceUtil::Mutex::Lock lock(*this); + + _destroyed = true; + + // + // Although the session has been destroyed, we cannot destroy this queue + // until all requests have completed. + // + if(_requests.empty()) + { + destroyInternal(); + } +} + +void +Glacier2::RequestQueue::destroyInternal() +{ + // + // Must be called with the mutex locked. + // + + // + // Remove cyclic references. + // + const_cast(_callback) = 0; + const_cast(_flushCallback) = 0; +} + +void Glacier2::RequestQueue::flush() { assert(_connection); @@ -289,6 +321,11 @@ _pendingSendRequest = 0; } } + + if(_destroyed && _requests.empty()) + { + destroyInternal(); + } } void @@ -312,6 +349,11 @@ } } _requests.clear(); + + if(_destroyed) + { + destroyInternal(); + } } void --- cpp.orig/src/Glacier2/RequestQueue.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Glacier2/RequestQueue.h 2012-03-04 19:39:27.000000000 +0100 @@ -65,8 +65,12 @@ bool addRequest(const RequestPtr&); void flushRequests(std::set&); + void destroy(); + private: + void destroyInternal(); + void flush(); void flush(std::set&); @@ -83,6 +87,7 @@ std::deque _requests; bool _pendingSend; RequestPtr _pendingSendRequest; + bool _destroyed; }; typedef IceUtil::Handle RequestQueuePtr; --- cpp.orig/src/Glacier2/RouterI.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Glacier2/RouterI.cpp 2012-03-04 19:39:27.000000000 +0100 @@ -98,6 +98,12 @@ _session->destroy_async(amiCB); } } + + _clientBlobject->destroy(); + if(_serverBlobject) + { + _serverBlobject->destroy(); + } } ObjectPrx --- cpp.orig/src/Ice/ConnectionI.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Ice/ConnectionI.cpp 2012-03-04 20:14:52.000000000 +0100 @@ -31,7 +31,7 @@ using namespace Ice; using namespace IceInternal; -Ice::LocalObject* IceInternal::upCast(ConnectionI* p) { return p; } +Ice::LocalObject* Ice::upCast(ConnectionI* p) { return p; } namespace { @@ -600,6 +600,7 @@ } catch(const LocalException& ex) { + status = IceInternal::AsyncStatusQueued; // this is only to apeace the compiler setState(StateClosed, ex); assert(_exception.get()); _exception->ice_throw(); @@ -971,6 +972,7 @@ } catch(const Ice::LocalException& ex) { + status = IceInternal::AsyncStatusQueued; // this is only to apeace the compiler setState(StateClosed, ex); assert(_exception.get()); _exception->ice_throw(); --- cpp.orig/src/Ice/IncomingAsync.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Ice/IncomingAsync.cpp 2012-03-04 20:14:52.000000000 +0100 @@ -24,7 +24,7 @@ using namespace IceInternal; IceUtil::Shared* IceInternal::upCast(IncomingAsync* p) { return p; } -IceUtil::Shared* IceInternal::upCast(AMD_Object_ice_invoke* p) { return p; } +IceUtil::Shared* Ice::upCast(AMD_Object_ice_invoke* p) { return p; } namespace { --- cpp.orig/src/Ice/LocalObject.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Ice/LocalObject.cpp 2012-03-04 20:14:52.000000000 +0100 @@ -13,7 +13,7 @@ using namespace Ice; using namespace IceInternal; -IceUtil::Shared* IceInternal::upCast(LocalObject* obj) { return obj; } +IceUtil::Shared* Ice::upCast(LocalObject* obj) { return obj; } bool Ice::LocalObject::operator==(const LocalObject& r) const --- cpp.orig/src/Ice/Network.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Ice/Network.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -715,7 +715,11 @@ WSASetLastError(error); #else int error = errno; - if(close(fd) == SOCKET_ERROR) + if(close(fd) == SOCKET_ERROR +# if defined(__FreeBSD__) + && getSocketErrno() != ECONNRESET +# endif + ) { SocketException ex(__FILE__, __LINE__); ex.error = getSocketErrno(); @@ -1098,7 +1098,7 @@ IceInternal::doBind(SOCKET fd, const struct sockaddr_storage& addr) size = 0; // Keep the compiler happy. } - if(bind(fd, reinterpret_cast(&addr), size) == SOCKET_ERROR) + if(::bind(fd, reinterpret_cast(&addr), size) == SOCKET_ERROR) { closeSocketNoThrow(fd); SocketException ex(__FILE__, __LINE__); --- cpp.orig/src/Ice/Object.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/Ice/Object.cpp 2012-03-04 20:14:52.000000000 +0100 @@ -19,7 +19,7 @@ using namespace Ice; using namespace IceInternal; -IceUtil::Shared* IceInternal::upCast(Object* p) { return p; } +IceUtil::Shared* Ice::upCast(Object* p) { return p; } bool Ice::Object::operator==(const Object& r) const --- cpp.orig/src/Ice/OutgoingAsync.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/Ice/OutgoingAsync.cpp 2012-03-04 20:14:52.000000000 +0100 @@ -30,7 +30,7 @@ using namespace Ice; using namespace IceInternal; -IceUtil::Shared* IceInternal::upCast(AsyncResult* p) { return p; } +IceUtil::Shared* Ice::upCast(AsyncResult* p) { return p; } IceUtil::Shared* IceInternal::upCast(OutgoingAsyncMessageCallback* p) { return p; } IceUtil::Shared* IceInternal::upCast(OutgoingAsync* p) { return p; } --- cpp.orig/src/Ice/PropertyNames.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/Ice/PropertyNames.cpp 2012-03-04 19:55:44.000000000 +0100 @@ -8,7 +8,7 @@ // ********************************************************************** // -// Generated by makeprops.py from file ..\config\PropertyNames.xml, Mon May 09 07:39:43 2011 +// Generated by makeprops.py from file ../config/PropertyNames.xml, Tue Jul 12 07:22:34 2011 // IMPORTANT: Do not edit this file -- any edits made here will be lost! @@ -335,6 +335,8 @@ IceInternal::Property("IceGrid.Registry.PermissionsVerifier", false, 0), IceInternal::Property("IceGrid.Registry.ReplicaName", false, 0), IceInternal::Property("IceGrid.Registry.ReplicaSessionTimeout", false, 0), + IceInternal::Property("IceGrid.Registry.RequireNodeCertCN", false, 0), + IceInternal::Property("IceGrid.Registry.RequireReplicaCertCN", false, 0), IceInternal::Property("IceGrid.Registry.Server.ACM", false, 0), IceInternal::Property("IceGrid.Registry.Server.AdapterId", false, 0), IceInternal::Property("IceGrid.Registry.Server.Endpoints", false, 0), --- cpp.orig/src/Ice/PropertyNames.h 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/Ice/PropertyNames.h 2012-03-04 19:55:44.000000000 +0100 @@ -8,7 +8,7 @@ // ********************************************************************** // -// Generated by makeprops.py from file ..\config\PropertyNames.xml, Mon May 09 07:39:43 2011 +// Generated by makeprops.py from file ../config/PropertyNames.xml, Tue Jul 12 07:22:34 2011 // IMPORTANT: Do not edit this file -- any edits made here will be lost! --- cpp.orig/src/Ice/ProxyFactory.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/Ice/ProxyFactory.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -229,6 +229,7 @@ } else if(cnt > static_cast(_retryIntervals.size())) { + interval = 0; // apeace compiler if(traceLevels->retry >= 1) { Trace out(logger, traceLevels->retryCat); --- cpp.orig/src/Ice/Service.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/Ice/Service.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -2136,17 +2136,26 @@ // // Associate stdin, stdout and stderr with /dev/null. // +#ifndef NDEBUG int fd; - fd = open("/dev/null", O_RDWR); + fd = +#endif + open("/dev/null", O_RDWR); assert(fd == 0); if(stdOut.empty()) { - fd = dup2(0, 1); +#ifndef NDEBUG + fd = +#endif + dup2(0, 1); assert(fd == 1); } if(stdErr.empty()) { - fd = dup2(1, 2); +#ifndef NDEBUG + fd = +#endif + dup2(1, 2); assert(fd == 2); } } --- cpp.orig/src/Ice/Stream.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/Ice/Stream.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -8,10 +8,19 @@ // ********************************************************************** #include +#include using namespace std; using namespace Ice; using namespace IceInternal; -IceUtil::Shared* IceInternal::upCast(InputStream* p) { return p; } -IceUtil::Shared* IceInternal::upCast(OutputStream* p) { return p; } +IceUtil::Shared* Ice::upCast(InputStream* p) { return p; } +IceUtil::Shared* Ice::upCast(OutputStream* p) { return p; } + +namespace IceInternal +{ + void delegateThrowMarshalException(const char* file, int line , const ::std::string& message) + { + throw Ice::MarshalException(file, line, message); + } +} --- cpp.orig/src/IceGrid/AdminCallbackRouter.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceGrid/AdminCallbackRouter.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -49,7 +49,12 @@ #ifndef NDEBUG bool inserted = #endif - _categoryToConnection.insert(map::value_type(category, con)).second; + _categoryToConnection.insert(map::value_type(category, con)) +#ifndef NDEBUG + .second +#endif + ; + assert(inserted == true); } --- cpp.orig/src/IceGrid/DescriptorHelper.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceGrid/DescriptorHelper.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -198,15 +198,6 @@ return result; } -template Dict -getDictUpdatedElts(const Dict& ldict, const Dict& rdict) -{ -#if defined(_MSC_VER) && (_MSC_VER < 1300) - return getDictUpdatedEltsWithEq(ldict, rdict, equal_to()); -#else - return getDictUpdatedEltsWithEq(ldict, rdict, equal_to()); -#endif -} template Dict getDictUpdatedEltsWithEq(const Dict& ldict, const Dict& rdict, EqFunc eq) @@ -223,6 +214,16 @@ return result; } +template Dict +getDictUpdatedElts(const Dict& ldict, const Dict& rdict) +{ +#if defined(_MSC_VER) && (_MSC_VER < 1300) + return getDictUpdatedEltsWithEq(ldict, rdict, equal_to()); +#else + return getDictUpdatedEltsWithEq(ldict, rdict, equal_to()); +#endif +} + template Ice::StringSeq getDictRemovedElts(const Dict& ldict, const Dict& rdict) { --- cpp.orig/src/IceGrid/FileCache.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/IceGrid/FileCache.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -195,15 +195,12 @@ FileCache::read(const string& file, Ice::Long offset, int size, Ice::Long& newOf totalSize += lineSize; lines.push_back(line); -#if defined(_MSC_VER) && (_MSC_VER < 1300) - if(is.eof()) + + if(is.eof() || is.fail()) { newOffset += line.size(); } else -#else - if(!is.fail()) -#endif { newOffset = is.tellg(); } --- cpp.orig/src/IceGrid/Internal.ice 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceGrid/Internal.ice 2012-03-04 19:55:44.000000000 +0100 @@ -702,7 +702,7 @@ * **/ NodeSession* registerNode(InternalNodeInfo info, Node* prx, LoadInfo loadInf) - throws NodeActiveException; + throws NodeActiveException, PermissionDeniedException; /** * @@ -721,7 +721,7 @@ * **/ ReplicaSession* registerReplica(InternalReplicaInfo info, InternalRegistry* prx) - throws ReplicaActiveException; + throws ReplicaActiveException, PermissionDeniedException; /** * --- cpp.orig/src/IceGrid/InternalRegistryI.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceGrid/InternalRegistryI.cpp 2012-03-04 19:55:44.000000000 +0100 @@ -19,6 +19,8 @@ #include #include #include +#include +#include using namespace std; using namespace IceGrid; @@ -38,6 +40,8 @@ Ice::PropertiesPtr properties = database->getCommunicator()->getProperties(); _nodeSessionTimeout = properties->getPropertyAsIntWithDefault("IceGrid.Registry.NodeSessionTimeout", 30); _replicaSessionTimeout = properties->getPropertyAsIntWithDefault("IceGrid.Registry.ReplicaSessionTimeout", 30); + _requireNodeCertCN = properties->getPropertyAsIntWithDefault("IceGrid.Registry.RequireNodeCertCN", 0); + _requireReplicaCertCN = properties->getPropertyAsIntWithDefault("IceGrid.Registry.RequireReplicaCertCN", 0); } InternalRegistryI::~InternalRegistryI() @@ -50,7 +54,56 @@ const LoadInfo& load, const Ice::Current& current) { - const Ice::LoggerPtr logger = _database->getTraceLevels()->logger; + const TraceLevelsPtr traceLevels = _database->getTraceLevels(); + const Ice::LoggerPtr logger = traceLevels->logger; + if(!info || !node) + { + return 0; + } + + if(_requireNodeCertCN) + { + try + { + IceSSL::ConnectionInfoPtr sslConnInfo = IceSSL::ConnectionInfoPtr::dynamicCast(current.con->getInfo()); + if(sslConnInfo) + { + if (sslConnInfo->certs.empty() || + !IceSSL::Certificate::decode(sslConnInfo->certs[0])->getSubjectDN().match("CN=" + info->name)) + { + if(traceLevels->node > 0) + { + Ice::Trace out(logger, traceLevels->nodeCat); + out << "certificate CN doesn't match node name `" << info->name << "'"; + } + throw PermissionDeniedException("certificate CN doesn't match node name `" + info->name + "'"); + } + } + else + { + if(traceLevels->node > 0) + { + Ice::Trace out(logger, traceLevels->nodeCat); + out << "node certificate for `" << info->name << "' is required to connect to this registry"; + } + throw PermissionDeniedException("node certificate is required to connect to this registry"); + } + } + catch(const PermissionDeniedException& ex) + { + throw ex; + } + catch(const IceUtil::Exception&) + { + if(traceLevels->node > 0) + { + Ice::Trace out(logger, traceLevels->nodeCat); + out << "unexpected exception while verifying certificate for node `" << info->name << "'"; + } + throw PermissionDeniedException("unable to verify certificate for node `" + info->name + "'"); + } + } + try { NodeSessionIPtr session = new NodeSessionI(_database, node, info, _nodeSessionTimeout, load); @@ -68,7 +121,56 @@ const InternalRegistryPrx& prx, const Ice::Current& current) { - const Ice::LoggerPtr logger = _database->getTraceLevels()->logger; + const TraceLevelsPtr traceLevels = _database->getTraceLevels(); + const Ice::LoggerPtr logger = traceLevels->logger; + if(!info || !prx) + { + return 0; + } + + if(_requireReplicaCertCN) + { + try + { + IceSSL::ConnectionInfoPtr sslConnInfo = IceSSL::ConnectionInfoPtr::dynamicCast(current.con->getInfo()); + if(sslConnInfo) + { + if (sslConnInfo->certs.empty() || + !IceSSL::Certificate::decode(sslConnInfo->certs[0])->getSubjectDN().match("CN=" + info->name)) + { + if(traceLevels->replica > 0) + { + Ice::Trace out(logger, traceLevels->replicaCat); + out << "certificate CN doesn't match replica name `" << info->name << "'"; + } + throw PermissionDeniedException("certificate CN doesn't match replica name `" + info->name + "'"); + } + } + else + { + if(traceLevels->replica > 0) + { + Ice::Trace out(logger, traceLevels->replicaCat); + out << "replica certificate for `" << info->name << "' is required to connect to this registry"; + } + throw PermissionDeniedException("replica certificate is required to connect to this registry"); + } + } + catch(const PermissionDeniedException& ex) + { + throw ex; + } + catch(const IceUtil::Exception&) + { + if(traceLevels->replica > 0) + { + Ice::Trace out(logger, traceLevels->replicaCat); + out << "unexpected exception while verifying certificate for replica `" << info->name << "'"; + } + throw PermissionDeniedException("unable to verify certificate for replica `" + info->name + "'"); + } + } + try { ReplicaSessionIPtr s = new ReplicaSessionI(_database, _wellKnownObjects, info, prx, _replicaSessionTimeout); --- cpp.orig/src/IceGrid/InternalRegistryI.h 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceGrid/InternalRegistryI.h 2012-03-04 19:55:44.000000000 +0100 @@ -68,6 +68,8 @@ ReplicaSessionManager& _session; int _nodeSessionTimeout; int _replicaSessionTimeout; + bool _requireNodeCertCN; + bool _requireReplicaCertCN; }; }; --- cpp.orig/src/IceGrid/NodeSessionManager.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceGrid/NodeSessionManager.cpp 2012-03-04 19:55:44.000000000 +0100 @@ -110,6 +110,14 @@ } exception.reset(ex.ice_clone()); } + catch(const PermissionDeniedException& ex) + { + if(traceLevels) + { + traceLevels->logger->error("connection to the the registry `" + _name + "' was denied:\n" + ex.reason); + } + exception.reset(ex.ice_clone()); + } catch(const Ice::Exception& ex) { exception.reset(ex.ice_clone()); --- cpp.orig/src/IceGrid/ReplicaCache.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceGrid/ReplicaCache.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -40,7 +40,7 @@ Lock sync(*this); ReplicaEntryPtr entry; - while(entry = getImpl(name)) + while((entry = getImpl(name))) { ReplicaSessionIPtr session = entry->getSession(); if(session->isDestroyed()) --- cpp.orig/src/IceGrid/ReplicaSessionManager.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceGrid/ReplicaSessionManager.cpp 2012-03-04 19:55:44.000000000 +0100 @@ -500,6 +500,14 @@ } exception.reset(ex.ice_clone()); } + catch(const PermissionDeniedException& ex) + { + if(_traceLevels) + { + _traceLevels->logger->error("connection to the the registry `" + _name + "' was denied:\n" + ex.reason); + } + exception.reset(ex.ice_clone()); + } catch(const Ice::Exception& ex) { exception.reset(ex.ice_clone()); --- cpp.orig/src/IceGrid/SessionI.h 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceGrid/SessionI.h 2012-03-04 20:14:53.000000000 +0100 @@ -35,7 +35,7 @@ class SessionI; typedef IceUtil::Handle SessionIPtr; -class BaseSessionI : virtual Ice::Object, public IceUtil::Mutex +class BaseSessionI : virtual public Ice::Object, public IceUtil::Mutex { public: --- cpp.orig/src/IceSSL/Instance.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceSSL/Instance.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -38,7 +38,7 @@ using namespace Ice; using namespace IceSSL; -IceUtil::Shared* IceInternal::upCast(IceSSL::Instance* p) { return p; } +IceUtil::Shared* IceSSL::upCast(IceSSL::Instance* p) { return p; } namespace { --- cpp.orig/src/IceSSL/InstanceF.h 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceSSL/InstanceF.h 2012-03-04 20:14:53.000000000 +0100 @@ -18,13 +18,13 @@ { class Instance; +IceUtil::Shared* upCast(IceSSL::Instance*); } namespace IceInternal { -IceUtil::Shared* upCast(IceSSL::Instance*); } --- cpp.orig/src/IceSSL/TrustManager.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceSSL/TrustManager.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -20,7 +20,7 @@ using namespace std; using namespace IceSSL; -IceUtil::Shared* IceInternal::upCast(IceSSL::TrustManager* p) { return p; } +IceUtil::Shared* IceSSL::upCast(IceSSL::TrustManager* p) { return p; } TrustManager::TrustManager(const Ice::CommunicatorPtr& communicator) : _communicator(communicator) --- cpp.orig/src/IceSSL/TrustManagerF.h 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceSSL/TrustManagerF.h 2012-03-04 20:14:53.000000000 +0100 @@ -18,13 +18,13 @@ { class TrustManager; +IceUtil::Shared* upCast(IceSSL::TrustManager*); } namespace IceInternal { -IceUtil::Shared* upCast(IceSSL::TrustManager*); } --- cpp.orig/src/IceSSL/Util.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceSSL/Util.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -175,7 +175,7 @@ return dh; } -IceUtil::Shared* IceInternal::upCast(IceSSL::DHParams* p) { return p; } +IceUtil::Shared* IceSSL::upCast(IceSSL::DHParams* p) { return p; } IceSSL::DHParams::DHParams() : _dh512(0), _dh1024(0), _dh2048(0), _dh4096(0) --- cpp.orig/src/IceSSL/UtilF.h 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceSSL/UtilF.h 2012-03-04 20:14:53.000000000 +0100 @@ -21,13 +21,13 @@ { class DHParams; +IceUtil::Shared* upCast(IceSSL::DHParams*); } namespace IceInternal { -IceUtil::Shared* upCast(IceSSL::DHParams*); } --- cpp.orig/src/IceStorm/NodeI.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceStorm/NodeI.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -18,11 +18,6 @@ namespace { -bool operator==(const GroupNodeInfo& info, int id) -{ - return info.id == id; -} - class CheckTask : public IceUtil::TimerTask { const NodeIPtr _node; --- cpp.orig/src/IceStorm/Replica.h 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/IceStorm/Replica.h 2012-09-10 11:43:58.000000000 +0200 @@ -23,9 +23,9 @@ struct GroupNodeInfo GroupNodeInfo(int i, LogUpdate l, const Ice::ObjectPrx& o = Ice::ObjectPrx()); bool operator<(const GroupNodeInfo& rhs) const; bool operator==(const GroupNodeInfo& rhs) const; - const int id; - const LogUpdate llu; - const Ice::ObjectPrx observer; + int id; + LogUpdate llu; + Ice::ObjectPrx observer; }; class Replica : virtual public IceUtil::Shared --- cpp.orig/src/IceStorm/TopicI.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/IceStorm/TopicI.cpp 2012-09-12 22:14:00.000000000 +0200 @@ -666,7 +666,7 @@ TopicImpl::subscribe(const QoS& origQoS, const Ice::ObjectPrx& obj) { try { - DatabaseConnectionPtr connection = _databaseCache->getConnection(); + DatabaseConnectionPtr connection = _databaseCache->newConnection(); TransactionHolder txn(connection); SubscriberRecordKey key; @@ -703,7 +703,7 @@ TopicImpl::subscribe(const QoS& origQoS, const Ice::ObjectPrx& obj) { try { - DatabaseConnectionPtr connection = _databaseCache->getConnection(); + DatabaseConnectionPtr connection = _databaseCache->newConnection(); TransactionHolder txn(connection); SubscriberRecordKey key; @@ -788,7 +788,7 @@ TopicImpl::subscribeAndGetPublisher(const QoS& qos, const Ice::ObjectPrx& obj) { try { - DatabaseConnectionPtr connection = _databaseCache->getConnection(); + DatabaseConnectionPtr connection = _databaseCache->newConnection(); TransactionHolder txn(connection); SubscriberRecordKey key; @@ -912,7 +912,7 @@ TopicImpl::link(const TopicPrx& topic, Ice::Int cost) { try { - DatabaseConnectionPtr connection = _databaseCache->getConnection(); + DatabaseConnectionPtr connection = _databaseCache->newConnection(); TransactionHolder txn(connection); SubscriberRecordKey key; @@ -1311,7 +1311,7 @@ TopicImpl::observerAddSubscriber(const LogUpdate& llu, const SubscriberRecord& r { try { - DatabaseConnectionPtr connection = _databaseCache->getConnection(); + DatabaseConnectionPtr connection = _databaseCache->newConnection(); TransactionHolder txn(connection); SubscriberRecordKey key; @@ -1380,7 +1380,7 @@ TopicImpl::observerRemoveSubscriber(const LogUpdate& llu, const Ice::IdentitySeq { try { - DatabaseConnectionPtr connection = _databaseCache->getConnection(); + DatabaseConnectionPtr connection = _databaseCache->newConnection(); TransactionHolder txn(connection); for(Ice::IdentitySeq::const_iterator id = ids.begin(); id != ids.end(); ++id) @@ -1456,7 +1456,7 @@ TopicImpl::destroyInternal(const LogUpdate& origLLU, bool master) { try { - DatabaseConnectionPtr connection = _databaseCache->getConnection(); + DatabaseConnectionPtr connection = _databaseCache->newConnection(); TransactionHolder txn(connection); // Erase all subscriber records and the topic record. @@ -1531,7 +1531,7 @@ TopicImpl::removeSubscribers(const Ice::IdentitySeq& ids) { try { - DatabaseConnectionPtr connection = _databaseCache->getConnection(); + DatabaseConnectionPtr connection = _databaseCache->newConnection(); TransactionHolder txn(connection); for(Ice::IdentitySeq::const_iterator id = ids.begin(); id != ids.end(); ++id) --- cpp.orig/src/IceStorm/TopicManagerI.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/IceStorm/TopicManagerI.cpp 2012-09-12 22:14:00.000000000 +0200 @@ -312,7 +312,7 @@ TopicManagerImpl::TopicManagerImpl(const InstancePtr& instance) : _sync = _instance->nodeAdapter()->addWithUUID(_syncImpl); } - DatabaseConnectionPtr connection = _databaseCache->getConnection(); + DatabaseConnectionPtr connection = _databaseCache->newConnection(); // Ensure that the llu counter is present in the log. LLUWrapperPtr lluWrapper = _databaseCache->getLLU(connection); @@ -381,7 +381,7 @@ TopicManagerImpl::create(const string& name) { try { - DatabaseConnectionPtr connection = _databaseCache->getConnection(); + DatabaseConnectionPtr connection = _databaseCache->newConnection(); TransactionHolder txn(connection); SubscriberRecordKey key; @@ -486,7 +486,7 @@ TopicManagerImpl::observerInit(const LogUpdate& llu, const TopicContentSeq& cont { try { - DatabaseConnectionPtr connection = _databaseCache->getConnection(); + DatabaseConnectionPtr connection = _databaseCache->newConnection(); TransactionHolder txn(connection); LLUWrapperPtr lluWrapper = _databaseCache->getLLU(connection); @@ -590,7 +590,7 @@ TopicManagerImpl::observerCreateTopic(const LogUpdate& llu, const string& name) { try { - DatabaseConnectionPtr connection = _databaseCache->getConnection(); + DatabaseConnectionPtr connection = _databaseCache->newConnection(); TransactionHolder txn(connection); SubscriberRecordKey key; @@ -776,7 +776,7 @@ TopicManagerImpl::initMaster(const set& slaves, const LogUpdate& { content.clear(); - DatabaseConnectionPtr connection = _databaseCache->getConnection(); + DatabaseConnectionPtr connection = _databaseCache->newConnection(); TransactionHolder txn(connection); for(map::const_iterator p = _topics.begin(); p != _topics.end(); ++p) --- cpp.orig/src/IceUtil/Cond.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceUtil/Cond.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -330,8 +330,11 @@ IceUtil::Cond::~Cond() { +#ifndef NDEBUG int rc = 0; - rc = pthread_cond_destroy(&_cond); + rc = +#endif + pthread_cond_destroy(&_cond); assert(rc == 0); } --- cpp.orig/src/IceUtil/CountDownLatch.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceUtil/CountDownLatch.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -44,10 +44,16 @@ #ifdef _WIN32 CloseHandle(_event); #else +#ifndef NDEBUG int rc = 0; - rc = pthread_mutex_destroy(&_mutex); + rc = +#endif + pthread_mutex_destroy(&_mutex); assert(rc == 0); - rc = pthread_cond_destroy(&_cond); +#ifndef NDEBUG + rc = +#endif + pthread_cond_destroy(&_cond); assert(rc == 0); #endif } --- cpp.orig/src/IceUtil/CtrlCHandler.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceUtil/CtrlCHandler.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -219,29 +219,41 @@ sigaddset(&ctrlCLikeSignals, SIGHUP); sigaddset(&ctrlCLikeSignals, SIGINT); sigaddset(&ctrlCLikeSignals, SIGTERM); - int rc = pthread_sigmask(SIG_BLOCK, &ctrlCLikeSignals, 0); +#ifndef NDEBUG + int rc = +#endif + pthread_sigmask(SIG_BLOCK, &ctrlCLikeSignals, 0); assert(rc == 0); // Joinable thread - rc = pthread_create(&_tid, 0, sigwaitThread, 0); +#ifndef NDEBUG + rc = +#endif + pthread_create(&_tid, 0, sigwaitThread, 0); assert(rc == 0); } } CtrlCHandler::~CtrlCHandler() { - int rc = pthread_cancel(_tid); +#ifndef NDEBUG + int rc = +#endif + pthread_cancel(_tid); assert(rc == 0); #if defined(__APPLE__) // // WORKAROUND: sigwait isn't a cancellation point on MacOS X, see // comment in sigwaitThread // - rc = pthread_kill(_tid, SIGTERM); + pthread_kill(_tid, SIGTERM); //assert(rc == 0); For some reaosns, this assert is sometime triggered #endif void* status = 0; - rc = pthread_join(_tid, &status); +#ifndef NDEBUG + rc = +#endif + pthread_join(_tid, &status); assert(rc == 0); #if !defined(__APPLE__) assert(status == PTHREAD_CANCELED); --- cpp.orig/src/IceUtil/FileUtil.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceUtil/FileUtil.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -26,6 +26,10 @@ # include #endif +#ifdef __FreeBSD__ +# include +#endif + using namespace std; // --- cpp.orig/src/IceUtil/RecMutex.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/IceUtil/RecMutex.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -148,8 +148,11 @@ IceUtil::RecMutex::~RecMutex() { assert(_count == 0); +#ifndef NDEBUG int rc = 0; - rc = pthread_mutex_destroy(&_mutex); + rc = +#endif + pthread_mutex_destroy(&_mutex); assert(rc == 0); } @@ -196,8 +199,11 @@ { if(--_count == 0) { +#ifndef NDEBUG int rc = 0; // Prevent warnings when NDEBUG is defined. - rc = pthread_mutex_unlock(&_mutex); + rc = +#endif + pthread_mutex_unlock(&_mutex); assert(rc == 0); } } --- cpp.orig/src/IceUtil/Shared.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/IceUtil/Shared.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -96,6 +96,18 @@ IceUtil::SimpleShared::SimpleShared(const SimpleShared&) : { } +IceUtil::SimpleSharedUnsafeDestructor::SimpleSharedUnsafeDestructor() : + _ref(0), + _noDelete(false) +{ +} + +IceUtil::SimpleSharedUnsafeDestructor::SimpleSharedUnsafeDestructor(const SimpleSharedUnsafeDestructor&) : + _ref(0), + _noDelete(false) +{ +} + IceUtil::Shared::Shared() : _ref(0), _noDelete(false) --- cpp.orig/src/Slice/CPlusPlusUtil.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/Slice/CPlusPlusUtil.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -631,7 +631,7 @@ string scope = fixKwd(cl->scope()); if(marshal) { - out << nl << stream << deref << "write(::Ice::ObjectPtr(::IceInternal::upCast(" << fixedParam + out << nl << stream << deref << "write(::Ice::ObjectPtr(" << scope << "upCast(" << fixedParam << ".get())));"; } else @@ -649,7 +649,7 @@ string scope = fixKwd(px->_class()->scope()); if(marshal) { - out << nl << stream << deref << "write(::Ice::ObjectPrx(::IceInternal::upCast(" << fixedParam + out << nl << stream << deref << "write(::Ice::ObjectPrx(::IceProxy" << scope << "upCast(" << fixedParam << ".get())));"; } else --- cpp.orig/src/Slice/FileTracker.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/Slice/FileTracker.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -17,6 +17,10 @@ # include #endif +#ifdef __FreeBSD__ +# include +#endif + using namespace std; Slice::FileException::FileException(const char* file, int line, const string& r) : --- cpp.orig/src/slice2cpp/Gen.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/slice2cpp/Gen.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -1944,8 +1944,10 @@ } string name = fixKwd(p->name()); + string scoped = fixKwd(p->scoped()); H << sp << nl << "class " << name << ';'; + H << nl << _dllExport << "::IceProxy::Ice::Object* upCast(::IceProxy" << scoped << "*);"; } Slice::Gen::ProxyVisitor::ProxyVisitor(Output& h, Output& c, const string& dllExport) : @@ -3691,10 +3693,22 @@ Slice::Gen::ObjectDeclVisitor::visitClassDecl(const ClassDeclPtr& p) { string name = fixKwd(p->name()); + string scoped = fixKwd(p->scoped()); H << sp << nl << "class " << name << ';'; H << nl << "bool operator==(const " << name << "&, const " << name << "&);"; H << nl << "bool operator<(const " << name << "&, const " << name << "&);"; + + H << sp; + + if(!p->isLocal()) + { + H << nl << _dllExport << "::Ice::Object* upCast(" << scoped << "*);"; + } + else + { + H << nl << _dllExport << "::Ice::LocalObject* upCast(" << scoped << "*);"; + } } void @@ -4922,13 +4936,13 @@ { if((BuiltinPtr::dynamicCast(p) && BuiltinPtr::dynamicCast(p)->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(p)) - { - C << nl << "if(" << prefix << name << ')'; + { C << nl << "if(" << prefix << name << ')'; C << sb; ClassDeclPtr decl = ClassDeclPtr::dynamicCast(p); if(decl) { - C << nl << "::IceInternal::upCast(" << prefix << name << ".get())->__addObject(_c);"; + string scope = fixKwd(decl->scope()); + C << nl << scope << "upCast(" << prefix << name << ".get())->__addObject(_c);"; } else { @@ -4991,9 +5005,10 @@ ClassDeclPtr decl = ClassDeclPtr::dynamicCast(p); if(decl) { - C << nl << "if(" << "::IceInternal::upCast(" << prefix << name << ".get())->__usesClasses())"; + string scope = fixKwd(decl->scope()); + C << nl << "if(" << scope << "upCast(" << prefix << name << ".get())->__usesClasses())"; C << sb; - C << nl << "::IceInternal::upCast(" << prefix << name << ".get())->__decRefUnsafe();"; + C << nl << scope << "upCast(" << prefix << name << ".get())->__decRefUnsafe();"; C << nl << prefix << name << ".__clearHandleUnsafe();"; } @@ -5629,40 +5644,30 @@ { string scoped = fixKwd(p->scoped()); - H << sp; - - if(!p->isLocal()) - { - H << nl << _dllExport << "::Ice::Object* upCast(" << scoped << "*);"; - H << nl << _dllExport << "::IceProxy::Ice::Object* upCast(::IceProxy" << scoped << "*);"; - } - else - { - H << nl << _dllExport << "::Ice::LocalObject* upCast(" << scoped << "*);"; - } } bool Slice::Gen::IceInternalVisitor::visitClassDefStart(const ClassDefPtr& p) { string scoped = fixKwd(p->scoped()); + string scope = fixKwd(p->scope()); C << sp; if(!p->isLocal()) { C << nl << (_dllExport.empty() ? "" : "ICE_DECLSPEC_EXPORT ") - << "::Ice::Object* IceInternal::upCast(" << scoped << "* p) { return p; }"; + << "::Ice::Object* " << scope << "upCast(" << scoped << "* p) { return p; }"; C << nl << (_dllExport.empty() ? "" : "ICE_DECLSPEC_EXPORT ") - << "::IceProxy::Ice::Object* IceInternal::upCast(::IceProxy" << scoped + << "::IceProxy::Ice::Object* IceProxy" << scope << "upCast(::IceProxy" << scoped << "* p) { return p; }"; } else { C << nl << (_dllExport.empty() ? "" : "ICE_DECLSPEC_EXPORT ") - << "::Ice::LocalObject* IceInternal::upCast(" << scoped << "* p) { return p; }"; + << "::Ice::LocalObject* " << scope << "upCast(" << scoped << "* p) { return p; }"; } return true; --- cpp.orig/src/slice2cpp/Main.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/slice2cpp/Main.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -22,7 +22,7 @@ using namespace Slice; namespace { -IceUtil::Mutex* mutex = 0; +IceUtil::Mutex* mtx = 0; bool interrupted = false; class Init @@ -31,13 +31,13 @@ public: Init() { - mutex = new IceUtil::Mutex; + mtx = new IceUtil::Mutex; } ~Init() { - delete mutex; - mutex = 0; + delete mtx; + mtx = 0; } }; @@ -48,7 +48,7 @@ Init init; void interruptedCallback(int signal) { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); interrupted = true; } @@ -294,7 +294,7 @@ compile(int argc, char* argv[]) } { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); if(interrupted) { --- cpp.orig/src/slice2cs/Gen.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/slice2cs/Gen.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -1281,7 +1281,7 @@ { _out << value << "F"; } - else if(ep = EnumPtr::dynamicCast(type)) + else if((ep = EnumPtr::dynamicCast(type))) { string enumName = fixId(ep->scoped()); string::size_type colon = value.rfind(':'); @@ -3914,16 +3914,6 @@ ClassDefPtr cl = ClassDefPtr::dynamicCast(p->container()); string name = fixId(p->name(), DotNet::ICloneable, true); vector params = getParams(p); - bool hasOutParams = false; - ParamDeclList paramList = p->parameters(); - for(ParamDeclList::const_iterator pli = paramList.begin(); pli != paramList.end(); ++pli) - { - if((*pli)->isOutParam()) - { - hasOutParams = true; - break; - } - } _out << sp; --- cpp.orig/src/slice2cs/Main.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/slice2cs/Main.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -22,7 +22,7 @@ using namespace Slice; namespace { -IceUtil::Mutex* mutex = 0; +IceUtil::Mutex* mtx = 0; bool interrupted = false; class Init @@ -31,13 +31,13 @@ public: Init() { - mutex = new IceUtil::Mutex; + mtx = new IceUtil::Mutex; } ~Init() { - delete mutex; - mutex = 0; + delete mtx; + mtx = 0; } }; @@ -48,7 +48,7 @@ Init init; void interruptedCallback(int signal) { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); interrupted = true; } @@ -303,7 +303,7 @@ compile(int argc, char* argv[]) } { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); if(interrupted) { --- cpp.orig/src/slice2freeze/Main.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/slice2freeze/Main.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -28,7 +28,7 @@ using namespace Slice; namespace { -IceUtil::Mutex* mutex = 0; +IceUtil::Mutex* mtx = 0; bool interrupted = false; class Init @@ -37,13 +37,13 @@ public: Init() { - mutex = new IceUtil::Mutex; + mtx = new IceUtil::Mutex; } ~Init() { - delete mutex; - mutex = 0; + delete mtx; + mtx = 0; } }; @@ -56,7 +56,7 @@ string ICE_ENCODING_COMPARE = "Freeze::IceEncodingCompare"; void interruptedCallback(int signal) { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); interrupted = true; } @@ -1995,7 +1995,7 @@ compile(int argc, char* argv[]) } { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); if(interrupted) { @@ -2042,7 +2042,7 @@ compile(int argc, char* argv[]) u->destroy(); { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); if(interrupted) { --- cpp.orig/src/slice2freezej/Main.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/slice2freezej/Main.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -26,7 +26,7 @@ using namespace IceUtilInternal; namespace { -IceUtil::Mutex* mutex = 0; +IceUtil::Mutex* mtx = 0; bool interrupted = false; class Init @@ -35,13 +35,13 @@ public: Init() { - mutex = new IceUtil::Mutex; + mtx = new IceUtil::Mutex; } ~Init() { - delete mutex; - mutex = 0; + delete mtx; + mtx = 0; } }; @@ -52,7 +52,7 @@ Init init; void interruptedCallback(int signal) { - IceUtilInternal::MutexPtrLock lock(mutex); + IceUtilInternal::MutexPtrLock lock(mtx); interrupted = true; } @@ -1828,7 +1828,7 @@ compile(int argc, char* argv[]) } { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); if(interrupted) { @@ -1923,7 +1923,7 @@ compile(int argc, char* argv[]) u->destroy(); { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); if(interrupted) { --- cpp.orig/src/slice2html/Main.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/slice2html/Main.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -24,7 +24,7 @@ using namespace IceUtil; namespace { -IceUtil::Mutex* mutex = 0; +IceUtil::Mutex* mtx = 0; bool interrupted = false; class Init @@ -33,13 +33,13 @@ public: Init() { - mutex = new IceUtil::Mutex; + mtx = new IceUtil::Mutex; } ~Init() { - delete mutex; - mutex = 0; + delete mtx; + mtx = 0; } }; @@ -50,7 +50,7 @@ Init init; void interruptedCallback(int signal) { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); interrupted = true; } @@ -254,7 +254,7 @@ compile(int argc, char* argv[]) } { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); if(interrupted) { @@ -296,7 +296,7 @@ compile(int argc, char* argv[]) p->destroy(); { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); if(interrupted) { --- cpp.orig/src/slice2java/Gen.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/src/slice2java/Gen.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -1246,7 +1246,7 @@ { BuiltinPtr bp; EnumPtr ep; - if(bp = BuiltinPtr::dynamicCast(type)) + if((bp = BuiltinPtr::dynamicCast(type))) { switch(bp->kind()) { @@ -1349,7 +1349,7 @@ } } - else if(ep = EnumPtr::dynamicCast(type)) + else if((ep = EnumPtr::dynamicCast(type))) { string val = value; string::size_type pos = val.rfind(':'); --- cpp.orig/src/slice2java/Main.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/slice2java/Main.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -23,7 +23,7 @@ using namespace Slice; namespace { -IceUtil::Mutex* mutex = 0; +IceUtil::Mutex* mtx = 0; bool interrupted = false; class Init @@ -32,13 +32,13 @@ public: Init() { - mutex = new IceUtil::Mutex; + mtx = new IceUtil::Mutex; } ~Init() { - delete mutex; - mutex = 0; + delete mtx; + mtx = 0; } }; @@ -49,7 +49,7 @@ Init init; void interruptedCallback(int signal) { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); interrupted = true; } @@ -356,7 +356,7 @@ compile(int argc, char* argv[]) } { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); if(interrupted) { --- cpp.orig/src/slice2php/Main.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/slice2php/Main.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -1488,7 +1488,7 @@ printHeader(IceUtilInternal::Output& out) namespace { -IceUtil::Mutex* mutex = 0; +IceUtil::Mutex* mtx = 0; bool interrupted = false; class Init @@ -1497,13 +1497,13 @@ public: Init() { - mutex = new IceUtil::Mutex; + mtx = new IceUtil::Mutex; } ~Init() { - delete mutex; - mutex = 0; + delete mtx; + mtx = 0; } }; @@ -1514,7 +1514,7 @@ Init init; static void interruptedCallback(int signal) { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); interrupted = true; } @@ -1777,7 +1777,7 @@ compile(int argc, char* argv[]) } { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); if(interrupted) { --- cpp.orig/src/slice2py/Main.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/slice2py/Main.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -40,7 +40,7 @@ using namespace Slice::Python; namespace { -IceUtil::Mutex* mutex = 0; +IceUtil::Mutex* mtx = 0; bool interrupted = false; class Init @@ -49,13 +49,13 @@ public: Init() { - mutex = new IceUtil::Mutex; + mtx = new IceUtil::Mutex; } ~Init() { - delete mutex; - mutex = 0; + delete mtx; + mtx = 0; } }; @@ -66,7 +66,7 @@ Init init; void interruptedCallback(int signal) { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); interrupted = true; } @@ -631,7 +631,7 @@ compile(int argc, char* argv[]) } { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); if(interrupted) { --- cpp.orig/src/slice2rb/Main.cpp 2011-06-15 21:43:58.000000000 +0200 +++ cpp/src/slice2rb/Main.cpp 2012-09-10 11:43:58.000000000 +0200 @@ -39,7 +39,7 @@ using namespace Slice::Ruby; namespace { -IceUtil::Mutex* mutex = 0; +IceUtil::Mutex* mtx = 0; bool interrupted = false; class Init @@ -48,13 +48,13 @@ public: Init() { - mutex = new IceUtil::Mutex; + mtx = new IceUtil::Mutex; } ~Init() { - delete mutex; - mutex = 0; + delete mtx; + mtx = 0; } }; @@ -65,7 +65,7 @@ Init init; void interruptedCallback(int signal) { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); interrupted = true; } @@ -316,7 +316,7 @@ compile(int argc, char* argv[]) } { - IceUtilInternal::MutexPtrLock sync(mutex); + IceUtilInternal::MutexPtrLock sync(mtx); if(interrupted) { --- cpp.orig/test/Glacier2/ssl/Server.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/test/Glacier2/ssl/Server.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -31,9 +31,15 @@ test(ctx["_con.type"] == "ssl"); test(ctx["_con.localPort"] == "12348"); } - test(ctx["_con.localAddress"] == "127.0.0.1"); + if (!inFreeBSDJail()) + { + test(ctx["_con.localAddress"] == "127.0.0.1"); + } test(ctx["_con.remotePort"] != ""); - test(ctx["_con.remoteAddress"] == "127.0.0.1"); + if (!inFreeBSDJail()) + { + test(ctx["_con.remoteAddress"] == "127.0.0.1"); + } } } @@ -99,7 +105,7 @@ } virtual void - ice_ping(const Ice::Current& current) + ice_ping(const Ice::Current& current) const { testContext(_ssl, current.ctx); } @@ -133,8 +139,11 @@ { testContext(true, current.ctx); - test(info.remoteHost == "127.0.0.1"); - test(info.localHost == "127.0.0.1"); + if (!inFreeBSDJail()) + { + test(info.remoteHost == "127.0.0.1"); + test(info.localHost == "127.0.0.1"); + } test(info.localPort == 12348); try --- cpp.orig/test/Ice/background/EndpointI.h 2011-06-15 21:43:59.000000000 +0200 +++ cpp/test/Ice/background/EndpointI.h 2012-03-04 20:14:53.000000000 +0100 @@ -48,7 +48,7 @@ virtual Ice::Int hashInit() const; #if !defined(_MSC_VER) || _MSC_VER > 1300 - using IceInternal::EndpointI::connectors; + using ::IceInternal::EndpointI::connectors; #endif private: --- cpp.orig/test/Ice/custom/AllTests.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/test/Ice/custom/AllTests.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -1384,7 +1384,8 @@ const ::Test::ClassStructSeq& seq, const InParamPtr& cookie) { - pair< ::Test::ClassStructPtr, ::Test::ClassStructSeq> in = getIn(in, cookie); + pair< ::Test::ClassStructPtr, ::Test::ClassStructSeq> in; + in = getIn(in, cookie); test(ret == in.first); test(cs1 == in.first); test(seq == in.second); @@ -1432,7 +1433,8 @@ void throwExcept1(const Ice::AsyncResultPtr& result) { - wstring in = getIn(in, InParamPtr::dynamicCast(result->getCookie())); + wstring in; + in = getIn(in, InParamPtr::dynamicCast(result->getCookie())); try { Test1::WstringClassPrx t = Test1::WstringClassPrx::uncheckedCast(result->getProxy()); @@ -1451,7 +1453,8 @@ void throwExcept2(const Ice::AsyncResultPtr& result) { - wstring in = getIn(in, InParamPtr::dynamicCast(result->getCookie())); + wstring in; + in = getIn(in, InParamPtr::dynamicCast(result->getCookie())); try { Test2::WstringClassPrx t = Test2::WstringClassPrx::uncheckedCast(result->getProxy()); --- cpp.orig/test/Ice/info/AllTests.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/test/Ice/info/AllTests.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -141,9 +141,11 @@ test(info->adapterName.empty()); test(info->localPort > 0); test(info->remotePort == 12010); - test(info->remoteAddress == defaultHost); - test(info->localAddress == defaultHost); - + if (!inFreeBSDJail()) + { + test(info->remoteAddress == defaultHost); + test(info->localAddress == defaultHost); + } ostringstream os; Ice::Context ctx = testIntf->getConnectionInfoAsContext(); @@ -163,8 +165,11 @@ test(info->adapterName.empty()); test(info->localPort > 0); test(info->remotePort == 12010); - test(info->remoteAddress ==defaultHost); - test(info->localAddress == defaultHost); + if (!inFreeBSDJail()) + { + test(info->remoteAddress == defaultHost); + test(info->localAddress == defaultHost); + } } cout << "ok" << endl; --- cpp.orig/test/Ice/properties/run.py 2011-06-15 21:43:59.000000000 +0200 +++ cpp/test/Ice/properties/run.py 2012-03-04 20:14:53.000000000 +0100 @@ -26,7 +26,7 @@ # # Write config # -configPath = u"./config/中国_client.config" +configPath = u"./config/中国_client.config".encode("utf-8") TestUtil.createConfig(configPath, ["# Automatically generated by Ice test driver.", @@ -38,4 +38,4 @@ TestUtil.simpleTest(client) if os.path.exists(configPath): - os.remove(configPath) \ No newline at end of file + os.remove(configPath) --- cpp.orig/test/IceUtil/unicode/Client.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/test/IceUtil/unicode/Client.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -15,6 +15,10 @@ # include #endif +#ifdef __FreeBSD__ +# include +#endif + using namespace IceUtil; using namespace std; --- cpp.orig/test/Slice/keyword/Client.cpp 2011-06-15 21:43:59.000000000 +0200 +++ cpp/test/Slice/keyword/Client.cpp 2012-03-04 20:14:53.000000000 +0100 @@ -73,6 +73,9 @@ virtual void ice_response(Ice::Int) {} virtual void ice_exception(const ::Ice::Exception&) {} }; + +template +void unused(T const &) { } // // This section of the test is present to ensure that the C++ types @@ -86,6 +89,7 @@ _cpp_and::_cpp_auto b; b._cpp_default = 0; + unused(b); _cpp_and::deletePtr c = new _cpp_and::_cpp_delete(); c->_cpp_else = ""; --- cpp.orig/test/include/TestCommon.h 2011-06-15 21:43:59.000000000 +0200 +++ cpp/test/include/TestCommon.h 2012-03-04 20:14:53.000000000 +0100 @@ -17,6 +17,22 @@ #include #endif +#if defined(__FreeBSD__) +# include +# include +inline bool inFreeBSDJail() +{ + int jailed; + size_t size = sizeof(jailed); + return (sysctlbyname("security.jail.jailed", &jailed, &size, NULL, 0) != -1 || jailed); +} +#else +inline bool inFreeBSDJail() +{ + return false; +} +#endif + void inline testFailed(const char* expr, const char* file, unsigned int line) { --- scripts.orig/TestUtil.py 2011-06-15 21:44:00.000000000 +0200 +++ scripts/TestUtil.py 2012-03-04 20:14:53.000000000 +0100 @@ -74,6 +74,25 @@ def isLinux(): return sys.platform.startswith("linux") +def isFreeBSD(): + return sys.platform.startswith("freebsd") + +def sysctl(key): + p = subprocess.Popen("sysctl "+key, shell=1, stdout=subprocess.PIPE) + try: + result = p.communicate()[0].strip().split()[1] + except IndexError: + return 0 + if sys.version_info >= (3,): + result = str(result, sys.stdout.encoding) + try: + return int(result) + except ValueError: + return result + +def isFreeBSDJail(): + return isFreeBSD() and sysctl("security.jail.jailed") + def getCppCompiler(): compiler = "" if os.environ.get("CPP_COMPILER", "") != "": @@ -1590,7 +1609,15 @@ if isDarwin() and "nodarwin" in config: print "%s*** test not supported under Darwin%s" % (prefix, suffix) continue + + if isFreeBSD() and "nofreebsd" in config: + print "%s*** test not supported under FreeBSD%s" % (prefix, suffix) + continue + if isFreeBSDJail() and "nofreebsdjail" in config: + print "%s*** test not supported within a FreeBSD Jail%s" % (prefix, suffix) + continue + if not isWin32() and "win32only" in config: print "%s*** test only supported under Win32%s" % (prefix, suffix) continue --- py/test/Ice/info/AllTests.py.orig 2011-06-15 19:44:00.000000000 +0000 +++ py/test/Ice/info/AllTests.py 2012-09-11 19:18:30.188273390 +0000 @@ -7,12 +7,31 @@ # # ********************************************************************** -import Ice, Test, threading +import Ice, Test, threading, sys, subprocess def test(b): if not b: raise RuntimeError('test assertion failed') +def isFreeBSD(): + return sys.platform.startswith("freebsd") + +def sysctl(key): + p = subprocess.Popen("sysctl "+key, shell=1, stdout=subprocess.PIPE) + try: + result = p.communicate()[0].strip().split()[1] + except IndexError: + return 0 + if sys.version_info >= (3,): + result = str(result, sys.stdout.encoding) + try: + return int(result) + except ValueError: + return result + +def isFreeBSDJail(): + return isFreeBSD() and sysctl("security.jail.jailed") + def allTests(communicator, collocated): print "testing proxy endpoint information...", @@ -64,12 +83,12 @@ ipEndpoint = endpoints[0].getInfo() test(ipEndpoint.type() == Ice.TCPEndpointType or ipEndpoint.type() == 2) - test(ipEndpoint.host == defaultHost) + test(ipEndpoint.host == defaultHost or isFreeBSDJail()) test(ipEndpoint.port > 0) test(ipEndpoint.timeout == 15000) udpEndpoint = endpoints[1].getInfo() - test(udpEndpoint.host == defaultHost) + test(udpEndpoint.host == defaultHost or isFreeBSDJail()) test(udpEndpoint.datagram()) test(udpEndpoint.port > 0) @@ -104,7 +123,7 @@ ipinfo = base.ice_getConnection().getEndpoint().getInfo() test(ipinfo.port == 12010) test(not ipinfo.compress) - test(ipinfo.host == defaultHost) + test(ipinfo.host == defaultHost or isFreeBSDJail()) ctx = testIntf.getEndpointInfoAsContext() test(ctx["host"] == ipinfo.host) @@ -114,7 +133,7 @@ udp = base.ice_datagram().ice_getConnection().getEndpoint().getInfo() test(udp.port == 12010) - test(udp.host == defaultHost) + test(udp.host == defaultHost or isFreeBSDJail()) print "ok" @@ -124,8 +143,8 @@ test(not info.incoming) test(len(info.adapterName) == 0) test(info.remotePort == 12010) - test(info.remoteAddress == defaultHost) - test(info.localAddress == defaultHost) + test(info.remoteAddress == defaultHost or isFreeBSDJail()) + test(info.localAddress == defaultHost or isFreeBSDJail()) ctx = testIntf.getConnectionInfoAsContext() test(ctx["incoming"] == "true") --- py/test/Ice/properties/run.py.orig 2011-06-15 19:44:00.000000000 +0000 +++ py/test/Ice/properties/run.py 2012-09-11 19:05:41.531273236 +0000 @@ -24,14 +24,14 @@ # # Write config # -configPath = u"./config/中国_client.config" +configPath = u"./config/中国_client.config".encode("utf-8") TestUtil.createConfig(configPath, ["# Automatically generated by Ice test driver.", "Ice.Trace.Protocol=1", "Ice.Trace.Network=1", "Ice.ProgramName=PropertiesClient", - "Config.Path=./config/中国_client.config"]) + "Config.Path="+configPath]) TestUtil.simpleTest()