passenger 6.2.0 → 6.2.1

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.
Files changed (650) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +33 -1
  3. data/CONTRIBUTING.md +7 -311
  4. data/CONTRIBUTORS +1 -0
  5. data/LICENSE +1 -1
  6. data/README.md +1 -1
  7. data/Rakefile +1 -1
  8. data/bin/passenger +1 -1
  9. data/bin/passenger-config +1 -1
  10. data/bin/passenger-install-apache2-module +1 -1
  11. data/bin/passenger-install-nginx-module +4 -9
  12. data/bin/passenger-memory-stats +1 -1
  13. data/bin/passenger-status +1 -1
  14. data/build/agent.rb +13 -15
  15. data/build/apache2.rb +13 -16
  16. data/build/basics.rb +10 -13
  17. data/build/common_library.rb +5 -9
  18. data/build/cxx_tests.rb +37 -12
  19. data/build/integration_tests.rb +5 -2
  20. data/build/misc.rb +1 -1
  21. data/build/nginx.rb +1 -1
  22. data/build/node_tests.rb +1 -1
  23. data/build/oxt_tests.rb +6 -8
  24. data/build/packaging.rb +1 -1
  25. data/build/ruby_extension.rb +1 -1
  26. data/build/ruby_tests.rb +1 -1
  27. data/build/schema_printer.rb +13 -15
  28. data/build/support/cplusplus.rb +61 -69
  29. data/build/support/cxx_dependency_map.rb +2 -1
  30. data/build/support/general.rb +1 -1
  31. data/build/support/vendor/cxx_hinted_parser/LICENSE.md +1 -1
  32. data/build/support/vendor/cxx_hinted_parser/lib/cxx_hinted_parser/parser.rb +1 -1
  33. data/build/support/vendor/cxx_hinted_parser/lib/cxx_hinted_parser.rb +1 -1
  34. data/build/support/vendor/cxxcodebuilder/LICENSE.md +1 -1
  35. data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder/builder.rb +1 -1
  36. data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder/initializer_builder.rb +1 -1
  37. data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder.rb +1 -1
  38. data/build/test_basics.rb +1 -1
  39. data/dev/copy_boost_headers +1 -1
  40. data/dev/index_cxx_dependencies.rb +5 -1
  41. data/dev/libev-changes.patch +108 -0
  42. data/dev/nginx_version_sha256 +1 -1
  43. data/dev/ruby_server.rb +1 -6
  44. data/dev/upgrading_libuv.sh +16 -0
  45. data/doc/BasicArchitectureOverview.md +55 -0
  46. data/doc/BuildCaching.md +23 -0
  47. data/doc/BuildSystem.md +49 -0
  48. data/doc/DebuggingAndStressTesting.md +2 -0
  49. data/doc/DesignAspects/LimitedGemDependencies.md +1 -0
  50. data/doc/DevEnvironmentSetup.md +46 -0
  51. data/doc/DevHandbook.md +28 -0
  52. data/doc/Packaging.md +1 -1
  53. data/doc/RunningTests.md +88 -0
  54. data/doc/{TempFileHandling.md → SecureTempFileHandling.md} +1 -1
  55. data/doc/{CxxTestingGuide.md → WritingCxxTests.md} +1 -20
  56. data/src/agent/AgentMain.cpp +1 -1
  57. data/src/agent/Core/ApiServer.h +1 -1
  58. data/src/agent/Core/ApplicationPool/AbstractSession.h +1 -1
  59. data/src/agent/Core/ApplicationPool/BasicGroupInfo.h +1 -1
  60. data/src/agent/Core/ApplicationPool/BasicProcessInfo.h +1 -1
  61. data/src/agent/Core/ApplicationPool/Common.h +1 -1
  62. data/src/agent/Core/ApplicationPool/Context.h +1 -1
  63. data/src/agent/Core/ApplicationPool/Group/InitializationAndShutdown.cpp +1 -1
  64. data/src/agent/Core/ApplicationPool/Group/InternalUtils.cpp +1 -1
  65. data/src/agent/Core/ApplicationPool/Group/LifetimeAndBasics.cpp +1 -1
  66. data/src/agent/Core/ApplicationPool/Group/Miscellaneous.cpp +1 -1
  67. data/src/agent/Core/ApplicationPool/Group/OutOfBandWork.cpp +1 -1
  68. data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +1 -1
  69. data/src/agent/Core/ApplicationPool/Group/SessionManagement.cpp +1 -1
  70. data/src/agent/Core/ApplicationPool/Group/SpawningAndRestarting.cpp +1 -1
  71. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +1 -1
  72. data/src/agent/Core/ApplicationPool/Group/Verification.cpp +1 -1
  73. data/src/agent/Core/ApplicationPool/Group.h +1 -1
  74. data/src/agent/Core/ApplicationPool/Implementation.cpp +1 -1
  75. data/src/agent/Core/ApplicationPool/Options.h +1 -1
  76. data/src/agent/Core/ApplicationPool/Pool/AnalyticsCollection.cpp +1 -1
  77. data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +1 -1
  78. data/src/agent/Core/ApplicationPool/Pool/GeneralUtils.cpp +1 -1
  79. data/src/agent/Core/ApplicationPool/Pool/GroupUtils.cpp +1 -1
  80. data/src/agent/Core/ApplicationPool/Pool/InitializationAndShutdown.cpp +1 -1
  81. data/src/agent/Core/ApplicationPool/Pool/Miscellaneous.cpp +1 -1
  82. data/src/agent/Core/ApplicationPool/Pool/ProcessUtils.cpp +1 -1
  83. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +1 -1
  84. data/src/agent/Core/ApplicationPool/Pool.h +1 -1
  85. data/src/agent/Core/ApplicationPool/Process.cpp +1 -1
  86. data/src/agent/Core/ApplicationPool/Process.h +1 -1
  87. data/src/agent/Core/ApplicationPool/Session.h +1 -1
  88. data/src/agent/Core/ApplicationPool/Socket.h +1 -1
  89. data/src/agent/Core/ApplicationPool/TestSession.h +1 -1
  90. data/src/agent/Core/Config.h +3 -2
  91. data/src/agent/Core/ConfigChange.cpp +1 -1
  92. data/src/agent/Core/ConfigChange.h +1 -1
  93. data/src/agent/Core/Controller/AppResponse.h +1 -1
  94. data/src/agent/Core/Controller/BufferBody.cpp +1 -1
  95. data/src/agent/Core/Controller/CheckoutSession.cpp +8 -5
  96. data/src/agent/Core/Controller/Client.h +1 -1
  97. data/src/agent/Core/Controller/Config.cpp +1 -1
  98. data/src/agent/Core/Controller/Config.h +2 -2
  99. data/src/agent/Core/Controller/ForwardResponse.cpp +2 -2
  100. data/src/agent/Core/Controller/Hooks.cpp +12 -9
  101. data/src/agent/Core/Controller/Implementation.cpp +1 -1
  102. data/src/agent/Core/Controller/InitRequest.cpp +1 -1
  103. data/src/agent/Core/Controller/InitializationAndShutdown.cpp +1 -1
  104. data/src/agent/Core/Controller/InternalUtils.cpp +1 -1
  105. data/src/agent/Core/Controller/Miscellaneous.cpp +1 -1
  106. data/src/agent/Core/Controller/Request.h +1 -1
  107. data/src/agent/Core/Controller/SendRequest.cpp +1 -1
  108. data/src/agent/Core/Controller/StateInspection.cpp +1 -1
  109. data/src/agent/Core/Controller/TurboCaching.h +1 -1
  110. data/src/agent/Core/Controller.h +1 -1
  111. data/src/agent/Core/CoreMain.cpp +1 -1
  112. data/src/agent/Core/OptionParser.h +1 -1
  113. data/src/agent/Core/ResponseCache.h +1 -1
  114. data/src/agent/Core/SecurityUpdateChecker.h +1 -1
  115. data/src/agent/Core/SpawningKit/Config/AutoGeneratedCode.h +1 -1
  116. data/src/agent/Core/SpawningKit/Config/AutoGeneratedCode.h.cxxcodebuilder +1 -1
  117. data/src/agent/Core/SpawningKit/Config.h +1 -1
  118. data/src/agent/Core/SpawningKit/Context.h +1 -1
  119. data/src/agent/Core/SpawningKit/DirectSpawner.h +1 -1
  120. data/src/agent/Core/SpawningKit/DummySpawner.h +1 -1
  121. data/src/agent/Core/SpawningKit/ErrorRenderer.h +1 -1
  122. data/src/agent/Core/SpawningKit/Exceptions.h +63 -2
  123. data/src/agent/Core/SpawningKit/Factory.h +1 -1
  124. data/src/agent/Core/SpawningKit/Handshake/BackgroundIOCapturer.h +1 -1
  125. data/src/agent/Core/SpawningKit/Handshake/Perform.h +3 -2
  126. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -1
  127. data/src/agent/Core/SpawningKit/Handshake/Session.h +1 -1
  128. data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +1 -1
  129. data/src/agent/Core/SpawningKit/Journey.h +1 -1
  130. data/src/agent/Core/SpawningKit/PipeWatcher.h +1 -1
  131. data/src/agent/Core/SpawningKit/README.md +3 -3
  132. data/src/agent/Core/SpawningKit/Result/AutoGeneratedCode.h +1 -1
  133. data/src/agent/Core/SpawningKit/Result/AutoGeneratedCode.h.cxxcodebuilder +1 -1
  134. data/src/agent/Core/SpawningKit/Result.h +1 -1
  135. data/src/agent/Core/SpawningKit/SmartSpawner.h +17 -17
  136. data/src/agent/Core/SpawningKit/Spawner.h +1 -1
  137. data/src/agent/Core/SpawningKit/UserSwitchingRules.h +1 -1
  138. data/src/agent/Core/TelemetryCollector.h +1 -1
  139. data/src/agent/ExecHelper/ExecHelperMain.cpp +1 -1
  140. data/src/agent/FileReadHelper/FileReadHelperMain.cpp +1 -1
  141. data/src/agent/MainFunctions.h +1 -1
  142. data/src/agent/Shared/ApiAccountUtils.h +4 -3
  143. data/src/agent/Shared/ApiServerUtils.h +1 -2
  144. data/src/agent/Shared/ApplicationPoolApiKey.h +1 -1
  145. data/src/agent/Shared/Fundamentals/AbortHandler.cpp +1 -1
  146. data/src/agent/Shared/Fundamentals/AbortHandler.h +1 -1
  147. data/src/agent/Shared/Fundamentals/Initialization.cpp +1 -1
  148. data/src/agent/Shared/Fundamentals/Initialization.h +1 -1
  149. data/src/agent/Shared/Fundamentals/Utils.cpp +1 -1
  150. data/src/agent/Shared/Fundamentals/Utils.h +1 -1
  151. data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +1 -1
  152. data/src/agent/SystemMetrics/SystemMetricsMain.cpp +1 -1
  153. data/src/agent/TempDirToucher/TempDirToucherMain.cpp +1 -1
  154. data/src/agent/Watchdog/ApiServer.h +7 -6
  155. data/src/agent/Watchdog/Config.h +2 -2
  156. data/src/apache2_module/Bucket.cpp +1 -1
  157. data/src/apache2_module/Bucket.h +1 -1
  158. data/src/apache2_module/CBindings.cpp +1 -1
  159. data/src/apache2_module/Config.cpp +1 -1
  160. data/src/apache2_module/Config.h +1 -1
  161. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +104 -104
  162. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp.cxxcodebuilder +2 -2
  163. data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp +1 -1
  164. data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp.cxxcodebuilder +1 -1
  165. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +1 -1
  166. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp.cxxcodebuilder +1 -1
  167. data/src/apache2_module/ConfigGeneral/Common.h +1 -1
  168. data/src/apache2_module/ConfigGeneral/ManifestGeneration.h +1 -1
  169. data/src/apache2_module/ConfigGeneral/SetterFuncs.h +1 -1
  170. data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp +1 -1
  171. data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp.cxxcodebuilder +1 -1
  172. data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp +1 -1
  173. data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp.cxxcodebuilder +1 -1
  174. data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp +1 -1
  175. data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp.cxxcodebuilder +1 -1
  176. data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp +1 -1
  177. data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp.cxxcodebuilder +1 -1
  178. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +1 -1
  179. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h.cxxcodebuilder +1 -1
  180. data/src/apache2_module/DirectoryMapper.h +1 -1
  181. data/src/apache2_module/Hooks.cpp +8 -2
  182. data/src/apache2_module/Hooks.h +1 -1
  183. data/src/apache2_module/ServerConfig/AutoGeneratedManifestGeneration.cpp +1 -1
  184. data/src/apache2_module/ServerConfig/AutoGeneratedManifestGeneration.cpp.cxxcodebuilder +1 -1
  185. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +1 -1
  186. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h.cxxcodebuilder +1 -1
  187. data/src/apache2_module/Utils.h +1 -1
  188. data/src/apache2_module/mod_passenger.c +1 -1
  189. data/src/cxx_supportlib/Algorithms/Hasher.cpp +1 -1
  190. data/src/cxx_supportlib/Algorithms/Hasher.h +1 -1
  191. data/src/cxx_supportlib/Algorithms/MovingAverage.h +1 -1
  192. data/src/cxx_supportlib/AppLocalConfigFileUtils.h +1 -1
  193. data/src/cxx_supportlib/AppTypeDetector/CBindings.cpp +1 -1
  194. data/src/cxx_supportlib/AppTypeDetector/CBindings.h +1 -1
  195. data/src/cxx_supportlib/AppTypeDetector/Detector.h +1 -1
  196. data/src/cxx_supportlib/BackgroundEventLoop.cpp +1 -1
  197. data/src/cxx_supportlib/BackgroundEventLoop.h +1 -1
  198. data/src/cxx_supportlib/ConfigKit/AsyncUtils.h +1 -1
  199. data/src/cxx_supportlib/ConfigKit/Common.h +1 -1
  200. data/src/cxx_supportlib/ConfigKit/ConfigKit.h +1 -1
  201. data/src/cxx_supportlib/ConfigKit/DummyTranslator.h +1 -1
  202. data/src/cxx_supportlib/ConfigKit/IN_PRACTICE.md +1 -3
  203. data/src/cxx_supportlib/ConfigKit/PrefixTranslator.h +3 -3
  204. data/src/cxx_supportlib/ConfigKit/Schema.h +1 -1
  205. data/src/cxx_supportlib/ConfigKit/SchemaUtils.h +1 -1
  206. data/src/cxx_supportlib/ConfigKit/Store.h +1 -1
  207. data/src/cxx_supportlib/ConfigKit/SubComponentUtils.h +1 -1
  208. data/src/cxx_supportlib/ConfigKit/TableTranslator.h +1 -1
  209. data/src/cxx_supportlib/ConfigKit/Translator.h +1 -1
  210. data/src/cxx_supportlib/ConfigKit/Utils.h +1 -1
  211. data/src/cxx_supportlib/Constants.h +2 -2
  212. data/src/cxx_supportlib/Constants.h.cxxcodebuilder +1 -1
  213. data/src/cxx_supportlib/DataStructures/HashedStaticString.h +1 -1
  214. data/src/cxx_supportlib/DataStructures/LString.cpp +1 -1
  215. data/src/cxx_supportlib/DataStructures/LString.h +1 -1
  216. data/src/cxx_supportlib/DataStructures/StringKeyTable.h +1 -1
  217. data/src/cxx_supportlib/DataStructures/StringMap.h +1 -1
  218. data/src/cxx_supportlib/Exceptions.cpp +1 -1
  219. data/src/cxx_supportlib/Exceptions.h +1 -1
  220. data/src/cxx_supportlib/FileDescriptor.h +1 -1
  221. data/src/cxx_supportlib/FileTools/FileManip.cpp +1 -1
  222. data/src/cxx_supportlib/FileTools/FileManip.h +1 -1
  223. data/src/cxx_supportlib/FileTools/PathManip.cpp +1 -1
  224. data/src/cxx_supportlib/FileTools/PathManip.h +1 -1
  225. data/src/cxx_supportlib/FileTools/PathManipCBindings.cpp +1 -1
  226. data/src/cxx_supportlib/FileTools/PathManipCBindings.h +1 -1
  227. data/src/cxx_supportlib/FileTools/PathSecurityCheck.cpp +1 -1
  228. data/src/cxx_supportlib/FileTools/PathSecurityCheck.h +1 -1
  229. data/src/cxx_supportlib/Hooks.h +1 -1
  230. data/src/cxx_supportlib/IOTools/BufferedIO.h +1 -1
  231. data/src/cxx_supportlib/IOTools/IOUtils.cpp +10 -10
  232. data/src/cxx_supportlib/IOTools/IOUtils.h +1 -1
  233. data/src/cxx_supportlib/IOTools/MessageIO.h +1 -1
  234. data/src/cxx_supportlib/IOTools/MessageSerialization.h +1 -1
  235. data/src/cxx_supportlib/InstanceDirectory.h +1 -1
  236. data/src/cxx_supportlib/Integrations/LibevJsonUtils.h +1 -1
  237. data/src/cxx_supportlib/JsonTools/Autocast.h +1 -1
  238. data/src/cxx_supportlib/JsonTools/CBindings.cpp +1 -1
  239. data/src/cxx_supportlib/JsonTools/CBindings.h +1 -1
  240. data/src/cxx_supportlib/JsonTools/JsonUtils.h +1 -1
  241. data/src/cxx_supportlib/LoggingKit/Assert.h +1 -1
  242. data/src/cxx_supportlib/LoggingKit/Config.h +2 -1
  243. data/src/cxx_supportlib/LoggingKit/Context.h +1 -1
  244. data/src/cxx_supportlib/LoggingKit/Forward.h +1 -1
  245. data/src/cxx_supportlib/LoggingKit/Implementation.cpp +11 -1
  246. data/src/cxx_supportlib/LoggingKit/Logging.h +1 -1
  247. data/src/cxx_supportlib/LoggingKit/LoggingKit.h +1 -1
  248. data/src/cxx_supportlib/LveLoggingDecorator.h +1 -1
  249. data/src/cxx_supportlib/MemoryKit/mbuf.cpp +1 -1
  250. data/src/cxx_supportlib/MemoryKit/mbuf.h +1 -1
  251. data/src/cxx_supportlib/MemoryKit/palloc.cpp +1 -1
  252. data/src/cxx_supportlib/MemoryKit/palloc.h +1 -1
  253. data/src/cxx_supportlib/ProcessManagement/Ruby.cpp +1 -1
  254. data/src/cxx_supportlib/ProcessManagement/Ruby.h +1 -1
  255. data/src/cxx_supportlib/ProcessManagement/Spawn.cpp +1 -1
  256. data/src/cxx_supportlib/ProcessManagement/Spawn.h +1 -1
  257. data/src/cxx_supportlib/ProcessManagement/Utils.cpp +1 -1
  258. data/src/cxx_supportlib/ProcessManagement/Utils.h +1 -1
  259. data/src/cxx_supportlib/RandomGenerator.h +1 -1
  260. data/src/cxx_supportlib/ResourceLocator.h +1 -1
  261. data/src/cxx_supportlib/SafeLibev.h +1 -1
  262. data/src/cxx_supportlib/SecurityKit/Crypto.cpp +9 -27
  263. data/src/cxx_supportlib/SecurityKit/Crypto.h +2 -2
  264. data/src/cxx_supportlib/SecurityKit/MemZeroGuard.h +1 -1
  265. data/src/cxx_supportlib/ServerKit/AcceptLoadBalancer.h +1 -1
  266. data/src/cxx_supportlib/ServerKit/Channel.h +1 -1
  267. data/src/cxx_supportlib/ServerKit/Client.h +1 -1
  268. data/src/cxx_supportlib/ServerKit/ClientRef.h +1 -1
  269. data/src/cxx_supportlib/ServerKit/Config.h +1 -1
  270. data/src/cxx_supportlib/ServerKit/Context.h +1 -1
  271. data/src/cxx_supportlib/ServerKit/CookieUtils.h +1 -1
  272. data/src/cxx_supportlib/ServerKit/Errors.h +1 -1
  273. data/src/cxx_supportlib/ServerKit/FdSinkChannel.h +1 -1
  274. data/src/cxx_supportlib/ServerKit/FdSourceChannel.h +1 -1
  275. data/src/cxx_supportlib/ServerKit/FileBufferedChannel.h +54 -2
  276. data/src/cxx_supportlib/ServerKit/FileBufferedFdSinkChannel.h +1 -1
  277. data/src/cxx_supportlib/ServerKit/HeaderTable.h +1 -1
  278. data/src/cxx_supportlib/ServerKit/Hooks.h +1 -1
  279. data/src/cxx_supportlib/ServerKit/HttpChunkedBodyParser.h +1 -1
  280. data/src/cxx_supportlib/ServerKit/HttpChunkedBodyParserState.h +1 -1
  281. data/src/cxx_supportlib/ServerKit/HttpClient.h +1 -1
  282. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +1 -1
  283. data/src/cxx_supportlib/ServerKit/HttpHeaderParserState.h +1 -1
  284. data/src/cxx_supportlib/ServerKit/HttpRequest.h +1 -1
  285. data/src/cxx_supportlib/ServerKit/HttpRequestRef.h +1 -1
  286. data/src/cxx_supportlib/ServerKit/HttpServer.h +1 -1
  287. data/src/cxx_supportlib/ServerKit/Implementation.cpp +1 -1
  288. data/src/cxx_supportlib/ServerKit/Server.h +4 -2
  289. data/src/cxx_supportlib/StaticString.h +1 -1
  290. data/src/cxx_supportlib/StrIntTools/DateParsing.h +1 -1
  291. data/src/cxx_supportlib/StrIntTools/StrIntUtils.cpp +1 -1
  292. data/src/cxx_supportlib/StrIntTools/StrIntUtils.h +1 -1
  293. data/src/cxx_supportlib/StrIntTools/StrIntUtilsNoStrictAliasing.cpp +1 -1
  294. data/src/cxx_supportlib/StrIntTools/StringScanning.h +1 -1
  295. data/src/cxx_supportlib/StrIntTools/Template.h +1 -1
  296. data/src/cxx_supportlib/SystemTools/ContainerHelpers.h +1 -1
  297. data/src/cxx_supportlib/SystemTools/ProcessMetricsCollector.h +1 -1
  298. data/src/cxx_supportlib/SystemTools/SystemMetricsCollector.h +1 -1
  299. data/src/cxx_supportlib/SystemTools/SystemTime.cpp +1 -1
  300. data/src/cxx_supportlib/SystemTools/SystemTime.h +1 -1
  301. data/src/cxx_supportlib/SystemTools/UserDatabase.cpp +1 -1
  302. data/src/cxx_supportlib/SystemTools/UserDatabase.h +1 -1
  303. data/src/cxx_supportlib/Utils/AnsiColorConstants.h +1 -1
  304. data/src/cxx_supportlib/Utils/AsyncSignalSafeUtils.h +1 -1
  305. data/src/cxx_supportlib/Utils/BlockingQueue.h +1 -1
  306. data/src/cxx_supportlib/Utils/CachedFileStat.cpp +1 -1
  307. data/src/cxx_supportlib/Utils/CachedFileStat.h +1 -1
  308. data/src/cxx_supportlib/Utils/CachedFileStat.hpp +1 -1
  309. data/src/cxx_supportlib/Utils/ClassUtils.h +1 -1
  310. data/src/cxx_supportlib/Utils/Curl.h +1 -1
  311. data/src/cxx_supportlib/Utils/FastStringStream.h +1 -1
  312. data/src/cxx_supportlib/Utils/FileChangeChecker.h +1 -1
  313. data/src/cxx_supportlib/Utils/HttpConstants.h +1 -1
  314. data/src/cxx_supportlib/Utils/IniFile.h +1 -1
  315. data/src/cxx_supportlib/Utils/MessagePassing.h +1 -1
  316. data/src/cxx_supportlib/Utils/OptionParsing.h +1 -1
  317. data/src/cxx_supportlib/Utils/ReleaseableScopedPointer.h +1 -1
  318. data/src/cxx_supportlib/Utils/ScopeGuard.h +1 -1
  319. data/src/cxx_supportlib/Utils/SpeedMeter.h +1 -1
  320. data/src/cxx_supportlib/Utils/Timer.h +1 -1
  321. data/src/cxx_supportlib/Utils/VariantMap.h +1 -1
  322. data/src/cxx_supportlib/Utils.cpp +1 -1
  323. data/src/cxx_supportlib/Utils.h +1 -1
  324. data/src/cxx_supportlib/WatchdogLauncher.cpp +1 -1
  325. data/src/cxx_supportlib/WatchdogLauncher.h +1 -1
  326. data/src/cxx_supportlib/WrapperRegistry/CBindings.cpp +1 -1
  327. data/src/cxx_supportlib/WrapperRegistry/CBindings.h +1 -1
  328. data/src/cxx_supportlib/WrapperRegistry/Entry.h +1 -1
  329. data/src/cxx_supportlib/WrapperRegistry/Registry.h +1 -1
  330. data/src/cxx_supportlib/oxt/backtrace.hpp +1 -1
  331. data/src/cxx_supportlib/oxt/detail/backtrace_disabled.hpp +1 -1
  332. data/src/cxx_supportlib/oxt/detail/backtrace_enabled.hpp +1 -1
  333. data/src/cxx_supportlib/oxt/detail/context.hpp +1 -1
  334. data/src/cxx_supportlib/oxt/detail/tracable_exception_disabled.hpp +1 -1
  335. data/src/cxx_supportlib/oxt/detail/tracable_exception_enabled.hpp +1 -1
  336. data/src/cxx_supportlib/oxt/dynamic_thread_group.hpp +1 -1
  337. data/src/cxx_supportlib/oxt/implementation.cpp +1 -1
  338. data/src/cxx_supportlib/oxt/initialize.hpp +1 -1
  339. data/src/cxx_supportlib/oxt/macros.hpp +1 -1
  340. data/src/cxx_supportlib/oxt/spin_lock.hpp +1 -1
  341. data/src/cxx_supportlib/oxt/system_calls.cpp +1 -1
  342. data/src/cxx_supportlib/oxt/system_calls.hpp +1 -1
  343. data/src/cxx_supportlib/oxt/thread.hpp +1 -1
  344. data/src/cxx_supportlib/oxt/tracable_exception.hpp +1 -1
  345. data/src/cxx_supportlib/vendor-copy/adhoc_lve.h +1 -1
  346. data/src/cxx_supportlib/vendor-copy/libuv/AUTHORS +353 -3
  347. data/src/cxx_supportlib/vendor-copy/libuv/ChangeLog +3981 -2
  348. data/src/cxx_supportlib/vendor-copy/libuv/LICENSE +1 -28
  349. data/src/cxx_supportlib/vendor-copy/libuv/LICENSE-docs +396 -0
  350. data/src/cxx_supportlib/vendor-copy/libuv/LICENSE-extra +36 -0
  351. data/src/cxx_supportlib/vendor-copy/libuv/Makefile.am +275 -58
  352. data/src/cxx_supportlib/vendor-copy/libuv/Makefile.in +4380 -2125
  353. data/src/cxx_supportlib/vendor-copy/libuv/aclocal.m4 +425 -221
  354. data/src/cxx_supportlib/vendor-copy/libuv/ar-lib +30 -10
  355. data/src/cxx_supportlib/vendor-copy/libuv/compile +31 -14
  356. data/src/cxx_supportlib/vendor-copy/libuv/config.guess +1084 -690
  357. data/src/cxx_supportlib/vendor-copy/libuv/config.sub +1844 -1297
  358. data/src/cxx_supportlib/vendor-copy/libuv/configure +6935 -3664
  359. data/src/cxx_supportlib/vendor-copy/libuv/configure.ac +43 -19
  360. data/src/cxx_supportlib/vendor-copy/libuv/depcomp +12 -11
  361. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-darwin.h → uv/darwin.h} +3 -3
  362. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-errno.h → uv/errno.h} +119 -60
  363. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-linux.h → uv/linux.h} +1 -1
  364. data/src/cxx_supportlib/vendor-copy/libuv/include/uv/os390.h +33 -0
  365. data/src/cxx_supportlib/vendor-copy/libuv/include/uv/posix.h +31 -0
  366. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-threadpool.h → uv/threadpool.h} +1 -1
  367. data/src/cxx_supportlib/vendor-copy/libuv/include/{tree.h → uv/tree.h} +3 -250
  368. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-unix.h → uv/unix.h} +186 -60
  369. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-version.h → uv/version.h} +3 -3
  370. data/src/cxx_supportlib/vendor-copy/libuv/include/uv/win.h +703 -0
  371. data/src/cxx_supportlib/vendor-copy/libuv/include/uv.h +528 -40
  372. data/src/cxx_supportlib/vendor-copy/libuv/install-sh +110 -70
  373. data/src/cxx_supportlib/vendor-copy/libuv/libuv-static.pc.in +12 -0
  374. data/src/cxx_supportlib/vendor-copy/libuv/libuv.pc.in +4 -2
  375. data/src/cxx_supportlib/vendor-copy/libuv/ltmain.sh +995 -619
  376. data/src/cxx_supportlib/vendor-copy/libuv/m4/ax_pthread.m4 +485 -0
  377. data/src/cxx_supportlib/vendor-copy/libuv/m4/libtool.m4 +438 -289
  378. data/src/cxx_supportlib/vendor-copy/libuv/m4/libuv-check-flags.m4 +21 -4
  379. data/src/cxx_supportlib/vendor-copy/libuv/m4/libuv-check-versions.m4 +7 -0
  380. data/src/cxx_supportlib/vendor-copy/libuv/m4/ltoptions.m4 +69 -39
  381. data/src/cxx_supportlib/vendor-copy/libuv/m4/ltsugar.m4 +1 -1
  382. data/src/cxx_supportlib/vendor-copy/libuv/m4/ltversion.m4 +7 -6
  383. data/src/cxx_supportlib/vendor-copy/libuv/m4/lt~obsolete.m4 +2 -2
  384. data/src/cxx_supportlib/vendor-copy/libuv/missing +55 -34
  385. data/src/cxx_supportlib/vendor-copy/libuv/src/fs-poll.c +52 -20
  386. data/src/cxx_supportlib/vendor-copy/libuv/src/idna.c +560 -0
  387. data/src/cxx_supportlib/vendor-copy/libuv/src/idna.h +31 -0
  388. data/src/cxx_supportlib/vendor-copy/libuv/src/inet.c +5 -16
  389. data/src/cxx_supportlib/vendor-copy/libuv/src/queue.h +68 -86
  390. data/src/cxx_supportlib/vendor-copy/libuv/src/random.c +123 -0
  391. data/src/cxx_supportlib/vendor-copy/libuv/src/strscpy.c +38 -0
  392. data/src/cxx_supportlib/vendor-copy/libuv/src/strscpy.h +39 -0
  393. data/src/cxx_supportlib/vendor-copy/libuv/src/strtok.c +52 -0
  394. data/src/cxx_supportlib/vendor-copy/libuv/src/strtok.h +27 -0
  395. data/src/cxx_supportlib/vendor-copy/libuv/src/thread-common.c +175 -0
  396. data/src/cxx_supportlib/vendor-copy/libuv/src/threadpool.c +172 -57
  397. data/src/cxx_supportlib/vendor-copy/libuv/src/{unix/timer.c → timer.c} +57 -29
  398. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/aix-common.c +89 -0
  399. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/aix.c +418 -256
  400. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/async.c +168 -129
  401. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/bsd-ifaddrs.c +163 -0
  402. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/bsd-proctitle.c +99 -0
  403. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/core.c +1312 -378
  404. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/cygwin.c +93 -0
  405. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/darwin-proctitle.c +18 -32
  406. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/darwin-stub.h +97 -0
  407. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/darwin-syscalls.h +17 -0
  408. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/darwin.c +41 -139
  409. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/dl.c +1 -1
  410. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/freebsd.c +75 -235
  411. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/fs.c +1308 -299
  412. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/fsevents.c +150 -148
  413. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/getaddrinfo.c +58 -8
  414. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/getnameinfo.c +3 -2
  415. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/haiku.c +172 -0
  416. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/hurd.c +172 -0
  417. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/ibmi.c +542 -0
  418. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/internal.h +297 -106
  419. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/kqueue.c +325 -94
  420. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux.c +2708 -0
  421. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/loop-watcher.c +11 -11
  422. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/loop.c +105 -24
  423. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/netbsd.c +51 -157
  424. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/no-fsevents.c +42 -0
  425. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/no-proctitle.c +45 -0
  426. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/openbsd.c +42 -183
  427. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/os390-proctitle.c +136 -0
  428. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/os390-syscalls.c +536 -0
  429. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/os390-syscalls.h +75 -0
  430. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/os390.c +1070 -0
  431. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/pipe.c +324 -55
  432. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/poll.c +58 -11
  433. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/posix-hrtime.c +36 -0
  434. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/posix-poll.c +385 -0
  435. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/process.c +795 -248
  436. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/procfs-exepath.c +45 -0
  437. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/proctitle.c +77 -22
  438. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/qnx.c +142 -0
  439. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/random-devurandom.c +93 -0
  440. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/random-getentropy.c +57 -0
  441. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/random-getrandom.c +86 -0
  442. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/random-sysctl-linux.c +99 -0
  443. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/signal.c +147 -39
  444. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/stream.c +426 -474
  445. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/sunos.c +240 -98
  446. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/sysinfo-loadavg.c +36 -0
  447. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/sysinfo-memory.c +42 -0
  448. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/tcp.c +402 -91
  449. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/thread.c +497 -145
  450. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/tty.c +269 -45
  451. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/udp.c +695 -165
  452. data/src/cxx_supportlib/vendor-copy/libuv/src/uv-common.c +463 -61
  453. data/src/cxx_supportlib/vendor-copy/libuv/src/uv-common.h +248 -44
  454. data/src/cxx_supportlib/vendor-copy/libuv/src/uv-data-getter-setters.c +119 -0
  455. data/src/cxx_supportlib/vendor-copy/libuv/tsansupp.txt +2 -0
  456. data/src/cxx_supportlib/vendor-modified/libev/Changes +109 -0
  457. data/src/cxx_supportlib/vendor-modified/libev/Makefile.am +2 -1
  458. data/src/cxx_supportlib/vendor-modified/libev/Makefile.in +47 -33
  459. data/src/cxx_supportlib/vendor-modified/libev/README +2 -1
  460. data/src/cxx_supportlib/vendor-modified/libev/aclocal.m4 +1653 -1224
  461. data/src/cxx_supportlib/vendor-modified/libev/config.guess +376 -316
  462. data/src/cxx_supportlib/vendor-modified/libev/config.h.in +13 -2
  463. data/src/cxx_supportlib/vendor-modified/libev/config.sub +156 -154
  464. data/src/cxx_supportlib/vendor-modified/libev/configure +1431 -940
  465. data/src/cxx_supportlib/vendor-modified/libev/configure.ac +3 -3
  466. data/src/cxx_supportlib/vendor-modified/libev/depcomp +5 -5
  467. data/src/cxx_supportlib/vendor-modified/libev/ev++.h +109 -107
  468. data/src/cxx_supportlib/vendor-modified/libev/ev.c +807 -319
  469. data/src/cxx_supportlib/vendor-modified/libev/ev.h +111 -105
  470. data/src/cxx_supportlib/vendor-modified/libev/ev_epoll.c +42 -29
  471. data/src/cxx_supportlib/vendor-modified/libev/ev_iouring.c +694 -0
  472. data/src/cxx_supportlib/vendor-modified/libev/ev_kqueue.c +15 -9
  473. data/src/cxx_supportlib/vendor-modified/libev/ev_linuxaio.c +620 -0
  474. data/src/cxx_supportlib/vendor-modified/libev/ev_poll.c +19 -14
  475. data/src/cxx_supportlib/vendor-modified/libev/ev_port.c +8 -5
  476. data/src/cxx_supportlib/vendor-modified/libev/ev_select.c +6 -6
  477. data/src/cxx_supportlib/vendor-modified/libev/ev_vars.h +48 -3
  478. data/src/cxx_supportlib/vendor-modified/libev/ev_win32.c +2 -2
  479. data/src/cxx_supportlib/vendor-modified/libev/ev_wrap.h +72 -0
  480. data/src/cxx_supportlib/vendor-modified/libev/install-sh +23 -13
  481. data/src/cxx_supportlib/vendor-modified/libev/libev.m4 +6 -1
  482. data/src/cxx_supportlib/vendor-modified/libev/ltmain.sh +3581 -1993
  483. data/src/cxx_supportlib/vendor-modified/libev/missing +8 -8
  484. data/src/cxx_supportlib/vendor-modified/libev/mkinstalldirs +3 -3
  485. data/src/cxx_supportlib/vendor-modified/modp_b64_strict_aliasing.cpp +1 -1
  486. data/src/helper-scripts/backtrace-sanitizer.rb +1 -1
  487. data/src/helper-scripts/crash-watch.rb +1 -1
  488. data/src/helper-scripts/download_binaries/extconf.rb +1 -1
  489. data/src/helper-scripts/meteor-loader.rb +1 -1
  490. data/src/helper-scripts/node-loader.js +1 -1
  491. data/src/helper-scripts/prespawn +1 -1
  492. data/src/helper-scripts/rack-loader.rb +1 -1
  493. data/src/helper-scripts/rack-preloader.rb +1 -1
  494. data/src/helper-scripts/wsgi-loader.py +1 -1
  495. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +1 -1
  496. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c.cxxcodebuilder +1 -1
  497. data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c +1 -1
  498. data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c.cxxcodebuilder +1 -1
  499. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +1 -1
  500. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c.cxxcodebuilder +1 -1
  501. data/src/nginx_module/Configuration.c +1 -1
  502. data/src/nginx_module/Configuration.h +1 -1
  503. data/src/nginx_module/ContentHandler.c +1 -1
  504. data/src/nginx_module/ContentHandler.h +1 -1
  505. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +1 -1
  506. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c.cxxcodebuilder +1 -1
  507. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +1 -1
  508. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c.cxxcodebuilder +1 -1
  509. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +1 -1
  510. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c.cxxcodebuilder +1 -1
  511. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +1 -1
  512. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c.cxxcodebuilder +1 -1
  513. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +1 -1
  514. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h.cxxcodebuilder +1 -1
  515. data/src/nginx_module/MainConfig/AutoGeneratedCreateFunction.c +1 -1
  516. data/src/nginx_module/MainConfig/AutoGeneratedCreateFunction.c.cxxcodebuilder +1 -1
  517. data/src/nginx_module/MainConfig/AutoGeneratedManifestGeneration.c +1 -1
  518. data/src/nginx_module/MainConfig/AutoGeneratedManifestGeneration.c.cxxcodebuilder +1 -1
  519. data/src/nginx_module/MainConfig/AutoGeneratedStruct.h +1 -1
  520. data/src/nginx_module/MainConfig/AutoGeneratedStruct.h.cxxcodebuilder +1 -1
  521. data/src/nginx_module/StaticContentHandler.c +1 -1
  522. data/src/nginx_module/StaticContentHandler.h +1 -1
  523. data/src/nginx_module/ngx_http_passenger_module.c +1 -1
  524. data/src/nginx_module/ngx_http_passenger_module.h +1 -1
  525. data/src/nodejs_supportlib/phusion_passenger/line_reader.js +1 -1
  526. data/src/ruby_native_extension/extconf.rb +1 -1
  527. data/src/ruby_native_extension/passenger_native_support.c +1 -1
  528. data/src/ruby_supportlib/phusion_passenger/abstract_installer.rb +1 -1
  529. data/src/ruby_supportlib/phusion_passenger/admin_tools/instance.rb +1 -1
  530. data/src/ruby_supportlib/phusion_passenger/admin_tools/instance_registry.rb +1 -1
  531. data/src/ruby_supportlib/phusion_passenger/admin_tools/memory_stats.rb +2 -12
  532. data/src/ruby_supportlib/phusion_passenger/admin_tools.rb +1 -1
  533. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +1 -1
  534. data/src/ruby_supportlib/phusion_passenger/apache2/config_utils.rb +1 -1
  535. data/src/ruby_supportlib/phusion_passenger/common_library.rb +8 -10
  536. data/src/ruby_supportlib/phusion_passenger/config/about_command.rb +1 -1
  537. data/src/ruby_supportlib/phusion_passenger/config/agent_compiler.rb +1 -1
  538. data/src/ruby_supportlib/phusion_passenger/config/api_call_command.rb +1 -1
  539. data/src/ruby_supportlib/phusion_passenger/config/build_native_support_command.rb +1 -1
  540. data/src/ruby_supportlib/phusion_passenger/config/command.rb +1 -1
  541. data/src/ruby_supportlib/phusion_passenger/config/compile_agent_command.rb +1 -1
  542. data/src/ruby_supportlib/phusion_passenger/config/compile_nginx_engine_command.rb +1 -1
  543. data/src/ruby_supportlib/phusion_passenger/config/detach_process_command.rb +1 -1
  544. data/src/ruby_supportlib/phusion_passenger/config/download_agent_command.rb +1 -1
  545. data/src/ruby_supportlib/phusion_passenger/config/download_nginx_engine_command.rb +1 -1
  546. data/src/ruby_supportlib/phusion_passenger/config/install_agent_command.rb +1 -1
  547. data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +1 -1
  548. data/src/ruby_supportlib/phusion_passenger/config/installation_utils.rb +1 -1
  549. data/src/ruby_supportlib/phusion_passenger/config/list_instances_command.rb +1 -1
  550. data/src/ruby_supportlib/phusion_passenger/config/main.rb +1 -1
  551. data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +3 -2
  552. data/src/ruby_supportlib/phusion_passenger/config/reopen_logs_command.rb +6 -1
  553. data/src/ruby_supportlib/phusion_passenger/config/restart_app_command.rb +1 -1
  554. data/src/ruby_supportlib/phusion_passenger/config/system_metrics_command.rb +1 -1
  555. data/src/ruby_supportlib/phusion_passenger/config/system_properties_command.rb +1 -1
  556. data/src/ruby_supportlib/phusion_passenger/config/utils.rb +1 -1
  557. data/src/ruby_supportlib/phusion_passenger/config/validate_install_command.rb +1 -1
  558. data/src/ruby_supportlib/phusion_passenger/console_text_template.rb +1 -1
  559. data/src/ruby_supportlib/phusion_passenger/constants.rb +1 -1
  560. data/src/ruby_supportlib/phusion_passenger/debug_logging.rb +1 -1
  561. data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +1 -1
  562. data/src/ruby_supportlib/phusion_passenger/message_channel.rb +1 -1
  563. data/src/ruby_supportlib/phusion_passenger/message_client.rb +1 -1
  564. data/src/ruby_supportlib/phusion_passenger/native_support.rb +1 -1
  565. data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +1 -1
  566. data/src/ruby_supportlib/phusion_passenger/packaging.rb +4 -3
  567. data/src/ruby_supportlib/phusion_passenger/platform_info/apache.rb +1 -1
  568. data/src/ruby_supportlib/phusion_passenger/platform_info/apache_detector.rb +1 -1
  569. data/src/ruby_supportlib/phusion_passenger/platform_info/binary_compatibility.rb +1 -1
  570. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +195 -11
  571. data/src/ruby_supportlib/phusion_passenger/platform_info/crypto.rb +1 -1
  572. data/src/ruby_supportlib/phusion_passenger/platform_info/curl.rb +1 -1
  573. data/src/ruby_supportlib/phusion_passenger/platform_info/cxx_portability.rb +1 -1
  574. data/src/ruby_supportlib/phusion_passenger/platform_info/linux.rb +1 -1
  575. data/src/ruby_supportlib/phusion_passenger/platform_info/networking.rb +1 -1
  576. data/src/ruby_supportlib/phusion_passenger/platform_info/openssl.rb +1 -1
  577. data/src/ruby_supportlib/phusion_passenger/platform_info/operating_system.rb +1 -1
  578. data/src/ruby_supportlib/phusion_passenger/platform_info/pcre.rb +1 -1
  579. data/src/ruby_supportlib/phusion_passenger/platform_info/ruby.rb +1 -1
  580. data/src/ruby_supportlib/phusion_passenger/platform_info/zlib.rb +1 -1
  581. data/src/ruby_supportlib/phusion_passenger/platform_info.rb +1 -1
  582. data/src/ruby_supportlib/phusion_passenger/plugin.rb +1 -1
  583. data/src/ruby_supportlib/phusion_passenger/preloader_shared_helpers.rb +1 -1
  584. data/src/ruby_supportlib/phusion_passenger/public_api.rb +1 -1
  585. data/src/ruby_supportlib/phusion_passenger/rack/handler.rb +1 -1
  586. data/src/ruby_supportlib/phusion_passenger/rack/out_of_band_gc.rb +1 -1
  587. data/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb +1 -1
  588. data/src/ruby_supportlib/phusion_passenger/rack_handler.rb +1 -1
  589. data/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb +2 -7
  590. data/src/ruby_supportlib/phusion_passenger/request_handler.rb +1 -1
  591. data/src/ruby_supportlib/phusion_passenger/ruby_core_enhancements.rb +1 -1
  592. data/src/ruby_supportlib/phusion_passenger/ruby_core_io_enhancements.rb +1 -1
  593. data/src/ruby_supportlib/phusion_passenger/simple_benchmarking.rb +1 -1
  594. data/src/ruby_supportlib/phusion_passenger/standalone/app_finder.rb +1 -1
  595. data/src/ruby_supportlib/phusion_passenger/standalone/command.rb +1 -1
  596. data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +1 -1
  597. data/src/ruby_supportlib/phusion_passenger/standalone/config_utils.rb +1 -1
  598. data/src/ruby_supportlib/phusion_passenger/standalone/control_utils.rb +1 -1
  599. data/src/ruby_supportlib/phusion_passenger/standalone/main.rb +1 -1
  600. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +2 -2
  601. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/nginx_engine.rb +4 -8
  602. data/src/ruby_supportlib/phusion_passenger/standalone/start_command.rb +1 -1
  603. data/src/ruby_supportlib/phusion_passenger/standalone/status_command.rb +1 -1
  604. data/src/ruby_supportlib/phusion_passenger/standalone/stop_command.rb +1 -1
  605. data/src/ruby_supportlib/phusion_passenger/standalone/version_command.rb +1 -1
  606. data/src/ruby_supportlib/phusion_passenger/utils/ansi_colors.rb +1 -1
  607. data/src/ruby_supportlib/phusion_passenger/utils/download.rb +1 -1
  608. data/src/ruby_supportlib/phusion_passenger/utils/file_system_watcher.rb +1 -1
  609. data/src/ruby_supportlib/phusion_passenger/utils/hosts_file_parser.rb +1 -1
  610. data/src/ruby_supportlib/phusion_passenger/utils/lock.rb +1 -1
  611. data/src/ruby_supportlib/phusion_passenger/utils/native_support_utils.rb +1 -1
  612. data/src/ruby_supportlib/phusion_passenger/utils/progress_bar.rb +1 -1
  613. data/src/ruby_supportlib/phusion_passenger/utils/strscan.rb +1 -1
  614. data/src/ruby_supportlib/phusion_passenger/utils/terminal_choice_menu.rb +1 -1
  615. data/src/ruby_supportlib/phusion_passenger/utils/unseekable_socket.rb +3 -13
  616. data/src/ruby_supportlib/phusion_passenger/utils.rb +1 -1
  617. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/app.rb +1 -1
  618. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/base.rb +1 -1
  619. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +1 -1
  620. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/lldb_controller.rb +1 -1
  621. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/utils.rb +1 -1
  622. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/version.rb +1 -1
  623. data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller/lock_file.rb +8 -6
  624. data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller/spawn.rb +4 -3
  625. data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller/version.rb +6 -4
  626. data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller.rb +395 -579
  627. data/src/ruby_supportlib/phusion_passenger.rb +8 -8
  628. data/src/schema_printer/SchemaPrinterMain.cpp +1 -1
  629. data/src/schema_printer/SchemaPrinterMain.cpp.cxxcodebuilder +1 -1
  630. metadata +69 -32
  631. data/doc/DeveloperQuickstart.md +0 -70
  632. data/src/README.md +0 -7
  633. data/src/cxx_supportlib/vendor-copy/libuv/README.md +0 -245
  634. data/src/cxx_supportlib/vendor-copy/libuv/checksparse.sh +0 -234
  635. data/src/cxx_supportlib/vendor-copy/libuv/common.gypi +0 -210
  636. data/src/cxx_supportlib/vendor-copy/libuv/gyp_uv.py +0 -93
  637. data/src/cxx_supportlib/vendor-copy/libuv/include/android-ifaddrs.h +0 -54
  638. data/src/cxx_supportlib/vendor-copy/libuv/include/pthread-fixes.h +0 -72
  639. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/android-ifaddrs.c +0 -703
  640. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/atomic-ops.h +0 -77
  641. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux-core.c +0 -899
  642. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux-inotify.c +0 -285
  643. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux-syscalls.c +0 -471
  644. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux-syscalls.h +0 -158
  645. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/pthread-fixes.c +0 -104
  646. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/spinlock.h +0 -53
  647. data/src/cxx_supportlib/vendor-copy/libuv/uv.gyp +0 -508
  648. /data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-aix.h → uv/aix.h} +0 -0
  649. /data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-bsd.h → uv/bsd.h} +0 -0
  650. /data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-sunos.h → uv/sunos.h} +0 -0
