passenger 2.0.6 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (497) hide show
  1. data/DEVELOPERS.TXT +10 -4
  2. data/LICENSE +1 -1
  3. data/NEWS +0 -0
  4. data/Rakefile +183 -117
  5. data/benchmark/dispatcher.rb +5 -9
  6. data/bin/passenger-install-apache2-module +52 -18
  7. data/bin/passenger-memory-stats +67 -13
  8. data/bin/passenger-spawn-server +8 -4
  9. data/bin/passenger-status +21 -46
  10. data/bin/passenger-stress-test +5 -5
  11. data/debian/postinst +1 -1
  12. data/doc/ApplicationPool algorithm.txt +180 -128
  13. data/doc/Architectural overview.html +1 -778
  14. data/doc/Security of user switching support.html +1 -643
  15. data/doc/Users guide Apache.html +3127 -0
  16. data/doc/Users guide Nginx.html +1458 -0
  17. data/doc/Users guide.html +1404 -467
  18. data/doc/Users guide.txt +843 -105
  19. data/doc/cxxapi/ApplicationPoolServer_8h-source.html +751 -641
  20. data/doc/cxxapi/ApplicationPool_8h-source.html +168 -171
  21. data/doc/cxxapi/Application_8h-source.html +494 -394
  22. data/doc/cxxapi/Bucket_8h-source.html +21 -15
  23. data/doc/cxxapi/CachedFileStat_8h-source.html +191 -0
  24. data/doc/cxxapi/Configuration_8h-source.html +311 -149
  25. data/doc/cxxapi/DirectoryMapper_8h-source.html +309 -0
  26. data/doc/cxxapi/DummySpawnManager_8h-source.html +3 -4
  27. data/doc/cxxapi/Exceptions_8h-source.html +182 -165
  28. data/doc/cxxapi/FileChecker_8h-source.html +130 -0
  29. data/doc/cxxapi/Hooks_8h-source.html +2 -3
  30. data/doc/cxxapi/Logging_8h-source.html +92 -89
  31. data/doc/cxxapi/MessageChannel_8h-source.html +585 -477
  32. data/doc/cxxapi/PoolOptions_8h-source.html +305 -0
  33. data/doc/cxxapi/SpawnManager_8h-source.html +515 -540
  34. data/doc/cxxapi/StandardApplicationPool_8h-source.html +779 -679
  35. data/doc/cxxapi/SystemTime_8h-source.html +104 -0
  36. data/doc/cxxapi/Utils_8h-source.html +331 -227
  37. data/doc/cxxapi/annotated.html +6 -7
  38. data/doc/cxxapi/classClient-members.html +1 -2
  39. data/doc/cxxapi/classClient.html +1 -2
  40. data/doc/cxxapi/classHooks-members.html +5 -2
  41. data/doc/cxxapi/classHooks.html +112 -2
  42. data/doc/cxxapi/classPassenger_1_1Application-members.html +2 -3
  43. data/doc/cxxapi/classPassenger_1_1Application.html +8 -9
  44. data/doc/cxxapi/classPassenger_1_1ApplicationPool-members.html +4 -4
  45. data/doc/cxxapi/classPassenger_1_1ApplicationPool.html +42 -81
  46. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer-members.html +1 -2
  47. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer.html +3 -4
  48. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.png +0 -0
  49. data/doc/cxxapi/classPassenger_1_1Application_1_1Session-members.html +3 -2
  50. data/doc/cxxapi/classPassenger_1_1Application_1_1Session.html +74 -3
  51. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +1 -2
  52. data/doc/cxxapi/classPassenger_1_1BusyException.html +2 -3
  53. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +1 -2
  54. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +2 -3
  55. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +38 -0
  56. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +256 -0
  57. data/doc/cxxapi/classPassenger_1_1DummySpawnManager-members.html +1 -2
  58. data/doc/cxxapi/classPassenger_1_1DummySpawnManager.html +2 -3
  59. data/doc/cxxapi/{classPassenger_1_1Thread-members.html → classPassenger_1_1FileChecker-members.html} +4 -5
  60. data/doc/cxxapi/classPassenger_1_1FileChecker.html +121 -0
  61. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +1 -2
  62. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +2 -3
  63. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
  64. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +2 -3
  65. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +2 -3
  66. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
  67. data/doc/cxxapi/classPassenger_1_1IOException-members.html +1 -2
  68. data/doc/cxxapi/classPassenger_1_1IOException.html +2 -3
  69. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
  70. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +5 -2
  71. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +155 -5
  72. data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption-members.html → classPassenger_1_1RuntimeException-members.html} +2 -3
  73. data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption.html → classPassenger_1_1RuntimeException.html} +10 -8
  74. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -2
  75. data/doc/cxxapi/classPassenger_1_1SpawnException.html +2 -3
  76. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +2 -3
  77. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +15 -56
  78. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool-members.html +5 -4
  79. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool.html +20 -81
  80. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.png +0 -0
  81. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +2 -3
  82. data/doc/cxxapi/classPassenger_1_1SystemException.html +9 -10
  83. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
  84. data/doc/cxxapi/{classboost_1_1this__thread_1_1disable__syscall__interruption-members.html → classPassenger_1_1SystemTime-members.html} +5 -3
  85. data/doc/cxxapi/classPassenger_1_1SystemTime.html +86 -0
  86. data/doc/cxxapi/classPassenger_1_1TempFile-members.html +2 -3
  87. data/doc/cxxapi/classPassenger_1_1TempFile.html +17 -9
  88. data/doc/cxxapi/definitions_8h-source.html +1 -2
  89. data/doc/cxxapi/files.html +6 -3
  90. data/doc/cxxapi/functions.html +98 -35
  91. data/doc/cxxapi/functions_func.html +60 -32
  92. data/doc/cxxapi/functions_type.html +1 -2
  93. data/doc/cxxapi/functions_vars.html +27 -2
  94. data/doc/cxxapi/graph_legend.html +1 -2
  95. data/doc/cxxapi/graph_legend.png +0 -0
  96. data/doc/cxxapi/group__Configuration.html +3 -4
  97. data/doc/cxxapi/group__Configuration.png +0 -0
  98. data/doc/cxxapi/group__Core.html +3 -4
  99. data/doc/cxxapi/group__Core.png +0 -0
  100. data/doc/cxxapi/group__Exceptions.html +4 -2
  101. data/doc/cxxapi/group__Hooks.html +1 -6
  102. data/doc/cxxapi/group__Hooks.png +0 -0
  103. data/doc/cxxapi/group__Support.html +259 -36
  104. data/doc/cxxapi/hierarchy.html +6 -7
  105. data/doc/cxxapi/inherit__graph__0.map +1 -1
  106. data/doc/cxxapi/inherit__graph__0.md5 +1 -1
  107. data/doc/cxxapi/inherit__graph__0.png +0 -0
  108. data/doc/cxxapi/inherit__graph__1.map +1 -1
  109. data/doc/cxxapi/inherit__graph__1.md5 +1 -1
  110. data/doc/cxxapi/inherit__graph__1.png +0 -0
  111. data/doc/cxxapi/inherit__graph__10.map +1 -1
  112. data/doc/cxxapi/inherit__graph__10.md5 +1 -1
  113. data/doc/cxxapi/inherit__graph__10.png +0 -0
  114. data/doc/cxxapi/inherit__graph__11.map +1 -1
  115. data/doc/cxxapi/inherit__graph__11.md5 +1 -1
  116. data/doc/cxxapi/inherit__graph__11.png +0 -0
  117. data/doc/cxxapi/inherit__graph__12.map +2 -1
  118. data/doc/cxxapi/inherit__graph__12.md5 +1 -1
  119. data/doc/cxxapi/inherit__graph__12.png +0 -0
  120. data/doc/cxxapi/inherit__graph__13.map +1 -1
  121. data/doc/cxxapi/inherit__graph__13.md5 +1 -1
  122. data/doc/cxxapi/inherit__graph__13.png +0 -0
  123. data/doc/cxxapi/inherit__graph__14.map +1 -2
  124. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  125. data/doc/cxxapi/inherit__graph__14.png +0 -0
  126. data/doc/cxxapi/inherit__graph__15.map +1 -1
  127. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  128. data/doc/cxxapi/inherit__graph__15.png +0 -0
  129. data/doc/cxxapi/inherit__graph__16.map +1 -1
  130. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  131. data/doc/cxxapi/inherit__graph__16.png +0 -0
  132. data/doc/cxxapi/inherit__graph__17.png +0 -0
  133. data/doc/cxxapi/inherit__graph__18.png +0 -0
  134. data/doc/cxxapi/inherit__graph__19.png +0 -0
  135. data/doc/cxxapi/inherit__graph__2.map +1 -1
  136. data/doc/cxxapi/inherit__graph__2.md5 +1 -1
  137. data/doc/cxxapi/inherit__graph__2.png +0 -0
  138. data/doc/cxxapi/inherit__graph__20.map +1 -1
  139. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  140. data/doc/cxxapi/inherit__graph__20.png +0 -0
  141. data/doc/cxxapi/inherit__graph__21.map +1 -1
  142. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  143. data/doc/cxxapi/inherit__graph__21.png +0 -0
  144. data/doc/cxxapi/inherit__graph__3.map +1 -1
  145. data/doc/cxxapi/inherit__graph__3.md5 +1 -1
  146. data/doc/cxxapi/inherit__graph__3.png +0 -0
  147. data/doc/cxxapi/inherit__graph__4.map +1 -1
  148. data/doc/cxxapi/inherit__graph__4.md5 +1 -1
  149. data/doc/cxxapi/inherit__graph__4.png +0 -0
  150. data/doc/cxxapi/inherit__graph__5.map +2 -1
  151. data/doc/cxxapi/inherit__graph__5.md5 +1 -1
  152. data/doc/cxxapi/inherit__graph__5.png +0 -0
  153. data/doc/cxxapi/inherit__graph__6.map +1 -1
  154. data/doc/cxxapi/inherit__graph__6.md5 +1 -1
  155. data/doc/cxxapi/inherit__graph__6.png +0 -0
  156. data/doc/cxxapi/inherit__graph__7.map +1 -1
  157. data/doc/cxxapi/inherit__graph__7.md5 +1 -1
  158. data/doc/cxxapi/inherit__graph__7.png +0 -0
  159. data/doc/cxxapi/inherit__graph__8.map +1 -1
  160. data/doc/cxxapi/inherit__graph__8.md5 +1 -1
  161. data/doc/cxxapi/inherit__graph__8.png +0 -0
  162. data/doc/cxxapi/inherit__graph__9.map +1 -2
  163. data/doc/cxxapi/inherit__graph__9.md5 +1 -1
  164. data/doc/cxxapi/inherit__graph__9.png +0 -0
  165. data/doc/cxxapi/inherits.html +30 -31
  166. data/doc/cxxapi/main.html +1 -2
  167. data/doc/cxxapi/modules.html +1 -2
  168. data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +1 -2
  169. data/doc/cxxapi/structPassenger_1_1AnythingToString.html +2 -3
  170. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +1 -2
  171. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +2 -3
  172. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +49 -0
  173. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +404 -0
  174. data/doc/cxxapi/tree.html +18 -20
  175. data/doc/images/conservative_spawning.png +0 -0
  176. data/doc/images/conservative_spawning.svg +248 -0
  177. data/doc/images/smart-lv2.png +0 -0
  178. data/doc/images/smart-lv2.svg +320 -0
  179. data/doc/rdoc/classes/ConditionVariable.html +68 -34
  180. data/doc/rdoc/classes/Exception.html +16 -16
  181. data/doc/rdoc/classes/GC.html +9 -9
  182. data/doc/rdoc/classes/IO.html +36 -17
  183. data/doc/rdoc/classes/PhusionPassenger.html +183 -0
  184. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +511 -0
  185. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer.html +285 -242
  186. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerAlreadyStarted.html +3 -3
  187. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerError.html +3 -3
  188. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerNotStarted.html +3 -3
  189. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/UnknownMessage.html +3 -3
  190. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +598 -0
  191. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +140 -0
  192. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess.html +247 -0
  193. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess/Instance.html +138 -0
  194. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AppInitError.html +36 -19
  195. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/Application.html +81 -96
  196. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/ConsoleTextTemplate.html +18 -18
  197. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/FrameworkInitError.html +20 -18
  198. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/HTMLTemplate.html +18 -18
  199. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/InitializationError.html +9 -9
  200. data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +92 -0
  201. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/MessageChannel.html +93 -92
  202. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/NativeSupport.html +55 -25
  203. data/doc/rdoc/classes/PhusionPassenger/Rack.html +91 -0
  204. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +185 -0
  205. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +182 -0
  206. data/doc/rdoc/classes/PhusionPassenger/Railz.html +95 -0
  207. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +424 -0
  208. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner/Error.html +98 -0
  209. data/doc/rdoc/classes/PhusionPassenger/Railz/CGIFixed.html +200 -0
  210. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +444 -0
  211. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner/Error.html +98 -0
  212. data/doc/rdoc/classes/PhusionPassenger/Railz/RequestHandler.html +154 -0
  213. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +408 -0
  214. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/UnknownError.html +13 -13
  215. data/doc/rdoc/classes/PhusionPassenger/Utils.html +687 -0
  216. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/VersionNotFound.html +8 -8
  217. data/doc/rdoc/classes/PhusionPassenger/WSGI.html +89 -0
  218. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +188 -0
  219. data/doc/rdoc/classes/PlatformInfo.html +663 -159
  220. data/doc/rdoc/classes/RakeExtensions.html +4 -4
  221. data/doc/rdoc/classes/Signal.html +134 -0
  222. data/doc/rdoc/created.rid +1 -1
  223. data/doc/rdoc/files/DEVELOPERS_TXT.html +15 -10
  224. data/doc/rdoc/files/README.html +5 -7
  225. data/doc/rdoc/files/ext/{passenger → phusion_passenger}/native_support_c.html +2 -2
  226. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_request_handler_rb.html +7 -9
  227. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +120 -0
  228. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_server_rb.html +7 -10
  229. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +99 -0
  230. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +92 -0
  231. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/application_rb.html +6 -8
  232. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/console_text_template_rb.html +5 -7
  233. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/constants_rb.html +4 -5
  234. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/dependencies_rb.html +6 -8
  235. data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +116 -0
  236. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/exceptions_rb.html +5 -7
  237. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/html_template_rb.html +5 -7
  238. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/message_channel_rb.html +5 -7
  239. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/platform_info_rb.html +6 -7
  240. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +123 -0
  241. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +117 -0
  242. data/doc/rdoc/files/lib/{passenger/utils_rb.html → phusion_passenger/railz/application_spawner_rb.html} +24 -17
  243. data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +126 -0
  244. data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +139 -0
  245. data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +118 -0
  246. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/simple_benchmarking_rb.html +5 -7
  247. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/spawn_manager_rb.html +40 -24
  248. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +169 -0
  249. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +120 -0
  250. data/doc/rdoc/files/lib/rake/extensions_rb.html +3 -4
  251. data/doc/rdoc/fr_class_index.html +37 -19
  252. data/doc/rdoc/fr_file_index.html +25 -14
  253. data/doc/rdoc/fr_method_index.html +145 -74
  254. data/ext/apache2/Application.h +145 -44
  255. data/ext/apache2/ApplicationPool.h +27 -29
  256. data/ext/apache2/ApplicationPoolServer.h +183 -72
  257. data/ext/apache2/ApplicationPoolServerExecutable.cpp +249 -42
  258. data/ext/apache2/Bucket.cpp +61 -9
  259. data/ext/apache2/Bucket.h +15 -8
  260. data/ext/apache2/CachedFileStat.cpp +114 -0
  261. data/ext/apache2/CachedFileStat.h +169 -0
  262. data/ext/apache2/Configuration.cpp +213 -22
  263. data/ext/apache2/Configuration.h +176 -13
  264. data/ext/apache2/DirectoryMapper.h +287 -0
  265. data/ext/apache2/Exceptions.h +30 -12
  266. data/ext/apache2/FileChecker.h +108 -0
  267. data/ext/apache2/Hooks.cpp +709 -493
  268. data/ext/apache2/LICENSE-CNRI.TXT +15 -0
  269. data/ext/apache2/Logging.h +26 -22
  270. data/ext/apache2/MessageChannel.h +124 -15
  271. data/ext/apache2/PoolOptions.h +283 -0
  272. data/ext/apache2/SpawnManager.h +75 -99
  273. data/ext/apache2/StandardApplicationPool.h +296 -195
  274. data/ext/apache2/SystemTime.cpp +28 -0
  275. data/ext/apache2/SystemTime.h +82 -0
  276. data/ext/apache2/Utils.cpp +172 -18
  277. data/ext/apache2/Utils.h +124 -19
  278. data/ext/boost/cstdint.hpp +4 -2
  279. data/ext/boost/current_function.hpp +67 -0
  280. data/ext/boost/detail/sp_counted_base.hpp +4 -4
  281. data/ext/boost/thread/exceptions.hpp +2 -1
  282. data/ext/boost/thread/pthread/thread.hpp +11 -3
  283. data/ext/boost/thread/pthread/thread_data.hpp +2 -1
  284. data/ext/oxt/backtrace.cpp +172 -0
  285. data/ext/oxt/backtrace.hpp +135 -0
  286. data/ext/oxt/detail/backtrace_disabled.hpp +39 -0
  287. data/ext/oxt/detail/backtrace_enabled.hpp +155 -0
  288. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +82 -0
  289. data/ext/oxt/detail/spin_lock_portable.hpp +38 -0
  290. data/ext/oxt/detail/spin_lock_pthreads.hpp +97 -0
  291. data/ext/oxt/detail/tracable_exception_disabled.hpp +46 -0
  292. data/ext/oxt/detail/tracable_exception_enabled.hpp +48 -0
  293. data/ext/oxt/macros.hpp +58 -0
  294. data/ext/oxt/spin_lock.hpp +55 -0
  295. data/ext/{apache2/System.cpp → oxt/system_calls.cpp} +87 -52
  296. data/ext/oxt/system_calls.hpp +234 -0
  297. data/ext/oxt/thread.cpp +32 -0
  298. data/ext/oxt/thread.hpp +223 -0
  299. data/ext/oxt/tracable_exception.cpp +87 -0
  300. data/ext/oxt/tracable_exception.hpp +35 -0
  301. data/{lib/passenger/constants.rb → ext/phusion_passenger/extconf.rb} +14 -9
  302. data/ext/{passenger → phusion_passenger}/native_support.c +33 -6
  303. data/lib/{passenger → phusion_passenger}/abstract_request_handler.rb +209 -93
  304. data/lib/{passenger → phusion_passenger}/abstract_server.rb +23 -8
  305. data/lib/phusion_passenger/abstract_server_collection.rb +301 -0
  306. data/lib/phusion_passenger/admin_tools.rb +25 -0
  307. data/lib/phusion_passenger/admin_tools/control_process.rb +107 -0
  308. data/lib/{passenger → phusion_passenger}/application.rb +13 -16
  309. data/lib/{passenger → phusion_passenger}/console_text_template.rb +2 -2
  310. data/{ext/passenger/extconf.rb → lib/phusion_passenger/constants.rb} +5 -5
  311. data/lib/{passenger → phusion_passenger}/dependencies.rb +38 -32
  312. data/lib/phusion_passenger/events.rb +45 -0
  313. data/lib/{passenger → phusion_passenger}/exceptions.rb +12 -5
  314. data/lib/{passenger → phusion_passenger}/html_template.rb +2 -2
  315. data/lib/{passenger → phusion_passenger}/message_channel.rb +3 -2
  316. data/lib/phusion_passenger/platform_info.rb +500 -0
  317. data/lib/{passenger → phusion_passenger}/rack/application_spawner.rb +29 -22
  318. data/lib/{passenger → phusion_passenger}/rack/request_handler.rb +14 -9
  319. data/lib/{passenger → phusion_passenger}/railz/application_spawner.rb +94 -74
  320. data/lib/{passenger → phusion_passenger}/railz/cgi_fixed.rb +2 -2
  321. data/lib/{passenger → phusion_passenger}/railz/framework_spawner.rb +86 -98
  322. data/lib/{passenger → phusion_passenger}/railz/request_handler.rb +6 -6
  323. data/lib/{passenger → phusion_passenger}/simple_benchmarking.rb +0 -0
  324. data/lib/{passenger → phusion_passenger}/spawn_manager.rb +136 -128
  325. data/lib/{passenger → phusion_passenger}/templates/apache2_config_snippets.txt.erb +0 -0
  326. data/lib/{passenger → phusion_passenger}/templates/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
  327. data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +38 -0
  328. data/lib/{passenger → phusion_passenger}/templates/app_init_error.html.erb +0 -0
  329. data/lib/{passenger → phusion_passenger}/templates/database_error.html.erb +0 -0
  330. data/lib/{passenger → phusion_passenger}/templates/deployment_example.txt.erb +1 -1
  331. data/lib/{passenger → phusion_passenger}/templates/error_layout.css +0 -0
  332. data/lib/{passenger → phusion_passenger}/templates/error_layout.html.erb +0 -0
  333. data/lib/{passenger → phusion_passenger}/templates/framework_init_error.html.erb +0 -0
  334. data/lib/{passenger → phusion_passenger}/templates/general_error.html.erb +0 -0
  335. data/lib/{passenger → phusion_passenger}/templates/invalid_app_root.html.erb +1 -1
  336. data/lib/{passenger → phusion_passenger}/templates/load_error.html.erb +0 -0
  337. data/lib/{passenger → phusion_passenger}/templates/no_write_permission_to_passenger_root.txt.erb +0 -0
  338. data/lib/{passenger → phusion_passenger}/templates/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
  339. data/lib/{passenger → phusion_passenger}/templates/run_installer_as_root.txt.erb +0 -0
  340. data/lib/{passenger → phusion_passenger}/templates/version_not_found.html.erb +0 -0
  341. data/lib/{passenger → phusion_passenger}/templates/welcome.txt.erb +0 -0
  342. data/lib/{passenger → phusion_passenger}/utils.rb +210 -44
  343. data/lib/{passenger → phusion_passenger}/wsgi/application_spawner.rb +18 -15
  344. data/lib/{passenger → phusion_passenger}/wsgi/request_handler.py +7 -1
  345. data/man/passenger-memory-stats.8 +1 -1
  346. data/misc/render_error_pages.rb +1 -1
  347. data/test/ApplicationPoolServerTest.cpp +0 -28
  348. data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +4 -0
  349. data/test/ApplicationPoolTest.cpp +307 -69
  350. data/test/CachedFileStatTest.cpp +262 -0
  351. data/test/FileCheckerTest.cpp +79 -0
  352. data/test/MessageChannelTest.cpp +3 -3
  353. data/test/PoolOptionsTest.cpp +37 -0
  354. data/test/SpawnManagerTest.cpp +4 -4
  355. data/test/StandardApplicationPoolTest.cpp +4 -0
  356. data/test/SystemTimeTest.cpp +37 -0
  357. data/test/UtilsTest.cpp +137 -0
  358. data/test/integration_tests.rb +270 -23
  359. data/test/oxt/backtrace_test.cpp +128 -0
  360. data/test/oxt/oxt_test_main.cpp +25 -0
  361. data/test/oxt/syscall_interruption_test.cpp +50 -0
  362. data/test/ruby/abstract_request_handler_spec.rb +83 -0
  363. data/test/ruby/abstract_server_collection_spec.rb +246 -0
  364. data/test/ruby/application_spec.rb +3 -3
  365. data/test/ruby/message_channel_spec.rb +2 -2
  366. data/test/ruby/rack/application_spawner_spec.rb +3 -5
  367. data/test/ruby/rails/application_spawner_spec.rb +54 -15
  368. data/test/ruby/rails/framework_spawner_spec.rb +6 -8
  369. data/test/ruby/rails/minimal_spawner_spec.rb +29 -0
  370. data/test/ruby/rails/spawner_error_handling_spec.rb +1 -1
  371. data/test/ruby/rails/spawner_privilege_lowering_spec.rb +3 -3
  372. data/test/ruby/spawn_manager_spec.rb +23 -12
  373. data/test/ruby/utils_spec.rb +36 -2
  374. data/test/ruby/wsgi/application_spawner_spec.rb +47 -0
  375. data/test/stub/apache2/httpd.conf.erb +3 -5
  376. data/test/stub/message_channel.rb +2 -2
  377. data/test/stub/message_channel_2.rb +2 -2
  378. data/test/stub/message_channel_3.rb +3 -3
  379. data/test/stub/minimal-railsapp/README +0 -0
  380. data/test/stub/minimal-railsapp/config/application.rb +0 -0
  381. data/test/stub/minimal-railsapp/config/environment.rb +0 -0
  382. data/test/stub/minimal-railsapp/vendor/rails/actionmailer/lib/action_mailer.rb +0 -0
  383. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_controller.rb +0 -0
  384. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_pack.rb +0 -0
  385. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_view.rb +0 -0
  386. data/test/stub/minimal-railsapp/vendor/rails/activerecord/lib/active_record.rb +0 -0
  387. data/test/stub/minimal-railsapp/vendor/rails/activeresource/lib/active_resource.rb +0 -0
  388. data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support.rb +0 -0
  389. data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +0 -0
  390. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/dispatcher.rb +0 -0
  391. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/initializer.rb +0 -0
  392. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/ruby_version_check.rb +0 -0
  393. data/test/stub/rails_apps/foobar/app/controllers/foo_controller.rb +8 -0
  394. data/test/stub/rails_apps/foobar/config/environments/development.rb +1 -2
  395. data/test/stub/rails_apps/mycook/app/controllers/welcome_controller.rb +21 -1
  396. data/test/stub/rails_apps/mycook/sites/some.site/public/uploads.html +26 -0
  397. data/test/stub/rails_apps/mycook/sites/some.site/public/welcome/cached.html +26 -0
  398. data/test/stub/railsapp/app/controllers/application.rb +0 -0
  399. data/test/stub/railsapp/app/controllers/bar_controller_1.rb +0 -0
  400. data/test/stub/railsapp/app/controllers/bar_controller_2.rb +1 -1
  401. data/test/stub/railsapp/app/controllers/foo_controller.rb +4 -0
  402. data/test/stub/railsapp/app/helpers/application_helper.rb +0 -0
  403. data/test/stub/railsapp/config/boot.rb +0 -0
  404. data/test/stub/railsapp/config/database.yml +0 -0
  405. data/test/stub/railsapp/config/environment.rb +0 -0
  406. data/test/stub/railsapp/config/environments/development.rb +0 -0
  407. data/test/stub/railsapp/config/environments/production.rb +0 -0
  408. data/test/stub/railsapp/config/initializers/inflections.rb +0 -0
  409. data/test/stub/railsapp/config/initializers/mime_types.rb +0 -0
  410. data/test/stub/railsapp/config/routes.rb +0 -0
  411. data/test/stub/railsapp/public/useless.txt +0 -0
  412. data/test/stub/spawn_server.rb +3 -4
  413. data/test/stub/wsgi/passenger_wsgi.pyc +0 -0
  414. data/test/support/apache2_controller.rb +57 -7
  415. data/test/support/tut.h +15 -0
  416. data/vendor/README +12 -0
  417. data/vendor/README_FOR_PACKAGERS +1 -0
  418. data/vendor/rack-0.9.1/AUTHORS +8 -0
  419. data/vendor/rack-0.9.1/COPYING +18 -0
  420. data/vendor/rack-0.9.1/ChangeLog +1423 -0
  421. data/vendor/rack-0.9.1/KNOWN-ISSUES +18 -0
  422. data/vendor/rack-0.9.1/README +306 -0
  423. data/vendor/rack-0.9.1/Rakefile +188 -0
  424. data/vendor/rack-0.9.1/SPEC +129 -0
  425. data/vendor/rack-0.9.1/lib/rack.rb +86 -0
  426. data/vendor/rack-0.9.1/lib/rack/adapter/camping.rb +22 -0
  427. data/vendor/rack-0.9.1/lib/rack/auth/abstract/handler.rb +28 -0
  428. data/vendor/rack-0.9.1/lib/rack/auth/abstract/request.rb +37 -0
  429. data/vendor/rack-0.9.1/lib/rack/auth/basic.rb +58 -0
  430. data/vendor/rack-0.9.1/lib/rack/auth/digest/md5.rb +124 -0
  431. data/vendor/rack-0.9.1/lib/rack/auth/digest/nonce.rb +51 -0
  432. data/vendor/rack-0.9.1/lib/rack/auth/digest/params.rb +55 -0
  433. data/vendor/rack-0.9.1/lib/rack/auth/digest/request.rb +40 -0
  434. data/vendor/rack-0.9.1/lib/rack/auth/openid.rb +438 -0
  435. data/vendor/rack-0.9.1/lib/rack/builder.rb +67 -0
  436. data/vendor/rack-0.9.1/lib/rack/cascade.rb +36 -0
  437. data/vendor/rack-0.9.1/lib/rack/commonlogger.rb +61 -0
  438. data/vendor/rack-0.9.1/lib/rack/conditionalget.rb +43 -0
  439. data/vendor/rack-0.9.1/lib/rack/content_length.rb +25 -0
  440. data/vendor/rack-0.9.1/lib/rack/deflater.rb +87 -0
  441. data/vendor/rack-0.9.1/lib/rack/directory.rb +150 -0
  442. data/vendor/rack-0.9.1/lib/rack/file.rb +85 -0
  443. data/vendor/rack-0.9.1/lib/rack/handler.rb +48 -0
  444. data/vendor/rack-0.9.1/lib/rack/handler/cgi.rb +57 -0
  445. data/vendor/rack-0.9.1/lib/rack/handler/evented_mongrel.rb +8 -0
  446. data/vendor/rack-0.9.1/lib/rack/handler/fastcgi.rb +86 -0
  447. data/vendor/rack-0.9.1/lib/rack/handler/lsws.rb +52 -0
  448. data/vendor/rack-0.9.1/lib/rack/handler/mongrel.rb +82 -0
  449. data/vendor/rack-0.9.1/lib/rack/handler/scgi.rb +57 -0
  450. data/vendor/rack-0.9.1/lib/rack/handler/swiftiplied_mongrel.rb +8 -0
  451. data/vendor/rack-0.9.1/lib/rack/handler/thin.rb +15 -0
  452. data/vendor/rack-0.9.1/lib/rack/handler/webrick.rb +61 -0
  453. data/vendor/rack-0.9.1/lib/rack/head.rb +19 -0
  454. data/vendor/rack-0.9.1/lib/rack/lint.rb +465 -0
  455. data/vendor/rack-0.9.1/lib/rack/lobster.rb +65 -0
  456. data/vendor/rack-0.9.1/lib/rack/methodoverride.rb +27 -0
  457. data/vendor/rack-0.9.1/lib/rack/mime.rb +204 -0
  458. data/vendor/rack-0.9.1/lib/rack/mock.rb +160 -0
  459. data/vendor/rack-0.9.1/lib/rack/recursive.rb +57 -0
  460. data/vendor/rack-0.9.1/lib/rack/reloader.rb +64 -0
  461. data/vendor/rack-0.9.1/lib/rack/request.rb +218 -0
  462. data/vendor/rack-0.9.1/lib/rack/response.rb +171 -0
  463. data/vendor/rack-0.9.1/lib/rack/session/abstract/id.rb +153 -0
  464. data/vendor/rack-0.9.1/lib/rack/session/cookie.rb +89 -0
  465. data/vendor/rack-0.9.1/lib/rack/session/memcache.rb +97 -0
  466. data/vendor/rack-0.9.1/lib/rack/session/pool.rb +73 -0
  467. data/vendor/rack-0.9.1/lib/rack/showexceptions.rb +348 -0
  468. data/vendor/rack-0.9.1/lib/rack/showstatus.rb +106 -0
  469. data/vendor/rack-0.9.1/lib/rack/static.rb +38 -0
  470. data/vendor/rack-0.9.1/lib/rack/urlmap.rb +48 -0
  471. data/vendor/rack-0.9.1/lib/rack/utils.rb +347 -0
  472. metadata +1197 -1055
  473. data/doc/cxxapi/System_8h-source.html +0 -251
  474. data/doc/cxxapi/classDirectoryMapper-members.html +0 -38
  475. data/doc/cxxapi/classDirectoryMapper.html +0 -203
  476. data/doc/cxxapi/classPassenger_1_1Thread.html +0 -100
  477. data/doc/cxxapi/classboost_1_1this__thread_1_1disable__syscall__interruption.html +0 -46
  478. data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption-members.html +0 -33
  479. data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption.html +0 -44
  480. data/doc/cxxapi/namespacePassenger.html +0 -208
  481. data/doc/cxxapi/namespacePassenger_1_1InterruptableCalls.html +0 -43
  482. data/doc/cxxapi/namespacemembers.html +0 -70
  483. data/doc/cxxapi/namespacemembers_func.html +0 -66
  484. data/doc/cxxapi/namespacemembers_type.html +0 -46
  485. data/doc/cxxapi/namespaces.html +0 -35
  486. data/doc/rdoc/classes/Passenger.html +0 -136
  487. data/doc/rdoc/classes/Passenger/AbstractRequestHandler.html +0 -402
  488. data/doc/rdoc/classes/Passenger/SpawnManager.html +0 -379
  489. data/doc/rdoc/classes/Passenger/Utils.html +0 -578
  490. data/ext/apache2/System.h +0 -228
  491. data/lib/passenger/platform_info.rb +0 -302
  492. data/lib/passenger/templates/app_exited_during_initialization.html.erb +0 -19
  493. data/test/stub/apache2/httpd.conf +0 -75
  494. data/test/stub/rails_apps/foobar/config/environments/test.rb +0 -22
  495. data/test/stub/rails_apps/mycook/config/environments/test.rb +0 -22
  496. data/test/stub/railsapp/config/environments/test.rb +0 -22
  497. data/test/stub/railsapp2/config/environments/test.rb +0 -22
