zeroc-ice 3.6b1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ICE_LICENSE +54 -0
- data/LICENSE +339 -0
- data/bin/slice2rb +17 -0
- data/ext/Communicator.cpp +596 -0
- data/ext/Communicator.h +25 -0
- data/ext/Config.h +111 -0
- data/ext/Connection.cpp +381 -0
- data/ext/Connection.h +26 -0
- data/ext/Endpoint.cpp +311 -0
- data/ext/Endpoint.h +27 -0
- data/ext/ImplicitContext.cpp +152 -0
- data/ext/ImplicitContext.h +25 -0
- data/ext/Init.cpp +52 -0
- data/ext/Logger.cpp +151 -0
- data/ext/Logger.h +28 -0
- data/ext/ObjectFactory.cpp +140 -0
- data/ext/ObjectFactory.h +50 -0
- data/ext/Operation.cpp +676 -0
- data/ext/Operation.h +36 -0
- data/ext/Properties.cpp +369 -0
- data/ext/Properties.h +25 -0
- data/ext/Proxy.cpp +1354 -0
- data/ext/Proxy.h +27 -0
- data/ext/Slice.cpp +223 -0
- data/ext/Slice.h +22 -0
- data/ext/Types.cpp +3160 -0
- data/ext/Types.h +545 -0
- data/ext/Util.cpp +792 -0
- data/ext/Util.h +511 -0
- data/ext/extconf.rb +118 -0
- data/ext/ice/BZIP_LICENSE +42 -0
- data/ext/ice/MCPP_LICENSE +36 -0
- data/ext/ice/bzip2/blocksort.c +1094 -0
- data/ext/ice/bzip2/bzlib.c +1572 -0
- data/ext/ice/bzip2/bzlib.h +282 -0
- data/ext/ice/bzip2/bzlib_private.h +509 -0
- data/ext/ice/bzip2/compress.c +672 -0
- data/ext/ice/bzip2/crctable.c +104 -0
- data/ext/ice/bzip2/decompress.c +646 -0
- data/ext/ice/bzip2/huffman.c +205 -0
- data/ext/ice/bzip2/randtable.c +84 -0
- data/ext/ice/cpp/include/Ice/ACMF.h +30 -0
- data/ext/ice/cpp/include/Ice/Application.h +156 -0
- data/ext/ice/cpp/include/Ice/AsyncResult.h +363 -0
- data/ext/ice/cpp/include/Ice/AsyncResultF.h +26 -0
- data/ext/ice/cpp/include/Ice/BasicStream.h +1315 -0
- data/ext/ice/cpp/include/Ice/Buffer.h +159 -0
- data/ext/ice/cpp/include/Ice/BuiltinSequences.h +74 -0
- data/ext/ice/cpp/include/Ice/Communicator.h +194 -0
- data/ext/ice/cpp/include/Ice/CommunicatorAsync.h +115 -0
- data/ext/ice/cpp/include/Ice/CommunicatorF.h +60 -0
- data/ext/ice/cpp/include/Ice/Config.h +97 -0
- data/ext/ice/cpp/include/Ice/Connection.h +495 -0
- data/ext/ice/cpp/include/Ice/ConnectionAsync.h +115 -0
- data/ext/ice/cpp/include/Ice/ConnectionF.h +72 -0
- data/ext/ice/cpp/include/Ice/ConnectionFactoryF.h +30 -0
- data/ext/ice/cpp/include/Ice/ConnectionIF.h +37 -0
- data/ext/ice/cpp/include/Ice/Current.h +94 -0
- data/ext/ice/cpp/include/Ice/DefaultObjectFactory.h +48 -0
- data/ext/ice/cpp/include/Ice/DeprecatedStringConverter.h +62 -0
- data/ext/ice/cpp/include/Ice/DispatchInterceptor.h +33 -0
- data/ext/ice/cpp/include/Ice/Dispatcher.h +51 -0
- data/ext/ice/cpp/include/Ice/DynamicLibrary.h +105 -0
- data/ext/ice/cpp/include/Ice/DynamicLibraryF.h +29 -0
- data/ext/ice/cpp/include/Ice/Endpoint.h +350 -0
- data/ext/ice/cpp/include/Ice/EndpointF.h +97 -0
- data/ext/ice/cpp/include/Ice/EndpointTypes.h +74 -0
- data/ext/ice/cpp/include/Ice/Exception.h +114 -0
- data/ext/ice/cpp/include/Ice/FacetMap.h +56 -0
- data/ext/ice/cpp/include/Ice/FactoryTable.h +69 -0
- data/ext/ice/cpp/include/Ice/FactoryTableInit.h +87 -0
- data/ext/ice/cpp/include/Ice/Format.h +39 -0
- data/ext/ice/cpp/include/Ice/Functional.h +138 -0
- data/ext/ice/cpp/include/Ice/GCObject.h +73 -0
- data/ext/ice/cpp/include/Ice/Handle.h +192 -0
- data/ext/ice/cpp/include/Ice/Ice.h +54 -0
- data/ext/ice/cpp/include/Ice/Identity.h +160 -0
- data/ext/ice/cpp/include/Ice/ImplicitContext.h +96 -0
- data/ext/ice/cpp/include/Ice/ImplicitContextF.h +60 -0
- data/ext/ice/cpp/include/Ice/Incoming.h +131 -0
- data/ext/ice/cpp/include/Ice/IncomingAsync.h +108 -0
- data/ext/ice/cpp/include/Ice/IncomingAsyncF.h +35 -0
- data/ext/ice/cpp/include/Ice/Initialize.h +141 -0
- data/ext/ice/cpp/include/Ice/InstanceF.h +26 -0
- data/ext/ice/cpp/include/Ice/Instrumentation.h +377 -0
- data/ext/ice/cpp/include/Ice/InstrumentationF.h +71 -0
- data/ext/ice/cpp/include/Ice/LocalException.h +1022 -0
- data/ext/ice/cpp/include/Ice/LocalObject.h +36 -0
- data/ext/ice/cpp/include/Ice/LocalObjectF.h +26 -0
- data/ext/ice/cpp/include/Ice/Locator.h +2191 -0
- data/ext/ice/cpp/include/Ice/LocatorF.h +89 -0
- data/ext/ice/cpp/include/Ice/Logger.h +94 -0
- data/ext/ice/cpp/include/Ice/LoggerF.h +60 -0
- data/ext/ice/cpp/include/Ice/LoggerUtil.h +153 -0
- data/ext/ice/cpp/include/Ice/Makefile +26 -0
- data/ext/ice/cpp/include/Ice/Metrics.h +2989 -0
- data/ext/ice/cpp/include/Ice/MetricsAdminI.h +662 -0
- data/ext/ice/cpp/include/Ice/MetricsFunctional.h +144 -0
- data/ext/ice/cpp/include/Ice/MetricsObserverI.h +576 -0
- data/ext/ice/cpp/include/Ice/NativePropertiesAdmin.h +55 -0
- data/ext/ice/cpp/include/Ice/Object.h +165 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapter.h +162 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapterF.h +60 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapterFactoryF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObjectF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObjectFactory.h +86 -0
- data/ext/ice/cpp/include/Ice/ObjectFactoryF.h +60 -0
- data/ext/ice/cpp/include/Ice/ObjectFactoryManagerF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObserverHelper.h +177 -0
- data/ext/ice/cpp/include/Ice/Outgoing.h +197 -0
- data/ext/ice/cpp/include/Ice/OutgoingAsync.h +264 -0
- data/ext/ice/cpp/include/Ice/OutgoingAsyncF.h +38 -0
- data/ext/ice/cpp/include/Ice/Plugin.h +121 -0
- data/ext/ice/cpp/include/Ice/PluginF.h +66 -0
- data/ext/ice/cpp/include/Ice/Process.h +568 -0
- data/ext/ice/cpp/include/Ice/ProcessF.h +77 -0
- data/ext/ice/cpp/include/Ice/Properties.h +130 -0
- data/ext/ice/cpp/include/Ice/PropertiesAdmin.h +824 -0
- data/ext/ice/cpp/include/Ice/PropertiesF.h +83 -0
- data/ext/ice/cpp/include/Ice/Protocol.h +242 -0
- data/ext/ice/cpp/include/Ice/Proxy.h +2448 -0
- data/ext/ice/cpp/include/Ice/ProxyF.h +78 -0
- data/ext/ice/cpp/include/Ice/ProxyFactoryF.h +26 -0
- data/ext/ice/cpp/include/Ice/ProxyHandle.h +330 -0
- data/ext/ice/cpp/include/Ice/ReferenceF.h +34 -0
- data/ext/ice/cpp/include/Ice/RemoteLogger.h +1496 -0
- data/ext/ice/cpp/include/Ice/RequestHandlerF.h +29 -0
- data/ext/ice/cpp/include/Ice/ResponseHandlerF.h +25 -0
- data/ext/ice/cpp/include/Ice/Router.h +1155 -0
- data/ext/ice/cpp/include/Ice/RouterF.h +77 -0
- data/ext/ice/cpp/include/Ice/ServantLocator.h +90 -0
- data/ext/ice/cpp/include/Ice/ServantLocatorF.h +60 -0
- data/ext/ice/cpp/include/Ice/ServantManagerF.h +26 -0
- data/ext/ice/cpp/include/Ice/Service.h +260 -0
- data/ext/ice/cpp/include/Ice/SliceChecksumDict.h +56 -0
- data/ext/ice/cpp/include/Ice/SliceChecksums.h +34 -0
- data/ext/ice/cpp/include/Ice/SlicedData.h +103 -0
- data/ext/ice/cpp/include/Ice/SlicedDataF.h +34 -0
- data/ext/ice/cpp/include/Ice/Stream.h +449 -0
- data/ext/ice/cpp/include/Ice/StreamF.h +30 -0
- data/ext/ice/cpp/include/Ice/StreamHelpers.h +877 -0
- data/ext/ice/cpp/include/Ice/ThreadPoolF.h +28 -0
- data/ext/ice/cpp/include/Ice/UserExceptionFactory.h +56 -0
- data/ext/ice/cpp/include/Ice/Version.h +254 -0
- data/ext/ice/cpp/include/IceSSL/Config.h +23 -0
- data/ext/ice/cpp/include/IceSSL/ConnectionInfo.h +119 -0
- data/ext/ice/cpp/include/IceSSL/EndpointInfo.h +101 -0
- data/ext/ice/cpp/include/IceSSL/IceSSL.h +22 -0
- data/ext/ice/cpp/include/IceSSL/Makefile +26 -0
- data/ext/ice/cpp/include/IceSSL/Plugin.h +558 -0
- data/ext/ice/cpp/include/IceUtil/AbstractMutex.h +119 -0
- data/ext/ice/cpp/include/IceUtil/Cache.h +362 -0
- data/ext/ice/cpp/include/IceUtil/Cond.h +323 -0
- data/ext/ice/cpp/include/IceUtil/Config.h +234 -0
- data/ext/ice/cpp/include/IceUtil/CountDownLatch.h +50 -0
- data/ext/ice/cpp/include/IceUtil/CtrlCHandler.h +70 -0
- data/ext/ice/cpp/include/IceUtil/DisableWarnings.h +45 -0
- data/ext/ice/cpp/include/IceUtil/Exception.h +184 -0
- data/ext/ice/cpp/include/IceUtil/Functional.h +389 -0
- data/ext/ice/cpp/include/IceUtil/Handle.h +266 -0
- data/ext/ice/cpp/include/IceUtil/IceUtil.h +51 -0
- data/ext/ice/cpp/include/IceUtil/IconvStringConverter.h +302 -0
- data/ext/ice/cpp/include/IceUtil/InputUtil.h +47 -0
- data/ext/ice/cpp/include/IceUtil/Iterator.h +36 -0
- data/ext/ice/cpp/include/IceUtil/Lock.h +135 -0
- data/ext/ice/cpp/include/IceUtil/Makefile +26 -0
- data/ext/ice/cpp/include/IceUtil/Monitor.h +249 -0
- data/ext/ice/cpp/include/IceUtil/Mutex.h +357 -0
- data/ext/ice/cpp/include/IceUtil/MutexProtocol.h +28 -0
- data/ext/ice/cpp/include/IceUtil/MutexPtrLock.h +83 -0
- data/ext/ice/cpp/include/IceUtil/MutexPtrTryLock.h +82 -0
- data/ext/ice/cpp/include/IceUtil/Optional.h +322 -0
- data/ext/ice/cpp/include/IceUtil/Options.h +141 -0
- data/ext/ice/cpp/include/IceUtil/OutputUtil.h +362 -0
- data/ext/ice/cpp/include/IceUtil/PopDisableWarnings.h +19 -0
- data/ext/ice/cpp/include/IceUtil/PushDisableWarnings.h +26 -0
- data/ext/ice/cpp/include/IceUtil/Random.h +24 -0
- data/ext/ice/cpp/include/IceUtil/RecMutex.h +113 -0
- data/ext/ice/cpp/include/IceUtil/SHA1.h +65 -0
- data/ext/ice/cpp/include/IceUtil/ScannerConfig.h +44 -0
- data/ext/ice/cpp/include/IceUtil/ScopedArray.h +97 -0
- data/ext/ice/cpp/include/IceUtil/Shared.h +168 -0
- data/ext/ice/cpp/include/IceUtil/StringConverter.h +175 -0
- data/ext/ice/cpp/include/IceUtil/StringUtil.h +91 -0
- data/ext/ice/cpp/include/IceUtil/Thread.h +181 -0
- data/ext/ice/cpp/include/IceUtil/ThreadException.h +108 -0
- data/ext/ice/cpp/include/IceUtil/Time.h +209 -0
- data/ext/ice/cpp/include/IceUtil/Timer.h +143 -0
- data/ext/ice/cpp/include/IceUtil/UUID.h +22 -0
- data/ext/ice/cpp/include/IceUtil/UndefSysMacros.h +42 -0
- data/ext/ice/cpp/include/IceUtil/UniquePtr.h +101 -0
- data/ext/ice/cpp/include/Slice/CPlusPlusUtil.h +64 -0
- data/ext/ice/cpp/include/Slice/Checksum.h +26 -0
- data/ext/ice/cpp/include/Slice/CsUtil.h +92 -0
- data/ext/ice/cpp/include/Slice/DotNetNames.h +34 -0
- data/ext/ice/cpp/include/Slice/FileTracker.h +71 -0
- data/ext/ice/cpp/include/Slice/JavaUtil.h +277 -0
- data/ext/ice/cpp/include/Slice/Makefile +26 -0
- data/ext/ice/cpp/include/Slice/PHPUtil.h +50 -0
- data/ext/ice/cpp/include/Slice/Parser.h +1116 -0
- data/ext/ice/cpp/include/Slice/Preprocessor.h +68 -0
- data/ext/ice/cpp/include/Slice/PythonUtil.h +64 -0
- data/ext/ice/cpp/include/Slice/RubyUtil.h +54 -0
- data/ext/ice/cpp/include/Slice/Util.h +33 -0
- data/ext/ice/cpp/src/Ice/ACM.cpp +343 -0
- data/ext/ice/cpp/src/Ice/ACM.h +117 -0
- data/ext/ice/cpp/src/Ice/Acceptor.cpp +16 -0
- data/ext/ice/cpp/src/Ice/Acceptor.h +41 -0
- data/ext/ice/cpp/src/Ice/AcceptorF.h +30 -0
- data/ext/ice/cpp/src/Ice/Application.cpp +760 -0
- data/ext/ice/cpp/src/Ice/AsyncResult.cpp +599 -0
- data/ext/ice/cpp/src/Ice/Base64.cpp +269 -0
- data/ext/ice/cpp/src/Ice/Base64.h +36 -0
- data/ext/ice/cpp/src/Ice/BasicStream.cpp +3393 -0
- data/ext/ice/cpp/src/Ice/Buffer.cpp +98 -0
- data/ext/ice/cpp/src/Ice/BuiltinSequences.cpp +34 -0
- data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.cpp +718 -0
- data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.h +106 -0
- data/ext/ice/cpp/src/Ice/Communicator.cpp +45 -0
- data/ext/ice/cpp/src/Ice/CommunicatorF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/CommunicatorI.cpp +386 -0
- data/ext/ice/cpp/src/Ice/CommunicatorI.h +112 -0
- data/ext/ice/cpp/src/Ice/ConnectRequestHandler.cpp +546 -0
- data/ext/ice/cpp/src/Ice/ConnectRequestHandler.h +97 -0
- data/ext/ice/cpp/src/Ice/Connection.cpp +58 -0
- data/ext/ice/cpp/src/Ice/ConnectionF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ConnectionFactory.cpp +1639 -0
- data/ext/ice/cpp/src/Ice/ConnectionFactory.h +236 -0
- data/ext/ice/cpp/src/Ice/ConnectionI.cpp +3876 -0
- data/ext/ice/cpp/src/Ice/ConnectionI.h +364 -0
- data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.cpp +115 -0
- data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.h +50 -0
- data/ext/ice/cpp/src/Ice/Connector.cpp +16 -0
- data/ext/ice/cpp/src/Ice/Connector.h +36 -0
- data/ext/ice/cpp/src/Ice/ConnectorF.h +26 -0
- data/ext/ice/cpp/src/Ice/Current.cpp +38 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.cpp +168 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.h +57 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverridesF.h +26 -0
- data/ext/ice/cpp/src/Ice/DeprecatedStringConverter.cpp +60 -0
- data/ext/ice/cpp/src/Ice/DispatchInterceptor.cpp +49 -0
- data/ext/ice/cpp/src/Ice/DynamicLibrary.cpp +281 -0
- data/ext/ice/cpp/src/Ice/Endpoint.cpp +53 -0
- data/ext/ice/cpp/src/Ice/EndpointF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/EndpointFactory.cpp +25 -0
- data/ext/ice/cpp/src/Ice/EndpointFactory.h +44 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryF.h +26 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManager.cpp +208 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManager.h +46 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManagerF.h +26 -0
- data/ext/ice/cpp/src/Ice/EndpointI.cpp +87 -0
- data/ext/ice/cpp/src/Ice/EndpointI.h +165 -0
- data/ext/ice/cpp/src/Ice/EndpointIF.h +41 -0
- data/ext/ice/cpp/src/Ice/EndpointTypes.cpp +38 -0
- data/ext/ice/cpp/src/Ice/EventHandler.cpp +35 -0
- data/ext/ice/cpp/src/Ice/EventHandler.h +78 -0
- data/ext/ice/cpp/src/Ice/EventHandlerF.h +26 -0
- data/ext/ice/cpp/src/Ice/EventLoggerMsg.h +53 -0
- data/ext/ice/cpp/src/Ice/Exception.cpp +832 -0
- data/ext/ice/cpp/src/Ice/FacetMap.cpp +34 -0
- data/ext/ice/cpp/src/Ice/FactoryTable.cpp +158 -0
- data/ext/ice/cpp/src/Ice/FactoryTableInit.cpp +95 -0
- data/ext/ice/cpp/src/Ice/GCObject.cpp +444 -0
- data/ext/ice/cpp/src/Ice/HashUtil.h +59 -0
- data/ext/ice/cpp/src/Ice/HttpParser.cpp +680 -0
- data/ext/ice/cpp/src/Ice/HttpParser.h +124 -0
- data/ext/ice/cpp/src/Ice/IPEndpointI.cpp +733 -0
- data/ext/ice/cpp/src/Ice/IPEndpointI.h +157 -0
- data/ext/ice/cpp/src/Ice/IPEndpointIF.h +29 -0
- data/ext/ice/cpp/src/Ice/Identity.cpp +42 -0
- data/ext/ice/cpp/src/Ice/ImplicitContext.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextI.cpp +639 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextI.h +51 -0
- data/ext/ice/cpp/src/Ice/Incoming.cpp +757 -0
- data/ext/ice/cpp/src/Ice/IncomingAsync.cpp +340 -0
- data/ext/ice/cpp/src/Ice/IncomingRequest.h +37 -0
- data/ext/ice/cpp/src/Ice/Initialize.cpp +401 -0
- data/ext/ice/cpp/src/Ice/Instance.cpp +1928 -0
- data/ext/ice/cpp/src/Ice/Instance.h +198 -0
- data/ext/ice/cpp/src/Ice/Instrumentation.cpp +68 -0
- data/ext/ice/cpp/src/Ice/InstrumentationF.cpp +43 -0
- data/ext/ice/cpp/src/Ice/InstrumentationI.cpp +1083 -0
- data/ext/ice/cpp/src/Ice/InstrumentationI.h +262 -0
- data/ext/ice/cpp/src/Ice/LocalException.cpp +2091 -0
- data/ext/ice/cpp/src/Ice/LocalObject.cpp +29 -0
- data/ext/ice/cpp/src/Ice/Locator.cpp +1946 -0
- data/ext/ice/cpp/src/Ice/LocatorF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/LocatorInfo.cpp +917 -0
- data/ext/ice/cpp/src/Ice/LocatorInfo.h +193 -0
- data/ext/ice/cpp/src/Ice/LocatorInfoF.h +34 -0
- data/ext/ice/cpp/src/Ice/Logger.cpp +40 -0
- data/ext/ice/cpp/src/Ice/LoggerAdminI.cpp +862 -0
- data/ext/ice/cpp/src/Ice/LoggerAdminI.h +46 -0
- data/ext/ice/cpp/src/Ice/LoggerF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/LoggerI.cpp +199 -0
- data/ext/ice/cpp/src/Ice/LoggerI.h +57 -0
- data/ext/ice/cpp/src/Ice/LoggerUtil.cpp +107 -0
- data/ext/ice/cpp/src/Ice/Makefile +190 -0
- data/ext/ice/cpp/src/Ice/Metrics.cpp +2159 -0
- data/ext/ice/cpp/src/Ice/MetricsAdminI.cpp +669 -0
- data/ext/ice/cpp/src/Ice/MetricsObserverI.cpp +14 -0
- data/ext/ice/cpp/src/Ice/Network.cpp +2694 -0
- data/ext/ice/cpp/src/Ice/Network.h +291 -0
- data/ext/ice/cpp/src/Ice/NetworkF.h +28 -0
- data/ext/ice/cpp/src/Ice/NetworkProxy.cpp +325 -0
- data/ext/ice/cpp/src/Ice/NetworkProxy.h +74 -0
- data/ext/ice/cpp/src/Ice/NetworkProxyF.h +26 -0
- data/ext/ice/cpp/src/Ice/Object.cpp +440 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapter.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.cpp +241 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.h +52 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterI.cpp +1498 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterI.h +155 -0
- data/ext/ice/cpp/src/Ice/ObjectFactory.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryManager.cpp +140 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryManager.h +43 -0
- data/ext/ice/cpp/src/Ice/ObserverHelper.cpp +84 -0
- data/ext/ice/cpp/src/Ice/OpaqueEndpointI.cpp +407 -0
- data/ext/ice/cpp/src/Ice/OpaqueEndpointI.h +70 -0
- data/ext/ice/cpp/src/Ice/Outgoing.cpp +737 -0
- data/ext/ice/cpp/src/Ice/OutgoingAsync.cpp +874 -0
- data/ext/ice/cpp/src/Ice/Plugin.cpp +43 -0
- data/ext/ice/cpp/src/Ice/PluginF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/PluginManagerI.cpp +503 -0
- data/ext/ice/cpp/src/Ice/PluginManagerI.h +67 -0
- data/ext/ice/cpp/src/Ice/Process.cpp +299 -0
- data/ext/ice/cpp/src/Ice/ProcessF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/Properties.cpp +45 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdmin.cpp +555 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdminI.cpp +207 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdminI.h +45 -0
- data/ext/ice/cpp/src/Ice/PropertiesF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/PropertiesI.cpp +759 -0
- data/ext/ice/cpp/src/Ice/PropertiesI.h +78 -0
- data/ext/ice/cpp/src/Ice/PropertyNames.cpp +1293 -0
- data/ext/ice/cpp/src/Ice/PropertyNames.h +81 -0
- data/ext/ice/cpp/src/Ice/Protocol.cpp +137 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstance.cpp +98 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstance.h +91 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstanceF.h +26 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.cpp +51 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.h +67 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacadeF.h +26 -0
- data/ext/ice/cpp/src/Ice/Proxy.cpp +1810 -0
- data/ext/ice/cpp/src/Ice/ProxyFactory.cpp +305 -0
- data/ext/ice/cpp/src/Ice/ProxyFactory.h +57 -0
- data/ext/ice/cpp/src/Ice/Reference.cpp +1947 -0
- data/ext/ice/cpp/src/Ice/Reference.h +305 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactory.cpp +937 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactory.h +81 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactoryF.h +24 -0
- data/ext/ice/cpp/src/Ice/RemoteLogger.cpp +958 -0
- data/ext/ice/cpp/src/Ice/ReplyStatus.h +29 -0
- data/ext/ice/cpp/src/Ice/RequestHandler.cpp +40 -0
- data/ext/ice/cpp/src/Ice/RequestHandler.h +90 -0
- data/ext/ice/cpp/src/Ice/RequestHandlerFactory.cpp +70 -0
- data/ext/ice/cpp/src/Ice/RequestHandlerFactory.h +41 -0
- data/ext/ice/cpp/src/Ice/ResponseHandler.cpp +20 -0
- data/ext/ice/cpp/src/Ice/ResponseHandler.h +39 -0
- data/ext/ice/cpp/src/Ice/RetryQueue.cpp +154 -0
- data/ext/ice/cpp/src/Ice/RetryQueue.h +69 -0
- data/ext/ice/cpp/src/Ice/RetryQueueF.h +24 -0
- data/ext/ice/cpp/src/Ice/Router.cpp +849 -0
- data/ext/ice/cpp/src/Ice/RouterF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/RouterInfo.cpp +381 -0
- data/ext/ice/cpp/src/Ice/RouterInfo.h +148 -0
- data/ext/ice/cpp/src/Ice/RouterInfoF.h +30 -0
- data/ext/ice/cpp/src/Ice/Selector.cpp +926 -0
- data/ext/ice/cpp/src/Ice/Selector.h +231 -0
- data/ext/ice/cpp/src/Ice/ServantLocator.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ServantLocatorF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ServantManager.cpp +495 -0
- data/ext/ice/cpp/src/Ice/ServantManager.h +74 -0
- data/ext/ice/cpp/src/Ice/Service.cpp +1897 -0
- data/ext/ice/cpp/src/Ice/SharedContext.h +51 -0
- data/ext/ice/cpp/src/Ice/SliceChecksumDict.cpp +34 -0
- data/ext/ice/cpp/src/Ice/SliceChecksums.cpp +80 -0
- data/ext/ice/cpp/src/Ice/SlicedData.cpp +80 -0
- data/ext/ice/cpp/src/Ice/Stream.cpp +53 -0
- data/ext/ice/cpp/src/Ice/StreamI.cpp +832 -0
- data/ext/ice/cpp/src/Ice/StreamI.h +198 -0
- data/ext/ice/cpp/src/Ice/StreamSocket.cpp +521 -0
- data/ext/ice/cpp/src/Ice/StreamSocket.h +85 -0
- data/ext/ice/cpp/src/Ice/StringConverterPlugin.cpp +145 -0
- data/ext/ice/cpp/src/Ice/SysLoggerI.cpp +167 -0
- data/ext/ice/cpp/src/Ice/SysLoggerI.h +43 -0
- data/ext/ice/cpp/src/Ice/TcpAcceptor.cpp +235 -0
- data/ext/ice/cpp/src/Ice/TcpAcceptor.h +67 -0
- data/ext/ice/cpp/src/Ice/TcpConnector.cpp +133 -0
- data/ext/ice/cpp/src/Ice/TcpConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/TcpEndpointI.cpp +397 -0
- data/ext/ice/cpp/src/Ice/TcpEndpointI.h +93 -0
- data/ext/ice/cpp/src/Ice/TcpTransceiver.cpp +127 -0
- data/ext/ice/cpp/src/Ice/TcpTransceiver.h +61 -0
- data/ext/ice/cpp/src/Ice/ThreadPool.cpp +1357 -0
- data/ext/ice/cpp/src/Ice/ThreadPool.h +399 -0
- data/ext/ice/cpp/src/Ice/TraceLevels.cpp +43 -0
- data/ext/ice/cpp/src/Ice/TraceLevels.h +50 -0
- data/ext/ice/cpp/src/Ice/TraceLevelsF.h +26 -0
- data/ext/ice/cpp/src/Ice/TraceUtil.cpp +452 -0
- data/ext/ice/cpp/src/Ice/TraceUtil.h +28 -0
- data/ext/ice/cpp/src/Ice/Transceiver.cpp +24 -0
- data/ext/ice/cpp/src/Ice/Transceiver.h +52 -0
- data/ext/ice/cpp/src/Ice/TransceiverF.h +38 -0
- data/ext/ice/cpp/src/Ice/UdpConnector.cpp +144 -0
- data/ext/ice/cpp/src/Ice/UdpConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/UdpEndpointI.cpp +483 -0
- data/ext/ice/cpp/src/Ice/UdpEndpointI.h +95 -0
- data/ext/ice/cpp/src/Ice/UdpTransceiver.cpp +1156 -0
- data/ext/ice/cpp/src/Ice/UdpTransceiver.h +123 -0
- data/ext/ice/cpp/src/Ice/Version.cpp +46 -0
- data/ext/ice/cpp/src/Ice/WSAcceptor.cpp +103 -0
- data/ext/ice/cpp/src/Ice/WSAcceptor.h +61 -0
- data/ext/ice/cpp/src/Ice/WSConnector.cpp +113 -0
- data/ext/ice/cpp/src/Ice/WSConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/WSEndpoint.cpp +441 -0
- data/ext/ice/cpp/src/Ice/WSEndpoint.h +97 -0
- data/ext/ice/cpp/src/Ice/WSTransceiver.cpp +1728 -0
- data/ext/ice/cpp/src/Ice/WSTransceiver.h +149 -0
- data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.cpp +594 -0
- data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.h +1035 -0
- data/ext/ice/cpp/src/IceDiscovery/LocatorI.cpp +208 -0
- data/ext/ice/cpp/src/IceDiscovery/LocatorI.h +78 -0
- data/ext/ice/cpp/src/IceDiscovery/LookupI.cpp +308 -0
- data/ext/ice/cpp/src/IceDiscovery/LookupI.h +183 -0
- data/ext/ice/cpp/src/IceDiscovery/Makefile +61 -0
- data/ext/ice/cpp/src/IceDiscovery/PluginI.cpp +148 -0
- data/ext/ice/cpp/src/IceDiscovery/PluginI.h +39 -0
- data/ext/ice/cpp/src/IceSSL/AcceptorI.cpp +258 -0
- data/ext/ice/cpp/src/IceSSL/AcceptorI.h +66 -0
- data/ext/ice/cpp/src/IceSSL/Certificate.cpp +1334 -0
- data/ext/ice/cpp/src/IceSSL/ConnectionInfo.cpp +42 -0
- data/ext/ice/cpp/src/IceSSL/ConnectorI.cpp +151 -0
- data/ext/ice/cpp/src/IceSSL/ConnectorI.h +56 -0
- data/ext/ice/cpp/src/IceSSL/EndpointI.cpp +397 -0
- data/ext/ice/cpp/src/IceSSL/EndpointI.h +96 -0
- data/ext/ice/cpp/src/IceSSL/EndpointInfo.cpp +41 -0
- data/ext/ice/cpp/src/IceSSL/Instance.cpp +38 -0
- data/ext/ice/cpp/src/IceSSL/Instance.h +42 -0
- data/ext/ice/cpp/src/IceSSL/InstanceF.h +34 -0
- data/ext/ice/cpp/src/IceSSL/Makefile +82 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.cpp +1001 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.cpp +607 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.h +75 -0
- data/ext/ice/cpp/src/IceSSL/PluginI.cpp +102 -0
- data/ext/ice/cpp/src/IceSSL/PluginI.h +56 -0
- data/ext/ice/cpp/src/IceSSL/RFC2253.cpp +541 -0
- data/ext/ice/cpp/src/IceSSL/RFC2253.h +67 -0
- data/ext/ice/cpp/src/IceSSL/SChannelEngine.cpp +729 -0
- data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.cpp +1062 -0
- data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.h +130 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngine.cpp +291 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngine.h +264 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngineF.h +41 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.cpp +1514 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +609 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.h +91 -0
- data/ext/ice/cpp/src/IceSSL/TrustManager.cpp +246 -0
- data/ext/ice/cpp/src/IceSSL/TrustManager.h +51 -0
- data/ext/ice/cpp/src/IceSSL/TrustManagerF.h +26 -0
- data/ext/ice/cpp/src/IceSSL/Util.cpp +1423 -0
- data/ext/ice/cpp/src/IceSSL/Util.h +136 -0
- data/ext/ice/cpp/src/IceUtil/ArgVector.cpp +65 -0
- data/ext/ice/cpp/src/IceUtil/ArgVector.h +41 -0
- data/ext/ice/cpp/src/IceUtil/Cond.cpp +386 -0
- data/ext/ice/cpp/src/IceUtil/ConvertUTF.cpp +477 -0
- data/ext/ice/cpp/src/IceUtil/ConvertUTF.h +144 -0
- data/ext/ice/cpp/src/IceUtil/CountDownLatch.cpp +184 -0
- data/ext/ice/cpp/src/IceUtil/CtrlCHandler.cpp +273 -0
- data/ext/ice/cpp/src/IceUtil/Exception.cpp +782 -0
- data/ext/ice/cpp/src/IceUtil/FileUtil.cpp +532 -0
- data/ext/ice/cpp/src/IceUtil/FileUtil.h +159 -0
- data/ext/ice/cpp/src/IceUtil/InputUtil.cpp +41 -0
- data/ext/ice/cpp/src/IceUtil/Makefile +68 -0
- data/ext/ice/cpp/src/IceUtil/MutexProtocol.cpp +24 -0
- data/ext/ice/cpp/src/IceUtil/Options.cpp +1049 -0
- data/ext/ice/cpp/src/IceUtil/OutputUtil.cpp +591 -0
- data/ext/ice/cpp/src/IceUtil/Random.cpp +185 -0
- data/ext/ice/cpp/src/IceUtil/RecMutex.cpp +257 -0
- data/ext/ice/cpp/src/IceUtil/SHA1.cpp +126 -0
- data/ext/ice/cpp/src/IceUtil/Shared.cpp +200 -0
- data/ext/ice/cpp/src/IceUtil/StopWatch.h +54 -0
- data/ext/ice/cpp/src/IceUtil/StringConverter.cpp +450 -0
- data/ext/ice/cpp/src/IceUtil/StringUtil.cpp +842 -0
- data/ext/ice/cpp/src/IceUtil/Thread.cpp +809 -0
- data/ext/ice/cpp/src/IceUtil/ThreadException.cpp +172 -0
- data/ext/ice/cpp/src/IceUtil/Time.cpp +306 -0
- data/ext/ice/cpp/src/IceUtil/Timer.cpp +251 -0
- data/ext/ice/cpp/src/IceUtil/UUID.cpp +174 -0
- data/ext/ice/cpp/src/IceUtil/Unicode.cpp +131 -0
- data/ext/ice/cpp/src/IceUtil/Unicode.h +49 -0
- data/ext/ice/cpp/src/Slice/CPlusPlusUtil.cpp +1139 -0
- data/ext/ice/cpp/src/Slice/Checksum.cpp +452 -0
- data/ext/ice/cpp/src/Slice/CsUtil.cpp +2650 -0
- data/ext/ice/cpp/src/Slice/DotNetNames.cpp +146 -0
- data/ext/ice/cpp/src/Slice/FileTracker.cpp +203 -0
- data/ext/ice/cpp/src/Slice/Grammar.cpp +4755 -0
- data/ext/ice/cpp/src/Slice/Grammar.h +98 -0
- data/ext/ice/cpp/src/Slice/GrammarUtil.h +234 -0
- data/ext/ice/cpp/src/Slice/JavaUtil.cpp +4376 -0
- data/ext/ice/cpp/src/Slice/MD5.cpp +57 -0
- data/ext/ice/cpp/src/Slice/MD5.h +44 -0
- data/ext/ice/cpp/src/Slice/MD5I.cpp +385 -0
- data/ext/ice/cpp/src/Slice/MD5I.h +91 -0
- data/ext/ice/cpp/src/Slice/Makefile +65 -0
- data/ext/ice/cpp/src/Slice/PHPUtil.cpp +156 -0
- data/ext/ice/cpp/src/Slice/Parser.cpp +6386 -0
- data/ext/ice/cpp/src/Slice/Preprocessor.cpp +686 -0
- data/ext/ice/cpp/src/Slice/Python.cpp +675 -0
- data/ext/ice/cpp/src/Slice/PythonUtil.cpp +2614 -0
- data/ext/ice/cpp/src/Slice/Ruby.cpp +317 -0
- data/ext/ice/cpp/src/Slice/RubyUtil.cpp +1774 -0
- data/ext/ice/cpp/src/Slice/Scanner.cpp +2426 -0
- data/ext/ice/cpp/src/Slice/Util.cpp +325 -0
- data/ext/ice/mcpp/config.h.Darwin +227 -0
- data/ext/ice/mcpp/config.h.Linux +227 -0
- data/ext/ice/mcpp/config.h.MINGW +7 -0
- data/ext/ice/mcpp/configed.H +382 -0
- data/ext/ice/mcpp/directive.c +1699 -0
- data/ext/ice/mcpp/eval.c +1673 -0
- data/ext/ice/mcpp/expand.c +2980 -0
- data/ext/ice/mcpp/internal.H +564 -0
- data/ext/ice/mcpp/main.c +1131 -0
- data/ext/ice/mcpp/mbchar.c +869 -0
- data/ext/ice/mcpp/mcpp_lib.h +31 -0
- data/ext/ice/mcpp/mcpp_out.h +13 -0
- data/ext/ice/mcpp/support.c +2811 -0
- data/ext/ice/mcpp/system.H +396 -0
- data/ext/ice/mcpp/system.c +4940 -0
- data/ice.gemspec +41 -0
- data/lib/Glacier2.rb +12 -0
- data/lib/Glacier2/Metrics.rb +99 -0
- data/lib/Glacier2/PermissionsVerifier.rb +168 -0
- data/lib/Glacier2/PermissionsVerifierF.rb +34 -0
- data/lib/Glacier2/Router.rb +141 -0
- data/lib/Glacier2/RouterF.rb +29 -0
- data/lib/Glacier2/SSLInfo.rb +79 -0
- data/lib/Glacier2/Session.rb +470 -0
- data/lib/Ice.rb +659 -0
- data/lib/Ice/BuiltinSequences.rb +64 -0
- data/lib/Ice/Communicator.rb +93 -0
- data/lib/Ice/CommunicatorF.rb +28 -0
- data/lib/Ice/Connection.rb +414 -0
- data/lib/Ice/ConnectionF.rb +36 -0
- data/lib/Ice/Current.rb +152 -0
- data/lib/Ice/Endpoint.rb +265 -0
- data/lib/Ice/EndpointF.rb +52 -0
- data/lib/Ice/EndpointTypes.rb +77 -0
- data/lib/Ice/FacetMap.rb +28 -0
- data/lib/Ice/Identity.rb +70 -0
- data/lib/Ice/ImplicitContext.rb +59 -0
- data/lib/Ice/ImplicitContextF.rb +28 -0
- data/lib/Ice/Instrumentation.rb +425 -0
- data/lib/Ice/InstrumentationF.rb +35 -0
- data/lib/Ice/LocalException.rb +1081 -0
- data/lib/Ice/Locator.rb +314 -0
- data/lib/Ice/LocatorF.rb +34 -0
- data/lib/Ice/Logger.rb +57 -0
- data/lib/Ice/LoggerF.rb +28 -0
- data/lib/Ice/Metrics.rb +696 -0
- data/lib/Ice/ObjectAdapterF.rb +28 -0
- data/lib/Ice/ObjectFactory.rb +53 -0
- data/lib/Ice/ObjectFactoryF.rb +28 -0
- data/lib/Ice/Plugin.rb +87 -0
- data/lib/Ice/PluginF.rb +32 -0
- data/lib/Ice/Process.rb +93 -0
- data/lib/Ice/ProcessF.rb +29 -0
- data/lib/Ice/Properties.rb +65 -0
- data/lib/Ice/PropertiesAdmin.rb +104 -0
- data/lib/Ice/PropertiesF.rb +33 -0
- data/lib/Ice/Router.rb +163 -0
- data/lib/Ice/RouterF.rb +29 -0
- data/lib/Ice/SliceChecksumDict.rb +28 -0
- data/lib/Ice/Version.rb +100 -0
- data/lib/IceBox.rb +10 -0
- data/lib/IceBox/IceBox.rb +272 -0
- data/lib/IceGrid.rb +17 -0
- data/lib/IceGrid/Admin.rb +1076 -0
- data/lib/IceGrid/Descriptor.rb +1505 -0
- data/lib/IceGrid/Exception.rb +401 -0
- data/lib/IceGrid/FileParser.rb +105 -0
- data/lib/IceGrid/Locator.rb +105 -0
- data/lib/IceGrid/Observer.rb +571 -0
- data/lib/IceGrid/Query.rb +168 -0
- data/lib/IceGrid/Registry.rb +120 -0
- data/lib/IceGrid/Session.rb +114 -0
- data/lib/IceGrid/UserAccountMapper.rb +101 -0
- data/lib/IcePatch2.rb +10 -0
- data/lib/IcePatch2/FileInfo.rb +75 -0
- data/lib/IcePatch2/FileServer.rb +141 -0
- data/lib/IceStorm.rb +11 -0
- data/lib/IceStorm/IceStorm.rb +463 -0
- data/lib/IceStorm/Metrics.rb +155 -0
- data/slice/Freeze/BackgroundSaveEvictor.ice +111 -0
- data/slice/Freeze/CatalogData.ice +49 -0
- data/slice/Freeze/Connection.ice +111 -0
- data/slice/Freeze/ConnectionF.ice +20 -0
- data/slice/Freeze/DB.ice +37 -0
- data/slice/Freeze/Evictor.ice +339 -0
- data/slice/Freeze/EvictorF.ice +22 -0
- data/slice/Freeze/EvictorStorage.ice +72 -0
- data/slice/Freeze/Exception.ice +100 -0
- data/slice/Freeze/Transaction.ice +57 -0
- data/slice/Freeze/TransactionalEvictor.ice +50 -0
- data/slice/Glacier2/Metrics.ice +77 -0
- data/slice/Glacier2/PermissionsVerifier.ice +105 -0
- data/slice/Glacier2/PermissionsVerifierF.ice +21 -0
- data/slice/Glacier2/Router.ice +178 -0
- data/slice/Glacier2/RouterF.ice +20 -0
- data/slice/Glacier2/SSLInfo.ice +50 -0
- data/slice/Glacier2/Session.ice +273 -0
- data/slice/Ice/BuiltinSequences.ice +48 -0
- data/slice/Ice/Communicator.ice +567 -0
- data/slice/Ice/CommunicatorF.ice +20 -0
- data/slice/Ice/Connection.ice +323 -0
- data/slice/Ice/ConnectionF.ice +22 -0
- data/slice/Ice/Current.ice +160 -0
- data/slice/Ice/Endpoint.ice +227 -0
- data/slice/Ice/EndpointF.ice +32 -0
- data/slice/Ice/EndpointTypes.ice +38 -0
- data/slice/Ice/FacetMap.ice +25 -0
- data/slice/Ice/Identity.ice +59 -0
- data/slice/Ice/ImplicitContext.ice +109 -0
- data/slice/Ice/ImplicitContextF.ice +20 -0
- data/slice/Ice/Instrumentation.ice +499 -0
- data/slice/Ice/InstrumentationF.ice +26 -0
- data/slice/Ice/LocalException.ice +1015 -0
- data/slice/Ice/Locator.ice +227 -0
- data/slice/Ice/LocatorF.ice +21 -0
- data/slice/Ice/Logger.ice +86 -0
- data/slice/Ice/LoggerF.ice +20 -0
- data/slice/Ice/Metrics.ice +422 -0
- data/slice/Ice/ObjectAdapter.ice +673 -0
- data/slice/Ice/ObjectAdapterF.ice +20 -0
- data/slice/Ice/ObjectFactory.ice +60 -0
- data/slice/Ice/ObjectFactoryF.ice +20 -0
- data/slice/Ice/Plugin.ice +117 -0
- data/slice/Ice/PluginF.ice +21 -0
- data/slice/Ice/Process.ice +54 -0
- data/slice/Ice/ProcessF.ice +20 -0
- data/slice/Ice/Properties.ice +228 -0
- data/slice/Ice/PropertiesAdmin.ice +75 -0
- data/slice/Ice/PropertiesF.ice +21 -0
- data/slice/Ice/RemoteLogger.ice +232 -0
- data/slice/Ice/Router.ice +83 -0
- data/slice/Ice/RouterF.ice +20 -0
- data/slice/Ice/ServantLocator.ice +117 -0
- data/slice/Ice/ServantLocatorF.ice +20 -0
- data/slice/Ice/SliceChecksumDict.ice +25 -0
- data/slice/Ice/Version.ice +39 -0
- data/slice/IceBox/IceBox.ice +194 -0
- data/slice/IceDiscovery/IceDiscovery.ice +32 -0
- data/slice/IceGrid/Admin.ice +1578 -0
- data/slice/IceGrid/Descriptor.ice +1079 -0
- data/slice/IceGrid/Discovery.ice +73 -0
- data/slice/IceGrid/Exception.ice +383 -0
- data/slice/IceGrid/FileParser.ice +61 -0
- data/slice/IceGrid/Locator.ice +56 -0
- data/slice/IceGrid/Observer.ice +394 -0
- data/slice/IceGrid/PluginFacade.ice +316 -0
- data/slice/IceGrid/Query.ice +130 -0
- data/slice/IceGrid/Registry.ice +138 -0
- data/slice/IceGrid/Session.ice +124 -0
- data/slice/IceGrid/UserAccountMapper.ice +58 -0
- data/slice/IcePatch2/FileInfo.ice +49 -0
- data/slice/IcePatch2/FileServer.ice +129 -0
- data/slice/IceSSL/ConnectionInfo.ice +34 -0
- data/slice/IceSSL/EndpointInfo.ice +41 -0
- data/slice/IceStorm/IceStorm.ice +405 -0
- data/slice/IceStorm/Metrics.ice +71 -0
- metadata +737 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#include <Ice/MetricsObserverI.h>
|
|
11
|
+
|
|
12
|
+
#include <Ice/Connection.h>
|
|
13
|
+
#include <Ice/Endpoint.h>
|
|
14
|
+
|
|
@@ -0,0 +1,2694 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
//
|
|
11
|
+
// The following is required on HP-UX in order to bring in
|
|
12
|
+
// the definition for the ip_mreq structure.
|
|
13
|
+
//
|
|
14
|
+
#if defined(__hpux)
|
|
15
|
+
# undef _XOPEN_SOURCE_EXTENDED
|
|
16
|
+
# define _XOPEN_SOURCE
|
|
17
|
+
# include <netinet/in.h>
|
|
18
|
+
#endif
|
|
19
|
+
|
|
20
|
+
#include <IceUtil/DisableWarnings.h>
|
|
21
|
+
#include <Ice/Network.h>
|
|
22
|
+
#include <Ice/NetworkProxy.h>
|
|
23
|
+
#include <IceUtil/StringUtil.h>
|
|
24
|
+
#include <IceUtil/StringConverter.h>
|
|
25
|
+
#include <Ice/LocalException.h>
|
|
26
|
+
#include <Ice/Properties.h> // For setTcpBufSize
|
|
27
|
+
#include <Ice/LoggerUtil.h> // For setTcpBufSize
|
|
28
|
+
#include <Ice/Buffer.h>
|
|
29
|
+
#include <IceUtil/Random.h>
|
|
30
|
+
|
|
31
|
+
#if defined(ICE_OS_WINRT)
|
|
32
|
+
# include <IceUtil/InputUtil.h>
|
|
33
|
+
# include <IceUtil/CountDownLatch.h>
|
|
34
|
+
#elif defined(_WIN32)
|
|
35
|
+
# include <winsock2.h>
|
|
36
|
+
# include <ws2tcpip.h>
|
|
37
|
+
# ifdef __MINGW32__
|
|
38
|
+
# include <wincrypt.h>
|
|
39
|
+
# endif
|
|
40
|
+
# include <iphlpapi.h>
|
|
41
|
+
# include <Mswsock.h>
|
|
42
|
+
# include <mstcpip.h>
|
|
43
|
+
#else
|
|
44
|
+
# include <net/if.h>
|
|
45
|
+
# include <sys/ioctl.h>
|
|
46
|
+
#endif
|
|
47
|
+
|
|
48
|
+
#if defined(__linux) || defined(__APPLE__) || defined(__FreeBSD__)
|
|
49
|
+
# include <ifaddrs.h>
|
|
50
|
+
#elif defined(__sun)
|
|
51
|
+
# include <sys/sockio.h>
|
|
52
|
+
#endif
|
|
53
|
+
|
|
54
|
+
#if defined(_WIN32)
|
|
55
|
+
# ifndef SIO_LOOPBACK_FAST_PATH
|
|
56
|
+
# define SIO_LOOPBACK_FAST_PATH _WSAIOW(IOC_VENDOR,16)
|
|
57
|
+
# endif
|
|
58
|
+
#endif
|
|
59
|
+
|
|
60
|
+
#if defined(__MINGW32__)
|
|
61
|
+
//
|
|
62
|
+
// Work-around for missing definitions in MinGW Windows headers
|
|
63
|
+
//
|
|
64
|
+
# ifndef IPV6_V6ONLY
|
|
65
|
+
# define IPV6_V6ONLY 27
|
|
66
|
+
# endif
|
|
67
|
+
|
|
68
|
+
extern "C"
|
|
69
|
+
{
|
|
70
|
+
WINSOCK_API_LINKAGE int WSAAPI inet_pton(INT, PCTSTR, PVOID);
|
|
71
|
+
}
|
|
72
|
+
#endif
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
using namespace std;
|
|
76
|
+
using namespace Ice;
|
|
77
|
+
using namespace IceInternal;
|
|
78
|
+
|
|
79
|
+
#ifdef ICE_OS_WINRT
|
|
80
|
+
using namespace Platform;
|
|
81
|
+
using namespace Windows::Foundation;
|
|
82
|
+
using namespace Windows::Storage::Streams;
|
|
83
|
+
using namespace Windows::Networking;
|
|
84
|
+
using namespace Windows::Networking::Sockets;
|
|
85
|
+
#endif
|
|
86
|
+
|
|
87
|
+
namespace
|
|
88
|
+
{
|
|
89
|
+
|
|
90
|
+
#ifndef ICE_OS_WINRT
|
|
91
|
+
struct AddressIsIPv6 : public unary_function<Address, bool>
|
|
92
|
+
{
|
|
93
|
+
public:
|
|
94
|
+
|
|
95
|
+
bool
|
|
96
|
+
operator()(const Address& ss) const
|
|
97
|
+
{
|
|
98
|
+
return ss.saStorage.ss_family == AF_INET6;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
struct RandomNumberGenerator : public std::unary_function<ptrdiff_t, ptrdiff_t>
|
|
103
|
+
{
|
|
104
|
+
ptrdiff_t operator()(ptrdiff_t d)
|
|
105
|
+
{
|
|
106
|
+
return IceUtilInternal::random(static_cast<int>(d));
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
void
|
|
111
|
+
sortAddresses(vector<Address>& addrs, ProtocolSupport protocol, Ice::EndpointSelectionType selType, bool preferIPv6)
|
|
112
|
+
{
|
|
113
|
+
if(selType == Ice::Random)
|
|
114
|
+
{
|
|
115
|
+
RandomNumberGenerator rng;
|
|
116
|
+
random_shuffle(addrs.begin(), addrs.end(), rng);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if(protocol == EnableBoth)
|
|
120
|
+
{
|
|
121
|
+
if(preferIPv6)
|
|
122
|
+
{
|
|
123
|
+
stable_partition(addrs.begin(), addrs.end(), AddressIsIPv6());
|
|
124
|
+
}
|
|
125
|
+
else
|
|
126
|
+
{
|
|
127
|
+
stable_partition(addrs.begin(), addrs.end(), not1(AddressIsIPv6()));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
void
|
|
133
|
+
setTcpNoDelay(SOCKET fd)
|
|
134
|
+
{
|
|
135
|
+
int flag = 1;
|
|
136
|
+
if(setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast<char*>(&flag), int(sizeof(int))) == SOCKET_ERROR)
|
|
137
|
+
{
|
|
138
|
+
closeSocketNoThrow(fd);
|
|
139
|
+
SocketException ex(__FILE__, __LINE__);
|
|
140
|
+
ex.error = getSocketErrno();
|
|
141
|
+
throw ex;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
void
|
|
146
|
+
setKeepAlive(SOCKET fd)
|
|
147
|
+
{
|
|
148
|
+
int flag = 1;
|
|
149
|
+
if(setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, reinterpret_cast<char*>(&flag), int(sizeof(int))) == SOCKET_ERROR)
|
|
150
|
+
{
|
|
151
|
+
closeSocketNoThrow(fd);
|
|
152
|
+
SocketException ex(__FILE__, __LINE__);
|
|
153
|
+
ex.error = getSocketErrno();
|
|
154
|
+
throw ex;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
#endif
|
|
158
|
+
|
|
159
|
+
#if defined(_WIN32) && !defined(ICE_OS_WINRT)
|
|
160
|
+
void
|
|
161
|
+
setTcpLoopbackFastPath(SOCKET fd)
|
|
162
|
+
{
|
|
163
|
+
int OptionValue = 1;
|
|
164
|
+
DWORD NumberOfBytesReturned = 0;
|
|
165
|
+
|
|
166
|
+
int status =
|
|
167
|
+
WSAIoctl(fd, SIO_LOOPBACK_FAST_PATH, &OptionValue, sizeof(OptionValue), NULL, 0, &NumberOfBytesReturned, 0, 0);
|
|
168
|
+
if(status == SOCKET_ERROR)
|
|
169
|
+
{
|
|
170
|
+
// On platforms that do not support fast path (< Windows 8), WSAEONOTSUPP is expected.
|
|
171
|
+
DWORD LastError = ::GetLastError();
|
|
172
|
+
if(LastError != WSAEOPNOTSUPP)
|
|
173
|
+
{
|
|
174
|
+
closeSocketNoThrow(fd);
|
|
175
|
+
SocketException ex(__FILE__, __LINE__);
|
|
176
|
+
ex.error = getSocketErrno();
|
|
177
|
+
throw ex;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
#endif
|
|
182
|
+
|
|
183
|
+
#ifdef ICE_OS_WINRT
|
|
184
|
+
SOCKET
|
|
185
|
+
createSocketImpl(bool udp, int)
|
|
186
|
+
{
|
|
187
|
+
SOCKET fd;
|
|
188
|
+
|
|
189
|
+
if(udp)
|
|
190
|
+
{
|
|
191
|
+
return ref new DatagramSocket();
|
|
192
|
+
}
|
|
193
|
+
else
|
|
194
|
+
{
|
|
195
|
+
StreamSocket^ socket = ref new StreamSocket();
|
|
196
|
+
socket->Control->KeepAlive = true;
|
|
197
|
+
socket->Control->NoDelay = true;
|
|
198
|
+
return socket;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return fd;
|
|
202
|
+
}
|
|
203
|
+
#else
|
|
204
|
+
SOCKET
|
|
205
|
+
createSocketImpl(bool udp, int family)
|
|
206
|
+
{
|
|
207
|
+
SOCKET fd;
|
|
208
|
+
if(udp)
|
|
209
|
+
{
|
|
210
|
+
fd = socket(family, SOCK_DGRAM, IPPROTO_UDP);
|
|
211
|
+
}
|
|
212
|
+
else
|
|
213
|
+
{
|
|
214
|
+
fd = socket(family, SOCK_STREAM, IPPROTO_TCP);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if(fd == INVALID_SOCKET)
|
|
218
|
+
{
|
|
219
|
+
SocketException ex(__FILE__, __LINE__);
|
|
220
|
+
ex.error = getSocketErrno();
|
|
221
|
+
throw ex;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if(!udp)
|
|
225
|
+
{
|
|
226
|
+
setTcpNoDelay(fd);
|
|
227
|
+
setKeepAlive(fd);
|
|
228
|
+
|
|
229
|
+
#if defined(_WIN32) && !defined(ICE_OS_WINRT)
|
|
230
|
+
//
|
|
231
|
+
// FIX: the fast path loopback appears to cause issues with
|
|
232
|
+
// connection closure when it's enabled. Sometime, a peer
|
|
233
|
+
// doesn't receive the TCP/IP connection closure (RST) from
|
|
234
|
+
// the other peer and it ends up hanging. This is showing up
|
|
235
|
+
// with the background test when ran with WS. The test
|
|
236
|
+
// sporadically hangs on exit. See bug #6093.
|
|
237
|
+
//
|
|
238
|
+
//setTcpLoopbackFastPath(fd);
|
|
239
|
+
#endif
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return fd;
|
|
243
|
+
}
|
|
244
|
+
#endif
|
|
245
|
+
|
|
246
|
+
#ifndef ICE_OS_WINRT
|
|
247
|
+
vector<Address>
|
|
248
|
+
getLocalAddresses(ProtocolSupport protocol, bool includeLoopback)
|
|
249
|
+
{
|
|
250
|
+
vector<Address> result;
|
|
251
|
+
|
|
252
|
+
#if defined(_WIN32)
|
|
253
|
+
DWORD family;
|
|
254
|
+
switch(protocol)
|
|
255
|
+
{
|
|
256
|
+
case EnableIPv4:
|
|
257
|
+
family = AF_INET;
|
|
258
|
+
break;
|
|
259
|
+
case EnableIPv6:
|
|
260
|
+
family = AF_INET6;
|
|
261
|
+
break;
|
|
262
|
+
default:
|
|
263
|
+
family = AF_UNSPEC;
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
DWORD size;
|
|
268
|
+
DWORD rv = GetAdaptersAddresses(family, 0, NULL, NULL, &size);
|
|
269
|
+
if (rv == ERROR_BUFFER_OVERFLOW)
|
|
270
|
+
{
|
|
271
|
+
PIP_ADAPTER_ADDRESSES adapter_addresses = (PIP_ADAPTER_ADDRESSES) malloc(size);
|
|
272
|
+
rv = GetAdaptersAddresses(family, 0, NULL, adapter_addresses, &size);
|
|
273
|
+
if (rv == ERROR_SUCCESS)
|
|
274
|
+
{
|
|
275
|
+
for (PIP_ADAPTER_ADDRESSES aa = adapter_addresses; aa != NULL; aa = aa->Next)
|
|
276
|
+
{
|
|
277
|
+
for (PIP_ADAPTER_UNICAST_ADDRESS ua = aa->FirstUnicastAddress; ua != NULL; ua = ua->Next)
|
|
278
|
+
{
|
|
279
|
+
Address addr;
|
|
280
|
+
memcpy(&addr.saStorage, ua->Address.lpSockaddr, ua->Address.iSockaddrLength);
|
|
281
|
+
if(addr.saStorage.ss_family == AF_INET && protocol != EnableIPv6)
|
|
282
|
+
{
|
|
283
|
+
if(addr.saIn.sin_addr.s_addr != 0 &&
|
|
284
|
+
(includeLoopback || addr.saIn.sin_addr.s_addr != htonl(INADDR_LOOPBACK)))
|
|
285
|
+
{
|
|
286
|
+
result.push_back(addr);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
else if(addr.saStorage.ss_family == AF_INET6 && protocol != EnableIPv4)
|
|
290
|
+
{
|
|
291
|
+
if(!IN6_IS_ADDR_UNSPECIFIED(&addr.saIn6.sin6_addr) &&
|
|
292
|
+
(includeLoopback || !IN6_IS_ADDR_LOOPBACK(&addr.saIn6.sin6_addr)))
|
|
293
|
+
{
|
|
294
|
+
result.push_back(addr);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
free(adapter_addresses);
|
|
302
|
+
}
|
|
303
|
+
#elif defined(__linux) || defined(__APPLE__) || defined(__FreeBSD__)
|
|
304
|
+
struct ifaddrs* ifap;
|
|
305
|
+
if(::getifaddrs(&ifap) == SOCKET_ERROR)
|
|
306
|
+
{
|
|
307
|
+
SocketException ex(__FILE__, __LINE__);
|
|
308
|
+
ex.error = getSocketErrno();
|
|
309
|
+
throw ex;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
struct ifaddrs* curr = ifap;
|
|
313
|
+
while(curr != 0)
|
|
314
|
+
{
|
|
315
|
+
if(curr->ifa_addr && (includeLoopback || !(curr->ifa_flags & IFF_LOOPBACK)))
|
|
316
|
+
{
|
|
317
|
+
if(curr->ifa_addr->sa_family == AF_INET && protocol != EnableIPv6)
|
|
318
|
+
{
|
|
319
|
+
Address addr;
|
|
320
|
+
memcpy(&addr.saStorage, curr->ifa_addr, sizeof(sockaddr_in));
|
|
321
|
+
if(addr.saIn.sin_addr.s_addr != 0)
|
|
322
|
+
{
|
|
323
|
+
result.push_back(addr);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
else if(curr->ifa_addr->sa_family == AF_INET6 && protocol != EnableIPv4)
|
|
327
|
+
{
|
|
328
|
+
Address addr;
|
|
329
|
+
memcpy(&addr.saStorage, curr->ifa_addr, sizeof(sockaddr_in6));
|
|
330
|
+
if(!IN6_IS_ADDR_UNSPECIFIED(&addr.saIn6.sin6_addr))
|
|
331
|
+
{
|
|
332
|
+
result.push_back(addr);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
curr = curr->ifa_next;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
::freeifaddrs(ifap);
|
|
341
|
+
#else
|
|
342
|
+
for(int i = 0; i < 2; i++)
|
|
343
|
+
{
|
|
344
|
+
if((i == 0 && protocol == EnableIPv6) || (i == 1 && protocol == EnableIPv4))
|
|
345
|
+
{
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
SOCKET fd = createSocketImpl(false, i == 0 ? AF_INET : AF_INET6);
|
|
349
|
+
|
|
350
|
+
#ifdef _AIX
|
|
351
|
+
int cmd = CSIOCGIFCONF;
|
|
352
|
+
#else
|
|
353
|
+
int cmd = SIOCGIFCONF;
|
|
354
|
+
#endif
|
|
355
|
+
struct ifconf ifc;
|
|
356
|
+
int numaddrs = 10;
|
|
357
|
+
int old_ifc_len = 0;
|
|
358
|
+
|
|
359
|
+
//
|
|
360
|
+
// Need to call ioctl multiple times since we do not know up front
|
|
361
|
+
// how many addresses there will be, and thus how large a buffer we need.
|
|
362
|
+
// We keep increasing the buffer size until subsequent calls return
|
|
363
|
+
// the same length, meaning we have all the addresses.
|
|
364
|
+
//
|
|
365
|
+
while(true)
|
|
366
|
+
{
|
|
367
|
+
int bufsize = numaddrs * static_cast<int>(sizeof(struct ifreq));
|
|
368
|
+
ifc.ifc_len = bufsize;
|
|
369
|
+
ifc.ifc_buf = (char*)malloc(bufsize);
|
|
370
|
+
|
|
371
|
+
int rs = ioctl(fd, cmd, &ifc);
|
|
372
|
+
if(rs == SOCKET_ERROR)
|
|
373
|
+
{
|
|
374
|
+
free(ifc.ifc_buf);
|
|
375
|
+
closeSocketNoThrow(fd);
|
|
376
|
+
SocketException ex(__FILE__, __LINE__);
|
|
377
|
+
ex.error = getSocketErrno();
|
|
378
|
+
throw ex;
|
|
379
|
+
}
|
|
380
|
+
else if(ifc.ifc_len == old_ifc_len)
|
|
381
|
+
{
|
|
382
|
+
//
|
|
383
|
+
// Returned same length twice in a row, finished.
|
|
384
|
+
//
|
|
385
|
+
break;
|
|
386
|
+
}
|
|
387
|
+
else
|
|
388
|
+
{
|
|
389
|
+
old_ifc_len = ifc.ifc_len;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
numaddrs += 10;
|
|
393
|
+
free(ifc.ifc_buf);
|
|
394
|
+
}
|
|
395
|
+
closeSocket(fd);
|
|
396
|
+
|
|
397
|
+
numaddrs = ifc.ifc_len / static_cast<int>(sizeof(struct ifreq));
|
|
398
|
+
struct ifreq* ifr = ifc.ifc_req;
|
|
399
|
+
for(int i = 0; i < numaddrs; ++i)
|
|
400
|
+
{
|
|
401
|
+
if(!(ifr[i].ifr_flags & IFF_LOOPBACK)) // Don't include loopback interface addresses
|
|
402
|
+
{
|
|
403
|
+
//
|
|
404
|
+
// On Solaris the above Loopback check does not always work so we double
|
|
405
|
+
// check the address below. Solaris also returns duplicate entries that need
|
|
406
|
+
// to be filtered out.
|
|
407
|
+
//
|
|
408
|
+
if(ifr[i].ifr_addr.sa_family == AF_INET && protocol != EnableIPv6)
|
|
409
|
+
{
|
|
410
|
+
Address addr;
|
|
411
|
+
memcpy(&addr.saStorage, &ifr[i].ifr_addr, sizeof(sockaddr_in));
|
|
412
|
+
if(addr.saIn.sin_addr.s_addr != 0 &&
|
|
413
|
+
(includeLoopback || addr.saIn.sin_addr.s_addr != htonl(INADDR_LOOPBACK)))
|
|
414
|
+
{
|
|
415
|
+
unsigned int j;
|
|
416
|
+
for(j = 0; j < result.size(); ++j)
|
|
417
|
+
{
|
|
418
|
+
if(compareAddress(addr, result[j]) == 0)
|
|
419
|
+
{
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
if(j == result.size())
|
|
424
|
+
{
|
|
425
|
+
result.push_back(addr);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
else if(ifr[i].ifr_addr.sa_family == AF_INET6 && protocol != EnableIPv4)
|
|
430
|
+
{
|
|
431
|
+
Address addr;
|
|
432
|
+
memcpy(&addr.saStorage, &ifr[i].ifr_addr, sizeof(sockaddr_in6));
|
|
433
|
+
if(!IN6_IS_ADDR_UNSPECIFIED(&addr.saIn6.sin6_addr) &&
|
|
434
|
+
(includeLoopback || !IN6_IS_ADDR_LOOPBACK(&addr.saIn6.sin6_addr)))
|
|
435
|
+
{
|
|
436
|
+
unsigned int j;
|
|
437
|
+
for(j = 0; j < result.size(); ++j)
|
|
438
|
+
{
|
|
439
|
+
if(compareAddress(addr, result[j]) == 0)
|
|
440
|
+
{
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
if(j == result.size())
|
|
445
|
+
{
|
|
446
|
+
result.push_back(addr);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
free(ifc.ifc_buf);
|
|
453
|
+
}
|
|
454
|
+
#endif
|
|
455
|
+
|
|
456
|
+
return result;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
bool
|
|
460
|
+
isLinklocal(const Address& addr)
|
|
461
|
+
{
|
|
462
|
+
if (addr.saStorage.ss_family == AF_INET6)
|
|
463
|
+
{
|
|
464
|
+
return IN6_IS_ADDR_LINKLOCAL(&addr.saIn6.sin6_addr);
|
|
465
|
+
}
|
|
466
|
+
else if (addr.saStorage.ss_family == AF_INET)
|
|
467
|
+
{
|
|
468
|
+
// Check for 169.254.X.X in network order
|
|
469
|
+
return (addr.saIn.sin_addr.s_addr & 0xFF) == 169 && ((addr.saIn.sin_addr.s_addr & 0xFF00)>>8) == 254;
|
|
470
|
+
}
|
|
471
|
+
return false;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
bool
|
|
475
|
+
isWildcard(const string& host, ProtocolSupport protocol, bool& ipv4)
|
|
476
|
+
{
|
|
477
|
+
try
|
|
478
|
+
{
|
|
479
|
+
Address addr = getAddressForServer(host, 0, protocol, true);
|
|
480
|
+
if(addr.saStorage.ss_family == AF_INET)
|
|
481
|
+
{
|
|
482
|
+
if(addr.saIn.sin_addr.s_addr == INADDR_ANY)
|
|
483
|
+
{
|
|
484
|
+
ipv4 = true;
|
|
485
|
+
return true;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
else if(addr.saStorage.ss_family)
|
|
489
|
+
{
|
|
490
|
+
if(IN6_IS_ADDR_UNSPECIFIED(&addr.saIn6.sin6_addr))
|
|
491
|
+
{
|
|
492
|
+
ipv4 = false;
|
|
493
|
+
return true;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
catch(const DNSException&)
|
|
498
|
+
{
|
|
499
|
+
}
|
|
500
|
+
return false;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
int
|
|
504
|
+
getInterfaceIndex(const string& name)
|
|
505
|
+
{
|
|
506
|
+
if(name.empty())
|
|
507
|
+
{
|
|
508
|
+
return 0;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
int index = 0;
|
|
512
|
+
|
|
513
|
+
//
|
|
514
|
+
// First check if index
|
|
515
|
+
//
|
|
516
|
+
istringstream p(name);
|
|
517
|
+
if((p >> index) && p.eof())
|
|
518
|
+
{
|
|
519
|
+
return index;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
//
|
|
523
|
+
// Then check if it's an IPv6 address. If it's an address we'll
|
|
524
|
+
// look for the interface index by address.
|
|
525
|
+
//
|
|
526
|
+
in6_addr addr;
|
|
527
|
+
bool isAddr = inet_pton(AF_INET6, name.c_str(), &addr) > 0;
|
|
528
|
+
|
|
529
|
+
#ifdef _WIN32
|
|
530
|
+
IP_ADAPTER_ADDRESSES addrs;
|
|
531
|
+
ULONG buflen = 0;
|
|
532
|
+
if(::GetAdaptersAddresses(AF_INET6, 0, 0, &addrs, &buflen) == ERROR_BUFFER_OVERFLOW)
|
|
533
|
+
{
|
|
534
|
+
PIP_ADAPTER_ADDRESSES paddrs;
|
|
535
|
+
char* buf = new char[buflen];
|
|
536
|
+
paddrs = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buf);
|
|
537
|
+
if(::GetAdaptersAddresses(AF_INET6, 0, 0, paddrs, &buflen) == NO_ERROR)
|
|
538
|
+
{
|
|
539
|
+
while(paddrs)
|
|
540
|
+
{
|
|
541
|
+
if(isAddr)
|
|
542
|
+
{
|
|
543
|
+
PIP_ADAPTER_UNICAST_ADDRESS ipAddr = paddrs->FirstUnicastAddress;
|
|
544
|
+
while(ipAddr)
|
|
545
|
+
{
|
|
546
|
+
if(ipAddr->Address.lpSockaddr->sa_family == AF_INET6)
|
|
547
|
+
{
|
|
548
|
+
struct sockaddr_in6* ipv6Addr =
|
|
549
|
+
reinterpret_cast<struct sockaddr_in6*>(ipAddr->Address.lpSockaddr);
|
|
550
|
+
if(memcmp(&addr, &ipv6Addr->sin6_addr, sizeof(in6_addr)) == 0)
|
|
551
|
+
{
|
|
552
|
+
break;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
ipAddr = ipAddr->Next;
|
|
556
|
+
}
|
|
557
|
+
if(ipAddr)
|
|
558
|
+
{
|
|
559
|
+
index = paddrs->Ipv6IfIndex;
|
|
560
|
+
break;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
else
|
|
564
|
+
{
|
|
565
|
+
//
|
|
566
|
+
// Don't need to pass a wide string converter as the wide string
|
|
567
|
+
// come from Windows API.
|
|
568
|
+
//
|
|
569
|
+
if(IceUtil::wstringToString(paddrs->FriendlyName, IceUtil::getProcessStringConverter()) == name)
|
|
570
|
+
{
|
|
571
|
+
index = paddrs->Ipv6IfIndex;
|
|
572
|
+
break;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
paddrs = paddrs->Next;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
delete[] buf;
|
|
579
|
+
}
|
|
580
|
+
#elif !defined(__hpux)
|
|
581
|
+
|
|
582
|
+
//
|
|
583
|
+
// Look for an interface with a matching IP address
|
|
584
|
+
//
|
|
585
|
+
if(isAddr)
|
|
586
|
+
{
|
|
587
|
+
# if defined(__linux) || defined(__APPLE__) || defined(__FreeBSD__)
|
|
588
|
+
struct ifaddrs* ifap;
|
|
589
|
+
if(::getifaddrs(&ifap) != SOCKET_ERROR)
|
|
590
|
+
{
|
|
591
|
+
struct ifaddrs* curr = ifap;
|
|
592
|
+
while(curr != 0)
|
|
593
|
+
{
|
|
594
|
+
if(curr->ifa_addr && curr->ifa_addr->sa_family == AF_INET6)
|
|
595
|
+
{
|
|
596
|
+
struct sockaddr_in6* ipv6Addr = reinterpret_cast<struct sockaddr_in6*>(curr->ifa_addr);
|
|
597
|
+
if(memcmp(&addr, &ipv6Addr->sin6_addr, sizeof(in6_addr)) == 0)
|
|
598
|
+
{
|
|
599
|
+
index = if_nametoindex(curr->ifa_name);
|
|
600
|
+
break;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
curr = curr->ifa_next;
|
|
604
|
+
}
|
|
605
|
+
::freeifaddrs(ifap);
|
|
606
|
+
}
|
|
607
|
+
# else
|
|
608
|
+
SOCKET fd = createSocketImpl(false, AF_INET6);
|
|
609
|
+
# ifdef _AIX
|
|
610
|
+
int cmd = CSIOCGIFCONF;
|
|
611
|
+
# else
|
|
612
|
+
int cmd = SIOCGIFCONF;
|
|
613
|
+
# endif
|
|
614
|
+
struct ifconf ifc;
|
|
615
|
+
int numaddrs = 10;
|
|
616
|
+
int old_ifc_len = 0;
|
|
617
|
+
|
|
618
|
+
//
|
|
619
|
+
// Need to call ioctl multiple times since we do not know up front
|
|
620
|
+
// how many addresses there will be, and thus how large a buffer we need.
|
|
621
|
+
// We keep increasing the buffer size until subsequent calls return
|
|
622
|
+
// the same length, meaning we have all the addresses.
|
|
623
|
+
//
|
|
624
|
+
while(true)
|
|
625
|
+
{
|
|
626
|
+
int bufsize = numaddrs * static_cast<int>(sizeof(struct ifreq));
|
|
627
|
+
ifc.ifc_len = bufsize;
|
|
628
|
+
ifc.ifc_buf = (char*)malloc(bufsize);
|
|
629
|
+
|
|
630
|
+
int rs = ioctl(fd, cmd, &ifc);
|
|
631
|
+
if(rs == SOCKET_ERROR)
|
|
632
|
+
{
|
|
633
|
+
free(ifc.ifc_buf);
|
|
634
|
+
ifc.ifc_buf = 0;
|
|
635
|
+
break;
|
|
636
|
+
}
|
|
637
|
+
else if(ifc.ifc_len == old_ifc_len)
|
|
638
|
+
{
|
|
639
|
+
//
|
|
640
|
+
// Returned same length twice in a row, finished.
|
|
641
|
+
//
|
|
642
|
+
break;
|
|
643
|
+
}
|
|
644
|
+
else
|
|
645
|
+
{
|
|
646
|
+
old_ifc_len = ifc.ifc_len;
|
|
647
|
+
}
|
|
648
|
+
numaddrs += 10;
|
|
649
|
+
free(ifc.ifc_buf);
|
|
650
|
+
}
|
|
651
|
+
closeSocketNoThrow(fd);
|
|
652
|
+
|
|
653
|
+
if(ifc.ifc_buf)
|
|
654
|
+
{
|
|
655
|
+
numaddrs = ifc.ifc_len / static_cast<int>(sizeof(struct ifreq));
|
|
656
|
+
struct ifreq* ifr = ifc.ifc_req;
|
|
657
|
+
for(int i = 0; i < numaddrs; ++i)
|
|
658
|
+
{
|
|
659
|
+
if(ifr[i].ifr_addr.sa_family == AF_INET6)
|
|
660
|
+
{
|
|
661
|
+
struct sockaddr_in6* ipv6Addr = reinterpret_cast<struct sockaddr_in6*>(&ifr[i].ifr_addr);
|
|
662
|
+
if(memcmp(&addr, &ipv6Addr->sin6_addr, sizeof(in6_addr)) == 0)
|
|
663
|
+
{
|
|
664
|
+
index = if_nametoindex(ifr[i].ifr_name);
|
|
665
|
+
break;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
free(ifc.ifc_buf);
|
|
670
|
+
}
|
|
671
|
+
# endif
|
|
672
|
+
}
|
|
673
|
+
else // Look for an interface with the given name.
|
|
674
|
+
{
|
|
675
|
+
index = if_nametoindex(name.c_str());
|
|
676
|
+
}
|
|
677
|
+
#endif
|
|
678
|
+
|
|
679
|
+
return index;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
struct in_addr
|
|
683
|
+
getInterfaceAddress(const string& name)
|
|
684
|
+
{
|
|
685
|
+
struct in_addr addr;
|
|
686
|
+
addr.s_addr = INADDR_ANY;
|
|
687
|
+
if(name.empty())
|
|
688
|
+
{
|
|
689
|
+
return addr;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
if(inet_pton(AF_INET, name.c_str(), &addr) > 0)
|
|
693
|
+
{
|
|
694
|
+
return addr;
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
#ifdef _WIN32
|
|
698
|
+
IP_ADAPTER_ADDRESSES addrs;
|
|
699
|
+
ULONG buflen = 0;
|
|
700
|
+
if(::GetAdaptersAddresses(AF_INET, 0, 0, &addrs, &buflen) == ERROR_BUFFER_OVERFLOW)
|
|
701
|
+
{
|
|
702
|
+
PIP_ADAPTER_ADDRESSES paddrs;
|
|
703
|
+
char* buf = new char[buflen];
|
|
704
|
+
paddrs = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buf);
|
|
705
|
+
if(::GetAdaptersAddresses(AF_INET, 0, 0, paddrs, &buflen) == NO_ERROR)
|
|
706
|
+
{
|
|
707
|
+
while(paddrs)
|
|
708
|
+
{
|
|
709
|
+
//
|
|
710
|
+
// Don't need to pass a wide string converter as the wide string come
|
|
711
|
+
// from Windows API.
|
|
712
|
+
//
|
|
713
|
+
if(IceUtil::wstringToString(paddrs->FriendlyName, IceUtil::getProcessStringConverter()) == name)
|
|
714
|
+
{
|
|
715
|
+
struct sockaddr_in addrin;
|
|
716
|
+
memcpy(&addrin, paddrs->FirstUnicastAddress->Address.lpSockaddr,
|
|
717
|
+
paddrs->FirstUnicastAddress->Address.iSockaddrLength);
|
|
718
|
+
addr = addrin.sin_addr;
|
|
719
|
+
break;
|
|
720
|
+
}
|
|
721
|
+
paddrs = paddrs->Next;
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
delete[] buf;
|
|
725
|
+
}
|
|
726
|
+
#else
|
|
727
|
+
ifreq if_address;
|
|
728
|
+
strcpy(if_address.ifr_name, name.c_str());
|
|
729
|
+
|
|
730
|
+
SOCKET fd = createSocketImpl(false, AF_INET);
|
|
731
|
+
int rc = ioctl(fd, SIOCGIFADDR, &if_address);
|
|
732
|
+
closeSocketNoThrow(fd);
|
|
733
|
+
|
|
734
|
+
if(rc != SOCKET_ERROR)
|
|
735
|
+
{
|
|
736
|
+
addr = reinterpret_cast<struct sockaddr_in*>(&if_address.ifr_addr)->sin_addr;
|
|
737
|
+
}
|
|
738
|
+
#endif
|
|
739
|
+
|
|
740
|
+
return addr;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
int
|
|
744
|
+
getAddressStorageSize(const Address& addr)
|
|
745
|
+
{
|
|
746
|
+
int size = 0;
|
|
747
|
+
if(addr.saStorage.ss_family == AF_INET)
|
|
748
|
+
{
|
|
749
|
+
size = sizeof(sockaddr_in);
|
|
750
|
+
}
|
|
751
|
+
else if(addr.saStorage.ss_family == AF_INET6)
|
|
752
|
+
{
|
|
753
|
+
size = sizeof(sockaddr_in6);
|
|
754
|
+
}
|
|
755
|
+
return size;
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
#endif // #ifndef ICE_OS_WINRT
|
|
759
|
+
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
#ifdef ICE_USE_IOCP
|
|
763
|
+
IceInternal::AsyncInfo::AsyncInfo(SocketOperation s)
|
|
764
|
+
{
|
|
765
|
+
ZeroMemory(this, sizeof(AsyncInfo));
|
|
766
|
+
status = s;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
void
|
|
770
|
+
IceInternal::NativeInfo::initialize(HANDLE handle, ULONG_PTR key)
|
|
771
|
+
{
|
|
772
|
+
_handle = handle;
|
|
773
|
+
_key = key;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
void
|
|
777
|
+
IceInternal::NativeInfo::completed(SocketOperation operation)
|
|
778
|
+
{
|
|
779
|
+
if(!PostQueuedCompletionStatus(_handle, 0, _key, getAsyncInfo(operation)))
|
|
780
|
+
{
|
|
781
|
+
Ice::SocketException ex(__FILE__, __LINE__);
|
|
782
|
+
ex.error = GetLastError();
|
|
783
|
+
throw ex;
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
#elif defined(ICE_OS_WINRT)
|
|
787
|
+
|
|
788
|
+
void
|
|
789
|
+
IceInternal::NativeInfo::completed(SocketOperation operation)
|
|
790
|
+
{
|
|
791
|
+
assert(_completedHandler);
|
|
792
|
+
_completedHandler(operation);
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
#endif
|
|
796
|
+
|
|
797
|
+
bool
|
|
798
|
+
IceInternal::noMoreFds(int error)
|
|
799
|
+
{
|
|
800
|
+
#if defined(ICE_OS_WINRT)
|
|
801
|
+
return error == (int)SocketErrorStatus::TooManyOpenFiles;
|
|
802
|
+
#elif defined(_WIN32)
|
|
803
|
+
return error == WSAEMFILE;
|
|
804
|
+
#else
|
|
805
|
+
return error == EMFILE || error == ENFILE;
|
|
806
|
+
#endif
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
#if defined(ICE_OS_WINRT)
|
|
810
|
+
string
|
|
811
|
+
IceInternal::errorToStringDNS(int)
|
|
812
|
+
{
|
|
813
|
+
return "Host not found";
|
|
814
|
+
}
|
|
815
|
+
#else
|
|
816
|
+
string
|
|
817
|
+
IceInternal::errorToStringDNS(int error)
|
|
818
|
+
{
|
|
819
|
+
# if defined(_WIN32)
|
|
820
|
+
return IceUtilInternal::errorToString(error);
|
|
821
|
+
# else
|
|
822
|
+
return gai_strerror(error);
|
|
823
|
+
# endif
|
|
824
|
+
}
|
|
825
|
+
#endif
|
|
826
|
+
|
|
827
|
+
#ifdef ICE_OS_WINRT
|
|
828
|
+
vector<Address>
|
|
829
|
+
IceInternal::getAddresses(const string& host, int port, ProtocolSupport, Ice::EndpointSelectionType, bool, bool)
|
|
830
|
+
{
|
|
831
|
+
try
|
|
832
|
+
{
|
|
833
|
+
vector<Address> result;
|
|
834
|
+
Address addr;
|
|
835
|
+
if(host.empty())
|
|
836
|
+
{
|
|
837
|
+
addr.host = ref new HostName("localhost");
|
|
838
|
+
}
|
|
839
|
+
else
|
|
840
|
+
{
|
|
841
|
+
//
|
|
842
|
+
// Don't need to pass a wide string converter as the wide string is passed
|
|
843
|
+
// to Windows API.
|
|
844
|
+
//
|
|
845
|
+
addr.host = ref new HostName(ref new String(
|
|
846
|
+
IceUtil::stringToWstring(host,
|
|
847
|
+
IceUtil::getProcessStringConverter()).c_str()));
|
|
848
|
+
}
|
|
849
|
+
stringstream os;
|
|
850
|
+
os << port;
|
|
851
|
+
//
|
|
852
|
+
// Don't need to use any string converter here as the port number use just
|
|
853
|
+
// ACII characters.
|
|
854
|
+
//
|
|
855
|
+
addr.port = ref new String(IceUtil::stringToWstring(os.str()).c_str());
|
|
856
|
+
result.push_back(addr);
|
|
857
|
+
return result;
|
|
858
|
+
}
|
|
859
|
+
catch(Platform::Exception^ pex)
|
|
860
|
+
{
|
|
861
|
+
DNSException ex(__FILE__, __LINE__);
|
|
862
|
+
ex.error = (int)SocketError::GetStatus(pex->HResult);
|
|
863
|
+
ex.host = host;
|
|
864
|
+
throw ex;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
}
|
|
868
|
+
#else
|
|
869
|
+
vector<Address>
|
|
870
|
+
IceInternal::getAddresses(const string& host, int port, ProtocolSupport protocol, Ice::EndpointSelectionType selType,
|
|
871
|
+
bool preferIPv6, bool blocking)
|
|
872
|
+
{
|
|
873
|
+
vector<Address> result;
|
|
874
|
+
Address addr;
|
|
875
|
+
|
|
876
|
+
memset(&addr.saStorage, 0, sizeof(sockaddr_storage));
|
|
877
|
+
|
|
878
|
+
//
|
|
879
|
+
// We don't use getaddrinfo when host is empty as it's not portable (some old Linux
|
|
880
|
+
// versions don't support it).
|
|
881
|
+
//
|
|
882
|
+
if(host.empty())
|
|
883
|
+
{
|
|
884
|
+
if(protocol != EnableIPv4)
|
|
885
|
+
{
|
|
886
|
+
addr.saIn6.sin6_family = AF_INET6;
|
|
887
|
+
addr.saIn6.sin6_port = htons(port);
|
|
888
|
+
addr.saIn6.sin6_addr = in6addr_loopback;
|
|
889
|
+
result.push_back(addr);
|
|
890
|
+
}
|
|
891
|
+
if(protocol != EnableIPv6)
|
|
892
|
+
{
|
|
893
|
+
addr.saIn.sin_family = AF_INET;
|
|
894
|
+
addr.saIn.sin_port = htons(port);
|
|
895
|
+
addr.saIn.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
|
896
|
+
result.push_back(addr);
|
|
897
|
+
}
|
|
898
|
+
sortAddresses(result, protocol, selType, preferIPv6);
|
|
899
|
+
return result;
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
struct addrinfo* info = 0;
|
|
903
|
+
int retry = 5;
|
|
904
|
+
|
|
905
|
+
struct addrinfo hints = { 0 };
|
|
906
|
+
if(protocol == EnableIPv4)
|
|
907
|
+
{
|
|
908
|
+
hints.ai_family = PF_INET;
|
|
909
|
+
}
|
|
910
|
+
else if(protocol == EnableIPv6)
|
|
911
|
+
{
|
|
912
|
+
hints.ai_family = PF_INET6;
|
|
913
|
+
}
|
|
914
|
+
else
|
|
915
|
+
{
|
|
916
|
+
hints.ai_family = PF_UNSPEC;
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
if(!blocking)
|
|
920
|
+
{
|
|
921
|
+
hints.ai_flags = AI_NUMERICHOST;
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
int rs = 0;
|
|
925
|
+
do
|
|
926
|
+
{
|
|
927
|
+
rs = getaddrinfo(host.c_str(), 0, &hints, &info);
|
|
928
|
+
}
|
|
929
|
+
while(info == 0 && rs == EAI_AGAIN && --retry >= 0);
|
|
930
|
+
|
|
931
|
+
// In theory, getaddrinfo should only return EAI_NONAME if
|
|
932
|
+
// AI_NUMERICHOST is specified and the host name is not a IP
|
|
933
|
+
// address. However on some platforms (e.g. OS X 10.4.x)
|
|
934
|
+
// EAI_NODATA is also returned so we also check for it.
|
|
935
|
+
# ifdef EAI_NODATA
|
|
936
|
+
if(!blocking && (rs == EAI_NONAME || rs == EAI_NODATA))
|
|
937
|
+
# else
|
|
938
|
+
if(!blocking && rs == EAI_NONAME)
|
|
939
|
+
# endif
|
|
940
|
+
{
|
|
941
|
+
return result; // Empty result indicates that a blocking lookup is necessary.
|
|
942
|
+
}
|
|
943
|
+
else if(rs != 0)
|
|
944
|
+
{
|
|
945
|
+
DNSException ex(__FILE__, __LINE__);
|
|
946
|
+
ex.error = rs;
|
|
947
|
+
ex.host = host;
|
|
948
|
+
throw ex;
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
for(struct addrinfo* p = info; p != NULL; p = p->ai_next)
|
|
952
|
+
{
|
|
953
|
+
memcpy(&addr.saStorage, p->ai_addr, p->ai_addrlen);
|
|
954
|
+
if(p->ai_family == PF_INET)
|
|
955
|
+
{
|
|
956
|
+
addr.saIn.sin_port = htons(port);
|
|
957
|
+
}
|
|
958
|
+
else if(p->ai_family == PF_INET6)
|
|
959
|
+
{
|
|
960
|
+
addr.saIn6.sin6_port = htons(port);
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
bool found = false;
|
|
964
|
+
for(unsigned int i = 0; i < result.size(); ++i)
|
|
965
|
+
{
|
|
966
|
+
if(compareAddress(result[i], addr) == 0)
|
|
967
|
+
{
|
|
968
|
+
found = true;
|
|
969
|
+
break;
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
if(!found)
|
|
973
|
+
{
|
|
974
|
+
result.push_back(addr);
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
freeaddrinfo(info);
|
|
979
|
+
|
|
980
|
+
if(result.empty())
|
|
981
|
+
{
|
|
982
|
+
DNSException ex(__FILE__, __LINE__);
|
|
983
|
+
ex.host = host;
|
|
984
|
+
throw ex;
|
|
985
|
+
}
|
|
986
|
+
sortAddresses(result, protocol, selType, preferIPv6);
|
|
987
|
+
return result;
|
|
988
|
+
}
|
|
989
|
+
#endif
|
|
990
|
+
|
|
991
|
+
#ifdef ICE_OS_WINRT
|
|
992
|
+
ProtocolSupport
|
|
993
|
+
IceInternal::getProtocolSupport(const Address&)
|
|
994
|
+
{
|
|
995
|
+
// For WinRT, there's no distinction between IPv4 and IPv6 adresses.
|
|
996
|
+
return EnableBoth;
|
|
997
|
+
}
|
|
998
|
+
#else
|
|
999
|
+
ProtocolSupport
|
|
1000
|
+
IceInternal::getProtocolSupport(const Address& addr)
|
|
1001
|
+
{
|
|
1002
|
+
return addr.saStorage.ss_family == AF_INET ? EnableIPv4 : EnableIPv6;
|
|
1003
|
+
}
|
|
1004
|
+
#endif
|
|
1005
|
+
|
|
1006
|
+
Address
|
|
1007
|
+
IceInternal::getAddressForServer(const string& host, int port, ProtocolSupport protocol, bool preferIPv6)
|
|
1008
|
+
{
|
|
1009
|
+
//
|
|
1010
|
+
// We don't use getaddrinfo when host is empty as it's not portable (some old Linux
|
|
1011
|
+
// versions don't support it).
|
|
1012
|
+
//
|
|
1013
|
+
if(host.empty())
|
|
1014
|
+
{
|
|
1015
|
+
Address addr;
|
|
1016
|
+
#ifdef ICE_OS_WINRT
|
|
1017
|
+
ostringstream os;
|
|
1018
|
+
os << port;
|
|
1019
|
+
//
|
|
1020
|
+
// Don't need to use any string converter here as the port number use just
|
|
1021
|
+
// ASCII characters.
|
|
1022
|
+
//
|
|
1023
|
+
addr.port = ref new String(IceUtil::stringToWstring(os.str()).c_str());
|
|
1024
|
+
addr.host = nullptr; // Equivalent of inaddr_any, see doBind implementation.
|
|
1025
|
+
#else
|
|
1026
|
+
memset(&addr.saStorage, 0, sizeof(sockaddr_storage));
|
|
1027
|
+
if(protocol != EnableIPv4)
|
|
1028
|
+
{
|
|
1029
|
+
addr.saIn6.sin6_family = AF_INET6;
|
|
1030
|
+
addr.saIn6.sin6_port = htons(port);
|
|
1031
|
+
addr.saIn6.sin6_addr = in6addr_any;
|
|
1032
|
+
}
|
|
1033
|
+
else
|
|
1034
|
+
{
|
|
1035
|
+
addr.saIn.sin_family = AF_INET;
|
|
1036
|
+
addr.saIn.sin_port = htons(port);
|
|
1037
|
+
addr.saIn.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
1038
|
+
}
|
|
1039
|
+
#endif
|
|
1040
|
+
return addr;
|
|
1041
|
+
}
|
|
1042
|
+
return getAddresses(host, port, protocol, Ice::Ordered, preferIPv6, true)[0];
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
int
|
|
1046
|
+
IceInternal::compareAddress(const Address& addr1, const Address& addr2)
|
|
1047
|
+
{
|
|
1048
|
+
#ifdef ICE_OS_WINRT
|
|
1049
|
+
int o = String::CompareOrdinal(addr1.port, addr2.port);
|
|
1050
|
+
if(o != 0)
|
|
1051
|
+
{
|
|
1052
|
+
return o;
|
|
1053
|
+
}
|
|
1054
|
+
if(addr1.host == addr2.host)
|
|
1055
|
+
{
|
|
1056
|
+
return 0;
|
|
1057
|
+
}
|
|
1058
|
+
if(addr1.host == nullptr)
|
|
1059
|
+
{
|
|
1060
|
+
return -1;
|
|
1061
|
+
}
|
|
1062
|
+
if(addr2.host == nullptr)
|
|
1063
|
+
{
|
|
1064
|
+
return 1;
|
|
1065
|
+
}
|
|
1066
|
+
return String::CompareOrdinal(addr1.host->RawName, addr2.host->RawName);
|
|
1067
|
+
#else
|
|
1068
|
+
if(addr1.saStorage.ss_family < addr2.saStorage.ss_family)
|
|
1069
|
+
{
|
|
1070
|
+
return -1;
|
|
1071
|
+
}
|
|
1072
|
+
else if(addr2.saStorage.ss_family < addr1.saStorage.ss_family)
|
|
1073
|
+
{
|
|
1074
|
+
return 1;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
if(addr1.saStorage.ss_family == AF_INET)
|
|
1078
|
+
{
|
|
1079
|
+
if(addr1.saIn.sin_port < addr2.saIn.sin_port)
|
|
1080
|
+
{
|
|
1081
|
+
return -1;
|
|
1082
|
+
}
|
|
1083
|
+
else if(addr2.saIn.sin_port < addr1.saIn.sin_port)
|
|
1084
|
+
{
|
|
1085
|
+
return 1;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
if(addr1.saIn.sin_addr.s_addr < addr2.saIn.sin_addr.s_addr)
|
|
1089
|
+
{
|
|
1090
|
+
return -1;
|
|
1091
|
+
}
|
|
1092
|
+
else if(addr2.saIn.sin_addr.s_addr < addr1.saIn.sin_addr.s_addr)
|
|
1093
|
+
{
|
|
1094
|
+
return 1;
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
else
|
|
1098
|
+
{
|
|
1099
|
+
if(addr1.saIn6.sin6_port < addr2.saIn6.sin6_port)
|
|
1100
|
+
{
|
|
1101
|
+
return -1;
|
|
1102
|
+
}
|
|
1103
|
+
else if(addr2.saIn6.sin6_port < addr1.saIn6.sin6_port)
|
|
1104
|
+
{
|
|
1105
|
+
return 1;
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
int res = memcmp(&addr1.saIn6.sin6_addr, &addr2.saIn6.sin6_addr, sizeof(in6_addr));
|
|
1109
|
+
if(res < 0)
|
|
1110
|
+
{
|
|
1111
|
+
return -1;
|
|
1112
|
+
}
|
|
1113
|
+
else if(res > 0)
|
|
1114
|
+
{
|
|
1115
|
+
return 1;
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
return 0;
|
|
1120
|
+
#endif
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
#ifdef ICE_OS_WINRT
|
|
1124
|
+
bool
|
|
1125
|
+
IceInternal::isIPv6Supported()
|
|
1126
|
+
{
|
|
1127
|
+
return true;
|
|
1128
|
+
}
|
|
1129
|
+
#else
|
|
1130
|
+
bool
|
|
1131
|
+
IceInternal::isIPv6Supported()
|
|
1132
|
+
{
|
|
1133
|
+
SOCKET fd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
|
|
1134
|
+
if(fd == INVALID_SOCKET)
|
|
1135
|
+
{
|
|
1136
|
+
return false;
|
|
1137
|
+
}
|
|
1138
|
+
else
|
|
1139
|
+
{
|
|
1140
|
+
closeSocketNoThrow(fd);
|
|
1141
|
+
return true;
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
#endif
|
|
1145
|
+
|
|
1146
|
+
#ifdef ICE_OS_WINRT
|
|
1147
|
+
SOCKET
|
|
1148
|
+
IceInternal::createSocket(bool udp, const Address&)
|
|
1149
|
+
{
|
|
1150
|
+
return createSocketImpl(udp, 0);
|
|
1151
|
+
}
|
|
1152
|
+
#else
|
|
1153
|
+
SOCKET
|
|
1154
|
+
IceInternal::createSocket(bool udp, const Address& addr)
|
|
1155
|
+
{
|
|
1156
|
+
return createSocketImpl(udp, addr.saStorage.ss_family);
|
|
1157
|
+
}
|
|
1158
|
+
#endif
|
|
1159
|
+
|
|
1160
|
+
#ifndef ICE_OS_WINRT
|
|
1161
|
+
SOCKET
|
|
1162
|
+
IceInternal::createServerSocket(bool udp, const Address& addr, ProtocolSupport protocol)
|
|
1163
|
+
{
|
|
1164
|
+
SOCKET fd = createSocket(udp, addr);
|
|
1165
|
+
if(addr.saStorage.ss_family == AF_INET6 && protocol != EnableIPv4)
|
|
1166
|
+
{
|
|
1167
|
+
int flag = protocol == EnableIPv6 ? 1 : 0;
|
|
1168
|
+
if(setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<char*>(&flag), int(sizeof(int))) == SOCKET_ERROR)
|
|
1169
|
+
{
|
|
1170
|
+
#ifdef _WIN32
|
|
1171
|
+
if(getSocketErrno() == WSAENOPROTOOPT)
|
|
1172
|
+
{
|
|
1173
|
+
return fd; // Windows XP doesn't support IPV6_V6ONLY
|
|
1174
|
+
}
|
|
1175
|
+
#endif
|
|
1176
|
+
closeSocketNoThrow(fd);
|
|
1177
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1178
|
+
ex.error = getSocketErrno();
|
|
1179
|
+
throw ex;
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
return fd;
|
|
1183
|
+
}
|
|
1184
|
+
#else
|
|
1185
|
+
SOCKET
|
|
1186
|
+
IceInternal::createServerSocket(bool udp, const Address& addr, ProtocolSupport)
|
|
1187
|
+
{
|
|
1188
|
+
return createSocket(udp, addr);
|
|
1189
|
+
}
|
|
1190
|
+
#endif
|
|
1191
|
+
|
|
1192
|
+
void
|
|
1193
|
+
IceInternal::closeSocketNoThrow(SOCKET fd)
|
|
1194
|
+
{
|
|
1195
|
+
#if defined(ICE_OS_WINRT)
|
|
1196
|
+
//
|
|
1197
|
+
// NOTE: StreamSocket::Close or DatagramSocket::Close aren't
|
|
1198
|
+
// exposed in C++, you have to delete the socket to close
|
|
1199
|
+
// it. According some Microsoft samples, this is safe even if
|
|
1200
|
+
// there are still references to the object...
|
|
1201
|
+
//
|
|
1202
|
+
//fd->Close();
|
|
1203
|
+
delete fd;
|
|
1204
|
+
#elif defined(_WIN32)
|
|
1205
|
+
int error = WSAGetLastError();
|
|
1206
|
+
closesocket(fd);
|
|
1207
|
+
WSASetLastError(error);
|
|
1208
|
+
#else
|
|
1209
|
+
int error = errno;
|
|
1210
|
+
close(fd);
|
|
1211
|
+
errno = error;
|
|
1212
|
+
#endif
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
void
|
|
1216
|
+
IceInternal::closeSocket(SOCKET fd)
|
|
1217
|
+
{
|
|
1218
|
+
#if defined(ICE_OS_WINRT)
|
|
1219
|
+
//
|
|
1220
|
+
// NOTE: StreamSocket::Close or DatagramSocket::Close aren't
|
|
1221
|
+
// exposed in C++, you have to delete the socket to close
|
|
1222
|
+
// it. According some Microsoft samples, this is safe even if
|
|
1223
|
+
// there are still references to the object...
|
|
1224
|
+
//
|
|
1225
|
+
//fd->Close();
|
|
1226
|
+
delete fd;
|
|
1227
|
+
#elif defined(_WIN32)
|
|
1228
|
+
int error = WSAGetLastError();
|
|
1229
|
+
if(closesocket(fd) == SOCKET_ERROR)
|
|
1230
|
+
{
|
|
1231
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1232
|
+
ex.error = getSocketErrno();
|
|
1233
|
+
throw ex;
|
|
1234
|
+
}
|
|
1235
|
+
WSASetLastError(error);
|
|
1236
|
+
#else
|
|
1237
|
+
int error = errno;
|
|
1238
|
+
if(close(fd) == SOCKET_ERROR)
|
|
1239
|
+
{
|
|
1240
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1241
|
+
ex.error = getSocketErrno();
|
|
1242
|
+
throw ex;
|
|
1243
|
+
}
|
|
1244
|
+
errno = error;
|
|
1245
|
+
#endif
|
|
1246
|
+
}
|
|
1247
|
+
|
|
1248
|
+
string
|
|
1249
|
+
IceInternal::addrToString(const Address& addr)
|
|
1250
|
+
{
|
|
1251
|
+
ostringstream s;
|
|
1252
|
+
s << inetAddrToString(addr) << ':' << getPort(addr);
|
|
1253
|
+
return s.str();
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
void
|
|
1257
|
+
IceInternal::fdToLocalAddress(SOCKET fd, Address& addr)
|
|
1258
|
+
{
|
|
1259
|
+
#ifndef ICE_OS_WINRT
|
|
1260
|
+
socklen_t len = static_cast<socklen_t>(sizeof(sockaddr_storage));
|
|
1261
|
+
if(getsockname(fd, &addr.sa, &len) == SOCKET_ERROR)
|
|
1262
|
+
{
|
|
1263
|
+
closeSocketNoThrow(fd);
|
|
1264
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1265
|
+
ex.error = getSocketErrno();
|
|
1266
|
+
throw ex;
|
|
1267
|
+
}
|
|
1268
|
+
#else
|
|
1269
|
+
StreamSocket^ stream = dynamic_cast<StreamSocket^>(fd);
|
|
1270
|
+
if(stream)
|
|
1271
|
+
{
|
|
1272
|
+
addr.host = stream->Information->LocalAddress;
|
|
1273
|
+
addr.port = stream->Information->LocalPort;
|
|
1274
|
+
}
|
|
1275
|
+
DatagramSocket^ datagram = dynamic_cast<DatagramSocket^>(fd);
|
|
1276
|
+
if(datagram)
|
|
1277
|
+
{
|
|
1278
|
+
addr.host = datagram->Information->LocalAddress;
|
|
1279
|
+
addr.port = datagram->Information->LocalPort;
|
|
1280
|
+
}
|
|
1281
|
+
#endif
|
|
1282
|
+
}
|
|
1283
|
+
|
|
1284
|
+
bool
|
|
1285
|
+
IceInternal::fdToRemoteAddress(SOCKET fd, Address& addr)
|
|
1286
|
+
{
|
|
1287
|
+
#ifndef ICE_OS_WINRT
|
|
1288
|
+
socklen_t len = static_cast<socklen_t>(sizeof(sockaddr_storage));
|
|
1289
|
+
if(getpeername(fd, &addr.sa, &len) == SOCKET_ERROR)
|
|
1290
|
+
{
|
|
1291
|
+
if(notConnected())
|
|
1292
|
+
{
|
|
1293
|
+
return false;
|
|
1294
|
+
}
|
|
1295
|
+
else
|
|
1296
|
+
{
|
|
1297
|
+
closeSocketNoThrow(fd);
|
|
1298
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1299
|
+
ex.error = getSocketErrno();
|
|
1300
|
+
throw ex;
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1303
|
+
|
|
1304
|
+
return true;
|
|
1305
|
+
#else
|
|
1306
|
+
StreamSocket^ stream = dynamic_cast<StreamSocket^>(fd);
|
|
1307
|
+
if(stream != nullptr)
|
|
1308
|
+
{
|
|
1309
|
+
addr.host = stream->Information->RemoteAddress;
|
|
1310
|
+
addr.port = stream->Information->RemotePort;
|
|
1311
|
+
}
|
|
1312
|
+
DatagramSocket^ datagram = dynamic_cast<DatagramSocket^>(fd);
|
|
1313
|
+
if(datagram != nullptr)
|
|
1314
|
+
{
|
|
1315
|
+
addr.host = datagram->Information->RemoteAddress;
|
|
1316
|
+
addr.port = datagram->Information->RemotePort;
|
|
1317
|
+
}
|
|
1318
|
+
return addr.host != nullptr;
|
|
1319
|
+
#endif
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
std::string
|
|
1323
|
+
IceInternal::fdToString(SOCKET fd, const NetworkProxyPtr& proxy, const Address& target)
|
|
1324
|
+
{
|
|
1325
|
+
if(fd == INVALID_SOCKET)
|
|
1326
|
+
{
|
|
1327
|
+
return "<closed>";
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
ostringstream s;
|
|
1331
|
+
|
|
1332
|
+
Address remoteAddr;
|
|
1333
|
+
bool peerConnected = fdToRemoteAddress(fd, remoteAddr);
|
|
1334
|
+
|
|
1335
|
+
#ifdef _WIN32
|
|
1336
|
+
if(!peerConnected)
|
|
1337
|
+
{
|
|
1338
|
+
//
|
|
1339
|
+
// The local address is only accessible with connected sockets on Windows.
|
|
1340
|
+
//
|
|
1341
|
+
s << "local address = <not available>";
|
|
1342
|
+
}
|
|
1343
|
+
else
|
|
1344
|
+
#endif
|
|
1345
|
+
{
|
|
1346
|
+
Address localAddr;
|
|
1347
|
+
fdToLocalAddress(fd, localAddr);
|
|
1348
|
+
s << "local address = " << addrToString(localAddr);
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
if(proxy)
|
|
1352
|
+
{
|
|
1353
|
+
if(!peerConnected)
|
|
1354
|
+
{
|
|
1355
|
+
remoteAddr = proxy->getAddress();
|
|
1356
|
+
}
|
|
1357
|
+
s << "\n" + proxy->getName() + " proxy address = " << addrToString(remoteAddr);
|
|
1358
|
+
s << "\nremote address = " << addrToString(target);
|
|
1359
|
+
}
|
|
1360
|
+
else
|
|
1361
|
+
{
|
|
1362
|
+
if(!peerConnected)
|
|
1363
|
+
{
|
|
1364
|
+
remoteAddr = target;
|
|
1365
|
+
}
|
|
1366
|
+
s << "\nremote address = " << addrToString(remoteAddr);
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
return s.str();
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
std::string
|
|
1373
|
+
IceInternal::fdToString(SOCKET fd)
|
|
1374
|
+
{
|
|
1375
|
+
if(fd == INVALID_SOCKET)
|
|
1376
|
+
{
|
|
1377
|
+
return "<closed>";
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
Address localAddr;
|
|
1381
|
+
fdToLocalAddress(fd, localAddr);
|
|
1382
|
+
|
|
1383
|
+
Address remoteAddr;
|
|
1384
|
+
bool peerConnected = fdToRemoteAddress(fd, remoteAddr);
|
|
1385
|
+
|
|
1386
|
+
return addressesToString(localAddr, remoteAddr, peerConnected);
|
|
1387
|
+
}
|
|
1388
|
+
|
|
1389
|
+
void
|
|
1390
|
+
IceInternal::fdToAddressAndPort(SOCKET fd, string& localAddress, int& localPort, string& remoteAddress, int& remotePort)
|
|
1391
|
+
{
|
|
1392
|
+
if(fd == INVALID_SOCKET)
|
|
1393
|
+
{
|
|
1394
|
+
localAddress.clear();
|
|
1395
|
+
remoteAddress.clear();
|
|
1396
|
+
localPort = -1;
|
|
1397
|
+
remotePort = -1;
|
|
1398
|
+
return;
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
Address localAddr;
|
|
1402
|
+
fdToLocalAddress(fd, localAddr);
|
|
1403
|
+
addrToAddressAndPort(localAddr, localAddress, localPort);
|
|
1404
|
+
|
|
1405
|
+
Address remoteAddr;
|
|
1406
|
+
if(fdToRemoteAddress(fd, remoteAddr))
|
|
1407
|
+
{
|
|
1408
|
+
addrToAddressAndPort(remoteAddr, remoteAddress, remotePort);
|
|
1409
|
+
}
|
|
1410
|
+
else
|
|
1411
|
+
{
|
|
1412
|
+
remoteAddress.clear();
|
|
1413
|
+
remotePort = -1;
|
|
1414
|
+
}
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
void
|
|
1418
|
+
IceInternal::addrToAddressAndPort(const Address& addr, string& address, int& port)
|
|
1419
|
+
{
|
|
1420
|
+
address = inetAddrToString(addr);
|
|
1421
|
+
port = getPort(addr);
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
std::string
|
|
1425
|
+
IceInternal::addressesToString(const Address& localAddr, const Address& remoteAddr, bool peerConnected)
|
|
1426
|
+
{
|
|
1427
|
+
ostringstream s;
|
|
1428
|
+
s << "local address = " << addrToString(localAddr);
|
|
1429
|
+
if(peerConnected)
|
|
1430
|
+
{
|
|
1431
|
+
s << "\nremote address = " << addrToString(remoteAddr);
|
|
1432
|
+
}
|
|
1433
|
+
else
|
|
1434
|
+
{
|
|
1435
|
+
s << "\nremote address = <not connected>";
|
|
1436
|
+
}
|
|
1437
|
+
return s.str();
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
bool
|
|
1441
|
+
IceInternal::isAddressValid(const Address& addr)
|
|
1442
|
+
{
|
|
1443
|
+
#ifndef ICE_OS_WINRT
|
|
1444
|
+
return addr.saStorage.ss_family != AF_UNSPEC;
|
|
1445
|
+
#else
|
|
1446
|
+
return addr.host != nullptr || addr.port != nullptr;
|
|
1447
|
+
#endif
|
|
1448
|
+
}
|
|
1449
|
+
|
|
1450
|
+
#ifdef ICE_OS_WINRT
|
|
1451
|
+
vector<string>
|
|
1452
|
+
IceInternal::getHostsForEndpointExpand(const string&, ProtocolSupport, bool)
|
|
1453
|
+
{
|
|
1454
|
+
//
|
|
1455
|
+
// No support for expanding wildcard addresses on WinRT
|
|
1456
|
+
//
|
|
1457
|
+
vector<string> hosts;
|
|
1458
|
+
return hosts;
|
|
1459
|
+
}
|
|
1460
|
+
#else
|
|
1461
|
+
vector<string>
|
|
1462
|
+
IceInternal::getHostsForEndpointExpand(const string& host, ProtocolSupport protocolSupport, bool includeLoopback)
|
|
1463
|
+
{
|
|
1464
|
+
vector<string> hosts;
|
|
1465
|
+
bool ipv4Wildcard = false;
|
|
1466
|
+
if(isWildcard(host, protocolSupport, ipv4Wildcard))
|
|
1467
|
+
{
|
|
1468
|
+
vector<Address> addrs = getLocalAddresses(ipv4Wildcard ? EnableIPv4 : protocolSupport, includeLoopback);
|
|
1469
|
+
for(vector<Address>::const_iterator p = addrs.begin(); p != addrs.end(); ++p)
|
|
1470
|
+
{
|
|
1471
|
+
//
|
|
1472
|
+
// NOTE: We don't publish link-local addresses as in most cases
|
|
1473
|
+
// these are not desired to be published and in some cases
|
|
1474
|
+
// will not work without extra configuration.
|
|
1475
|
+
//
|
|
1476
|
+
if(!isLinklocal(*p))
|
|
1477
|
+
{
|
|
1478
|
+
hosts.push_back(inetAddrToString(*p));
|
|
1479
|
+
}
|
|
1480
|
+
}
|
|
1481
|
+
}
|
|
1482
|
+
return hosts; // An empty host list indicates to just use the given host.
|
|
1483
|
+
}
|
|
1484
|
+
#endif
|
|
1485
|
+
|
|
1486
|
+
string
|
|
1487
|
+
IceInternal::inetAddrToString(const Address& ss)
|
|
1488
|
+
{
|
|
1489
|
+
#ifndef ICE_OS_WINRT
|
|
1490
|
+
int size = getAddressStorageSize(ss);
|
|
1491
|
+
if(size == 0)
|
|
1492
|
+
{
|
|
1493
|
+
return "";
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1496
|
+
char namebuf[1024];
|
|
1497
|
+
namebuf[0] = '\0';
|
|
1498
|
+
getnameinfo(&ss.sa, size, namebuf, static_cast<socklen_t>(sizeof(namebuf)), 0, 0, NI_NUMERICHOST);
|
|
1499
|
+
return string(namebuf);
|
|
1500
|
+
#else
|
|
1501
|
+
if(ss.host == nullptr)
|
|
1502
|
+
{
|
|
1503
|
+
return "";
|
|
1504
|
+
}
|
|
1505
|
+
else
|
|
1506
|
+
{
|
|
1507
|
+
//
|
|
1508
|
+
// Don't need to pass a wide string converter as the wide string come
|
|
1509
|
+
// from Windows API.
|
|
1510
|
+
//
|
|
1511
|
+
return IceUtil::wstringToString(ss.host->RawName->Data(), IceUtil::getProcessStringConverter());
|
|
1512
|
+
}
|
|
1513
|
+
#endif
|
|
1514
|
+
}
|
|
1515
|
+
|
|
1516
|
+
int
|
|
1517
|
+
IceInternal::getPort(const Address& addr)
|
|
1518
|
+
{
|
|
1519
|
+
#ifndef ICE_OS_WINRT
|
|
1520
|
+
if(addr.saStorage.ss_family == AF_INET)
|
|
1521
|
+
{
|
|
1522
|
+
return ntohs(addr.saIn.sin_port);
|
|
1523
|
+
}
|
|
1524
|
+
else if(addr.saStorage.ss_family == AF_INET6)
|
|
1525
|
+
{
|
|
1526
|
+
return ntohs(addr.saIn6.sin6_port);
|
|
1527
|
+
}
|
|
1528
|
+
else
|
|
1529
|
+
{
|
|
1530
|
+
return -1;
|
|
1531
|
+
}
|
|
1532
|
+
#else
|
|
1533
|
+
IceUtil::Int64 port;
|
|
1534
|
+
//
|
|
1535
|
+
// Don't need to use any string converter here as the port number use just ASCII characters.
|
|
1536
|
+
//
|
|
1537
|
+
if(addr.port == nullptr || !IceUtilInternal::stringToInt64(IceUtil::wstringToString(addr.port->Data()), port))
|
|
1538
|
+
{
|
|
1539
|
+
return -1;
|
|
1540
|
+
}
|
|
1541
|
+
return static_cast<int>(port);
|
|
1542
|
+
#endif
|
|
1543
|
+
}
|
|
1544
|
+
|
|
1545
|
+
void
|
|
1546
|
+
IceInternal::setPort(Address& addr, int port)
|
|
1547
|
+
{
|
|
1548
|
+
#ifndef ICE_OS_WINRT
|
|
1549
|
+
if(addr.saStorage.ss_family == AF_INET)
|
|
1550
|
+
{
|
|
1551
|
+
addr.saIn.sin_port = htons(port);
|
|
1552
|
+
}
|
|
1553
|
+
else
|
|
1554
|
+
{
|
|
1555
|
+
assert(addr.saStorage.ss_family == AF_INET6);
|
|
1556
|
+
addr.saIn6.sin6_port = htons(port);
|
|
1557
|
+
}
|
|
1558
|
+
#else
|
|
1559
|
+
ostringstream os;
|
|
1560
|
+
os << port;
|
|
1561
|
+
//
|
|
1562
|
+
// Don't need to use any string converter here as the port number use just
|
|
1563
|
+
// ACII characters.
|
|
1564
|
+
//
|
|
1565
|
+
addr.port = ref new String(IceUtil::stringToWstring(os.str()).c_str());
|
|
1566
|
+
#endif
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
bool
|
|
1570
|
+
IceInternal::isMulticast(const Address& addr)
|
|
1571
|
+
{
|
|
1572
|
+
#ifndef ICE_OS_WINRT
|
|
1573
|
+
if(addr.saStorage.ss_family == AF_INET)
|
|
1574
|
+
{
|
|
1575
|
+
return IN_MULTICAST(ntohl(addr.saIn.sin_addr.s_addr));
|
|
1576
|
+
}
|
|
1577
|
+
else if(addr.saStorage.ss_family == AF_INET6)
|
|
1578
|
+
{
|
|
1579
|
+
return IN6_IS_ADDR_MULTICAST(&addr.saIn6.sin6_addr);
|
|
1580
|
+
}
|
|
1581
|
+
#else
|
|
1582
|
+
if(addr.host == nullptr)
|
|
1583
|
+
{
|
|
1584
|
+
return false;
|
|
1585
|
+
}
|
|
1586
|
+
//
|
|
1587
|
+
// Don't need to use string converters here, this is just to do a local
|
|
1588
|
+
// comparison to find if the address is multicast.
|
|
1589
|
+
//
|
|
1590
|
+
string host = IceUtil::wstringToString(addr.host->RawName->Data());
|
|
1591
|
+
string ip = IceUtilInternal::toUpper(host);
|
|
1592
|
+
vector<string> tokens;
|
|
1593
|
+
IceUtilInternal::splitString(ip, ".", tokens);
|
|
1594
|
+
if(tokens.size() == 4)
|
|
1595
|
+
{
|
|
1596
|
+
IceUtil::Int64 j;
|
|
1597
|
+
if(IceUtilInternal::stringToInt64(tokens[0], j))
|
|
1598
|
+
{
|
|
1599
|
+
if(j >= 233 && j <= 239)
|
|
1600
|
+
{
|
|
1601
|
+
return true;
|
|
1602
|
+
}
|
|
1603
|
+
}
|
|
1604
|
+
}
|
|
1605
|
+
if(ip.find("::") != string::npos)
|
|
1606
|
+
{
|
|
1607
|
+
return ip.compare(0, 2, "FF") == 0;
|
|
1608
|
+
}
|
|
1609
|
+
#endif
|
|
1610
|
+
return false;
|
|
1611
|
+
}
|
|
1612
|
+
|
|
1613
|
+
void
|
|
1614
|
+
IceInternal::setTcpBufSize(SOCKET fd, const Ice::PropertiesPtr& properties, const Ice::LoggerPtr& logger)
|
|
1615
|
+
{
|
|
1616
|
+
assert(fd != INVALID_SOCKET);
|
|
1617
|
+
|
|
1618
|
+
//
|
|
1619
|
+
// By default, on Windows we use a 128KB buffer size. On Unix
|
|
1620
|
+
// platforms, we use the system defaults.
|
|
1621
|
+
//
|
|
1622
|
+
#ifdef _WIN32
|
|
1623
|
+
const int dfltBufSize = 128 * 1024;
|
|
1624
|
+
#else
|
|
1625
|
+
const int dfltBufSize = 0;
|
|
1626
|
+
#endif
|
|
1627
|
+
Int sizeRequested;
|
|
1628
|
+
|
|
1629
|
+
sizeRequested = properties->getPropertyAsIntWithDefault("Ice.TCP.RcvSize", dfltBufSize);
|
|
1630
|
+
if(sizeRequested > 0)
|
|
1631
|
+
{
|
|
1632
|
+
//
|
|
1633
|
+
// Try to set the buffer size. The kernel will silently adjust
|
|
1634
|
+
// the size to an acceptable value. Then read the size back to
|
|
1635
|
+
// get the size that was actually set.
|
|
1636
|
+
//
|
|
1637
|
+
setRecvBufferSize(fd, sizeRequested);
|
|
1638
|
+
int size = getRecvBufferSize(fd);
|
|
1639
|
+
if(size > 0 && size < sizeRequested) // Warn if the size that was set is less than the requested size.
|
|
1640
|
+
{
|
|
1641
|
+
Ice::Warning out(logger);
|
|
1642
|
+
out << "TCP receive buffer size: requested size of " << sizeRequested << " adjusted to " << size;
|
|
1643
|
+
}
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
sizeRequested = properties->getPropertyAsIntWithDefault("Ice.TCP.SndSize", dfltBufSize);
|
|
1647
|
+
if(sizeRequested > 0)
|
|
1648
|
+
{
|
|
1649
|
+
//
|
|
1650
|
+
// Try to set the buffer size. The kernel will silently adjust
|
|
1651
|
+
// the size to an acceptable value. Then read the size back to
|
|
1652
|
+
// get the size that was actually set.
|
|
1653
|
+
//
|
|
1654
|
+
setSendBufferSize(fd, sizeRequested);
|
|
1655
|
+
int size = getSendBufferSize(fd);
|
|
1656
|
+
if(size > 0 && size < sizeRequested) // Warn if the size that was set is less than the requested size.
|
|
1657
|
+
{
|
|
1658
|
+
Ice::Warning out(logger);
|
|
1659
|
+
out << "TCP send buffer size: requested size of " << sizeRequested << " adjusted to " << size;
|
|
1660
|
+
}
|
|
1661
|
+
}
|
|
1662
|
+
}
|
|
1663
|
+
|
|
1664
|
+
#ifdef ICE_OS_WINRT
|
|
1665
|
+
void
|
|
1666
|
+
IceInternal::setBlock(SOCKET fd, bool)
|
|
1667
|
+
{
|
|
1668
|
+
}
|
|
1669
|
+
#else
|
|
1670
|
+
void
|
|
1671
|
+
IceInternal::setBlock(SOCKET fd, bool block)
|
|
1672
|
+
{
|
|
1673
|
+
#ifdef _WIN32
|
|
1674
|
+
if(block)
|
|
1675
|
+
{
|
|
1676
|
+
unsigned long arg = 0;
|
|
1677
|
+
if(ioctlsocket(fd, FIONBIO, &arg) == SOCKET_ERROR)
|
|
1678
|
+
{
|
|
1679
|
+
closeSocketNoThrow(fd);
|
|
1680
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1681
|
+
ex.error = WSAGetLastError();
|
|
1682
|
+
throw ex;
|
|
1683
|
+
}
|
|
1684
|
+
}
|
|
1685
|
+
else
|
|
1686
|
+
{
|
|
1687
|
+
unsigned long arg = 1;
|
|
1688
|
+
if(ioctlsocket(fd, FIONBIO, &arg) == SOCKET_ERROR)
|
|
1689
|
+
{
|
|
1690
|
+
closeSocketNoThrow(fd);
|
|
1691
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1692
|
+
ex.error = WSAGetLastError();
|
|
1693
|
+
throw ex;
|
|
1694
|
+
}
|
|
1695
|
+
}
|
|
1696
|
+
#else
|
|
1697
|
+
if(block)
|
|
1698
|
+
{
|
|
1699
|
+
int flags = fcntl(fd, F_GETFL);
|
|
1700
|
+
flags &= ~O_NONBLOCK;
|
|
1701
|
+
if(fcntl(fd, F_SETFL, flags) == SOCKET_ERROR)
|
|
1702
|
+
{
|
|
1703
|
+
closeSocketNoThrow(fd);
|
|
1704
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1705
|
+
ex.error = errno;
|
|
1706
|
+
throw ex;
|
|
1707
|
+
}
|
|
1708
|
+
}
|
|
1709
|
+
else
|
|
1710
|
+
{
|
|
1711
|
+
int flags = fcntl(fd, F_GETFL);
|
|
1712
|
+
flags |= O_NONBLOCK;
|
|
1713
|
+
if(fcntl(fd, F_SETFL, flags) == SOCKET_ERROR)
|
|
1714
|
+
{
|
|
1715
|
+
closeSocketNoThrow(fd);
|
|
1716
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1717
|
+
ex.error = errno;
|
|
1718
|
+
throw ex;
|
|
1719
|
+
}
|
|
1720
|
+
}
|
|
1721
|
+
#endif
|
|
1722
|
+
}
|
|
1723
|
+
#endif
|
|
1724
|
+
|
|
1725
|
+
void
|
|
1726
|
+
IceInternal::setSendBufferSize(SOCKET fd, int sz)
|
|
1727
|
+
{
|
|
1728
|
+
#ifndef ICE_OS_WINRT
|
|
1729
|
+
if(setsockopt(fd, SOL_SOCKET, SO_SNDBUF, reinterpret_cast<char*>(&sz), int(sizeof(int))) == SOCKET_ERROR)
|
|
1730
|
+
{
|
|
1731
|
+
closeSocketNoThrow(fd);
|
|
1732
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1733
|
+
ex.error = getSocketErrno();
|
|
1734
|
+
throw ex;
|
|
1735
|
+
}
|
|
1736
|
+
#else
|
|
1737
|
+
StreamSocket^ stream = dynamic_cast<StreamSocket^>(fd);
|
|
1738
|
+
if(stream != nullptr)
|
|
1739
|
+
{
|
|
1740
|
+
stream->Control->OutboundBufferSizeInBytes = sz;
|
|
1741
|
+
}
|
|
1742
|
+
#endif
|
|
1743
|
+
}
|
|
1744
|
+
|
|
1745
|
+
int
|
|
1746
|
+
IceInternal::getSendBufferSize(SOCKET fd)
|
|
1747
|
+
{
|
|
1748
|
+
#ifndef ICE_OS_WINRT
|
|
1749
|
+
int sz;
|
|
1750
|
+
socklen_t len = sizeof(sz);
|
|
1751
|
+
if(getsockopt(fd, SOL_SOCKET, SO_SNDBUF, reinterpret_cast<char*>(&sz), &len) == SOCKET_ERROR ||
|
|
1752
|
+
static_cast<unsigned int>(len) != sizeof(sz))
|
|
1753
|
+
{
|
|
1754
|
+
closeSocketNoThrow(fd);
|
|
1755
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1756
|
+
ex.error = getSocketErrno();
|
|
1757
|
+
throw ex;
|
|
1758
|
+
}
|
|
1759
|
+
return sz;
|
|
1760
|
+
#else
|
|
1761
|
+
StreamSocket^ stream = dynamic_cast<StreamSocket^>(fd);
|
|
1762
|
+
if(stream != nullptr)
|
|
1763
|
+
{
|
|
1764
|
+
return stream->Control->OutboundBufferSizeInBytes;
|
|
1765
|
+
}
|
|
1766
|
+
return 0; // Not supported
|
|
1767
|
+
#endif
|
|
1768
|
+
}
|
|
1769
|
+
|
|
1770
|
+
#ifdef ICE_OS_WINRT
|
|
1771
|
+
void
|
|
1772
|
+
IceInternal::setRecvBufferSize(SOCKET, int)
|
|
1773
|
+
{
|
|
1774
|
+
}
|
|
1775
|
+
#else
|
|
1776
|
+
void
|
|
1777
|
+
IceInternal::setRecvBufferSize(SOCKET fd, int sz)
|
|
1778
|
+
{
|
|
1779
|
+
if(setsockopt(fd, SOL_SOCKET, SO_RCVBUF, reinterpret_cast<char*>(&sz), int(sizeof(int))) == SOCKET_ERROR)
|
|
1780
|
+
{
|
|
1781
|
+
closeSocketNoThrow(fd);
|
|
1782
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1783
|
+
ex.error = getSocketErrno();
|
|
1784
|
+
throw ex;
|
|
1785
|
+
}
|
|
1786
|
+
}
|
|
1787
|
+
#endif
|
|
1788
|
+
|
|
1789
|
+
int
|
|
1790
|
+
IceInternal::getRecvBufferSize(SOCKET fd)
|
|
1791
|
+
{
|
|
1792
|
+
#ifndef ICE_OS_WINRT
|
|
1793
|
+
int sz;
|
|
1794
|
+
socklen_t len = sizeof(sz);
|
|
1795
|
+
if(getsockopt(fd, SOL_SOCKET, SO_RCVBUF, reinterpret_cast<char*>(&sz), &len) == SOCKET_ERROR ||
|
|
1796
|
+
static_cast<unsigned int>(len) != sizeof(sz))
|
|
1797
|
+
{
|
|
1798
|
+
closeSocketNoThrow(fd);
|
|
1799
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1800
|
+
ex.error = getSocketErrno();
|
|
1801
|
+
throw ex;
|
|
1802
|
+
}
|
|
1803
|
+
return sz;
|
|
1804
|
+
#else
|
|
1805
|
+
return 0; // Not supported
|
|
1806
|
+
#endif
|
|
1807
|
+
}
|
|
1808
|
+
|
|
1809
|
+
#ifndef ICE_OS_WINRT
|
|
1810
|
+
void
|
|
1811
|
+
IceInternal::setMcastGroup(SOCKET fd, const Address& group, const string& intf)
|
|
1812
|
+
{
|
|
1813
|
+
int rc;
|
|
1814
|
+
if(group.saStorage.ss_family == AF_INET)
|
|
1815
|
+
{
|
|
1816
|
+
struct ip_mreq mreq;
|
|
1817
|
+
mreq.imr_multiaddr = group.saIn.sin_addr;
|
|
1818
|
+
mreq.imr_interface = getInterfaceAddress(intf);
|
|
1819
|
+
rc = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, reinterpret_cast<char*>(&mreq), int(sizeof(mreq)));
|
|
1820
|
+
}
|
|
1821
|
+
else
|
|
1822
|
+
{
|
|
1823
|
+
struct ipv6_mreq mreq;
|
|
1824
|
+
mreq.ipv6mr_multiaddr = group.saIn6.sin6_addr;
|
|
1825
|
+
mreq.ipv6mr_interface = getInterfaceIndex(intf);
|
|
1826
|
+
rc = setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, reinterpret_cast<char*>(&mreq), int(sizeof(mreq)));
|
|
1827
|
+
}
|
|
1828
|
+
if(rc == SOCKET_ERROR)
|
|
1829
|
+
{
|
|
1830
|
+
closeSocketNoThrow(fd);
|
|
1831
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1832
|
+
ex.error = getSocketErrno();
|
|
1833
|
+
throw ex;
|
|
1834
|
+
}
|
|
1835
|
+
}
|
|
1836
|
+
#else
|
|
1837
|
+
void
|
|
1838
|
+
IceInternal::setMcastGroup(SOCKET fd, const Address& group, const string&)
|
|
1839
|
+
{
|
|
1840
|
+
try
|
|
1841
|
+
{
|
|
1842
|
+
//
|
|
1843
|
+
// NOTE: WinRT doesn't allow specyfing the interface.
|
|
1844
|
+
//
|
|
1845
|
+
safe_cast<DatagramSocket^>(fd)->JoinMulticastGroup(group.host);
|
|
1846
|
+
}
|
|
1847
|
+
catch(Platform::Exception^ pex)
|
|
1848
|
+
{
|
|
1849
|
+
throw SocketException(__FILE__, __LINE__, (int)SocketError::GetStatus(pex->HResult));
|
|
1850
|
+
}
|
|
1851
|
+
}
|
|
1852
|
+
#endif
|
|
1853
|
+
|
|
1854
|
+
#ifdef ICE_OS_WINRT
|
|
1855
|
+
void
|
|
1856
|
+
IceInternal::setMcastInterface(SOCKET, const string&, const Address&)
|
|
1857
|
+
{
|
|
1858
|
+
}
|
|
1859
|
+
#else
|
|
1860
|
+
void
|
|
1861
|
+
IceInternal::setMcastInterface(SOCKET fd, const string& intf, const Address& addr)
|
|
1862
|
+
{
|
|
1863
|
+
int rc;
|
|
1864
|
+
if(addr.saStorage.ss_family == AF_INET)
|
|
1865
|
+
{
|
|
1866
|
+
struct in_addr iface = getInterfaceAddress(intf);
|
|
1867
|
+
rc = setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, reinterpret_cast<char*>(&iface), int(sizeof(iface)));
|
|
1868
|
+
}
|
|
1869
|
+
else
|
|
1870
|
+
{
|
|
1871
|
+
int interfaceNum = getInterfaceIndex(intf);
|
|
1872
|
+
rc = setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, reinterpret_cast<char*>(&interfaceNum), int(sizeof(int)));
|
|
1873
|
+
}
|
|
1874
|
+
if(rc == SOCKET_ERROR)
|
|
1875
|
+
{
|
|
1876
|
+
closeSocketNoThrow(fd);
|
|
1877
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1878
|
+
ex.error = getSocketErrno();
|
|
1879
|
+
throw ex;
|
|
1880
|
+
}
|
|
1881
|
+
}
|
|
1882
|
+
#endif
|
|
1883
|
+
|
|
1884
|
+
#ifdef ICE_OS_WINRT
|
|
1885
|
+
void
|
|
1886
|
+
IceInternal::setMcastTtl(SOCKET, int, const Address&)
|
|
1887
|
+
{
|
|
1888
|
+
}
|
|
1889
|
+
#else
|
|
1890
|
+
void
|
|
1891
|
+
IceInternal::setMcastTtl(SOCKET fd, int ttl, const Address& addr)
|
|
1892
|
+
{
|
|
1893
|
+
int rc;
|
|
1894
|
+
if(addr.saStorage.ss_family == AF_INET)
|
|
1895
|
+
{
|
|
1896
|
+
rc = setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, reinterpret_cast<char*>(&ttl), int(sizeof(int)));
|
|
1897
|
+
}
|
|
1898
|
+
else
|
|
1899
|
+
{
|
|
1900
|
+
rc = setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, reinterpret_cast<char*>(&ttl), int(sizeof(int)));
|
|
1901
|
+
}
|
|
1902
|
+
if(rc == SOCKET_ERROR)
|
|
1903
|
+
{
|
|
1904
|
+
closeSocketNoThrow(fd);
|
|
1905
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1906
|
+
ex.error = getSocketErrno();
|
|
1907
|
+
throw ex;
|
|
1908
|
+
}
|
|
1909
|
+
}
|
|
1910
|
+
#endif
|
|
1911
|
+
|
|
1912
|
+
#ifdef ICE_OS_WINRT
|
|
1913
|
+
void
|
|
1914
|
+
IceInternal::setReuseAddress(SOCKET, bool)
|
|
1915
|
+
{
|
|
1916
|
+
}
|
|
1917
|
+
#else
|
|
1918
|
+
void
|
|
1919
|
+
IceInternal::setReuseAddress(SOCKET fd, bool reuse)
|
|
1920
|
+
{
|
|
1921
|
+
int flag = reuse ? 1 : 0;
|
|
1922
|
+
if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char*>(&flag), int(sizeof(int))) == SOCKET_ERROR)
|
|
1923
|
+
{
|
|
1924
|
+
closeSocketNoThrow(fd);
|
|
1925
|
+
SocketException ex(__FILE__, __LINE__);
|
|
1926
|
+
ex.error = getSocketErrno();
|
|
1927
|
+
throw ex;
|
|
1928
|
+
}
|
|
1929
|
+
}
|
|
1930
|
+
#endif
|
|
1931
|
+
|
|
1932
|
+
|
|
1933
|
+
#ifdef ICE_OS_WINRT
|
|
1934
|
+
void
|
|
1935
|
+
checkResultAndWait(IAsyncAction^ action)
|
|
1936
|
+
{
|
|
1937
|
+
if(action->Status == Windows::Foundation::AsyncStatus::Started)
|
|
1938
|
+
{
|
|
1939
|
+
IceUtilInternal::CountDownLatch count(1);
|
|
1940
|
+
HRESULT result = 0;
|
|
1941
|
+
action->Completed = ref new AsyncActionCompletedHandler(
|
|
1942
|
+
[&count, &result] (IAsyncAction^ action, Windows::Foundation::AsyncStatus status)
|
|
1943
|
+
{
|
|
1944
|
+
if(status != Windows::Foundation::AsyncStatus::Completed)
|
|
1945
|
+
{
|
|
1946
|
+
result = action->ErrorCode.Value;
|
|
1947
|
+
}
|
|
1948
|
+
count.countDown();
|
|
1949
|
+
});
|
|
1950
|
+
count.await();
|
|
1951
|
+
if(result)
|
|
1952
|
+
{
|
|
1953
|
+
checkErrorCode(__FILE__, __LINE__, result);
|
|
1954
|
+
}
|
|
1955
|
+
}
|
|
1956
|
+
else if(action->Status == Windows::Foundation::AsyncStatus::Error)
|
|
1957
|
+
{
|
|
1958
|
+
checkErrorCode(__FILE__, __LINE__, action->ErrorCode.Value);
|
|
1959
|
+
}
|
|
1960
|
+
}
|
|
1961
|
+
#endif
|
|
1962
|
+
|
|
1963
|
+
Address
|
|
1964
|
+
IceInternal::doBind(SOCKET fd, const Address& addr)
|
|
1965
|
+
{
|
|
1966
|
+
#ifdef ICE_OS_WINRT
|
|
1967
|
+
Address local;
|
|
1968
|
+
try
|
|
1969
|
+
{
|
|
1970
|
+
StreamSocketListener^ listener = dynamic_cast<StreamSocketListener^>(fd);
|
|
1971
|
+
if(listener != nullptr)
|
|
1972
|
+
{
|
|
1973
|
+
if(addr.host == nullptr) // inaddr_any
|
|
1974
|
+
{
|
|
1975
|
+
checkResultAndWait(listener->BindServiceNameAsync(addr.port));
|
|
1976
|
+
}
|
|
1977
|
+
else
|
|
1978
|
+
{
|
|
1979
|
+
checkResultAndWait(listener->BindEndpointAsync(addr.host, addr.port));
|
|
1980
|
+
}
|
|
1981
|
+
local.host = addr.host;
|
|
1982
|
+
local.port = listener->Information->LocalPort;
|
|
1983
|
+
}
|
|
1984
|
+
|
|
1985
|
+
DatagramSocket^ datagram = dynamic_cast<DatagramSocket^>(fd);
|
|
1986
|
+
if(datagram != nullptr)
|
|
1987
|
+
{
|
|
1988
|
+
if(addr.host == nullptr) // inaddr_any
|
|
1989
|
+
{
|
|
1990
|
+
checkResultAndWait(datagram->BindServiceNameAsync(addr.port));
|
|
1991
|
+
}
|
|
1992
|
+
else
|
|
1993
|
+
{
|
|
1994
|
+
checkResultAndWait(datagram->BindEndpointAsync(addr.host, addr.port));
|
|
1995
|
+
}
|
|
1996
|
+
local.host = datagram->Information->LocalAddress;
|
|
1997
|
+
local.port = datagram->Information->LocalPort;
|
|
1998
|
+
}
|
|
1999
|
+
}
|
|
2000
|
+
catch(const Ice::SocketException&)
|
|
2001
|
+
{
|
|
2002
|
+
closeSocketNoThrow(fd);
|
|
2003
|
+
throw;
|
|
2004
|
+
}
|
|
2005
|
+
return local;
|
|
2006
|
+
#else
|
|
2007
|
+
int size = getAddressStorageSize(addr);
|
|
2008
|
+
assert(size != 0);
|
|
2009
|
+
|
|
2010
|
+
if(::bind(fd, &addr.sa, size) == SOCKET_ERROR)
|
|
2011
|
+
{
|
|
2012
|
+
closeSocketNoThrow(fd);
|
|
2013
|
+
SocketException ex(__FILE__, __LINE__);
|
|
2014
|
+
ex.error = getSocketErrno();
|
|
2015
|
+
throw ex;
|
|
2016
|
+
}
|
|
2017
|
+
|
|
2018
|
+
Address local;
|
|
2019
|
+
socklen_t len = static_cast<socklen_t>(sizeof(sockaddr_storage));
|
|
2020
|
+
# ifdef NDEBUG
|
|
2021
|
+
getsockname(fd, &local.sa, &len);
|
|
2022
|
+
# else
|
|
2023
|
+
int ret = getsockname(fd, &local.sa, &len);
|
|
2024
|
+
assert(ret != SOCKET_ERROR);
|
|
2025
|
+
# endif
|
|
2026
|
+
return local;
|
|
2027
|
+
#endif
|
|
2028
|
+
}
|
|
2029
|
+
|
|
2030
|
+
#ifndef ICE_OS_WINRT
|
|
2031
|
+
|
|
2032
|
+
Address
|
|
2033
|
+
IceInternal::getNumericAddress(const std::string& address)
|
|
2034
|
+
{
|
|
2035
|
+
vector<Address> addrs = getAddresses(address, 0, EnableBoth, Ice::Ordered, false, false);
|
|
2036
|
+
if(addrs.empty())
|
|
2037
|
+
{
|
|
2038
|
+
return Address();
|
|
2039
|
+
}
|
|
2040
|
+
else
|
|
2041
|
+
{
|
|
2042
|
+
return addrs[0];
|
|
2043
|
+
}
|
|
2044
|
+
}
|
|
2045
|
+
|
|
2046
|
+
int
|
|
2047
|
+
IceInternal::getSocketErrno()
|
|
2048
|
+
{
|
|
2049
|
+
#if defined(_WIN32)
|
|
2050
|
+
return WSAGetLastError();
|
|
2051
|
+
#else
|
|
2052
|
+
return errno;
|
|
2053
|
+
#endif
|
|
2054
|
+
}
|
|
2055
|
+
|
|
2056
|
+
bool
|
|
2057
|
+
IceInternal::interrupted()
|
|
2058
|
+
{
|
|
2059
|
+
#ifdef _WIN32
|
|
2060
|
+
return WSAGetLastError() == WSAEINTR;
|
|
2061
|
+
#else
|
|
2062
|
+
# ifdef EPROTO
|
|
2063
|
+
return errno == EINTR || errno == EPROTO;
|
|
2064
|
+
# else
|
|
2065
|
+
return errno == EINTR;
|
|
2066
|
+
# endif
|
|
2067
|
+
#endif
|
|
2068
|
+
}
|
|
2069
|
+
|
|
2070
|
+
bool
|
|
2071
|
+
IceInternal::acceptInterrupted()
|
|
2072
|
+
{
|
|
2073
|
+
if(interrupted())
|
|
2074
|
+
{
|
|
2075
|
+
return true;
|
|
2076
|
+
}
|
|
2077
|
+
|
|
2078
|
+
#ifdef _WIN32
|
|
2079
|
+
int error = WSAGetLastError();
|
|
2080
|
+
return error == WSAECONNABORTED ||
|
|
2081
|
+
error == WSAECONNRESET ||
|
|
2082
|
+
error == WSAETIMEDOUT;
|
|
2083
|
+
#else
|
|
2084
|
+
return errno == ECONNABORTED ||
|
|
2085
|
+
errno == ECONNRESET ||
|
|
2086
|
+
errno == ETIMEDOUT;
|
|
2087
|
+
#endif
|
|
2088
|
+
}
|
|
2089
|
+
|
|
2090
|
+
bool
|
|
2091
|
+
IceInternal::noBuffers()
|
|
2092
|
+
{
|
|
2093
|
+
#ifdef _WIN32
|
|
2094
|
+
int error = WSAGetLastError();
|
|
2095
|
+
return error == WSAENOBUFS ||
|
|
2096
|
+
error == WSAEFAULT;
|
|
2097
|
+
#else
|
|
2098
|
+
return errno == ENOBUFS;
|
|
2099
|
+
#endif
|
|
2100
|
+
}
|
|
2101
|
+
|
|
2102
|
+
bool
|
|
2103
|
+
IceInternal::wouldBlock()
|
|
2104
|
+
{
|
|
2105
|
+
#ifdef _WIN32
|
|
2106
|
+
int error = WSAGetLastError();
|
|
2107
|
+
return error == WSAEWOULDBLOCK || error == WSA_IO_PENDING || error == ERROR_IO_PENDING;
|
|
2108
|
+
#else
|
|
2109
|
+
return errno == EAGAIN || errno == EWOULDBLOCK;
|
|
2110
|
+
#endif
|
|
2111
|
+
}
|
|
2112
|
+
|
|
2113
|
+
bool
|
|
2114
|
+
IceInternal::connectFailed()
|
|
2115
|
+
{
|
|
2116
|
+
#if defined(_WIN32)
|
|
2117
|
+
int error = WSAGetLastError();
|
|
2118
|
+
return error == WSAECONNREFUSED ||
|
|
2119
|
+
error == WSAETIMEDOUT ||
|
|
2120
|
+
error == WSAENETUNREACH ||
|
|
2121
|
+
error == WSAEHOSTUNREACH ||
|
|
2122
|
+
error == WSAECONNRESET ||
|
|
2123
|
+
error == WSAESHUTDOWN ||
|
|
2124
|
+
error == WSAECONNABORTED ||
|
|
2125
|
+
error == ERROR_SEM_TIMEOUT ||
|
|
2126
|
+
error == ERROR_NETNAME_DELETED;
|
|
2127
|
+
#else
|
|
2128
|
+
return errno == ECONNREFUSED ||
|
|
2129
|
+
errno == ETIMEDOUT ||
|
|
2130
|
+
errno == ENETUNREACH ||
|
|
2131
|
+
errno == EHOSTUNREACH ||
|
|
2132
|
+
errno == ECONNRESET ||
|
|
2133
|
+
errno == ESHUTDOWN ||
|
|
2134
|
+
errno == ECONNABORTED;
|
|
2135
|
+
#endif
|
|
2136
|
+
}
|
|
2137
|
+
|
|
2138
|
+
bool
|
|
2139
|
+
IceInternal::connectionRefused()
|
|
2140
|
+
{
|
|
2141
|
+
#if defined(_WIN32)
|
|
2142
|
+
int error = WSAGetLastError();
|
|
2143
|
+
return error == WSAECONNREFUSED || error == ERROR_CONNECTION_REFUSED;
|
|
2144
|
+
#else
|
|
2145
|
+
return errno == ECONNREFUSED;
|
|
2146
|
+
#endif
|
|
2147
|
+
}
|
|
2148
|
+
|
|
2149
|
+
bool
|
|
2150
|
+
IceInternal::connectionLost()
|
|
2151
|
+
{
|
|
2152
|
+
#ifdef _WIN32
|
|
2153
|
+
int error = WSAGetLastError();
|
|
2154
|
+
return error == WSAECONNRESET ||
|
|
2155
|
+
error == WSAESHUTDOWN ||
|
|
2156
|
+
error == WSAENOTCONN ||
|
|
2157
|
+
# ifdef ICE_USE_IOCP
|
|
2158
|
+
error == ERROR_NETNAME_DELETED ||
|
|
2159
|
+
# endif
|
|
2160
|
+
error == WSAECONNABORTED;
|
|
2161
|
+
#else
|
|
2162
|
+
return errno == ECONNRESET ||
|
|
2163
|
+
errno == ENOTCONN ||
|
|
2164
|
+
errno == ESHUTDOWN ||
|
|
2165
|
+
errno == ECONNABORTED ||
|
|
2166
|
+
errno == EPIPE;
|
|
2167
|
+
#endif
|
|
2168
|
+
}
|
|
2169
|
+
|
|
2170
|
+
bool
|
|
2171
|
+
IceInternal::connectInProgress()
|
|
2172
|
+
{
|
|
2173
|
+
#ifdef _WIN32
|
|
2174
|
+
int error = WSAGetLastError();
|
|
2175
|
+
return error == WSAEWOULDBLOCK || error == WSA_IO_PENDING || error == ERROR_IO_PENDING;
|
|
2176
|
+
#else
|
|
2177
|
+
return errno == EINPROGRESS;
|
|
2178
|
+
#endif
|
|
2179
|
+
}
|
|
2180
|
+
|
|
2181
|
+
bool
|
|
2182
|
+
IceInternal::notConnected()
|
|
2183
|
+
{
|
|
2184
|
+
#ifdef _WIN32
|
|
2185
|
+
return WSAGetLastError() == WSAENOTCONN;
|
|
2186
|
+
#elif defined(__APPLE__) || defined(__FreeBSD__)
|
|
2187
|
+
return errno == ENOTCONN || errno == EINVAL;
|
|
2188
|
+
#else
|
|
2189
|
+
return errno == ENOTCONN;
|
|
2190
|
+
#endif
|
|
2191
|
+
}
|
|
2192
|
+
|
|
2193
|
+
bool
|
|
2194
|
+
IceInternal::recvTruncated()
|
|
2195
|
+
{
|
|
2196
|
+
#ifdef _WIN32
|
|
2197
|
+
int err = WSAGetLastError();
|
|
2198
|
+
return err == WSAEMSGSIZE || err == ERROR_MORE_DATA;
|
|
2199
|
+
#else
|
|
2200
|
+
// We don't get an error under Linux if a datagram is truncated.
|
|
2201
|
+
return false;
|
|
2202
|
+
#endif
|
|
2203
|
+
}
|
|
2204
|
+
|
|
2205
|
+
void
|
|
2206
|
+
IceInternal::doListen(SOCKET fd, int backlog)
|
|
2207
|
+
{
|
|
2208
|
+
repeatListen:
|
|
2209
|
+
if(::listen(fd, backlog) == SOCKET_ERROR)
|
|
2210
|
+
{
|
|
2211
|
+
if(interrupted())
|
|
2212
|
+
{
|
|
2213
|
+
goto repeatListen;
|
|
2214
|
+
}
|
|
2215
|
+
|
|
2216
|
+
closeSocketNoThrow(fd);
|
|
2217
|
+
SocketException ex(__FILE__, __LINE__);
|
|
2218
|
+
ex.error = getSocketErrno();
|
|
2219
|
+
throw ex;
|
|
2220
|
+
}
|
|
2221
|
+
}
|
|
2222
|
+
|
|
2223
|
+
bool
|
|
2224
|
+
IceInternal::doConnect(SOCKET fd, const Address& addr, const Address& sourceAddr)
|
|
2225
|
+
{
|
|
2226
|
+
if(isAddressValid(sourceAddr))
|
|
2227
|
+
{
|
|
2228
|
+
doBind(fd, sourceAddr);
|
|
2229
|
+
}
|
|
2230
|
+
|
|
2231
|
+
repeatConnect:
|
|
2232
|
+
int size = getAddressStorageSize(addr);
|
|
2233
|
+
assert(size != 0);
|
|
2234
|
+
|
|
2235
|
+
if(::connect(fd, &addr.sa, size) == SOCKET_ERROR)
|
|
2236
|
+
{
|
|
2237
|
+
if(interrupted())
|
|
2238
|
+
{
|
|
2239
|
+
goto repeatConnect;
|
|
2240
|
+
}
|
|
2241
|
+
|
|
2242
|
+
if(connectInProgress())
|
|
2243
|
+
{
|
|
2244
|
+
return false;
|
|
2245
|
+
}
|
|
2246
|
+
|
|
2247
|
+
closeSocketNoThrow(fd);
|
|
2248
|
+
if(connectionRefused())
|
|
2249
|
+
{
|
|
2250
|
+
ConnectionRefusedException ex(__FILE__, __LINE__);
|
|
2251
|
+
ex.error = getSocketErrno();
|
|
2252
|
+
throw ex;
|
|
2253
|
+
}
|
|
2254
|
+
else if(connectFailed())
|
|
2255
|
+
{
|
|
2256
|
+
ConnectFailedException ex(__FILE__, __LINE__);
|
|
2257
|
+
ex.error = getSocketErrno();
|
|
2258
|
+
throw ex;
|
|
2259
|
+
}
|
|
2260
|
+
else
|
|
2261
|
+
{
|
|
2262
|
+
SocketException ex(__FILE__, __LINE__);
|
|
2263
|
+
ex.error = getSocketErrno();
|
|
2264
|
+
throw ex;
|
|
2265
|
+
}
|
|
2266
|
+
}
|
|
2267
|
+
|
|
2268
|
+
#if defined(__linux)
|
|
2269
|
+
//
|
|
2270
|
+
// Prevent self connect (self connect happens on Linux when a client tries to connect to
|
|
2271
|
+
// a server which was just deactivated if the client socket re-uses the same ephemeral
|
|
2272
|
+
// port as the server).
|
|
2273
|
+
//
|
|
2274
|
+
Address localAddr;
|
|
2275
|
+
fdToLocalAddress(fd, localAddr);
|
|
2276
|
+
if(compareAddress(addr, localAddr) == 0)
|
|
2277
|
+
{
|
|
2278
|
+
ConnectionRefusedException ex(__FILE__, __LINE__);
|
|
2279
|
+
ex.error = 0; // No appropriate errno
|
|
2280
|
+
throw ex;
|
|
2281
|
+
}
|
|
2282
|
+
#endif
|
|
2283
|
+
return true;
|
|
2284
|
+
}
|
|
2285
|
+
|
|
2286
|
+
void
|
|
2287
|
+
IceInternal::doFinishConnect(SOCKET fd)
|
|
2288
|
+
{
|
|
2289
|
+
//
|
|
2290
|
+
// Note: we don't close the socket if there's an exception. It's the responsability
|
|
2291
|
+
// of the caller to do so.
|
|
2292
|
+
//
|
|
2293
|
+
|
|
2294
|
+
//
|
|
2295
|
+
// Strange windows bug: The following call to Sleep() is
|
|
2296
|
+
// necessary, otherwise no error is reported through
|
|
2297
|
+
// getsockopt.
|
|
2298
|
+
//
|
|
2299
|
+
#if defined(_WIN32)
|
|
2300
|
+
Sleep(0);
|
|
2301
|
+
#endif
|
|
2302
|
+
|
|
2303
|
+
int val;
|
|
2304
|
+
socklen_t len = static_cast<socklen_t>(sizeof(int));
|
|
2305
|
+
if(getsockopt(fd, SOL_SOCKET, SO_ERROR, reinterpret_cast<char*>(&val), &len) == SOCKET_ERROR)
|
|
2306
|
+
{
|
|
2307
|
+
SocketException ex(__FILE__, __LINE__);
|
|
2308
|
+
ex.error = getSocketErrno();
|
|
2309
|
+
throw ex;
|
|
2310
|
+
}
|
|
2311
|
+
|
|
2312
|
+
if(val > 0)
|
|
2313
|
+
{
|
|
2314
|
+
#if defined(_WIN32)
|
|
2315
|
+
WSASetLastError(val);
|
|
2316
|
+
#else
|
|
2317
|
+
errno = val;
|
|
2318
|
+
#endif
|
|
2319
|
+
if(connectionRefused())
|
|
2320
|
+
{
|
|
2321
|
+
ConnectionRefusedException ex(__FILE__, __LINE__);
|
|
2322
|
+
ex.error = getSocketErrno();
|
|
2323
|
+
throw ex;
|
|
2324
|
+
}
|
|
2325
|
+
else if(connectFailed())
|
|
2326
|
+
{
|
|
2327
|
+
ConnectFailedException ex(__FILE__, __LINE__);
|
|
2328
|
+
ex.error = getSocketErrno();
|
|
2329
|
+
throw ex;
|
|
2330
|
+
}
|
|
2331
|
+
else
|
|
2332
|
+
{
|
|
2333
|
+
SocketException ex(__FILE__, __LINE__);
|
|
2334
|
+
ex.error = getSocketErrno();
|
|
2335
|
+
throw ex;
|
|
2336
|
+
}
|
|
2337
|
+
}
|
|
2338
|
+
|
|
2339
|
+
#if defined(__linux)
|
|
2340
|
+
//
|
|
2341
|
+
// Prevent self connect (self connect happens on Linux when a client tries to connect to
|
|
2342
|
+
// a server which was just deactivated if the client socket re-uses the same ephemeral
|
|
2343
|
+
// port as the server).
|
|
2344
|
+
//
|
|
2345
|
+
Address localAddr;
|
|
2346
|
+
fdToLocalAddress(fd, localAddr);
|
|
2347
|
+
Address remoteAddr;
|
|
2348
|
+
if(fdToRemoteAddress(fd, remoteAddr) && compareAddress(remoteAddr, localAddr) == 0)
|
|
2349
|
+
{
|
|
2350
|
+
ConnectionRefusedException ex(__FILE__, __LINE__);
|
|
2351
|
+
ex.error = 0; // No appropriate errno
|
|
2352
|
+
throw ex;
|
|
2353
|
+
}
|
|
2354
|
+
#endif
|
|
2355
|
+
}
|
|
2356
|
+
|
|
2357
|
+
SOCKET
|
|
2358
|
+
IceInternal::doAccept(SOCKET fd)
|
|
2359
|
+
{
|
|
2360
|
+
#ifdef _WIN32
|
|
2361
|
+
SOCKET ret;
|
|
2362
|
+
#else
|
|
2363
|
+
int ret;
|
|
2364
|
+
#endif
|
|
2365
|
+
|
|
2366
|
+
repeatAccept:
|
|
2367
|
+
if((ret = ::accept(fd, 0, 0)) == INVALID_SOCKET)
|
|
2368
|
+
{
|
|
2369
|
+
if(acceptInterrupted())
|
|
2370
|
+
{
|
|
2371
|
+
goto repeatAccept;
|
|
2372
|
+
}
|
|
2373
|
+
|
|
2374
|
+
SocketException ex(__FILE__, __LINE__);
|
|
2375
|
+
ex.error = getSocketErrno();
|
|
2376
|
+
throw ex;
|
|
2377
|
+
}
|
|
2378
|
+
|
|
2379
|
+
setTcpNoDelay(ret);
|
|
2380
|
+
setKeepAlive(ret);
|
|
2381
|
+
return ret;
|
|
2382
|
+
}
|
|
2383
|
+
|
|
2384
|
+
|
|
2385
|
+
void
|
|
2386
|
+
IceInternal::createPipe(SOCKET fds[2])
|
|
2387
|
+
{
|
|
2388
|
+
#ifdef _WIN32
|
|
2389
|
+
|
|
2390
|
+
SOCKET fd = createSocketImpl(false, AF_INET);
|
|
2391
|
+
setBlock(fd, true);
|
|
2392
|
+
|
|
2393
|
+
Address addr;
|
|
2394
|
+
memset(&addr.saStorage, 0, sizeof(sockaddr_storage));
|
|
2395
|
+
|
|
2396
|
+
addr.saIn.sin_family = AF_INET;
|
|
2397
|
+
addr.saIn.sin_port = htons(0);
|
|
2398
|
+
addr.saIn.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
|
2399
|
+
|
|
2400
|
+
addr = doBind(fd, addr);
|
|
2401
|
+
doListen(fd, 1);
|
|
2402
|
+
|
|
2403
|
+
try
|
|
2404
|
+
{
|
|
2405
|
+
fds[0] = createSocketImpl(false, AF_INET);
|
|
2406
|
+
}
|
|
2407
|
+
catch(...)
|
|
2408
|
+
{
|
|
2409
|
+
::closesocket(fd);
|
|
2410
|
+
throw;
|
|
2411
|
+
}
|
|
2412
|
+
|
|
2413
|
+
try
|
|
2414
|
+
{
|
|
2415
|
+
setBlock(fds[0], true);
|
|
2416
|
+
# ifndef NDEBUG
|
|
2417
|
+
bool connected = doConnect(fds[0], addr, Address());
|
|
2418
|
+
assert(connected);
|
|
2419
|
+
# else
|
|
2420
|
+
doConnect(fds[0], addr, Address());
|
|
2421
|
+
# endif
|
|
2422
|
+
}
|
|
2423
|
+
catch(...)
|
|
2424
|
+
{
|
|
2425
|
+
// fds[0] is closed by doConnect
|
|
2426
|
+
::closesocket(fd);
|
|
2427
|
+
throw;
|
|
2428
|
+
}
|
|
2429
|
+
|
|
2430
|
+
try
|
|
2431
|
+
{
|
|
2432
|
+
fds[1] = doAccept(fd);
|
|
2433
|
+
}
|
|
2434
|
+
catch(...)
|
|
2435
|
+
{
|
|
2436
|
+
::closesocket(fds[0]);
|
|
2437
|
+
::closesocket(fd);
|
|
2438
|
+
throw;
|
|
2439
|
+
}
|
|
2440
|
+
|
|
2441
|
+
::closesocket(fd);
|
|
2442
|
+
|
|
2443
|
+
try
|
|
2444
|
+
{
|
|
2445
|
+
setBlock(fds[1], true);
|
|
2446
|
+
}
|
|
2447
|
+
catch(...)
|
|
2448
|
+
{
|
|
2449
|
+
::closesocket(fds[0]);
|
|
2450
|
+
// fds[1] is closed by setBlock
|
|
2451
|
+
throw;
|
|
2452
|
+
}
|
|
2453
|
+
|
|
2454
|
+
#else
|
|
2455
|
+
|
|
2456
|
+
if(::pipe(fds) != 0)
|
|
2457
|
+
{
|
|
2458
|
+
SyscallException ex(__FILE__, __LINE__);
|
|
2459
|
+
ex.error = getSystemErrno();
|
|
2460
|
+
throw ex;
|
|
2461
|
+
}
|
|
2462
|
+
|
|
2463
|
+
try
|
|
2464
|
+
{
|
|
2465
|
+
setBlock(fds[0], true);
|
|
2466
|
+
}
|
|
2467
|
+
catch(...)
|
|
2468
|
+
{
|
|
2469
|
+
// fds[0] is closed by setBlock
|
|
2470
|
+
closeSocketNoThrow(fds[1]);
|
|
2471
|
+
throw;
|
|
2472
|
+
}
|
|
2473
|
+
|
|
2474
|
+
try
|
|
2475
|
+
{
|
|
2476
|
+
setBlock(fds[1], true);
|
|
2477
|
+
}
|
|
2478
|
+
catch(...)
|
|
2479
|
+
{
|
|
2480
|
+
closeSocketNoThrow(fds[0]);
|
|
2481
|
+
// fds[1] is closed by setBlock
|
|
2482
|
+
throw;
|
|
2483
|
+
}
|
|
2484
|
+
|
|
2485
|
+
#endif
|
|
2486
|
+
}
|
|
2487
|
+
|
|
2488
|
+
#else // ICE_OS_WINRT
|
|
2489
|
+
|
|
2490
|
+
void
|
|
2491
|
+
IceInternal::checkConnectErrorCode(const char* file, int line, HRESULT herr, HostName^ host)
|
|
2492
|
+
{
|
|
2493
|
+
if(herr == E_ACCESSDENIED)
|
|
2494
|
+
{
|
|
2495
|
+
SocketException ex(file, line);
|
|
2496
|
+
ex.error = static_cast<int>(herr);
|
|
2497
|
+
throw ex;
|
|
2498
|
+
}
|
|
2499
|
+
SocketErrorStatus error = SocketError::GetStatus(herr);
|
|
2500
|
+
if(error == SocketErrorStatus::ConnectionRefused)
|
|
2501
|
+
{
|
|
2502
|
+
ConnectionRefusedException ex(file, line);
|
|
2503
|
+
ex.error = static_cast<int>(error);
|
|
2504
|
+
throw ex;
|
|
2505
|
+
}
|
|
2506
|
+
else if(error == SocketErrorStatus::NetworkDroppedConnectionOnReset ||
|
|
2507
|
+
error == SocketErrorStatus::ConnectionTimedOut ||
|
|
2508
|
+
error == SocketErrorStatus::NetworkIsUnreachable ||
|
|
2509
|
+
error == SocketErrorStatus::UnreachableHost ||
|
|
2510
|
+
error == SocketErrorStatus::ConnectionResetByPeer ||
|
|
2511
|
+
error == SocketErrorStatus::SoftwareCausedConnectionAbort)
|
|
2512
|
+
{
|
|
2513
|
+
ConnectFailedException ex(file, line);
|
|
2514
|
+
ex.error = static_cast<int>(error);
|
|
2515
|
+
throw ex;
|
|
2516
|
+
}
|
|
2517
|
+
else if(error == SocketErrorStatus::HostNotFound)
|
|
2518
|
+
{
|
|
2519
|
+
DNSException ex(file, line);
|
|
2520
|
+
ex.error = static_cast<int>(error);
|
|
2521
|
+
//
|
|
2522
|
+
// Don't need to pass a wide string converter as the wide string come from
|
|
2523
|
+
// Windows API.
|
|
2524
|
+
//
|
|
2525
|
+
ex.host = IceUtil::wstringToString(host->RawName->Data(), IceUtil::getProcessStringConverter());
|
|
2526
|
+
throw ex;
|
|
2527
|
+
}
|
|
2528
|
+
else
|
|
2529
|
+
{
|
|
2530
|
+
SocketException ex(file, line);
|
|
2531
|
+
ex.error = static_cast<int>(error);
|
|
2532
|
+
throw ex;
|
|
2533
|
+
}
|
|
2534
|
+
}
|
|
2535
|
+
|
|
2536
|
+
void
|
|
2537
|
+
IceInternal::checkErrorCode(const char* file, int line, HRESULT herr)
|
|
2538
|
+
{
|
|
2539
|
+
if(herr == E_ACCESSDENIED)
|
|
2540
|
+
{
|
|
2541
|
+
SocketException ex(file, line);
|
|
2542
|
+
ex.error = static_cast<int>(herr);
|
|
2543
|
+
throw ex;
|
|
2544
|
+
}
|
|
2545
|
+
SocketErrorStatus error = SocketError::GetStatus(herr);
|
|
2546
|
+
if(error == SocketErrorStatus::NetworkDroppedConnectionOnReset ||
|
|
2547
|
+
error == SocketErrorStatus::SoftwareCausedConnectionAbort ||
|
|
2548
|
+
error == SocketErrorStatus::ConnectionResetByPeer)
|
|
2549
|
+
{
|
|
2550
|
+
ConnectionLostException ex(file, line);
|
|
2551
|
+
ex.error = static_cast<int>(error);
|
|
2552
|
+
throw ex;
|
|
2553
|
+
}
|
|
2554
|
+
else if(error == SocketErrorStatus::HostNotFound)
|
|
2555
|
+
{
|
|
2556
|
+
DNSException ex(file, line);
|
|
2557
|
+
ex.error = static_cast<int>(error);
|
|
2558
|
+
throw ex;
|
|
2559
|
+
}
|
|
2560
|
+
else
|
|
2561
|
+
{
|
|
2562
|
+
SocketException ex(file, line);
|
|
2563
|
+
ex.error = static_cast<int>(error);
|
|
2564
|
+
throw ex;
|
|
2565
|
+
}
|
|
2566
|
+
}
|
|
2567
|
+
|
|
2568
|
+
|
|
2569
|
+
#endif
|
|
2570
|
+
|
|
2571
|
+
#if defined(ICE_USE_IOCP)
|
|
2572
|
+
void
|
|
2573
|
+
IceInternal::doConnectAsync(SOCKET fd, const Address& addr, const Address& sourceAddr, AsyncInfo& info)
|
|
2574
|
+
{
|
|
2575
|
+
//
|
|
2576
|
+
// NOTE: It's the caller's responsability to close the socket upon
|
|
2577
|
+
// failure to connect. The socket isn't closed by this method.
|
|
2578
|
+
//
|
|
2579
|
+
Address bindAddr;
|
|
2580
|
+
if(isAddressValid(sourceAddr))
|
|
2581
|
+
{
|
|
2582
|
+
bindAddr = sourceAddr;
|
|
2583
|
+
}
|
|
2584
|
+
else
|
|
2585
|
+
{
|
|
2586
|
+
memset(&bindAddr.saStorage, 0, sizeof(sockaddr_storage));
|
|
2587
|
+
if(addr.saStorage.ss_family == AF_INET)
|
|
2588
|
+
{
|
|
2589
|
+
bindAddr.saIn.sin_family = AF_INET;
|
|
2590
|
+
bindAddr.saIn.sin_port = htons(0);
|
|
2591
|
+
bindAddr.saIn.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
2592
|
+
}
|
|
2593
|
+
else if(addr.saStorage.ss_family == AF_INET6)
|
|
2594
|
+
{
|
|
2595
|
+
bindAddr.saIn6.sin6_family = AF_INET6;
|
|
2596
|
+
bindAddr.saIn6.sin6_port = htons(0);
|
|
2597
|
+
bindAddr.saIn6.sin6_addr = in6addr_any;
|
|
2598
|
+
}
|
|
2599
|
+
}
|
|
2600
|
+
|
|
2601
|
+
int size = getAddressStorageSize(bindAddr);
|
|
2602
|
+
assert(size != 0);
|
|
2603
|
+
|
|
2604
|
+
if(::bind(fd, &bindAddr.sa, size) == SOCKET_ERROR)
|
|
2605
|
+
{
|
|
2606
|
+
SocketException ex(__FILE__, __LINE__);
|
|
2607
|
+
ex.error = getSocketErrno();
|
|
2608
|
+
throw ex;
|
|
2609
|
+
}
|
|
2610
|
+
|
|
2611
|
+
LPFN_CONNECTEX ConnectEx = NULL; // a pointer to the 'ConnectEx()' function
|
|
2612
|
+
GUID GuidConnectEx = WSAID_CONNECTEX; // The Guid
|
|
2613
|
+
DWORD dwBytes;
|
|
2614
|
+
if(WSAIoctl(fd,
|
|
2615
|
+
SIO_GET_EXTENSION_FUNCTION_POINTER,
|
|
2616
|
+
&GuidConnectEx,
|
|
2617
|
+
sizeof(GuidConnectEx),
|
|
2618
|
+
&ConnectEx,
|
|
2619
|
+
sizeof(ConnectEx),
|
|
2620
|
+
&dwBytes,
|
|
2621
|
+
NULL,
|
|
2622
|
+
NULL) == SOCKET_ERROR)
|
|
2623
|
+
{
|
|
2624
|
+
SocketException ex(__FILE__, __LINE__);
|
|
2625
|
+
ex.error = getSocketErrno();
|
|
2626
|
+
throw ex;
|
|
2627
|
+
}
|
|
2628
|
+
|
|
2629
|
+
if(!ConnectEx(fd, &addr.sa, size, 0, 0, 0, &info))
|
|
2630
|
+
{
|
|
2631
|
+
if(!connectInProgress())
|
|
2632
|
+
{
|
|
2633
|
+
if(connectionRefused())
|
|
2634
|
+
{
|
|
2635
|
+
ConnectionRefusedException ex(__FILE__, __LINE__);
|
|
2636
|
+
ex.error = getSocketErrno();
|
|
2637
|
+
throw ex;
|
|
2638
|
+
}
|
|
2639
|
+
else if(connectFailed())
|
|
2640
|
+
{
|
|
2641
|
+
ConnectFailedException ex(__FILE__, __LINE__);
|
|
2642
|
+
ex.error = getSocketErrno();
|
|
2643
|
+
throw ex;
|
|
2644
|
+
}
|
|
2645
|
+
else
|
|
2646
|
+
{
|
|
2647
|
+
SocketException ex(__FILE__, __LINE__);
|
|
2648
|
+
ex.error = getSocketErrno();
|
|
2649
|
+
throw ex;
|
|
2650
|
+
}
|
|
2651
|
+
}
|
|
2652
|
+
}
|
|
2653
|
+
}
|
|
2654
|
+
|
|
2655
|
+
void
|
|
2656
|
+
IceInternal::doFinishConnectAsync(SOCKET fd, AsyncInfo& info)
|
|
2657
|
+
{
|
|
2658
|
+
//
|
|
2659
|
+
// NOTE: It's the caller's responsability to close the socket upon
|
|
2660
|
+
// failure to connect. The socket isn't closed by this method.
|
|
2661
|
+
//
|
|
2662
|
+
|
|
2663
|
+
if(static_cast<int>(info.count) == SOCKET_ERROR)
|
|
2664
|
+
{
|
|
2665
|
+
WSASetLastError(info.error);
|
|
2666
|
+
if(connectionRefused())
|
|
2667
|
+
{
|
|
2668
|
+
ConnectionRefusedException ex(__FILE__, __LINE__);
|
|
2669
|
+
ex.error = getSocketErrno();
|
|
2670
|
+
throw ex;
|
|
2671
|
+
}
|
|
2672
|
+
else if(connectFailed())
|
|
2673
|
+
{
|
|
2674
|
+
ConnectFailedException ex(__FILE__, __LINE__);
|
|
2675
|
+
ex.error = getSocketErrno();
|
|
2676
|
+
throw ex;
|
|
2677
|
+
}
|
|
2678
|
+
else
|
|
2679
|
+
{
|
|
2680
|
+
SocketException ex(__FILE__, __LINE__);
|
|
2681
|
+
ex.error = getSocketErrno();
|
|
2682
|
+
throw ex;
|
|
2683
|
+
}
|
|
2684
|
+
}
|
|
2685
|
+
|
|
2686
|
+
if(setsockopt(fd, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0) == SOCKET_ERROR)
|
|
2687
|
+
{
|
|
2688
|
+
SocketException ex(__FILE__, __LINE__);
|
|
2689
|
+
ex.error = getSocketErrno();
|
|
2690
|
+
throw ex;
|
|
2691
|
+
}
|
|
2692
|
+
}
|
|
2693
|
+
#endif
|
|
2694
|
+
|