@@ -27,6 +27,10 @@
27
27
  #include <errno.h>
28
28
  #include <stdlib.h>
29
29
  #include <unistd.h>
30
+ #if defined(__MVS__)
31
+ #include <xti.h>
32
+ #endif
33
+ #include <sys/un.h>
30
34
 
31
35
  #if defined(IPV6_JOIN_GROUP) && !defined(IPV6_ADD_MEMBERSHIP)
32
36
  # define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
@@ -36,7 +40,6 @@
36
40
  # define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
37
41
  #endif
38
42
 
39
-
40
43
  static void uv__udp_run_completed(uv_udp_t* handle);
41
44
  static void uv__udp_io(uv_loop_t* loop, uv__io_t* w, unsigned int revents);
42
45
  static void uv__udp_recvmsg(uv_udp_t* handle);
@@ -59,18 +62,18 @@ void uv__udp_close(uv_udp_t* handle) {
59
62
 
60
63
  void uv__udp_finish_close(uv_udp_t* handle) {
61
64
  uv_udp_send_t* req;
62
- QUEUE* q;
65
+ struct uv__queue* q;
63
66
 
64
- assert(!uv__io_active(&handle->io_watcher, UV__POLLIN | UV__POLLOUT));
67
+ assert(!uv__io_active(&handle->io_watcher, POLLIN | POLLOUT));
65
68
  assert(handle->io_watcher.fd == -1);
66
69
 
67
- while (!QUEUE_EMPTY(&handle->write_queue)) {
68
- q = QUEUE_HEAD(&handle->write_queue);
69
- QUEUE_REMOVE(q);
70
+ while (!uv__queue_empty(&handle->write_queue)) {
71
+ q = uv__queue_head(&handle->write_queue);
72
+ uv__queue_remove(q);
70
73
 
71
- req = QUEUE_DATA(q, uv_udp_send_t, queue);
72
- req->status = -ECANCELED;
73
- QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue);
74
+ req = uv__queue_data(q, uv_udp_send_t, queue);
75
+ req->status = UV_ECANCELED;
76
+ uv__queue_insert_tail(&handle->write_completed_queue, &req->queue);
74
77
  }
75
78
 
76
79
  uv__udp_run_completed(handle);
@@ -87,17 +90,17 @@ void uv__udp_finish_close(uv_udp_t* handle) {
87
90
 
88
91
  static void uv__udp_run_completed(uv_udp_t* handle) {
89
92
  uv_udp_send_t* req;
90
- QUEUE* q;
93
+ struct uv__queue* q;
91
94
 
92
- assert(!(handle->flags & UV_UDP_PROCESSING));
93
- handle->flags |= UV_UDP_PROCESSING;
95
+ assert(!(handle->flags & UV_HANDLE_UDP_PROCESSING));
96
+ handle->flags |= UV_HANDLE_UDP_PROCESSING;
94
97
 
95
- while (!QUEUE_EMPTY(&handle->write_completed_queue)) {
96
- q = QUEUE_HEAD(&handle->write_completed_queue);
97
- QUEUE_REMOVE(q);
98
+ while (!uv__queue_empty(&handle->write_completed_queue)) {
99
+ q = uv__queue_head(&handle->write_completed_queue);
100
+ uv__queue_remove(q);
98
101
 
99
- req = QUEUE_DATA(q, uv_udp_send_t, queue);
100
- uv__req_unregister(handle->loop, req);
102
+ req = uv__queue_data(q, uv_udp_send_t, queue);
103
+ uv__req_unregister(handle->loop);
101
104
 
102
105
  handle->send_queue_size -= uv__count_bufs(req->bufs, req->nbufs);
103
106
  handle->send_queue_count--;
@@ -118,14 +121,14 @@ static void uv__udp_run_completed(uv_udp_t* handle) {
118
121
  req->send_cb(req, req->status);
119
122
  }
120
123
 
121
- if (QUEUE_EMPTY(&handle->write_queue)) {
124
+ if (uv__queue_empty(&handle->write_queue)) {
122
125
  /* Pending queue and completion queue empty, stop watcher. */
123
- uv__io_stop(handle->loop, &handle->io_watcher, UV__POLLOUT);
124
- if (!uv__io_active(&handle->io_watcher, UV__POLLIN))
126
+ uv__io_stop(handle->loop, &handle->io_watcher, POLLOUT);
127
+ if (!uv__io_active(&handle->io_watcher, POLLIN))
125
128
  uv__handle_stop(handle);
126
129
  }
127
130
 
128
- handle->flags &= ~UV_UDP_PROCESSING;
131
+ handle->flags &= ~UV_HANDLE_UDP_PROCESSING;
129
132
  }
130
133
 
131
134
 
@@ -135,15 +138,83 @@ static void uv__udp_io(uv_loop_t* loop, uv__io_t* w, unsigned int revents) {
135
138
  handle = container_of(w, uv_udp_t, io_watcher);
136
139
  assert(handle->type == UV_UDP);
137
140
 
138
- if (revents & UV__POLLIN)
141
+ if (revents & POLLIN)
139
142
  uv__udp_recvmsg(handle);
140
143
 
141
- if (revents & UV__POLLOUT) {
144
+ if (revents & POLLOUT && !uv__is_closing(handle)) {
142
145
  uv__udp_sendmsg(handle);
143
146
  uv__udp_run_completed(handle);
144
147
  }
145
148
  }
146
149
 
150
+ static int uv__udp_recvmmsg(uv_udp_t* handle, uv_buf_t* buf) {
151
+ #if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)
152
+ struct sockaddr_in6 peers[20];
153
+ struct iovec iov[ARRAY_SIZE(peers)];
154
+ struct mmsghdr msgs[ARRAY_SIZE(peers)];
155
+ ssize_t nread;
156
+ uv_buf_t chunk_buf;
157
+ size_t chunks;
158
+ int flags;
159
+ size_t k;
160
+
161
+ /* prepare structures for recvmmsg */
162
+ chunks = buf->len / UV__UDP_DGRAM_MAXSIZE;
163
+ if (chunks > ARRAY_SIZE(iov))
164
+ chunks = ARRAY_SIZE(iov);
165
+ for (k = 0; k < chunks; ++k) {
166
+ iov[k].iov_base = buf->base + k * UV__UDP_DGRAM_MAXSIZE;
167
+ iov[k].iov_len = UV__UDP_DGRAM_MAXSIZE;
168
+ memset(&msgs[k].msg_hdr, 0, sizeof(msgs[k].msg_hdr));
169
+ msgs[k].msg_hdr.msg_iov = iov + k;
170
+ msgs[k].msg_hdr.msg_iovlen = 1;
171
+ msgs[k].msg_hdr.msg_name = peers + k;
172
+ msgs[k].msg_hdr.msg_namelen = sizeof(peers[0]);
173
+ msgs[k].msg_hdr.msg_control = NULL;
174
+ msgs[k].msg_hdr.msg_controllen = 0;
175
+ msgs[k].msg_hdr.msg_flags = 0;
176
+ msgs[k].msg_len = 0;
177
+ }
178
+
179
+ #if defined(__APPLE__)
180
+ do
181
+ nread = recvmsg_x(handle->io_watcher.fd, msgs, chunks, MSG_DONTWAIT);
182
+ while (nread == -1 && errno == EINTR);
183
+ #else
184
+ do
185
+ nread = recvmmsg(handle->io_watcher.fd, msgs, chunks, 0, NULL);
186
+ while (nread == -1 && errno == EINTR);
187
+ #endif
188
+
189
+ if (nread < 1) {
190
+ if (nread == 0 || errno == EAGAIN || errno == EWOULDBLOCK)
191
+ handle->recv_cb(handle, 0, buf, NULL, 0);
192
+ else
193
+ handle->recv_cb(handle, UV__ERR(errno), buf, NULL, 0);
194
+ } else {
195
+ /* pass each chunk to the application */
196
+ for (k = 0; k < (size_t) nread && handle->recv_cb != NULL; k++) {
197
+ flags = UV_UDP_MMSG_CHUNK;
198
+ if (msgs[k].msg_hdr.msg_flags & MSG_TRUNC)
199
+ flags |= UV_UDP_PARTIAL;
200
+
201
+ chunk_buf = uv_buf_init(iov[k].iov_base, iov[k].iov_len);
202
+ handle->recv_cb(handle,
203
+ msgs[k].msg_len,
204
+ &chunk_buf,
205
+ msgs[k].msg_hdr.msg_name,
206
+ flags);
207
+ }
208
+
209
+ /* one last callback so the original buffer is freed */
210
+ if (handle->recv_cb != NULL)
211
+ handle->recv_cb(handle, 0, buf, NULL, UV_UDP_MMSG_FREE);
212
+ }
213
+ return nread;
214
+ #else /* __linux__ || ____FreeBSD__ || __APPLE__ */
215
+ return UV_ENOSYS;
216
+ #endif /* __linux__ || ____FreeBSD__ || __APPLE__ */
217
+ }
147
218
 
148
219
  static void uv__udp_recvmsg(uv_udp_t* handle) {
149
220
  struct sockaddr_storage peer;
@@ -161,17 +232,25 @@ static void uv__udp_recvmsg(uv_udp_t* handle) {
161
232
  */
162
233
  count = 32;
163
234
 
164
- memset(&h, 0, sizeof(h));
165
- h.msg_name = &peer;
166
-
167
235
  do {
168
- handle->alloc_cb((uv_handle_t*) handle, 64 * 1024, &buf);
169
- if (buf.len == 0) {
236
+ buf = uv_buf_init(NULL, 0);
237
+ handle->alloc_cb((uv_handle_t*) handle, UV__UDP_DGRAM_MAXSIZE, &buf);
238
+ if (buf.base == NULL || buf.len == 0) {
170
239
  handle->recv_cb(handle, UV_ENOBUFS, &buf, NULL, 0);
171
240
  return;
172
241
  }
173
242
  assert(buf.base != NULL);
174
243
 
244
+ if (uv_udp_using_recvmmsg(handle)) {
245
+ nread = uv__udp_recvmmsg(handle, &buf);
246
+ if (nread > 0)
247
+ count -= nread;
248
+ continue;
249
+ }
250
+
251
+ memset(&h, 0, sizeof(h));
252
+ memset(&peer, 0, sizeof(peer));
253
+ h.msg_name = &peer;
175
254
  h.msg_namelen = sizeof(peer);
176
255
  h.msg_iov = (void*) &buf;
177
256
  h.msg_iovlen = 1;
@@ -185,95 +264,252 @@ static void uv__udp_recvmsg(uv_udp_t* handle) {
185
264
  if (errno == EAGAIN || errno == EWOULDBLOCK)
186
265
  handle->recv_cb(handle, 0, &buf, NULL, 0);
187
266
  else
188
- handle->recv_cb(handle, -errno, &buf, NULL, 0);
267
+ handle->recv_cb(handle, UV__ERR(errno), &buf, NULL, 0);
189
268
  }
190
269
  else {
191
- const struct sockaddr *addr;
192
- if (h.msg_namelen == 0)
193
- addr = NULL;
194
- else
195
- addr = (const struct sockaddr*) &peer;
196
-
197
270
  flags = 0;
198
271
  if (h.msg_flags & MSG_TRUNC)
199
272
  flags |= UV_UDP_PARTIAL;
200
273
 
201
- handle->recv_cb(handle, nread, &buf, addr, flags);
274
+ handle->recv_cb(handle, nread, &buf, (const struct sockaddr*) &peer, flags);
202
275
  }
276
+ count--;
203
277
  }
204
278
  /* recv_cb callback may decide to pause or close the handle */
205
279
  while (nread != -1
206
- && count-- > 0
280
+ && count > 0
207
281
  && handle->io_watcher.fd != -1
208
282
  && handle->recv_cb != NULL);
209
283
  }
210
284
 
211
-
212
- static void uv__udp_sendmsg(uv_udp_t* handle) {
213
- uv_udp_send_t* req;
214
- QUEUE* q;
285
+ static void uv__udp_sendmsg_one(uv_udp_t* handle, uv_udp_send_t* req) {
286
+ struct uv__queue* q;
215
287
  struct msghdr h;
216
288
  ssize_t size;
217
289
 
218
- while (!QUEUE_EMPTY(&handle->write_queue)) {
219
- q = QUEUE_HEAD(&handle->write_queue);
220
- assert(q != NULL);
221
-
222
- req = QUEUE_DATA(q, uv_udp_send_t, queue);
223
- assert(req != NULL);
224
-
290
+ for (;;) {
225
291
  memset(&h, 0, sizeof h);
226
- h.msg_name = &req->addr;
227
- h.msg_namelen = (req->addr.ss_family == AF_INET6 ?
228
- sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in));
292
+ if (req->addr.ss_family == AF_UNSPEC) {
293
+ h.msg_name = NULL;
294
+ h.msg_namelen = 0;
295
+ } else {
296
+ h.msg_name = &req->addr;
297
+ if (req->addr.ss_family == AF_INET6)
298
+ h.msg_namelen = sizeof(struct sockaddr_in6);
299
+ else if (req->addr.ss_family == AF_INET)
300
+ h.msg_namelen = sizeof(struct sockaddr_in);
301
+ else if (req->addr.ss_family == AF_UNIX)
302
+ h.msg_namelen = sizeof(struct sockaddr_un);
303
+ else {
304
+ assert(0 && "unsupported address family");
305
+ abort();
306
+ }
307
+ }
229
308
  h.msg_iov = (struct iovec*) req->bufs;
230
309
  h.msg_iovlen = req->nbufs;
231
310
 
232
- do {
311
+ do
233
312
  size = sendmsg(handle->io_watcher.fd, &h, 0);
234
- } while (size == -1 && errno == EINTR);
313
+ while (size == -1 && errno == EINTR);
235
314
 
236
- if (size == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
237
- break;
315
+ if (size == -1)
316
+ if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS)
317
+ return;
238
318
 
239
- req->status = (size == -1 ? -errno : size);
319
+ req->status = (size == -1 ? UV__ERR(errno) : size);
240
320
 
241
321
  /* Sending a datagram is an atomic operation: either all data
242
322
  * is written or nothing is (and EMSGSIZE is raised). That is
243
323
  * why we don't handle partial writes. Just pop the request
244
324
  * off the write queue and onto the completed queue, done.
245
325
  */
246
- QUEUE_REMOVE(&req->queue);
247
- QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue);
326
+ uv__queue_remove(&req->queue);
327
+ uv__queue_insert_tail(&handle->write_completed_queue, &req->queue);
248
328
  uv__io_feed(handle->loop, &handle->io_watcher);
329
+
330
+ if (uv__queue_empty(&handle->write_queue))
331
+ return;
332
+
333
+ q = uv__queue_head(&handle->write_queue);
334
+ req = uv__queue_data(q, uv_udp_send_t, queue);
249
335
  }
250
336
  }
251
337
 
338
+ #if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)
339
+ static void uv__udp_sendmsg_many(uv_udp_t* handle) {
340
+ uv_udp_send_t* req;
341
+ struct mmsghdr h[20];
342
+ struct mmsghdr* p;
343
+ struct uv__queue* q;
344
+ ssize_t npkts;
345
+ size_t pkts;
346
+ size_t i;
347
+
348
+ write_queue_drain:
349
+ for (pkts = 0, q = uv__queue_head(&handle->write_queue);
350
+ pkts < ARRAY_SIZE(h) && q != &handle->write_queue;
351
+ ++pkts, q = uv__queue_head(q)) {
352
+ req = uv__queue_data(q, uv_udp_send_t, queue);
353
+
354
+ p = &h[pkts];
355
+ memset(p, 0, sizeof(*p));
356
+ if (req->addr.ss_family == AF_UNSPEC) {
357
+ p->msg_hdr.msg_name = NULL;
358
+ p->msg_hdr.msg_namelen = 0;
359
+ } else {
360
+ p->msg_hdr.msg_name = &req->addr;
361
+ if (req->addr.ss_family == AF_INET6)
362
+ p->msg_hdr.msg_namelen = sizeof(struct sockaddr_in6);
363
+ else if (req->addr.ss_family == AF_INET)
364
+ p->msg_hdr.msg_namelen = sizeof(struct sockaddr_in);
365
+ else if (req->addr.ss_family == AF_UNIX)
366
+ p->msg_hdr.msg_namelen = sizeof(struct sockaddr_un);
367
+ else {
368
+ assert(0 && "unsupported address family");
369
+ abort();
370
+ }
371
+ }
372
+ h[pkts].msg_hdr.msg_iov = (struct iovec*) req->bufs;
373
+ h[pkts].msg_hdr.msg_iovlen = req->nbufs;
374
+ }
375
+
376
+ #if defined(__APPLE__)
377
+ do
378
+ npkts = sendmsg_x(handle->io_watcher.fd, h, pkts, MSG_DONTWAIT);
379
+ while (npkts == -1 && errno == EINTR);
380
+ #else
381
+ do
382
+ npkts = sendmmsg(handle->io_watcher.fd, h, pkts, 0);
383
+ while (npkts == -1 && errno == EINTR);
384
+ #endif
385
+
386
+ if (npkts < 1) {
387
+ if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS)
388
+ return;
389
+ for (i = 0, q = uv__queue_head(&handle->write_queue);
390
+ i < pkts && q != &handle->write_queue;
391
+ ++i, q = uv__queue_head(&handle->write_queue)) {
392
+ req = uv__queue_data(q, uv_udp_send_t, queue);
393
+ req->status = UV__ERR(errno);
394
+ uv__queue_remove(&req->queue);
395
+ uv__queue_insert_tail(&handle->write_completed_queue, &req->queue);
396
+ }
397
+ uv__io_feed(handle->loop, &handle->io_watcher);
398
+ return;
399
+ }
400
+
401
+ /* Safety: npkts known to be >0 below. Hence cast from ssize_t
402
+ * to size_t safe.
403
+ */
404
+ for (i = 0, q = uv__queue_head(&handle->write_queue);
405
+ i < (size_t)npkts && q != &handle->write_queue;
406
+ ++i, q = uv__queue_head(&handle->write_queue)) {
407
+ req = uv__queue_data(q, uv_udp_send_t, queue);
408
+ req->status = req->bufs[0].len;
409
+
410
+ /* Sending a datagram is an atomic operation: either all data
411
+ * is written or nothing is (and EMSGSIZE is raised). That is
412
+ * why we don't handle partial writes. Just pop the request
413
+ * off the write queue and onto the completed queue, done.
414
+ */
415
+ uv__queue_remove(&req->queue);
416
+ uv__queue_insert_tail(&handle->write_completed_queue, &req->queue);
417
+ }
418
+
419
+ /* couldn't batch everything, continue sending (jump to avoid stack growth) */
420
+ if (!uv__queue_empty(&handle->write_queue))
421
+ goto write_queue_drain;
422
+
423
+ uv__io_feed(handle->loop, &handle->io_watcher);
424
+ }
425
+ #endif /* __linux__ || ____FreeBSD__ || __APPLE__ */
426
+
427
+ static void uv__udp_sendmsg(uv_udp_t* handle) {
428
+ struct uv__queue* q;
429
+ uv_udp_send_t* req;
430
+
431
+ if (uv__queue_empty(&handle->write_queue))
432
+ return;
433
+
434
+ q = uv__queue_head(&handle->write_queue);
435
+ req = uv__queue_data(q, uv_udp_send_t, queue);
436
+
437
+ #if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)
438
+ /* Use sendmmsg() if this send request contains more than one datagram OR
439
+ * there is more than one send request (because that automatically implies
440
+ * there is more than one datagram.)
441
+ */
442
+ if (req->nbufs != 1 || &handle->write_queue != uv__queue_next(&req->queue))
443
+ return uv__udp_sendmsg_many(handle);
444
+ #endif
445
+
446
+ return uv__udp_sendmsg_one(handle, req);
447
+ }
252
448
 
253
449
  /* On the BSDs, SO_REUSEPORT implies SO_REUSEADDR but with some additional
254
- * refinements for programs that use multicast.
450
+ * refinements for programs that use multicast. Therefore we preferentially
451
+ * set SO_REUSEPORT over SO_REUSEADDR here, but we set SO_REUSEPORT only
452
+ * when that socket option doesn't have the capability of load balancing.
453
+ * Otherwise, we fall back to SO_REUSEADDR.
255
454
  *
256
- * Linux as of 3.9 has a SO_REUSEPORT socket option but with semantics that
257
- * are different from the BSDs: it _shares_ the port rather than steal it
258
- * from the current listener. While useful, it's not something we can emulate
259
- * on other platforms so we don't enable it.
455
+ * Linux as of 3.9, DragonflyBSD 3.6, AIX 7.2.5 have the SO_REUSEPORT socket
456
+ * option but with semantics that are different from the BSDs: it _shares_
457
+ * the port rather than steals it from the current listener. While useful,
458
+ * it's not something we can emulate on other platforms so we don't enable it.
459
+ *
460
+ * zOS does not support getsockname with SO_REUSEPORT option when using
461
+ * AF_UNIX.
260
462
  */
261
- static int uv__set_reuse(int fd) {
463
+ static int uv__sock_reuseaddr(int fd) {
262
464
  int yes;
263
-
264
- #if defined(SO_REUSEPORT) && !defined(__linux__)
265
465
  yes = 1;
466
+
467
+ #if defined(SO_REUSEPORT) && defined(__MVS__)
468
+ struct sockaddr_in sockfd;
469
+ unsigned int sockfd_len = sizeof(sockfd);
470
+ if (getsockname(fd, (struct sockaddr*) &sockfd, &sockfd_len) == -1)
471
+ return UV__ERR(errno);
472
+ if (sockfd.sin_family == AF_UNIX) {
473
+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)))
474
+ return UV__ERR(errno);
475
+ } else {
476
+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes)))
477
+ return UV__ERR(errno);
478
+ }
479
+ #elif defined(SO_REUSEPORT) && !defined(__linux__) && !defined(__GNU__) && \
480
+ !defined(__sun__) && !defined(__DragonFly__) && !defined(_AIX73)
266
481
  if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes)))
267
- return -errno;
482
+ return UV__ERR(errno);
268
483
  #else
269
- yes = 1;
270
484
  if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)))