@@ -0,0 +1,104 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
+ <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
3
+ <title>Passenger: SystemTime.h Source File</title>
4
+ <link href="doxygen.css" rel="stylesheet" type="text/css">
5
+ <link href="tabs.css" rel="stylesheet" type="text/css">
6
+ </head><body>
7
+ <!-- Generated by Doxygen 1.5.5 -->
8
+ <div class="navigation" id="top">
9
+ <div class="tabs">
10
+ <ul>
11
+ <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
12
+ <li><a href="modules.html"><span>Modules</span></a></li>
13
+ <li><a href="annotated.html"><span>Classes</span></a></li>
14
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
15
+ </ul>
16
+ </div>
17
+ <h1>SystemTime.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
18
+ <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
19
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2009 Phusion</span>
20
+ <a name="l00004"></a>00004 <span class="comment"> *</span>
21
+ <a name="l00005"></a>00005 <span class="comment"> * Phusion Passenger is a trademark of Hongli Lai &amp; Ninh Bui.</span>
22
+ <a name="l00006"></a>00006 <span class="comment"> *</span>
23
+ <a name="l00007"></a>00007 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
24
+ <a name="l00008"></a>00008 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
25
+ <a name="l00009"></a>00009 <span class="comment"> * the Free Software Foundation; version 2 of the License.</span>
26
+ <a name="l00010"></a>00010 <span class="comment"> *</span>
27
+ <a name="l00011"></a>00011 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
28
+ <a name="l00012"></a>00012 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
29
+ <a name="l00013"></a>00013 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
30
+ <a name="l00014"></a>00014 <span class="comment"> * GNU General Public License for more details.</span>
31
+ <a name="l00015"></a>00015 <span class="comment"> *</span>
32
+ <a name="l00016"></a>00016 <span class="comment"> * You should have received a copy of the GNU General Public License along</span>
33
+ <a name="l00017"></a>00017 <span class="comment"> * with this program; if not, write to the Free Software Foundation, Inc.,</span>
34
+ <a name="l00018"></a>00018 <span class="comment"> * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span>
35
+ <a name="l00019"></a>00019 <span class="comment"> */</span>
36
+ <a name="l00020"></a>00020 <span class="preprocessor">#ifndef _PASSENGER_SYSTEM_TIME_H_</span>
37
+ <a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_SYSTEM_TIME_H_</span>
38
+ <a name="l00022"></a>00022 <span class="preprocessor"></span>
39
+ <a name="l00023"></a>00023 <span class="preprocessor">#include &lt;boost/thread.hpp&gt;</span>
40
+ <a name="l00024"></a>00024 <span class="preprocessor">#include &lt;oxt/system_calls.hpp&gt;</span>
41
+ <a name="l00025"></a>00025 <span class="preprocessor">#include "Exceptions.h"</span>
42
+ <a name="l00026"></a>00026
43
+ <a name="l00027"></a>00027 <span class="keyword">namespace </span>Passenger {
44
+ <a name="l00028"></a>00028
45
+ <a name="l00029"></a>00029 <span class="keyword">using namespace </span>oxt;
46
+ <a name="l00030"></a>00030
47
+ <a name="l00031"></a>00031 <span class="keyword">namespace </span>SystemTimeData {
48
+ <a name="l00032"></a>00032 <span class="keyword">extern</span> <span class="keywordtype">bool</span> hasForcedValue;
49
+ <a name="l00033"></a>00033 <span class="keyword">extern</span> time_t forcedValue;
50
+ <a name="l00034"></a>00034 }
51
+ <a name="l00035"></a>00035 <span class="comment"></span>
52
+ <a name="l00036"></a>00036 <span class="comment">/**</span>
53
+ <a name="l00037"></a>00037 <span class="comment"> * This class allows one to obtain the system time, similar to time(). Unlike</span>
54
+ <a name="l00038"></a>00038 <span class="comment"> * time(), it is possible to force a certain time to be returned, which is</span>
55
+ <a name="l00039"></a>00039 <span class="comment"> * useful for testing code that depends on the system time.</span>
56
+ <a name="l00040"></a>00040 <span class="comment"> */</span>
57
+ <a name="l00041"></a><a class="code" href="classPassenger_1_1SystemTime.html">00041</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1SystemTime.html" title="This class allows one to obtain the system time, similar to time().">SystemTime</a> {
58
+ <a name="l00042"></a>00042 <span class="keyword">public</span>:<span class="comment"></span>
59
+ <a name="l00043"></a>00043 <span class="comment"> /**</span>
60
+ <a name="l00044"></a>00044 <span class="comment"> * Returns the time since the Epoch, measured in seconds. Or, if a time</span>
61
+ <a name="l00045"></a>00045 <span class="comment"> * was forced, then the forced time is returned instead.</span>
62
+ <a name="l00046"></a>00046 <span class="comment"> *</span>
63
+ <a name="l00047"></a>00047 <span class="comment"> * @throws SystemException Something went wrong while retrieving the time.</span>
64
+ <a name="l00048"></a>00048 <span class="comment"> * @throws boost::thread_interrupted</span>
65
+ <a name="l00049"></a>00049 <span class="comment"> */</span>
66
+ <a name="l00050"></a><a class="code" href="classPassenger_1_1SystemTime.html#d643b3e5748ee929e013517e6aca046c">00050</a> <span class="keyword">static</span> time_t <span class="keyword">get</span>() {
67
+ <a name="l00051"></a>00051 <span class="keywordflow">if</span> (SystemTimeData::hasForcedValue) {
68
+ <a name="l00052"></a>00052 <span class="keywordflow">return</span> SystemTimeData::forcedValue;
69
+ <a name="l00053"></a>00053 } <span class="keywordflow">else</span> {
70
+ <a name="l00054"></a>00054 time_t ret = syscalls::time(NULL);
71
+ <a name="l00055"></a>00055 <span class="keywordflow">if</span> (ret == -1) {
72
+ <a name="l00056"></a>00056 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a>(<span class="stringliteral">"Unable to retrieve the system time"</span>,
73
+ <a name="l00057"></a>00057 errno);
74
+ <a name="l00058"></a>00058 }
75
+ <a name="l00059"></a>00059 <span class="keywordflow">return</span> ret;
76
+ <a name="l00060"></a>00060 }
77
+ <a name="l00061"></a>00061 }
78
+ <a name="l00062"></a>00062 <span class="comment"></span>
79
+ <a name="l00063"></a>00063 <span class="comment"> /**</span>
80
+ <a name="l00064"></a>00064 <span class="comment"> * Force get() to return the given value.</span>
81
+ <a name="l00065"></a>00065 <span class="comment"> */</span>
82
+ <a name="l00066"></a><a class="code" href="classPassenger_1_1SystemTime.html#e15eaa6cdbbf8ab91ff740a0ca8ad57b">00066</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1SystemTime.html#e15eaa6cdbbf8ab91ff740a0ca8ad57b" title="Force get() to return the given value.">force</a>(time_t value) {
83
+ <a name="l00067"></a>00067 SystemTimeData::hasForcedValue = <span class="keyword">true</span>;
84
+ <a name="l00068"></a>00068 SystemTimeData::forcedValue = value;
85
+ <a name="l00069"></a>00069 }
86
+ <a name="l00070"></a>00070 <span class="comment"></span>
87
+ <a name="l00071"></a>00071 <span class="comment"> /**</span>
88
+ <a name="l00072"></a>00072 <span class="comment"> * Release the previously forced value, so that get()</span>
89
+ <a name="l00073"></a>00073 <span class="comment"> * returns the system time once again.</span>
90
+ <a name="l00074"></a>00074 <span class="comment"> */</span>
91
+ <a name="l00075"></a><a class="code" href="classPassenger_1_1SystemTime.html#aa31ee319abe639741327a535c6d22fd">00075</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1SystemTime.html#aa31ee319abe639741327a535c6d22fd" title="Release the previously forced value, so that get() returns the system time once again...">release</a>() {
92
+ <a name="l00076"></a>00076 SystemTimeData::hasForcedValue = <span class="keyword">false</span>;
93
+ <a name="l00077"></a>00077 }
94
+ <a name="l00078"></a>00078 };
95
+ <a name="l00079"></a>00079
96
+ <a name="l00080"></a>00080 } <span class="comment">// namespace Passenger</span>
97
+ <a name="l00081"></a>00081
98
+ <a name="l00082"></a>00082 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_SYSTEM_TIME_H_ */</span>
99
+ </pre></div></div>
100
+ <hr size="1"><address style="text-align: right;"><small>Generated on Fri Mar 13 19:24:32 2009 for Passenger by&nbsp;
101
+ <a href="http://www.doxygen.org/index.html">
102
+ <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.5 </small></address>
103
+ </body>
104
+ </html>
@@ -10,7 +10,6 @@
10
10
  <ul>