271
- return -errno;
485
+ return UV__ERR(errno);
272
486
  #endif
273
487
 
274
488
  return 0;
275
489
  }
276
490
 
491
+ /*
492
+ * The Linux kernel suppresses some ICMP error messages by default for UDP
493
+ * sockets. Setting IP_RECVERR/IPV6_RECVERR on the socket enables full ICMP
494
+ * error reporting, hopefully resulting in faster failover to working name
495
+ * servers.
496
+ */
497
+ static int uv__set_recverr(int fd, sa_family_t ss_family) {
498
+ #if defined(__linux__)
499
+ int yes;
500
+
501
+ yes = 1;
502
+ if (ss_family == AF_INET) {
503
+ if (setsockopt(fd, IPPROTO_IP, IP_RECVERR, &yes, sizeof(yes)))
504
+ return UV__ERR(errno);
505
+ } else if (ss_family == AF_INET6) {
506
+ if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVERR, &yes, sizeof(yes)))
507
+ return UV__ERR(errno);
508
+ }
509
+ #endif
510
+ return 0;
511
+ }
512
+
277
513
 
278
514
  int uv__udp_bind(uv_udp_t* handle,
279
515
  const struct sockaddr* addr,
@@ -284,12 +520,13 @@ int uv__udp_bind(uv_udp_t* handle,
284
520
  int fd;
285
521
 
286
522
  /* Check for bad flags. */
287
- if (flags & ~(UV_UDP_IPV6ONLY | UV_UDP_REUSEADDR))
288
- return -EINVAL;
523
+ if (flags & ~(UV_UDP_IPV6ONLY | UV_UDP_REUSEADDR |
524
+ UV_UDP_REUSEPORT | UV_UDP_LINUX_RECVERR))
525
+ return UV_EINVAL;
289
526
 
290
527
  /* Cannot set IPv6-only mode on non-IPv6 socket. */
291
528
  if ((flags & UV_UDP_IPV6ONLY) && addr->sa_family != AF_INET6)
292
- return -EINVAL;
529
+ return UV_EINVAL;
293
530
 
294
531
  fd = handle->io_watcher.fd;
295
532
  if (fd == -1) {
@@ -300,50 +537,58 @@ int uv__udp_bind(uv_udp_t* handle,
300
537
  handle->io_watcher.fd = fd;
301
538
  }
302
539
 
540
+ if (flags & UV_UDP_LINUX_RECVERR) {
541
+ err = uv__set_recverr(fd, addr->sa_family);
542
+ if (err)
543
+ return err;
544
+ }
545
+
303
546
  if (flags & UV_UDP_REUSEADDR) {
304
- err = uv__set_reuse(fd);
547
+ err = uv__sock_reuseaddr(fd);
305
548
  if (err)
306
- goto out;
549
+ return err;
550
+ }
551
+
552
+ if (flags & UV_UDP_REUSEPORT) {
553
+ err = uv__sock_reuseport(fd);
554
+ if (err)
555
+ return err;
307
556
  }
308
557
 
309
558
  if (flags & UV_UDP_IPV6ONLY) {
310
559
  #ifdef IPV6_V6ONLY
311
560
  yes = 1;
312
561
  if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof yes) == -1) {
313
- err = -errno;
314
- goto out;
562
+ err = UV__ERR(errno);
563
+ return err;
315
564
  }
316
565
  #else
317
- err = -ENOTSUP;
318
- goto out;
566
+ err = UV_ENOTSUP;
567
+ return err;
319
568
  #endif
320
569
  }
321
570
 
322
571
  if (bind(fd, addr, addrlen)) {
323
- err = -errno;
572
+ err = UV__ERR(errno);
324
573
  if (errno == EAFNOSUPPORT)
325
574
  /* OSX, other BSDs and SunoS fail with EAFNOSUPPORT when binding a
326
575
  * socket created with AF_INET to an AF_INET6 address or vice versa. */
327
- err = -EINVAL;
328
- goto out;
576
+ err = UV_EINVAL;
577
+ return err;
329
578
  }
330
579
 
331
580
  if (addr->sa_family == AF_INET6)
332
581
  handle->flags |= UV_HANDLE_IPV6;
333
582
 
583
+ handle->flags |= UV_HANDLE_BOUND;
334
584
  return 0;
335
-
336
- out:
337
- uv__close(handle->io_watcher.fd);
338
- handle->io_watcher.fd = -1;
339
- return err;
340
585
  }