11
11
  <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
12
12
  <li><a href="modules.html"><span>Modules</span></a></li>
13
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
14
13
  <li><a href="annotated.html"><span>Classes</span></a></li>
15
14
  <li class="current"><a href="files.html"><span>Files</span></a></li>
16
15
  </ul>
@@ -49,234 +48,339 @@
49
48
  <a name="l00032"></a>00032 <span class="preprocessor">#include &lt;cstdlib&gt;</span>
50
49
  <a name="l00033"></a>00033 <span class="preprocessor">#include &lt;cstring&gt;</span>
51
50
  <a name="l00034"></a>00034 <span class="preprocessor">#include &lt;errno.h&gt;</span>
52
- <a name="l00035"></a>00035 <span class="preprocessor">#include "Exceptions.h"</span>
53
- <a name="l00036"></a>00036
54
- <a name="l00037"></a>00037 <span class="keyword">namespace </span>Passenger {
55
- <a name="l00038"></a>00038
56
- <a name="l00039"></a>00039 <span class="keyword">using namespace </span>std;
57
- <a name="l00040"></a>00040 <span class="keyword">using namespace </span>boost;
58
- <a name="l00041"></a>00041 <span class="comment"></span>
59
- <a name="l00042"></a>00042 <span class="comment">/**</span>
60
- <a name="l00043"></a>00043 <span class="comment"> * Convenience shortcut for creating a &lt;tt&gt;shared_ptr&lt;/tt&gt;.</span>
61
- <a name="l00044"></a>00044 <span class="comment"> * Instead of:</span>
62
- <a name="l00045"></a>00045 <span class="comment"> * @code</span>
63
- <a name="l00046"></a>00046 <span class="comment"> * shared_ptr&lt;Foo&gt; foo;</span>
64
- <a name="l00047"></a>00047 <span class="comment"> * ...</span>
65
- <a name="l00048"></a>00048 <span class="comment"> * foo = shared_ptr&lt;Foo&gt;(new Foo());</span>
66
- <a name="l00049"></a>00049 <span class="comment"> * @endcode</span>
67
- <a name="l00050"></a>00050 <span class="comment"> * one can write:</span>
68
- <a name="l00051"></a>00051 <span class="comment"> * @code</span>
69
- <a name="l00052"></a>00052 <span class="comment"> * shared_ptr&lt;Foo&gt; foo;</span>
70
- <a name="l00053"></a>00053 <span class="comment"> * ...</span>
71
- <a name="l00054"></a>00054 <span class="comment"> * foo = ptr(new Foo());</span>
72
- <a name="l00055"></a>00055 <span class="comment"> * @endcode</span>
73
- <a name="l00056"></a>00056 <span class="comment"> *</span>
74
- <a name="l00057"></a>00057 <span class="comment"> * @param pointer The item to put in the shared_ptr object.</span>
75
- <a name="l00058"></a>00058 <span class="comment"> * @ingroup Support</span>
76
- <a name="l00059"></a>00059 <span class="comment"> */</span>
77
- <a name="l00060"></a>00060 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; shared_ptr&lt;T&gt;
78
- <a name="l00061"></a><a class="code" href="group__Support.html#g41b6c4a82fed72531a147de0505a8396">00061</a> <a class="code" href="group__Support.html#g41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(T *pointer) {
79
- <a name="l00062"></a>00062 <span class="keywordflow">return</span> shared_ptr&lt;T&gt;(pointer);
80
- <a name="l00063"></a>00063 }
81
- <a name="l00064"></a>00064 <span class="comment"></span>
82
- <a name="l00065"></a>00065 <span class="comment">/**</span>
83
- <a name="l00066"></a>00066 <span class="comment"> * Used internally by toString(). Do not use directly.</span>
84
- <a name="l00067"></a>00067 <span class="comment"> *</span>
85
- <a name="l00068"></a>00068 <span class="comment"> * @internal</span>
86
- <a name="l00069"></a>00069 <span class="comment"> */</span>
87
- <a name="l00070"></a>00070 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;
88
- <a name="l00071"></a><a class="code" href="structPassenger_1_1AnythingToString.html">00071</a> <span class="keyword">struct </span><a class="code" href="structPassenger_1_1AnythingToString.html" title="Used internally by toString().">AnythingToString</a> {
89
- <a name="l00072"></a>00072 <span class="keywordtype">string</span> operator()(T something) {
90
- <a name="l00073"></a>00073 stringstream s;
91
- <a name="l00074"></a>00074 s &lt;&lt; something;
92
- <a name="l00075"></a>00075 <span class="keywordflow">return</span> s.str();
93
- <a name="l00076"></a>00076 }
94
- <a name="l00077"></a>00077 };
95
- <a name="l00078"></a>00078 <span class="comment"></span>
96
- <a name="l00079"></a>00079 <span class="comment">/**</span>
97
- <a name="l00080"></a>00080 <span class="comment"> * Used internally by toString(). Do not use directly.</span>
98
- <a name="l00081"></a>00081 <span class="comment"> *</span>
99
- <a name="l00082"></a>00082 <span class="comment"> * @internal</span>
100
- <a name="l00083"></a>00083 <span class="comment"> */</span>
101
- <a name="l00084"></a>00084 <span class="keyword">template</span>&lt;&gt;
102
- <a name="l00085"></a><a class="code" href="structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html">00085</a> <span class="keyword">struct </span><a class="code" href="structPassenger_1_1AnythingToString.html" title="Used internally by toString().">AnythingToString</a>&lt; vector&lt;string&gt; &gt; {
103
- <a name="l00086"></a>00086 <span class="keywordtype">string</span> operator()(<span class="keyword">const</span> vector&lt;string&gt; &amp;v) {
104
- <a name="l00087"></a>00087 <span class="keywordtype">string</span> result(<span class="stringliteral">"["</span>);
105
- <a name="l00088"></a>00088 vector&lt;string&gt;::const_iterator it;
106
- <a name="l00089"></a>00089 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
107
- <a name="l00090"></a>00090 <span class="keywordflow">for</span> (it = v.begin(), i = 0; it != v.end(); it++, i++) {
108
- <a name="l00091"></a>00091 result.append(<span class="stringliteral">"'"</span>);
109
- <a name="l00092"></a>00092 result.append(*it);
110
- <a name="l00093"></a>00093 <span class="keywordflow">if</span> (i == v.size() - 1) {
111
- <a name="l00094"></a>00094 result.append(<span class="stringliteral">"'"</span>);
112
- <a name="l00095"></a>00095 } <span class="keywordflow">else</span> {
113
- <a name="l00096"></a>00096 result.append(<span class="stringliteral">"', "</span>);
114
- <a name="l00097"></a>00097 }
115
- <a name="l00098"></a>00098 }
116
- <a name="l00099"></a>00099 result.append(<span class="stringliteral">"]"</span>);
117
- <a name="l00100"></a>00100 <span class="keywordflow">return</span> result;
118
- <a name="l00101"></a>00101 }
119
- <a name="l00102"></a>00102 };
120
- <a name="l00103"></a>00103 <span class="comment"></span>
121
- <a name="l00104"></a>00104 <span class="comment">/**</span>
122
- <a name="l00105"></a>00105 <span class="comment"> * Convert anything to a string.</span>
123
- <a name="l00106"></a>00106 <span class="comment"> *</span>
124
- <a name="l00107"></a>00107 <span class="comment"> * @param something The thing to convert.</span>
125
- <a name="l00108"></a>00108 <span class="comment"> * @ingroup Support</span>
126
- <a name="l00109"></a>00109 <span class="comment"> */</span>
127
- <a name="l00110"></a>00110 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">string</span>
128
- <a name="l00111"></a><a class="code" href="group__Support.html#gf6fab368d70c18fdf16bf5a24f630407">00111</a> <a class="code" href="group__Support.html#gf6fab368d70c18fdf16bf5a24f630407" title="Convert anything to a string.">toString</a>(T something) {
129
- <a name="l00112"></a>00112 <span class="keywordflow">return</span> <a class="code" href="structPassenger_1_1AnythingToString.html" title="Used internally by toString().">AnythingToString&lt;T&gt;</a>()(something);
130
- <a name="l00113"></a>00113 }
131
- <a name="l00114"></a>00114 <span class="comment"></span>
132
- <a name="l00115"></a>00115 <span class="comment">/**</span>
133
- <a name="l00116"></a>00116 <span class="comment"> * Converts the given string to an integer.</span>
134
- <a name="l00117"></a>00117 <span class="comment"> * @ingroup Support</span>
135
- <a name="l00118"></a>00118 <span class="comment"> */</span>
136
- <a name="l00119"></a>00119 <span class="keywordtype">int</span> <a class="code" href="group__Support.html#g73b17b509ee44938a56bf16cbf82fb48" title="Converts the given string to an integer.">atoi</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;s);
137
- <a name="l00120"></a>00120 <span class="comment"></span>
138
- <a name="l00121"></a>00121 <span class="comment">/**</span>
139
- <a name="l00122"></a>00122 <span class="comment"> * Split the given string using the given separator.</span>
140
- <a name="l00123"></a>00123 <span class="comment"> *</span>
141
- <a name="l00124"></a>00124 <span class="comment"> * @param str The string to split.</span>
142
- <a name="l00125"></a>00125 <span class="comment"> * @param sep The separator to use.</span>
143
- <a name="l00126"></a>00126 <span class="comment"> * @param output The vector to write the output to.</span>
144
- <a name="l00127"></a>00127 <span class="comment"> * @ingroup Support</span>
145
- <a name="l00128"></a>00128 <span class="comment"> */</span>
146
- <a name="l00129"></a>00129 <span class="keywordtype">void</span> <a class="code" href="group__Support.html#g4b8320aedc6a164a535c920234e3d8bf" title="Split the given string using the given separator.">split</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;str, <span class="keywordtype">char</span> sep, vector&lt;string&gt; &amp;output);
147
- <a name="l00130"></a>00130 <span class="comment"></span>
148
- <a name="l00131"></a>00131 <span class="comment">/**</span>
149
- <a name="l00132"></a>00132 <span class="comment"> * Check whether the specified file exists.</span>
150
- <a name="l00133"></a>00133 <span class="comment"> *</span>
151
- <a name="l00134"></a>00134 <span class="comment"> * @param filename The filename to check.</span>
152
- <a name="l00135"></a>00135 <span class="comment"> * @return Whether the file exists.</span>
153
- <a name="l00136"></a>00136 <span class="comment"> * @throws FileSystemException Unable to check because of a filesystem error.</span>
154
- <a name="l00137"></a>00137 <span class="comment"> * @ingroup Support</span>
155
- <a name="l00138"></a>00138 <span class="comment"> */</span>
156
- <a name="l00139"></a>00139 <span class="keywordtype">bool</span> <a class="code" href="group__Support.html#g56199e2a907b6791017eee7e0625e449" title="Check whether the specified file exists.">fileExists</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *filename);
157
- <a name="l00140"></a>00140 <span class="comment"></span>
158
- <a name="l00141"></a>00141 <span class="comment">/**</span>
159
- <a name="l00142"></a>00142 <span class="comment"> * Find the location of the Passenger spawn server script.</span>
160
- <a name="l00143"></a>00143 <span class="comment"> * If passengerRoot is given, t T</span>
51
+ <a name="l00035"></a>00035 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
52
+ <a name="l00036"></a>00036 <span class="preprocessor">#include "Exceptions.h"</span>
53
+ <a name="l00037"></a>00037
54
+ <a name="l00038"></a>00038 <span class="keyword">typedef</span> <span class="keyword">struct </span>CachedMultiFileStat CachedMultiFileStat;
55
+ <a name="l00039"></a>00039
56
+ <a name="l00040"></a>00040 <span class="keyword">namespace </span>Passenger {
57
+ <a name="l00041"></a>00041
58
+ <a name="l00042"></a>00042 <span class="keyword">using namespace </span>std;
59
+ <a name="l00043"></a>00043 <span class="keyword">using namespace </span>boost;
60
+ <a name="l00044"></a>00044 <span class="comment"></span>
61
+ <a name="l00045"></a>00045 <span class="comment">/** Enumeration which indicates what kind of file a file is. */</span>
62
+ <a name="l00046"></a>00046 <span class="keyword">typedef</span> <span class="keyword">enum</span> {<span class="comment"></span>
63
+ <a name="l00047"></a>00047 <span class="comment"> /** The file doesn't exist. */</span>
64
+ <a name="l00048"></a>00048 FT_NONEXISTANT,<span class="comment"></span>
65
+ <a name="l00049"></a>00049 <span class="comment"> /** A regular file or a symlink to a regular file. */</span>
66
+ <a name="l00050"></a>00050 FT_REGULAR,<span class="comment"></span>
67
+ <a name="l00051"></a>00051 <span class="comment"> /** A directory. */</span>
68
+ <a name="l00052"></a>00052 FT_DIRECTORY,<span class="comment"></span>
69
+ <a name="l00053"></a>00053 <span class="comment"> /** Something else, e.g. a pipe or a socket. */</span>
70
+ <a name="l00054"></a>00054 FT_OTHER
71
+ <a name="l00055"></a>00055 } FileType;
72
+ <a name="l00056"></a>00056 <span class="comment"></span>
73
+ <a name="l00057"></a>00057 <span class="comment">/**</span>
74
+ <a name="l00058"></a>00058 <span class="comment"> * Convenience shortcut for creating a &lt;tt&gt;shared_ptr&lt;/tt&gt;.</span>
75
+ <a name="l00059"></a>00059 <span class="comment"> * Instead of:</span>
76
+ <a name="l00060"></a>00060 <span class="comment"> * @code</span>
77
+ <a name="l00061"></a>00061 <span class="comment"> * shared_ptr&lt;Foo&gt; foo;</span>
78
+ <a name="l00062"></a>00062 <span class="comment"> * ...</span>
79
+ <a name="l00063"></a>00063 <span class="comment"> * foo = shared_ptr&lt;Foo&gt;(new Foo());</span>
80
+ <a name="l00064"></a>00064 <span class="comment"> * @endcode</span>
81
+ <a name="l00065"></a>00065 <span class="comment"> * one can write:</span>
82
+ <a name="l00066"></a>00066 <span class="comment"> * @code</span>
83
+ <a name="l00067"></a>00067 <span class="comment"> * shared_ptr&lt;Foo&gt; foo;</span>
84
+ <a name="l00068"></a>00068 <span class="comment"> * ...</span>
85
+ <a name="l00069"></a>00069 <span class="comment"> * foo = ptr(new Foo());</span>
86
+ <a name="l00070"></a>00070 <span class="comment"> * @endcode</span>
87
+ <a name="l00071"></a>00071 <span class="comment"> *</span>
88
+ <a name="l00072"></a>00072 <span class="comment"> * @param pointer The item to put in the shared_ptr object.</span>
89
+ <a name="l00073"></a>00073 <span class="comment"> * @ingroup Support</span>
90
+ <a name="l00074"></a>00074 <span class="comment"> */</span>
91
+ <a name="l00075"></a>00075 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; shared_ptr&lt;T&gt;
92
+ <a name="l00076"></a><a class="code" href="group__Support.html#g41b6c4a82fed72531a147de0505a8396">00076</a> <a class="code" href="group__Support.html#g41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(T *pointer) {
93
+ <a name="l00077"></a>00077 <span class="keywordflow">return</span> shared_ptr&lt;T&gt;(pointer);
94
+ <a name="l00078"></a>00078 }
95
+ <a name="l00079"></a>00079 <span class="comment"></span>
96
+ <a name="l00080"></a>00080 <span class="comment">/**</span>
97
+ <a name="l00081"></a>00081 <span class="comment"> * Used internally by toString(). Do not use directly.</span>
98
+ <a name="l00082"></a>00082 <span class="comment"> *</span>
99
+ <a name="l00083"></a>00083 <span class="comment"> * @internal</span>
100
+ <a name="l00084"></a>00084 <span class="comment"> */</span>
101
+ <a name="l00085"></a>00085 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;
102
+ <a name="l00086"></a><a class="code" href="structPassenger_1_1AnythingToString.html">00086</a> <span class="keyword">struct </span><a class="code" href="structPassenger_1_1AnythingToString.html" title="Used internally by toString().">AnythingToString</a> {
103
+ <a name="l00087"></a>00087 <span class="keywordtype">string</span> operator()(T something) {
104
+ <a name="l00088"></a>00088 stringstream s;
105
+ <a name="l00089"></a>00089 s &lt;&lt; something;
106
+ <a name="l00090"></a>00090 <span class="keywordflow">return</span> s.str();
107
+ <a name="l00091"></a>00091 }
108
+ <a name="l00092"></a>00092 };
109
+ <a name="l00093"></a>00093 <span class="comment"></span>
110
+ <a name="l00094"></a>00094 <span class="comment">/**</span>
111
+ <a name="l00095"></a>00095 <span class="comment"> * Used internally by toString(). Do not use directly.</span>
112
+ <a name="l00096"></a>00096 <span class="comment"> *</span>
113
+ <a name="l00097"></a>00097 <span class="comment"> * @internal</span>
114
+ <a name="l00098"></a>00098 <span class="comment"> */</span>
115
+ <a name="l00099"></a>00099 <span class="keyword">template</span>&lt;&gt;
116
+ <a name="l00100"></a><a class="code" href="structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html">00100</a> <span class="keyword">struct </span><a class="code" href="structPassenger_1_1AnythingToString.html" title="Used internally by toString().">AnythingToString</a>&lt; vector&lt;string&gt; &gt; {
117
+ <a name="l00101"></a>00101 <span class="keywordtype">string</span> operator()(<span class="keyword">const</span> vector&lt;string&gt; &amp;v) {
118
+ <a name="l00102"></a>00102 <span class="keywordtype">string</span> result(<span class="stringliteral">"["</span>);
119
+ <a name="l00103"></a>00103 vector&lt;string&gt;::const_iterator it;
120
+ <a name="l00104"></a>00104 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
121
+ <a name="l00105"></a>00105 <span class="keywordflow">for</span> (it = v.begin(), i = 0; it != v.end(); it++, i++) {
122
+ <a name="l00106"></a>00106 result.append(<span class="stringliteral">"'"</span>);
123
+ <a name="l00107"></a>00107 result.append(*it);
124
+ <a name="l00108"></a>00108 <span class="keywordflow">if</span> (i == v.size() - 1) {
125
+ <a name="l00109"></a>00109 result.append(<span class="stringliteral">"'"</span>);
126
+ <a name="l00110"></a>00110 } <span class="keywordflow">else</span> {
127
+ <a name="l00111"></a>00111 result.append(<span class="stringliteral">"', "</span>);
128
+ <a name="l00112"></a>00112 }
129
+ <a name="l00113"></a>00113 }
130
+ <a name="l00114"></a>00114 result.append(<span class="stringliteral">"]"</span>);
131
+ <a name="l00115"></a>00115 <span class="keywordflow">return</span> result;
132
+ <a name="l00116"></a>00116 }
133
+ <a name="l00117"></a>00117 };
134
+ <a name="l00118"></a>00118 <span class="comment"></span>
135
+ <a name="l00119"></a>00119 <span class="comment">/**</span>
136
+ <a name="l00120"></a>00120 <span class="comment"> * Convert anything to a string.</span>
137
+ <a name="l00121"></a>00121 <span class="comment"> *</span>
138
+ <a name="l00122"></a>00122 <span class="comment"> * @param something The thing to convert.</span>
139
+ <a name="l00123"></a>00123 <span class="comment"> * @ingroup Support</span>
140
+ <a name="l00124"></a>00124 <span class="comment"> */</span>
141
+ <a name="l00125"></a>00125 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">string</span>
142
+ <a name="l00126"></a><a class="code" href="group__Support.html#gf6fab368d70c18fdf16bf5a24f630407">00126</a> <a class="code" href="group__Support.html#gf6fab368d70c18fdf16bf5a24f630407" title="Convert anything to a string.">toString</a>(T something) {
143
+ <a name="l00127"></a>00127 <span class="keywordflow">return</span> <a class="code" href="structPassenger_1_1AnythingToString.html" title="Used internally by toString().">AnythingToString&lt;T&gt;</a>()(something);
144
+ <a name="l00128"></a>00128 }
145
+ <a name="l00129"></a>00129 <span class="comment"></span>
146
+ <a name="l00130"></a>00130 <span class="comment">/**</span>
147
+ <a name="l00131"></a>00131 <span class="comment"> * Converts the given string to an integer.</span>
148
+ <a name="l00132"></a>00132 <span class="comment"> * @ingroup Support</span>
149
+ <a name="l00133"></a>00133 <span class="comment"> */</span>
150
+ <a name="l00134"></a>00134 <span class="keywordtype">int</span> <a class="code" href="group__Support.html#g73b17b509ee44938a56bf16cbf82fb48" title="Converts the given string to an integer.">atoi</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;s);
151
+ <a name="l00135"></a>00135 <span class="comment"></span>
152
+ <a name="l00136"></a>00136 <span class="comment">/**</span>
153
+ <a name="l00137"></a>00137 <span class="comment"> * Converts the given string to a long integer.</span>
154
+ <a name="l00138"></a>00138 <span class="comment"> * @ingroup Support</span>
155
+ <a name="l00139"></a>00139 <span class="comment"> */</span>
156
+ <a name="l00140"></a>00140 <span class="keywordtype">long</span> <a class="code" href="group__Support.html#g7b50461f1bc2b370c956967870da2762" title="Converts the given string to a long integer.">atol</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;s);
157
+ <a name="l00141"></a>00141 <span class="comment"></span>
158
+ <a name="l00142"></a>00142 <span class="comment">/**</span>
159
+ <a name="l00143"></a>00143 <span class="comment"> * Split the given string using the given separator.</span>
161
160
  <a name="l00144"></a>00144 <span class="comment"> *</span>
162
- <a name="l00145"></a>00145 <span class="comment"> * @param passengerRoot The Passenger root folder. If NULL is given, then</span>
163
- <a name="l00146"></a>00146 <span class="comment"> * the spawn server is found by scanning $PATH. For security reasons,</span>
164
- <a name="l00147"></a>00147 <span class="comment"> * only absolute paths are scanned.</span>
165
- <a name="l00148"></a>00148 <span class="comment"> * @return An absolute path to the spawn server script, or</span>
166
- <a name="l00149"></a>00149 <span class="comment"> * an empty string on error.</span>
167
- <a name="l00150"></a>00150 <span class="comment"> * @throws FileSystemException Unable to access parts of the filesystem.</span>
168
- <a name="l00151"></a>00151 <span class="comment"> * @ingroup Support</span>
169
- <a name="l00152"></a>00152 <span class="comment"> */</span>
170
- <a name="l00153"></a>00153 <span class="keywordtype">string</span> <a class="code" href="group__Support.html#g37e1a293fa574748b2393b4801e7b23f" title="Find the location of the Passenger spawn server script.">findSpawnServer</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *passengerRoot = NULL);
171
- <a name="l00154"></a>00154 <span class="comment"></span>
172
- <a name="l00155"></a>00155 <span class="comment">/**</span>
173
- <a name="l00156"></a>00156 <span class="comment"> * Find the location of the Passenger ApplicationPool server</span>
174
- <a name="l00157"></a>00157 <span class="comment"> * executable.</span>
175
- <a name="l00158"></a>00158 <span class="comment"> *</span>
176
- <a name="l00159"></a>00159 <span class="comment"> * @param passengerRoot The Passenger root folder.</span>
177
- <a name="l00160"></a>00160 <span class="comment"> * @return An absolute path to the executable.</span>
178
- <a name="l00161"></a>00161 <span class="comment"> * @throws FileSystemException Unable to access parts of the filesystem.</span>
179
- <a name="l00162"></a>00162 <span class="comment"> * @pre passengerRoot != NULL</span>
180
- <a name="l00163"></a>00163 <span class="comment"> * @ingroup Support</span>
181
- <a name="l00164"></a>00164 <span class="comment"> */</span>
182
- <a name="l00165"></a>00165 <span class="keywordtype">string</span> <a class="code" href="group__Support.html#g67c03fa133dbb5a4e0de78f51899568e" title="Find the location of the Passenger ApplicationPool server executable.">findApplicationPoolServer</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *passengerRoot);
183
- <a name="l00166"></a>00166 <span class="comment"></span>
184
- <a name="l00167"></a>00167 <span class="comment">/**</span>
185
- <a name="l00168"></a>00168 <span class="comment"> * Returns a canonical version of the specified path. All symbolic links</span>
186
- <a name="l00169"></a>00169 <span class="comment"> * and relative path elements are resolved.</span>
187
- <a name="l00170"></a>00170 <span class="comment"> * Returns an empty string if something went wrong.</span>
188
- <a name="l00171"></a>00171 <span class="comment"> *</span>
189
- <a name="l00172"></a>00172 <span class="comment"> * @ingroup Support</span>
190
- <a name="l00173"></a>00173 <span class="comment"> */</span>
191
- <a name="l00174"></a>00174 <span class="keywordtype">string</span> <a class="code" href="group__Support.html#gf3b0a483f0a252ae08d9de9f8b267d36" title="Returns a canonical version of the specified path.">canonicalizePath</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;path);
192
- <a name="l00175"></a>00175 <span class="comment"></span>
193
- <a name="l00176"></a>00176 <span class="comment">/**</span>
194
- <a name="l00177"></a>00177 <span class="comment"> * Check whether the specified directory is a valid Ruby on Rails</span>
195
- <a name="l00178"></a>00178 <span class="comment"> * 'public' directory.</span>
196
- <a name="l00179"></a>00179 <span class="comment"> *</span>
197
- <a name="l00180"></a>00180 <span class="comment"> * @throws FileSystemException Unable to check because of a system error.</span>
198
- <a name="l00181"></a>00181 <span class="comment"> * @ingroup Support</span>
199
- <a name="l00182"></a>00182 <span class="comment"> */</span>
200
- <a name="l00183"></a>00183 <span class="keywordtype">bool</span> <a class="code" href="group__Support.html#g7eac0b3097091d39e348e0c2563630b8" title="Check whether the specified directory is a valid Ruby on Rails &amp;#39;public&amp;#39; directory...">verifyRailsDir</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;dir);
201
- <a name="l00184"></a>00184 <span class="comment"></span>
202
- <a name="l00185"></a>00185 <span class="comment">/**</span>
203
- <a name="l00186"></a>00186 <span class="comment"> * Check whether the specified directory is a valid Rack 'public'</span>
204
- <a name="l00187"></a>00187 <span class="comment"> * directory.</span>
205
- <a name="l00188"></a>00188 <span class="comment"> *</span>
206
- <a name="l00189"></a>00189 <span class="comment"> * @throws FileSystemException Unable to check because of a filesystem error.</span>
207
- <a name="l00190"></a>00190 <span class="comment"> * @ingroup Support</span>
208
- <a name="l00191"></a>00191 <span class="comment"> */</span>
209
- <a name="l00192"></a>00192 <span class="keywordtype">bool</span> <a class="code" href="group__Support.html#g6c3cf8f963ffa2885081df2da152dfda" title="Check whether the specified directory is a valid Rack &amp;#39;public&amp;#39; directory...">verifyRackDir</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;dir);
210
- <a name="l00193"></a>00193 <span class="comment"></span>
211
- <a name="l00194"></a>00194 <span class="comment">/**</span>
212
- <a name="l00195"></a>00195 <span class="comment"> * Check whether the specified directory is a valid WSGI 'public'</span>
213
- <a name="l00196"></a>00196 <span class="comment"> * directory.</span>
214
- <a name="l00197"></a>00197 <span class="comment"> *</span>
215
- <a name="l00198"></a>00198 <span class="comment"> * @throws FileSystemException Unable to check because of a filesystem error.</span>
216
- <a name="l00199"></a>00199 <span class="comment"> * @ingroup Support</span>
217
- <a name="l00200"></a>00200 <span class="comment"> */</span>
218
- <a name="l00201"></a>00201 <span class="keywordtype">bool</span> <a class="code" href="group__Support.html#g1d5027f3758e2e5893667f5d66443d9d" title="Check whether the specified directory is a valid WSGI &amp;#39;public&amp;#39; directory...">verifyWSGIDir</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;dir);
219
- <a name="l00202"></a>00202 <span class="comment"></span>
220
- <a name="l00203"></a>00203 <span class="comment">/**</span>
221
- <a name="l00204"></a>00204 <span class="comment"> * Represents a temporary file. The associated file is automatically</span>
222
- <a name="l00205"></a>00205 <span class="comment"> * deleted upon object destruction.</span>
223
- <a name="l00206"></a>00206 <span class="comment"> *</span>
224
- <a name="l00207"></a>00207 <span class="comment"> * @ingroup Support</span>
225
- <a name="l00208"></a>00208 <span class="comment"> */</span>
226
- <a name="l00209"></a><a class="code" href="classPassenger_1_1TempFile.html">00209</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1TempFile.html" title="Represents a temporary file.">TempFile</a> {
227
- <a name="l00210"></a>00210 <span class="keyword">public</span>:<span class="comment"></span>
228
- <a name="l00211"></a>00211 <span class="comment"> /** The filename. If this temp file is anonymous, then the filename is an empty string. */</span>
229
- <a name="l00212"></a><a class="code" href="classPassenger_1_1TempFile.html#5e3ad620abbd79a289e44057e241de6b">00212</a> <span class="keywordtype">string</span> <a class="code" href="classPassenger_1_1TempFile.html#5e3ad620abbd79a289e44057e241de6b" title="The filename.">filename</a>;<span class="comment"></span>
230
- <a name="l00213"></a>00213 <span class="comment"> /** The file handle. */</span>
231
- <a name="l00214"></a><a class="code" href="classPassenger_1_1TempFile.html#e78d0a63165ed1e5a083c1947db2ea14">00214</a> FILE *<a class="code" href="classPassenger_1_1TempFile.html#e78d0a63165ed1e5a083c1947db2ea14" title="The file handle.">handle</a>;
232
- <a name="l00215"></a>00215 <span class="comment"></span>
233
- <a name="l00216"></a>00216 <span class="comment"> /**</span>
234
- <a name="l00217"></a>00217 <span class="comment"> * Create an empty, temporary file, and open it for reading and writing.</span>
235
- <a name="l00218"></a>00218 <span class="comment"> *</span>
236
- <a name="l00219"></a>00219 <span class="comment"> * @param anonymous Set to true if this temp file should be unlinked</span>
237
- <a name="l00220"></a>00220 <span class="comment"> * immediately. Anonymous temp files are useful if one just wants</span>
238
- <a name="l00221"></a>00221 <span class="comment"> * a big not-in-memory buffer to work with.</span>
239
- <a name="l00222"></a>00222 <span class="comment"> * @throws SystemException Something went wrong.</span>
240
- <a name="l00223"></a>00223 <span class="comment"> */</span>
241
- <a name="l00224"></a><a class="code" href="classPassenger_1_1TempFile.html#bbcc818b88393bee71bf0bd8f66c3bd5">00224</a> <a class="code" href="classPassenger_1_1TempFile.html#bbcc818b88393bee71bf0bd8f66c3bd5" title="Create an empty, temporary file, and open it for reading and writing.">TempFile</a>(<span class="keywordtype">bool</span> anonymous = <span class="keyword">true</span>) {
242
- <a name="l00225"></a>00225 <span class="keyword">const</span> <span class="keywordtype">char</span> *temp_dir;
243
- <a name="l00226"></a>00226 <span class="keywordtype">char</span> templ[PATH_MAX];
244
- <a name="l00227"></a>00227 <span class="keywordtype">int</span> fd;
245
- <a name="l00228"></a>00228
246
- <a name="l00229"></a>00229 temp_dir = getenv(<span class="stringliteral">"TMP"</span>);
247
- <a name="l00230"></a>00230 <span class="keywordflow">if</span> (temp_dir == NULL || *temp_dir == <span class="charliteral">'\0'</span>) {
248
- <a name="l00231"></a>00231 temp_dir = <span class="stringliteral">"/tmp"</span>;
249
- <a name="l00232"></a>00232 }
250
- <a name="l00233"></a>00233
251
- <a name="l00234"></a>00234 snprintf(templ, <span class="keyword">sizeof</span>(templ), <span class="stringliteral">"%s/passenger.XXXXXX"</span>, temp_dir);
252
- <a name="l00235"></a>00235 templ[<span class="keyword">sizeof</span>(templ) - 1] = <span class="charliteral">'\0'</span>;
253
- <a name="l00236"></a>00236 fd = mkstemp(templ);
254
- <a name="l00237"></a>00237 <span class="keywordflow">if</span> (fd == -1) {
255
- <a name="l00238"></a>00238 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a>(<span class="stringliteral">"Cannot create a temporary file"</span>, errno);
256
- <a name="l00239"></a>00239 }
257
- <a name="l00240"></a>00240 <span class="keywordflow">if</span> (anonymous) {
258
- <a name="l00241"></a>00241 fchmod(fd, 0000);
259
- <a name="l00242"></a>00242 unlink(templ);
260
- <a name="l00243"></a>00243 } <span class="keywordflow">else</span> {
261
- <a name="l00244"></a>00244 <a class="code" href="classPassenger_1_1TempFile.html#5e3ad620abbd79a289e44057e241de6b" title="The filename.">filename</a>.assign(templ);
262
- <a name="l00245"></a>00245 }
263
- <a name="l00246"></a>00246 <a class="code" href="classPassenger_1_1TempFile.html#e78d0a63165ed1e5a083c1947db2ea14" title="The file handle.">handle</a> = fdopen(fd, <span class="stringliteral">"w+"</span>);
264
- <a name="l00247"></a>00247 }
265
- <a name="l00248"></a>00248
266
- <a name="l00249"></a>00249 ~<a class="code" href="classPassenger_1_1TempFile.html" title="Represents a temporary file.">TempFile</a>() {
267
- <a name="l00250"></a>00250 fclose(<a class="code" href="classPassenger_1_1TempFile.html#e78d0a63165ed1e5a083c1947db2ea14" title="The file handle.">handle</a>);
268
- <a name="l00251"></a>00251 <span class="keywordflow">if</span> (!<a class="code" href="classPassenger_1_1TempFile.html#5e3ad620abbd79a289e44057e241de6b" title="The filename.">filename</a>.empty()) {
269
- <a name="l00252"></a>00252 unlink(<a class="code" href="classPassenger_1_1TempFile.html#5e3ad620abbd79a289e44057e241de6b" title="The filename.">filename</a>.c_str());
270
- <a name="l00253"></a>00253 }
271
- <a name="l00254"></a>00254 }
272
- <a name="l00255"></a>00255 };
273
- <a name="l00256"></a>00256
274
- <a name="l00257"></a>00257 } <span class="comment">// namespace Passenger</span>
275
- <a name="l00258"></a>00258
276
- <a name="l00259"></a>00259 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_UTILS_H_ */</span>
277
- <a name="l00260"></a>00260
161
+ <a name="l00145"></a>00145 <span class="comment"> * @param str The string to split.</span>
162
+ <a name="l00146"></a>00146 <span class="comment"> * @param sep The separator to use.</span>
163
+ <a name="l00147"></a>00147 <span class="comment"> * @param output The vector to write the output to.</span>
164
+ <a name="l00148"></a>00148 <span class="comment"> * @ingroup Support</span>
165
+ <a name="l00149"></a>00149 <span class="comment"> */</span>
166
+ <a name="l00150"></a>00150 <span class="keywordtype">void</span> <a class="code" href="group__Support.html#g4b8320aedc6a164a535c920234e3d8bf" title="Split the given string using the given separator.">split</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;str, <span class="keywordtype">char</span> sep, vector&lt;string&gt; &amp;output);
167
+ <a name="l00151"></a>00151 <span class="comment"></span>
168
+ <a name="l00152"></a>00152 <span class="comment">/**</span>
169
+ <a name="l00153"></a>00153 <span class="comment"> * Check whether the specified file exists.</span>
170
+ <a name="l00154"></a>00154 <span class="comment"> *</span>
171
+ <a name="l00155"></a>00155 <span class="comment"> * @param filename The filename to check.</span>
172
+ <a name="l00156"></a>00156 <span class="comment"> * @param mstat A CachedMultiFileStat object, if you want to use cached statting.</span>
173
+ <a name="l00157"></a>00157 <span class="comment"> * @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.</span>
174
+ <a name="l00158"></a>00158 <span class="comment"> * @return Whether the file exists.</span>
175
+ <a name="l00159"></a>00159 <span class="comment"> * @throws FileSystemException Unable to check because of a filesystem error.</span>
176
+ <a name="l00160"></a>00160 <span class="comment"> * @ingroup Support</span>
177
+ <a name="l00161"></a>00161 <span class="comment"> */</span>
178
+ <a name="l00162"></a>00162 <span class="keywordtype">bool</span> <a class="code" href="group__Support.html#gb752bfac392b20da99e34847070aaaea" title="Check whether the specified file exists.">fileExists</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *filename, CachedMultiFileStat *mstat = 0,
179
+ <a name="l00163"></a>00163 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> throttleRate = 0);
180
+ <a name="l00164"></a>00164 <span class="comment"></span>
181
+ <a name="l00165"></a>00165 <span class="comment">/**</span>
182
+ <a name="l00166"></a>00166 <span class="comment"> * Check whether 'filename' exists and what kind of file it is.</span>
183
+ <a name="l00167"></a>00167 <span class="comment"> *</span>
184
+ <a name="l00168"></a>00168 <span class="comment"> * @param filename The filename to check.</span>
185
+ <a name="l00169"></a>00169 <span class="comment"> * @param mstat A CachedMultiFileStat object, if you want to use cached statting.</span>
186
+ <a name="l00170"></a>00170 <span class="comment"> * @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.</span>
187
+ <a name="l00171"></a>00171 <span class="comment"> * @return The file type.</span>
188
+ <a name="l00172"></a>00172 <span class="comment"> * @throws FileSystemException Unable to check because of a filesystem error.</span>
189
+ <a name="l00173"></a>00173 <span class="comment"> * @ingroup Support</span>
190
+ <a name="l00174"></a>00174 <span class="comment"> */</span>
191
+ <a name="l00175"></a>00175 FileType <a class="code" href="group__Support.html#g818326cfca681596cf6944c1b88ed9f4" title="Check whether &amp;#39;filename&amp;#39; exists and what kind of file it is.">getFileType</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *filename, CachedMultiFileStat *mstat = 0,
192
+ <a name="l00176"></a>00176 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> throttleRate = 0);
193
+ <a name="l00177"></a>00177 <span class="comment"></span>
194
+ <a name="l00178"></a>00178 <span class="comment">/**</span>
195
+ <a name="l00179"></a>00179 <span class="comment"> * Find the location of the Passenger spawn server script.</span>
196
+ <a name="l00180"></a>00180 <span class="comment"> * If passengerRoot is given, t T</span>
197
+ <a name="l00181"></a>00181 <span class="comment"> *</span>
198
+ <a name="l00182"></a>00182 <span class="comment"> * @param passengerRoot The Passenger root folder. If NULL is given, then</span>
199
+ <a name="l00183"></a>00183 <span class="comment"> * the spawn server is found by scanning $PATH. For security reasons,</span>
200
+ <a name="l00184"></a>00184 <span class="comment"> * only absolute paths are scanned.</span>
201
+ <a name="l00185"></a>00185 <span class="comment"> * @return An absolute path to the spawn server script, or</span>
202
+ <a name="l00186"></a>00186 <span class="comment"> * an empty string on error.</span>
203
+ <a name="l00187"></a>00187 <span class="comment"> * @throws FileSystemException Unable to access parts of the filesystem.</span>
204
+ <a name="l00188"></a>00188 <span class="comment"> * @ingroup Support</span>
205
+ <a name="l00189"></a>00189 <span class="comment"> */</span>
206
+ <a name="l00190"></a>00190 <span class="keywordtype">string</span> <a class="code" href="group__Support.html#g37e1a293fa574748b2393b4801e7b23f" title="Find the location of the Passenger spawn server script.">findSpawnServer</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *passengerRoot = NULL);
207
+ <a name="l00191"></a>00191 <span class="comment"></span>
208
+ <a name="l00192"></a>00192 <span class="comment">/**</span>
209
+ <a name="l00193"></a>00193 <span class="comment"> * Find the location of the Passenger ApplicationPool server</span>
210
+ <a name="l00194"></a>00194 <span class="comment"> * executable.</span>
211
+ <a name="l00195"></a>00195 <span class="comment"> *</span>
212
+ <a name="l00196"></a>00196 <span class="comment"> * @param passengerRoot The Passenger root folder.</span>
213
+ <a name="l00197"></a>00197 <span class="comment"> * @return An absolute path to the executable.</span>
214
+ <a name="l00198"></a>00198 <span class="comment"> * @throws FileSystemException Unable to access parts of the filesystem.</span>
215
+ <a name="l00199"></a>00199 <span class="comment"> * @pre passengerRoot != NULL</span>
216
+ <a name="l00200"></a>00200 <span class="comment"> * @ingroup Support</span>
217
+ <a name="l00201"></a>00201 <span class="comment"> */</span>
218
+ <a name="l00202"></a>00202 <span class="keywordtype">string</span> <a class="code" href="group__Support.html#g67c03fa133dbb5a4e0de78f51899568e" title="Find the location of the Passenger ApplicationPool server executable.">findApplicationPoolServer</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *passengerRoot);
219
+ <a name="l00203"></a>00203 <span class="comment"></span>
220
+ <a name="l00204"></a>00204 <span class="comment">/**</span>
221
+ <a name="l00205"></a>00205 <span class="comment"> * Returns a canonical version of the specified path. All symbolic links</span>
222
+ <a name="l00206"></a>00206 <span class="comment"> * and relative path elements are resolved.</span>
223
+ <a name="l00207"></a>00207 <span class="comment"> *</span>
224
+ <a name="l00208"></a>00208 <span class="comment"> * @throws FileSystemException Something went wrong.</span>
225
+ <a name="l00209"></a>00209 <span class="comment"> * @ingroup Support</span>
226
+ <a name="l00210"></a>00210 <span class="comment"> */</span>
227
+ <a name="l00211"></a>00211 <span class="keywordtype">string</span> <a class="code" href="group__Support.html#gf3b0a483f0a252ae08d9de9f8b267d36" title="Returns a canonical version of the specified path.">canonicalizePath</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;path);
228
+ <a name="l00212"></a>00212 <span class="comment"></span>
229
+ <a name="l00213"></a>00213 <span class="comment">/**</span>
230
+ <a name="l00214"></a>00214 <span class="comment"> * Escape the given raw string into an XML value.</span>
231
+ <a name="l00215"></a>00215 <span class="comment"> *</span>
232
+ <a name="l00216"></a>00216 <span class="comment"> * @throws std::bad_alloc Something went wrong.</span>
233
+ <a name="l00217"></a>00217 <span class="comment"> * @ingroup Support</span>
234
+ <a name="l00218"></a>00218 <span class="comment"> */</span>
235
+ <a name="l00219"></a>00219 <span class="keywordtype">string</span> <a class="code" href="group__Support.html#ge74addedf73782a1eb1f6dd48d6fce06" title="Escape the given raw string into an XML value.">escapeForXml</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;input);
236
+ <a name="l00220"></a>00220 <span class="comment"></span>
237
+ <a name="l00221"></a>00221 <span class="comment">/**</span>
238
+ <a name="l00222"></a>00222 <span class="comment"> * Return the path name for the directory in which temporary files are</span>
239
+ <a name="l00223"></a>00223 <span class="comment"> * to be stored.</span>
240
+ <a name="l00224"></a>00224 <span class="comment"> *</span>
241
+ <a name="l00225"></a>00225 <span class="comment"> * @ensure result != NULL</span>
242
+ <a name="l00226"></a>00226 <span class="comment"> * @ingroup Support</span>
243
+ <a name="l00227"></a>00227 <span class="comment"> */</span>
244
+ <a name="l00228"></a>00228 <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="group__Support.html#ga073519b32c6dd784125c01fd6588b8e" title="Return the path name for the directory in which temporary files are to be stored...">getTempDir</a>();
245
+ <a name="l00229"></a>00229 <span class="comment"></span>
246
+ <a name="l00230"></a>00230 <span class="comment">/**</span>
247
+ <a name="l00231"></a>00231 <span class="comment"> * Return the path name for the directory in which Phusion Passenger-specific</span>
248
+ <a name="l00232"></a>00232 <span class="comment"> * temporary files are to be stored. This directory is unique for this instance</span>
249
+ <a name="l00233"></a>00233 <span class="comment"> * of the web server in which Phusion Passenger is running.</span>
250
+ <a name="l00234"></a>00234 <span class="comment"> *</span>
251
+ <a name="l00235"></a>00235 <span class="comment"> * The result will be cached into the PHUSION_PASSENGER_TMP environment variable,</span>
252
+ <a name="l00236"></a>00236 <span class="comment"> * which will be used for future calls to this function. To bypass this cache,</span>
253
+ <a name="l00237"></a>00237 <span class="comment"> * set 'bypassCache' to true.</span>
254
+ <a name="l00238"></a>00238 <span class="comment"> *</span>
255
+ <a name="l00239"></a>00239 <span class="comment"> * @ensure !result.empty()</span>
256
+ <a name="l00240"></a>00240 <span class="comment"> * @ingroup Support</span>
257
+ <a name="l00241"></a>00241 <span class="comment"> */</span>
258
+ <a name="l00242"></a>00242 <span class="keywordtype">string</span> <a class="code" href="group__Support.html#g5d3a5c5fe2944a898e425e30b53ac0ac" title="Return the path name for the directory in which Phusion Passenger-specific temporary...">getPassengerTempDir</a>(<span class="keywordtype">bool</span> bypassCache = <span class="keyword">false</span>);
259
+ <a name="l00243"></a>00243
260
+ <a name="l00244"></a>00244 <span class="comment">/* Create a temp folder for storing Phusion Passenger-specific temp files,</span>
261
+ <a name="l00245"></a>00245 <span class="comment"> * such as temporarily buffered uploads, sockets for backend processes, etc.</span>
262
+ <a name="l00246"></a>00246 <span class="comment"> * This call also sets the PHUSION_PASSENGER_TMP environment variable, which</span>
263
+ <a name="l00247"></a>00247 <span class="comment"> * allows backend processes to find this temp folder.</span>
264
+ <a name="l00248"></a>00248 <span class="comment"> *</span>
265
+ <a name="l00249"></a>00249 <span class="comment"> * Does nothing if this folder already exists.</span>
266
+ <a name="l00250"></a>00250 <span class="comment"> *</span>
267
+ <a name="l00251"></a>00251 <span class="comment"> * @throws IOException Something went wrong.</span>
268
+ <a name="l00252"></a>00252 <span class="comment"> * @throws SystemException Something went wrong.</span>
269
+ <a name="l00253"></a>00253 <span class="comment"> */</span>
270
+ <a name="l00254"></a>00254 <span class="keywordtype">void</span> createPassengerTempDir();
271
+ <a name="l00255"></a>00255 <span class="comment"></span>
272
+ <a name="l00256"></a>00256 <span class="comment">/**</span>
273
+ <a name="l00257"></a>00257 <span class="comment"> * Create the directory at the given path, creating intermediate directories</span>
274
+ <a name="l00258"></a>00258 <span class="comment"> * if necessary. The created directories' permissions are as specified by the</span>
275
+ <a name="l00259"></a>00259 <span class="comment"> * 'mode' parameter.</span>
276
+ <a name="l00260"></a>00260 <span class="comment"> *</span>
277
+ <a name="l00261"></a>00261 <span class="comment"> * If 'path' already exists, then nothing will happen.</span>
278
+ <a name="l00262"></a>00262 <span class="comment"> *</span>
279
+ <a name="l00263"></a>00263 <span class="comment"> * @throws IOException Something went wrong.</span>
280
+ <a name="l00264"></a>00264 <span class="comment"> * @throws SystemException Something went wrong.</span>
281
+ <a name="l00265"></a>00265 <span class="comment"> */</span>
282
+ <a name="l00266"></a>00266 <span class="keywordtype">void</span> makeDirTree(<span class="keyword">const</span> <span class="keywordtype">char</span> *path, <span class="keyword">const</span> <span class="keywordtype">char</span> *mode = <span class="stringliteral">"u=rwx,g=,o="</span>);
283
+ <a name="l00267"></a>00267 <span class="comment"></span>
284
+ <a name="l00268"></a>00268 <span class="comment">/**</span>
285
+ <a name="l00269"></a>00269 <span class="comment"> * Remove an entire directory tree recursively.</span>
286
+ <a name="l00270"></a>00270 <span class="comment"> *</span>
287
+ <a name="l00271"></a>00271 <span class="comment"> * @throws SystemException Something went wrong.</span>
288
+ <a name="l00272"></a>00272 <span class="comment"> */</span>
289
+ <a name="l00273"></a>00273 <span class="keywordtype">void</span> removeDirTree(<span class="keyword">const</span> <span class="keywordtype">char</span> *path);
290
+ <a name="l00274"></a>00274 <span class="comment"></span>
291
+ <a name="l00275"></a>00275 <span class="comment">/**</span>
292
+ <a name="l00276"></a>00276 <span class="comment"> * Check whether the specified directory is a valid Ruby on Rails</span>
293
+ <a name="l00277"></a>00277 <span class="comment"> * application root directory.</span>
294
+ <a name="l00278"></a>00278 <span class="comment"> *</span>
295
+ <a name="l00279"></a>00279 <span class="comment"> * @param mstat A CachedMultiFileStat object, if you want to use cached statting.</span>
296
+ <a name="l00280"></a>00280 <span class="comment"> * @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.</span>
297
+ <a name="l00281"></a>00281 <span class="comment"> * @throws FileSystemException Unable to check because of a system error.</span>
298
+ <a name="l00282"></a>00282 <span class="comment"> * @ingroup Support</span>
299
+ <a name="l00283"></a>00283 <span class="comment"> */</span>
300
+ <a name="l00284"></a>00284 <span class="keywordtype">bool</span> <a class="code" href="group__Support.html#g02c80bd02d38cea295f24250ca8e2502" title="Check whether the specified directory is a valid Ruby on Rails application root directory...">verifyRailsDir</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;dir, CachedMultiFileStat *mstat = 0,
301
+ <a name="l00285"></a>00285 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> throttleRate = 0);
302
+ <a name="l00286"></a>00286 <span class="comment"></span>
303
+ <a name="l00287"></a>00287 <span class="comment">/**</span>
304
+ <a name="l00288"></a>00288 <span class="comment"> * Check whether the specified directory is a valid Rack application</span>
305
+ <a name="l00289"></a>00289 <span class="comment"> * root directory.</span>
306
+ <a name="l00290"></a>00290 <span class="comment"> *</span>
307
+ <a name="l00291"></a>00291 <span class="comment"> * @param mstat A CachedMultiFileStat object, if you want to use cached statting.</span>
308
+ <a name="l00292"></a>00292 <span class="comment"> * @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.</span>
309
+ <a name="l00293"></a>00293 <span class="comment"> * @throws FileSystemException Unable to check because of a filesystem error.</span>
310
+ <a name="l00294"></a>00294 <span class="comment"> * @ingroup Support</span>
311
+ <a name="l00295"></a>00295 <span class="comment"> */</span>
312
+ <a name="l00296"></a>00296 <span class="keywordtype">bool</span> <a class="code" href="group__Support.html#g7bb22ba786fa3c88dbbd9f84aaaed59a" title="Check whether the specified directory is a valid Rack application root directory...">verifyRackDir</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;dir, CachedMultiFileStat *mstat = 0,
313
+ <a name="l00297"></a>00297 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> throttleRate = 0);
314
+ <a name="l00298"></a>00298 <span class="comment"></span>
315
+ <a name="l00299"></a>00299 <span class="comment">/**</span>
316
+ <a name="l00300"></a>00300 <span class="comment"> * Check whether the specified directory is a valid WSGI application</span>
317
+ <a name="l00301"></a>00301 <span class="comment"> * root directory.</span>
318
+ <a name="l00302"></a>00302 <span class="comment"> *</span>
319
+ <a name="l00303"></a>00303 <span class="comment"> * @param mstat A CachedMultiFileStat object, if you want to use cached statting.</span>
320
+ <a name="l00304"></a>00304 <span class="comment"> * @param throttleRate A throttle rate for mstat. Only applicable if mstat is not NULL.</span>
321
+ <a name="l00305"></a>00305 <span class="comment"> * @throws FileSystemException Unable to check because of a filesystem error.</span>
322
+ <a name="l00306"></a>00306 <span class="comment"> * @ingroup Support</span>
323
+ <a name="l00307"></a>00307 <span class="comment"> */</span>
324
+ <a name="l00308"></a>00308 <span class="keywordtype">bool</span> <a class="code" href="group__Support.html#g8bfea2692733dfd80703707a120bce86" title="Check whether the specified directory is a valid WSGI application root directory...">verifyWSGIDir</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;dir, CachedMultiFileStat *mstat = 0,
325
+ <a name="l00309"></a>00309 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> throttleRate = 0);
326
+ <a name="l00310"></a>00310 <span class="comment"></span>
327
+ <a name="l00311"></a>00311 <span class="comment">/**</span>
328
+ <a name="l00312"></a>00312 <span class="comment"> * Represents a temporary file. The associated file is automatically</span>
329
+ <a name="l00313"></a>00313 <span class="comment"> * deleted upon object destruction.</span>
330
+ <a name="l00314"></a>00314 <span class="comment"> *</span>
331
+ <a name="l00315"></a>00315 <span class="comment"> * @ingroup Support</span>
332
+ <a name="l00316"></a>00316 <span class="comment"> */</span>
333
+ <a name="l00317"></a><a class="code" href="classPassenger_1_1TempFile.html">00317</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1TempFile.html" title="Represents a temporary file.">TempFile</a> {
334
+ <a name="l00318"></a>00318 <span class="keyword">public</span>:<span class="comment"></span>
335
+ <a name="l00319"></a>00319 <span class="comment"> /** The filename. If this temp file is anonymous, then the filename is an empty string. */</span>
336
+ <a name="l00320"></a><a class="code" href="classPassenger_1_1TempFile.html#5e3ad620abbd79a289e44057e241de6b">00320</a> <span class="keywordtype">string</span> <a class="code" href="classPassenger_1_1TempFile.html#5e3ad620abbd79a289e44057e241de6b" title="The filename.">filename</a>;<span class="comment"></span>
337
+ <a name="l00321"></a>00321 <span class="comment"> /** The file handle. */</span>
338
+ <a name="l00322"></a><a class="code" href="classPassenger_1_1TempFile.html#e78d0a63165ed1e5a083c1947db2ea14">00322</a> FILE *<a class="code" href="classPassenger_1_1TempFile.html#e78d0a63165ed1e5a083c1947db2ea14" title="The file handle.">handle</a>;
339
+ <a name="l00323"></a>00323 <span class="comment"></span>
340
+ <a name="l00324"></a>00324 <span class="comment"> /**</span>
341
+ <a name="l00325"></a>00325 <span class="comment"> * Create an empty, temporary file, and open it for reading and writing.</span>
342
+ <a name="l00326"></a>00326 <span class="comment"> *</span>
343
+ <a name="l00327"></a>00327 <span class="comment"> * @param anonymous Set to true if this temp file should be unlinked</span>
344
+ <a name="l00328"></a>00328 <span class="comment"> * immediately. Anonymous temp files are useful if one just wants</span>
345
+ <a name="l00329"></a>00329 <span class="comment"> * a big not-in-memory buffer to work with.</span>
346
+ <a name="l00330"></a>00330 <span class="comment"> * @throws SystemException Something went wrong.</span>
347
+ <a name="l00331"></a>00331 <span class="comment"> */</span>
348
+ <a name="l00332"></a><a class="code" href="classPassenger_1_1TempFile.html#64623aebacdfb78b63e43ad1f29673f1">00332</a> <a class="code" href="classPassenger_1_1TempFile.html#64623aebacdfb78b63e43ad1f29673f1" title="Create an empty, temporary file, and open it for reading and writing.">TempFile</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier = <span class="stringliteral">"temp"</span>, <span class="keywordtype">bool</span> anonymous = <span class="keyword">true</span>) {
349
+ <a name="l00333"></a>00333 <span class="keywordtype">char</span> templ[PATH_MAX];
350
+ <a name="l00334"></a>00334 <span class="keywordtype">int</span> fd;
351
+ <a name="l00335"></a>00335
352
+ <a name="l00336"></a>00336 snprintf(templ, <span class="keyword">sizeof</span>(templ), <span class="stringliteral">"%s/%s.XXXXXX"</span>, <a class="code" href="group__Support.html#g5d3a5c5fe2944a898e425e30b53ac0ac" title="Return the path name for the directory in which Phusion Passenger-specific temporary...">getPassengerTempDir</a>().c_str(), identifier);
353
+ <a name="l00337"></a>00337 templ[<span class="keyword">sizeof</span>(templ) - 1] = <span class="charliteral">'\0'</span>;
354
+ <a name="l00338"></a>00338 fd = mkstemp(templ);
355
+ <a name="l00339"></a>00339 <span class="keywordflow">if</span> (fd == -1) {
356
+ <a name="l00340"></a>00340 <span class="keywordtype">char</span> message[1024];
357
+ <a name="l00341"></a>00341 snprintf(message, <span class="keyword">sizeof</span>(message), <span class="stringliteral">"Cannot create a temporary file '%s'"</span>, templ);
358
+ <a name="l00342"></a>00342 message[<span class="keyword">sizeof</span>(message) - 1] = <span class="charliteral">'\0'</span>;
359
+ <a name="l00343"></a>00343 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a>(message, errno);
360
+ <a name="l00344"></a>00344 }
361
+ <a name="l00345"></a>00345 <span class="keywordflow">if</span> (anonymous) {
362
+ <a name="l00346"></a>00346 fchmod(fd, 0000);
363
+ <a name="l00347"></a>00347 unlink(templ);
364
+ <a name="l00348"></a>00348 } <span class="keywordflow">else</span> {
365
+ <a name="l00349"></a>00349 <a class="code" href="classPassenger_1_1TempFile.html#5e3ad620abbd79a289e44057e241de6b" title="The filename.">filename</a>.assign(templ);
366
+ <a name="l00350"></a>00350 }
367
+ <a name="l00351"></a>00351 <a class="code" href="classPassenger_1_1TempFile.html#e78d0a63165ed1e5a083c1947db2ea14" title="The file handle.">handle</a> = fdopen(fd, <span class="stringliteral">"w+"</span>);
368
+ <a name="l00352"></a>00352 }
369
+ <a name="l00353"></a>00353
370
+ <a name="l00354"></a>00354 ~<a class="code" href="classPassenger_1_1TempFile.html" title="Represents a temporary file.">TempFile</a>() {
371
+ <a name="l00355"></a>00355 fclose(<a class="code" href="classPassenger_1_1TempFile.html#e78d0a63165ed1e5a083c1947db2ea14" title="The file handle.">handle</a>);
372
+ <a name="l00356"></a>00356 <span class="keywordflow">if</span> (!<a class="code" href="classPassenger_1_1TempFile.html#5e3ad620abbd79a289e44057e241de6b" title="The filename.">filename</a>.empty()) {
373
+ <a name="l00357"></a>00357 unlink(<a class="code" href="classPassenger_1_1TempFile.html#5e3ad620abbd79a289e44057e241de6b" title="The filename.">filename</a>.c_str());
374
+ <a name="l00358"></a>00358 }
375
+ <a name="l00359"></a>00359 }
376
+ <a name="l00360"></a>00360 };
377
+ <a name="l00361"></a>00361
378
+ <a name="l00362"></a>00362 } <span class="comment">// namespace Passenger</span>
379
+ <a name="l00363"></a>00363
380
+ <a name="l00364"></a>00364 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_UTILS_H_ */</span>
381
+ <a name="l00365"></a>00365
278
382
  </pre></div></div>
279
- <hr size="1"><address style="text-align: right;"><small>Generated on Mon Dec 15 15:27:24 2008 for Passenger by&nbsp;
383
+ <hr size="1"><address style="text-align: right;"><small>Generated on Fri Mar 13 19:24:32 2009 for Passenger by&nbsp;
280
384
  <a href="http://www.doxygen.org/index.html">
281
385
  <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.5 </small></address>
282
386
  </body>