341
586
 
342
587
 
343
588
  static int uv__udp_maybe_deferred_bind(uv_udp_t* handle,
344
589
  int domain,
345
590
  unsigned int flags) {
346
- unsigned char taddr[sizeof(struct sockaddr_in6)];
591
+ union uv__sockaddr taddr;
347
592
  socklen_t addrlen;
348
593
 
349
594
  if (handle->io_watcher.fd != -1)
@@ -352,7 +597,7 @@ static int uv__udp_maybe_deferred_bind(uv_udp_t* handle,
352
597
  switch (domain) {
353
598
  case AF_INET:
354
599
  {
355
- struct sockaddr_in* addr = (void*)&taddr;
600
+ struct sockaddr_in* addr = &taddr.in;
356
601
  memset(addr, 0, sizeof *addr);
357
602
  addr->sin_family = AF_INET;
358
603
  addr->sin_addr.s_addr = INADDR_ANY;
@@ -361,7 +606,7 @@ static int uv__udp_maybe_deferred_bind(uv_udp_t* handle,
361
606
  }
362
607
  case AF_INET6:
363
608
  {
364
- struct sockaddr_in6* addr = (void*)&taddr;
609
+ struct sockaddr_in6* addr = &taddr.in6;
365
610
  memset(addr, 0, sizeof *addr);
366
611
  addr->sin6_family = AF_INET6;
367
612
  addr->sin6_addr = in6addr_any;
@@ -373,9 +618,105 @@ static int uv__udp_maybe_deferred_bind(uv_udp_t* handle,
373
618
  abort();
374
619
  }
375
620
 
376
- return uv__udp_bind(handle, (const struct sockaddr*) &taddr, addrlen, flags);
621
+ return uv__udp_bind(handle, &taddr.addr, addrlen, flags);
622
+ }
623
+
624
+
625
+ int uv__udp_connect(uv_udp_t* handle,
626
+ const struct sockaddr* addr,
627
+ unsigned int addrlen) {
628
+ int err;
629
+
630
+ err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0);
631
+ if (err)
632
+ return err;
633
+
634
+ do {
635
+ errno = 0;
636
+ err = connect(handle->io_watcher.fd, addr, addrlen);
637
+ } while (err == -1 && errno == EINTR);
638
+
639
+ if (err)
640
+ return UV__ERR(errno);
641
+
642
+ handle->flags |= UV_HANDLE_UDP_CONNECTED;
643
+
644
+ return 0;
377
645
  }
378
646
 
647
+ /* From https://pubs.opengroup.org/onlinepubs/9699919799/functions/connect.html
648
+ * Any of uv supported UNIXs kernel should be standardized, but the kernel
649
+ * implementation logic not same, let's use pseudocode to explain the udp
650
+ * disconnect behaviors:
651
+ *
652
+ * Predefined stubs for pseudocode:
653
+ * 1. sodisconnect: The function to perform the real udp disconnect
654
+ * 2. pru_connect: The function to perform the real udp connect
655
+ * 3. so: The kernel object match with socket fd
656
+ * 4. addr: The sockaddr parameter from user space
657
+ *
658
+ * BSDs:
659
+ * if(sodisconnect(so) == 0) { // udp disconnect succeed
660
+ * if (addr->sa_len != so->addr->sa_len) return EINVAL;
661
+ * if (addr->sa_family != so->addr->sa_family) return EAFNOSUPPORT;
662
+ * pru_connect(so);
663
+ * }
664
+ * else return EISCONN;
665
+ *
666
+ * z/OS (same with Windows):
667
+ * if(addr->sa_len < so->addr->sa_len) return EINVAL;
668
+ * if (addr->sa_family == AF_UNSPEC) sodisconnect(so);
669
+ *
670
+ * AIX:
671
+ * if(addr->sa_len != sizeof(struct sockaddr)) return EINVAL; // ignore ip proto version
672
+ * if (addr->sa_family == AF_UNSPEC) sodisconnect(so);
673
+ *
674
+ * Linux,Others:
675
+ * if(addr->sa_len < sizeof(struct sockaddr)) return EINVAL;
676
+ * if (addr->sa_family == AF_UNSPEC) sodisconnect(so);
677
+ */
678
+ int uv__udp_disconnect(uv_udp_t* handle) {
679
+ int r;
680
+ #if defined(__MVS__)
681
+ struct sockaddr_storage addr;
682
+ #else
683
+ struct sockaddr addr;
684
+ #endif
685
+
686
+ memset(&addr, 0, sizeof(addr));
687
+
688
+ #if defined(__MVS__)
689
+ addr.ss_family = AF_UNSPEC;
690
+ #else
691
+ addr.sa_family = AF_UNSPEC;
692
+ #endif
693
+
694
+ do {
695
+ errno = 0;
696
+ #ifdef __PASE__
697
+ /* On IBMi a connectionless transport socket can be disconnected by
698
+ * either setting the addr parameter to NULL or setting the
699
+ * addr_length parameter to zero, and issuing another connect().
700
+ * https://www.ibm.com/docs/en/i/7.4?topic=ssw_ibm_i_74/apis/connec.htm
701
+ */
702
+ r = connect(handle->io_watcher.fd, (struct sockaddr*) NULL, 0);
703
+ #else
704
+ r = connect(handle->io_watcher.fd, (struct sockaddr*) &addr, sizeof(addr));
705
+ #endif
706
+ } while (r == -1 && errno == EINTR);
707
+
708
+ if (r == -1) {
709
+ #if defined(BSD) /* The macro BSD is from sys/param.h */
710
+ if (errno != EAFNOSUPPORT && errno != EINVAL)
711
+ return UV__ERR(errno);
712
+ #else
713
+ return UV__ERR(errno);
714
+ #endif
715
+ }
716
+
717
+ handle->flags &= ~UV_HANDLE_UDP_CONNECTED;
718
+ return 0;
719
+ }
379
720
 
380
721
  int uv__udp_send(uv_udp_send_t* req,
381
722
  uv_udp_t* handle,
@@ -389,9 +730,11 @@ int uv__udp_send(uv_udp_send_t* req,
389
730
 
390
731
  assert(nbufs > 0);
391
732
 
392
- err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0);
393
- if (err)
394
- return err;
733
+ if (addr) {
734
+ err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0);
735
+ if (err)
736
+ return err;
737
+ }
395
738
 
396
739
  /* It's legal for send_queue_count > 0 even when the write_queue is empty;
397
740
  * it means there are error-state requests in the write_completed_queue that
@@ -401,7 +744,10 @@ int uv__udp_send(uv_udp_send_t* req,
401
744
 
402
745
  uv__req_init(handle->loop, req, UV_UDP_SEND);
403
746
  assert(addrlen <= sizeof(req->addr));
404
- memcpy(&req->addr, addr, addrlen);
747
+ if (addr == NULL)
748
+ req->addr.ss_family = AF_UNSPEC;
749
+ else
750
+ memcpy(&req->addr, addr, addrlen);
405
751
  req->send_cb = send_cb;
406
752
  req->handle = handle;
407
753
  req->nbufs = nbufs;
@@ -411,20 +757,27 @@ int uv__udp_send(uv_udp_send_t* req,
411
757
  req->bufs = uv__malloc(nbufs * sizeof(bufs[0]));
412
758
 
413
759
  if (req->bufs == NULL) {
414
- uv__req_unregister(handle->loop, req);
415
- return -ENOMEM;
760
+ uv__req_unregister(handle->loop);
761
+ return UV_ENOMEM;
416
762
  }
417
763
 
418
764
  memcpy(req->bufs, bufs, nbufs * sizeof(bufs[0]));
419
765
  handle->send_queue_size += uv__count_bufs(req->bufs, req->nbufs);
420
766
  handle->send_queue_count++;
421
- QUEUE_INSERT_TAIL(&handle->write_queue, &req->queue);
767
+ uv__queue_insert_tail(&handle->write_queue, &req->queue);
422
768
  uv__handle_start(handle);
423
769
 
424
- if (empty_queue && !(handle->flags & UV_UDP_PROCESSING)) {
770
+ if (empty_queue && !(handle->flags & UV_HANDLE_UDP_PROCESSING)) {
425
771
  uv__udp_sendmsg(handle);
772
+
773
+ /* `uv__udp_sendmsg` may not be able to do non-blocking write straight
774
+ * away. In such cases the `io_watcher` has to be queued for asynchronous
775
+ * write.
776
+ */
777
+ if (!uv__queue_empty(&handle->write_queue))
778
+ uv__io_start(handle->loop, &handle->io_watcher, POLLOUT);
426
779
  } else {
427
- uv__io_start(handle->loop, &handle->io_watcher, UV__POLLOUT);
780
+ uv__io_start(handle->loop, &handle->io_watcher, POLLOUT);
428
781
  }
429
782
 
430
783
  return 0;
@@ -444,11 +797,15 @@ int uv__udp_try_send(uv_udp_t* handle,
444
797
 
445
798
  /* already sending a message */
446
799
  if (handle->send_queue_count != 0)
447
- return -EAGAIN;
800
+ return UV_EAGAIN;
448
801
 
449
- err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0);
450
- if (err)
451
- return err;
802
+ if (addr) {
803
+ err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0);
804
+ if (err)
805
+ return err;
806
+ } else {
807
+ assert(handle->flags & UV_HANDLE_UDP_CONNECTED);
808
+ }
452
809
 
453
810
  memset(&h, 0, sizeof h);
454
811
  h.msg_name = (struct sockaddr*) addr;
@@ -461,10 +818,10 @@ int uv__udp_try_send(uv_udp_t* handle,
461
818
  } while (size == -1 && errno == EINTR);
462
819
 
463
820
  if (size == -1) {
464
- if (errno == EAGAIN || errno == EWOULDBLOCK)
465
- return -EAGAIN;
821
+ if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS)
822
+ return UV_EAGAIN;
466
823
  else
467
- return -errno;
824
+ return UV__ERR(errno);
468
825
  }
469
826
 
470
827
  return size;
@@ -499,7 +856,7 @@ static int uv__udp_set_membership4(uv_udp_t* handle,
499
856
  optname = IP_DROP_MEMBERSHIP;
500
857
  break;
501
858
  default:
502
- return -EINVAL;
859
+ return UV_EINVAL;
503
860
  }
504
861
 
505
862
  if (setsockopt(handle->io_watcher.fd,
@@ -507,7 +864,11 @@ static int uv__udp_set_membership4(uv_udp_t* handle,
507
864
  optname,
508
865
  &mreq,
509
866
  sizeof(mreq))) {
510
- return -errno;
867
+ #if defined(__MVS__)
868
+ if (errno == ENXIO)
869
+ return UV_ENODEV;
870
+ #endif
871
+ return UV__ERR(errno);
511
872
  }
512
873
 
513
874
  return 0;
@@ -526,7 +887,7 @@ static int uv__udp_set_membership6(uv_udp_t* handle,
526
887
 
527
888
  if (interface_addr) {
528
889
  if (uv_ip6_addr(interface_addr, 0, &addr6))
529
- return -EINVAL;
890
+ return UV_EINVAL;
530
891
  mreq.ipv6mr_interface = addr6.sin6_scope_id;
531
892
  } else {
532
893
  mreq.ipv6mr_interface = 0;
@@ -542,7 +903,7 @@ static int uv__udp_set_membership6(uv_udp_t* handle,
542
903
  optname = IPV6_DROP_MEMBERSHIP;
543
904
  break;
544
905
  default:
545
- return -EINVAL;
906
+ return UV_EINVAL;
546
907
  }
547
908
 
548
909
  if (setsockopt(handle->io_watcher.fd,
@@ -550,33 +911,129 @@ static int uv__udp_set_membership6(uv_udp_t* handle,
550
911
  optname,
551
912
  &mreq,
552
913
  sizeof(mreq))) {
553
- return -errno;
914
+ #if defined(__MVS__)
915
+ if (errno == ENXIO)
916
+ return UV_ENODEV;
917
+ #endif
918
+ return UV__ERR(errno);
554
919
  }
555
920
 
556
921
  return 0;
557
922
  }
558
923
 
559
924
 
560
- int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned int flags) {
561
- int domain;
925
+ #if !defined(__OpenBSD__) && \
926
+ !defined(__NetBSD__) && \
927
+ !defined(__ANDROID__) && \
928
+ !defined(__DragonFly__) && \
929
+ !defined(__QNX__) && \
930
+ !defined(__GNU__)
931
+ static int uv__udp_set_source_membership4(uv_udp_t* handle,
932
+ const struct sockaddr_in* multicast_addr,
933
+ const char* interface_addr,
934
+ const struct sockaddr_in* source_addr,
935
+ uv_membership membership) {
936
+ struct ip_mreq_source mreq;
937
+ int optname;
562
938
  int err;
563
- int fd;
564
939
 
565
- /* Use the lower 8 bits for the domain */
566
- domain = flags & 0xFF;
567
- if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC)
568
- return -EINVAL;
940
+ err = uv__udp_maybe_deferred_bind(handle, AF_INET, UV_UDP_REUSEADDR);
941
+ if (err)
942
+ return err;
569
943
 
570
- if (flags & ~0xFF)
571
- return -EINVAL;
944
+ memset(&mreq, 0, sizeof(mreq));
572
945
 
573
- if (domain != AF_UNSPEC) {
574
- err = uv__socket(domain, SOCK_DGRAM, 0);
575
- if (err < 0)
946
+ if (interface_addr != NULL) {
947
+ err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr);
948
+ if (err)
576
949
  return err;
577
- fd = err;
578
950
  } else {
579
- fd = -1;
951
+ mreq.imr_interface.s_addr = htonl(INADDR_ANY);
952
+ }
953
+
954
+ mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;
955
+ mreq.imr_sourceaddr.s_addr = source_addr->sin_addr.s_addr;
956
+
957
+ if (membership == UV_JOIN_GROUP)
958
+ optname = IP_ADD_SOURCE_MEMBERSHIP;
959
+ else if (membership == UV_LEAVE_GROUP)
960
+ optname = IP_DROP_SOURCE_MEMBERSHIP;
961
+ else
962
+ return UV_EINVAL;
963
+
964
+ if (setsockopt(handle->io_watcher.fd,
965
+ IPPROTO_IP,
966
+ optname,
967
+ &mreq,
968
+ sizeof(mreq))) {
969
+ return UV__ERR(errno);
970
+ }
971
+
972
+ return 0;
973
+ }
974
+
975
+
976
+ static int uv__udp_set_source_membership6(uv_udp_t* handle,
977
+ const struct sockaddr_in6* multicast_addr,
978
+ const char* interface_addr,
979
+ const struct sockaddr_in6* source_addr,
980
+ uv_membership membership) {
981
+ struct group_source_req mreq;
982
+ struct sockaddr_in6 addr6;
983
+ int optname;
984
+ int err;
985
+
986
+ err = uv__udp_maybe_deferred_bind(handle, AF_INET6, UV_UDP_REUSEADDR);
987
+ if (err)
988
+ return err;
989
+
990
+ memset(&mreq, 0, sizeof(mreq));
991
+
992
+ if (interface_addr != NULL) {
993
+ err = uv_ip6_addr(interface_addr, 0, &addr6);
994
+ if (err)
995
+ return err;
996
+ mreq.gsr_interface = addr6.sin6_scope_id;
997
+ } else {
998
+ mreq.gsr_interface = 0;
999
+ }
1000
+
1001
+ STATIC_ASSERT(sizeof(mreq.gsr_group) >= sizeof(*multicast_addr));
1002
+ STATIC_ASSERT(sizeof(mreq.gsr_source) >= sizeof(*source_addr));
1003
+ memcpy(&mreq.gsr_group, multicast_addr, sizeof(*multicast_addr));
1004
+ memcpy(&mreq.gsr_source, source_addr, sizeof(*source_addr));
1005
+
1006
+ if (membership == UV_JOIN_GROUP)
1007
+ optname = MCAST_JOIN_SOURCE_GROUP;
1008
+ else if (membership == UV_LEAVE_GROUP)
1009
+ optname = MCAST_LEAVE_SOURCE_GROUP;
1010
+ else
1011
+ return UV_EINVAL;
1012
+
1013
+ if (setsockopt(handle->io_watcher.fd,
1014
+ IPPROTO_IPV6,
1015
+ optname,
1016
+ &mreq,
1017
+ sizeof(mreq))) {
1018
+ return UV__ERR(errno);
1019
+ }
1020
+
1021
+ return 0;
1022
+ }
1023
+ #endif
1024
+
1025
+
1026
+ int uv__udp_init_ex(uv_loop_t* loop,
1027
+ uv_udp_t* handle,
1028
+ unsigned flags,
1029
+ int domain) {
1030
+ int fd;
1031
+
1032
+ fd = -1;
1033
+ if (domain != AF_UNSPEC) {
1034
+ fd = uv__socket(domain, SOCK_DGRAM, 0);
1035
+ if (fd < 0)
1036
+ return fd;
580
1037
  }
581
1038
 
582
1039
  uv__handle_init(loop, (uv_handle_t*)handle, UV_UDP);
@@ -585,14 +1042,19 @@ int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned int flags) {
585
1042
  handle->send_queue_size = 0;
586
1043
  handle->send_queue_count = 0;
587
1044
  uv__io_init(&handle->io_watcher, uv__udp_io, fd);
588
- QUEUE_INIT(&handle->write_queue);
589
- QUEUE_INIT(&handle->write_completed_queue);
1045
+ uv__queue_init(&handle->write_queue);
1046
+ uv__queue_init(&handle->write_completed_queue);
1047
+
590
1048
  return 0;
591
1049
  }
592
1050
 
593
1051
 
594
- int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) {
595
- return uv_udp_init_ex(loop, handle, AF_UNSPEC);
1052
+ int uv_udp_using_recvmmsg(const uv_udp_t* handle) {
1053
+ #if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)
1054
+ if (handle->flags & UV_HANDLE_UDP_RECVMMSG)
1055
+ return 1;
1056
+ #endif
1057
+ return 0;
596
1058
  }
597
1059
 
598
1060
 
@@ -601,17 +1063,23 @@ int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) {
601
1063
 
602
1064
  /* Check for already active socket. */
603
1065
  if (handle->io_watcher.fd != -1)
604
- return -EBUSY;
1066
+ return UV_EBUSY;
1067
+
1068
+ if (uv__fd_exists(handle->loop, sock))
1069
+ return UV_EEXIST;
605
1070
 
606
1071
  err = uv__nonblock(sock, 1);
607
1072
  if (err)
608
1073
  return err;
609
1074
 
610
- err = uv__set_reuse(sock);
1075
+ err = uv__sock_reuseaddr(sock);
611
1076
  if (err)
612
1077
  return err;
613
1078
 
614
1079
  handle->io_watcher.fd = sock;
1080
+ if (uv__udp_is_connected(handle))
1081
+ handle->flags |= UV_HANDLE_UDP_CONNECTED;
1082
+
615
1083
  return 0;
616
1084
  }
617
1085
 
@@ -635,15 +1103,60 @@ int uv_udp_set_membership(uv_udp_t* handle,
635
1103
  return err;
636
1104
  return uv__udp_set_membership6(handle, &addr6, interface_addr, membership);
637
1105
  } else {
638
- return -EINVAL;
1106
+ return UV_EINVAL;
639
1107
  }
640
1108
  }
641
1109
 
1110
+
1111
+ int uv_udp_set_source_membership(uv_udp_t* handle,
1112
+ const char* multicast_addr,
1113
+ const char* interface_addr,
1114
+ const char* source_addr,
1115
+ uv_membership membership) {
1116
+ #if !defined(__OpenBSD__) && \
1117
+ !defined(__NetBSD__) && \
1118
+ !defined(__ANDROID__) && \
1119
+ !defined(__DragonFly__) && \
1120
+ !defined(__QNX__) && \
1121
+ !defined(__GNU__)
1122
+ int err;
1123
+ union uv__sockaddr mcast_addr;
1124
+ union uv__sockaddr src_addr;
1125
+
1126
+ err = uv_ip4_addr(multicast_addr, 0, &mcast_addr.in);
1127
+ if (err) {
1128
+ err = uv_ip6_addr(multicast_addr, 0, &mcast_addr.in6);
1129
+ if (err)
1130
+ return err;
1131
+ err = uv_ip6_addr(source_addr, 0, &src_addr.in6);
1132
+ if (err)
1133
+ return err;
1134
+ return uv__udp_set_source_membership6(handle,
1135
+ &mcast_addr.in6,
1136
+ interface_addr,
1137
+ &src_addr.in6,
1138
+ membership);
1139
+ }
1140
+
1141
+ err = uv_ip4_addr(source_addr, 0, &src_addr.in);
1142
+ if (err)
1143
+ return err;
1144
+ return uv__udp_set_source_membership4(handle,
1145
+ &mcast_addr.in,
1146
+ interface_addr,
1147
+ &src_addr.in,
1148
+ membership);
1149
+ #else
1150
+ return UV_ENOSYS;
1151
+ #endif
1152
+ }
1153
+
1154
+
642
1155
  static int uv__setsockopt(uv_udp_t* handle,
643
1156
  int option4,
644
1157
  int option6,
645
1158
  const void* val,
646
- size_t size) {
1159
+ socklen_t size) {
647
1160
  int r;
648
1161
 
649
1162
  if (handle->flags & UV_HANDLE_IPV6)
@@ -659,7 +1172,7 @@ static int uv__setsockopt(uv_udp_t* handle,
659
1172
  val,
660
1173
  size);
661
1174
  if (r)
662
- return -errno;
1175
+ return UV__ERR(errno);
663
1176
 
664
1177
  return 0;
665
1178
  }
@@ -668,7 +1181,7 @@ static int uv__setsockopt_maybe_char(uv_udp_t* handle,
668
1181
  int option4,
669
1182
  int option6,
670
1183
  int val) {
671
- #if defined(__sun) || defined(_AIX)
1184
+ #if defined(__sun) || defined(_AIX) || defined(__MVS__)
672
1185
  char arg = val;
673
1186
  #elif defined(__OpenBSD__)
674
1187
  unsigned char arg = val;
@@ -677,7 +1190,7 @@ static int uv__setsockopt_maybe_char(uv_udp_t* handle,
677
1190
  #endif
678
1191
 
679
1192
  if (val < 0 || val > 255)
680
- return -EINVAL;
1193
+ return UV_EINVAL;
681
1194
 
682
1195
  return uv__setsockopt(handle, option4, option6, &arg, sizeof(arg));
683
1196
  }
@@ -689,7 +1202,7 @@ int uv_udp_set_broadcast(uv_udp_t* handle, int on) {
689
1202
  SO_BROADCAST,
690
1203
  &on,
691
1204
  sizeof(on))) {
692
- return -errno;
1205
+ return UV__ERR(errno);
693
1206
  }
694
1207
 
695
1208
  return 0;
@@ -698,7 +1211,12 @@ int uv_udp_set_broadcast(uv_udp_t* handle, int on) {
698
1211
 
699
1212
  int uv_udp_set_ttl(uv_udp_t* handle, int ttl) {
700
1213
  if (ttl < 1 || ttl > 255)
701
- return -EINVAL;
1214
+ return UV_EINVAL;
1215
+
1216
+ #if defined(__MVS__)
1217
+ if (!(handle->flags & UV_HANDLE_IPV6))
1218
+ return UV_ENOTSUP; /* zOS does not support setting ttl for IPv4 */
1219
+ #endif
702
1220
 
703
1221
  /*
704
1222
  * On Solaris and derivatives such as SmartOS, the length of socket options
@@ -706,18 +1224,25 @@ int uv_udp_set_ttl(uv_udp_t* handle, int ttl) {
706
1224
  * so hardcode the size of these options on this platform,
707
1225
  * and use the general uv__setsockopt_maybe_char call on other platforms.
708
1226
  */
709
- #if defined(__sun) || defined(_AIX) || defined(__OpenBSD__)
1227
+ #if defined(__sun) || defined(_AIX) || defined(__OpenBSD__) || \
1228
+ defined(__MVS__) || defined(__QNX__)
1229
+
710
1230
  return uv__setsockopt(handle,
711
1231
  IP_TTL,
712
1232
  IPV6_UNICAST_HOPS,
713
1233
  &ttl,
714
1234
  sizeof(ttl));
715
- #endif /* defined(__sun) || defined(_AIX) || defined (__OpenBSD__) */
1235
+
1236
+ #else /* !(defined(__sun) || defined(_AIX) || defined (__OpenBSD__) ||
1237
+ defined(__MVS__) || defined(__QNX__)) */
716
1238
 
717
1239
  return uv__setsockopt_maybe_char(handle,
718
1240
  IP_TTL,
719
1241
  IPV6_UNICAST_HOPS,
720
1242
  ttl);
1243
+
1244
+ #endif /* defined(__sun) || defined(_AIX) || defined (__OpenBSD__) ||
1245
+ defined(__MVS__) || defined(__QNX__) */
721
1246
  }
722
1247
 
723
1248
 
@@ -728,14 +1253,16 @@ int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl) {
728
1253
  * IP_MULTICAST_TTL, so hardcode the size of the option in the IPv6 case,
729
1254
  * and use the general uv__setsockopt_maybe_char call otherwise.
730
1255
  */
731
- #if defined(__sun) || defined(_AIX)
1256
+ #if defined(__sun) || defined(_AIX) || defined(__OpenBSD__) || \
1257
+ defined(__MVS__) || defined(__QNX__)
732
1258
  if (handle->flags & UV_HANDLE_IPV6)
733
1259
  return uv__setsockopt(handle,
734
1260
  IP_MULTICAST_TTL,
735
1261
  IPV6_MULTICAST_HOPS,
736
1262
  &ttl,
737
1263
  sizeof(ttl));
738
- #endif /* defined(__sun) || defined(_AIX) */
1264
+ #endif /* defined(__sun) || defined(_AIX) || defined(__OpenBSD__) || \
1265
+ defined(__MVS__) || defined(__QNX__) */
739
1266
 
740
1267
  return uv__setsockopt_maybe_char(handle,
741
1268
  IP_MULTICAST_TTL,
@@ -751,14 +1278,16 @@ int uv_udp_set_multicast_loop(uv_udp_t* handle, int on) {
751
1278
  * IP_MULTICAST_LOOP, so hardcode the size of the option in the IPv6 case,
752
1279
  * and use the general uv__setsockopt_maybe_char call otherwise.
753
1280
  */
754
- #if defined(__sun) || defined(_AIX)
1281
+ #if defined(__sun) || defined(_AIX) || defined(__OpenBSD__) || \
1282
+ defined(__MVS__) || defined(__QNX__)
755
1283
  if (handle->flags & UV_HANDLE_IPV6)
756
1284
  return uv__setsockopt(handle,
757
1285
  IP_MULTICAST_LOOP,
758
1286
  IPV6_MULTICAST_LOOP,
759
1287
  &on,
760
1288
  sizeof(on));
761
- #endif /* defined(__sun) || defined(_AIX) */
1289
+ #endif /* defined(__sun) || defined(_AIX) ||defined(__OpenBSD__) ||
1290
+ defined(__MVS__) || defined(__QNX__) */
762
1291
 
763
1292
  return uv__setsockopt_maybe_char(handle,
764
1293
  IP_MULTICAST_LOOP,
@@ -788,7 +1317,7 @@ int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr)
788
1317
  } else if (uv_ip6_addr(interface_addr, 0, addr6) == 0) {
789
1318
  /* nothing, address was parsed */
790
1319
  } else {
791
- return -EINVAL;
1320
+ return UV_EINVAL;
792
1321
  }
793
1322
 
794
1323
  if (addr_st.ss_family == AF_INET) {
@@ -797,7 +1326,7 @@ int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr)
797
1326
  IP_MULTICAST_IF,
798
1327
  (void*) &addr4->sin_addr,
799
1328
  sizeof(addr4->sin_addr)) == -1) {
800
- return -errno;
1329
+ return UV__ERR(errno);
801
1330
  }
802
1331
  } else if (addr_st.ss_family == AF_INET6) {
803
1332
  if (setsockopt(handle->io_watcher.fd,
@@ -805,7 +1334,7 @@ int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr)
805
1334
  IPV6_MULTICAST_IF,
806
1335
  &addr6->sin6_scope_id,
807
1336
  sizeof(addr6->sin6_scope_id)) == -1) {
808
- return -errno;
1337
+ return UV__ERR(errno);
809
1338
  }
810
1339
  } else {
811
1340
  assert(0 && "unexpected address family");
@@ -815,23 +1344,24 @@ int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr)
815
1344
  return 0;
816
1345
  }
817
1346
 
818
-
819
- int uv_udp_getsockname(const uv_udp_t* handle,
1347
+ int uv_udp_getpeername(const uv_udp_t* handle,
820
1348
  struct sockaddr* name,
821
1349
  int* namelen) {
822
- socklen_t socklen;
823
-
824
- if (handle->io_watcher.fd == -1)
825
- return -EINVAL; /* FIXME(bnoordhuis) -EBADF */
826
1350
 
827
- /* sizeof(socklen_t) != sizeof(int) on some systems. */
828
- socklen = (socklen_t) *namelen;
1351
+ return uv__getsockpeername((const uv_handle_t*) handle,
1352
+ getpeername,
1353
+ name,
1354
+ namelen);
1355
+ }
829
1356
 
830
- if (getsockname(handle->io_watcher.fd, name, &socklen))
831
- return -errno;
1357
+ int uv_udp_getsockname(const uv_udp_t* handle,
1358
+ struct sockaddr* name,
1359
+ int* namelen) {
832
1360
 
833
- *namelen = (int) socklen;
834
- return 0;
1361
+ return uv__getsockpeername((const uv_handle_t*) handle,
1362
+ getsockname,
1363
+ name,
1364
+ namelen);
835
1365
  }
836
1366
 
837
1367
 
@@ -841,10 +1371,10 @@ int uv__udp_recv_start(uv_udp_t* handle,
841
1371
  int err;
842
1372
 
843
1373
  if (alloc_cb == NULL || recv_cb == NULL)
844
- return -EINVAL;
1374
+ return UV_EINVAL;
845
1375
 
846
- if (uv__io_active(&handle->io_watcher, UV__POLLIN))
847
- return -EALREADY; /* FIXME(bnoordhuis) Should be -EBUSY. */
1376
+ if (uv__io_active(&handle->io_watcher, POLLIN))
1377
+ return UV_EALREADY; /* FIXME(bnoordhuis) Should be UV_EBUSY. */
848
1378
 
849
1379
  err = uv__udp_maybe_deferred_bind(handle, AF_INET, 0);
850
1380
  if (err)
@@ -853,7 +1383,7 @@ int uv__udp_recv_start(uv_udp_t* handle,
853
1383
  handle->alloc_cb = alloc_cb;
854
1384
  handle->recv_cb = recv_cb;
855
1385
 
856
- uv__io_start(handle->loop, &handle->io_watcher, UV__POLLIN);
1386
+ uv__io_start(handle->loop, &handle->io_watcher, POLLIN);
857
1387
  uv__handle_start(handle);
858
1388
 
859
1389
  return 0;
@@ -861,9 +1391,9 @@ int uv__udp_recv_start(uv_udp_t* handle,
861
1391
 
862
1392
 
863
1393
  int uv__udp_recv_stop(uv_udp_t* handle) {
864
- uv__io_stop(handle->loop, &handle->io_watcher, UV__POLLIN);
1394
+ uv__io_stop(handle->loop, &handle->io_watcher, POLLIN);
865
1395
 
866
- if (!uv__io_active(&handle->io_watcher, UV__POLLOUT))
1396
+ if (!uv__io_active(&handle->io_watcher, POLLOUT))
867
1397
  uv__handle_stop(handle);
868
1398
 
869
1399
  handle->alloc_cb = NULL;