passenger 2.0.3 → 2.0.4

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 (275) hide show
  1. data/Rakefile +8 -5
  2. data/bin/passenger-install-apache2-module +6 -1
  3. data/doc/ApplicationPool algorithm.txt +23 -5
  4. data/doc/Architectural overview.html +778 -0
  5. data/doc/Security of user switching support.html +1 -1
  6. data/doc/Users guide.html +113 -31
  7. data/doc/Users guide.txt +104 -10
  8. data/doc/cxxapi/ApplicationPoolServer_8h-source.html +683 -0
  9. data/doc/cxxapi/ApplicationPool_8h-source.html +224 -0
  10. data/doc/cxxapi/Application_8h-source.html +448 -0
  11. data/doc/cxxapi/Bucket_8h-source.html +61 -0
  12. data/doc/cxxapi/Configuration_8h-source.html +195 -0
  13. data/doc/cxxapi/DummySpawnManager_8h-source.html +126 -0
  14. data/doc/cxxapi/Exceptions_8h-source.html +244 -0
  15. data/doc/cxxapi/Hooks_8h-source.html +63 -0
  16. data/doc/cxxapi/Logging_8h-source.html +136 -0
  17. data/doc/cxxapi/MessageChannel_8h-source.html +524 -0
  18. data/doc/cxxapi/SpawnManager_8h-source.html +593 -0
  19. data/doc/cxxapi/StandardApplicationPool_8h-source.html +732 -0
  20. data/doc/cxxapi/System_8h-source.html +251 -0
  21. data/doc/cxxapi/Utils_8h-source.html +283 -0
  22. data/doc/cxxapi/annotated.html +59 -0
  23. data/doc/cxxapi/classClient-members.html +35 -0
  24. data/doc/cxxapi/classClient.html +117 -0
  25. data/doc/cxxapi/classDirectoryMapper-members.html +38 -0
  26. data/doc/cxxapi/classDirectoryMapper.html +203 -0
  27. data/doc/cxxapi/classHooks-members.html +33 -0
  28. data/doc/cxxapi/classHooks.html +43 -0
  29. data/doc/cxxapi/classPassenger_1_1Application-members.html +38 -0
  30. data/doc/cxxapi/classPassenger_1_1Application.html +229 -0
  31. data/doc/cxxapi/classPassenger_1_1ApplicationPool-members.html +41 -0
  32. data/doc/cxxapi/classPassenger_1_1ApplicationPool.html +359 -0
  33. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer-members.html +36 -0
  34. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer.html +225 -0
  35. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.map +1 -0
  36. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.md5 +1 -0
  37. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.png +0 -0
  38. data/doc/cxxapi/classPassenger_1_1Application_1_1Session-members.html +43 -0
  39. data/doc/cxxapi/classPassenger_1_1Application_1_1Session.html +329 -0
  40. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +33 -0
  41. data/doc/cxxapi/classPassenger_1_1BusyException.html +47 -0
  42. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +33 -0
  43. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +44 -0
  44. data/doc/cxxapi/classPassenger_1_1DummySpawnManager-members.html +33 -0
  45. data/doc/cxxapi/classPassenger_1_1DummySpawnManager.html +51 -0
  46. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +33 -0
  47. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +51 -0
  48. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.map +1 -0
  49. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.md5 +1 -0
  50. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
  51. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +38 -0
  52. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +61 -0
  53. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.map +1 -0
  54. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.md5 +1 -0
  55. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
  56. data/doc/cxxapi/classPassenger_1_1IOException-members.html +33 -0
  57. data/doc/cxxapi/classPassenger_1_1IOException.html +54 -0
  58. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.map +1 -0
  59. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.md5 +1 -0
  60. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
  61. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +47 -0
  62. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +591 -0
  63. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +35 -0
  64. data/doc/cxxapi/classPassenger_1_1SpawnException.html +77 -0
  65. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +37 -0
  66. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +255 -0
  67. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool-members.html +43 -0
  68. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool.html +400 -0
  69. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.map +1 -0
  70. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.md5 +1 -0
  71. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.png +0 -0
  72. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +37 -0
  73. data/doc/cxxapi/classPassenger_1_1SystemException.html +154 -0
  74. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.map +1 -0
  75. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.md5 +1 -0
  76. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
  77. data/doc/cxxapi/classPassenger_1_1TempFile-members.html +36 -0
  78. data/doc/cxxapi/classPassenger_1_1TempFile.html +128 -0
  79. data/doc/cxxapi/classPassenger_1_1Thread-members.html +35 -0
  80. data/doc/cxxapi/classPassenger_1_1Thread.html +100 -0
  81. data/doc/cxxapi/classboost_1_1this__thread_1_1disable__syscall__interruption-members.html +33 -0
  82. data/doc/cxxapi/classboost_1_1this__thread_1_1disable__syscall__interruption.html +46 -0
  83. data/doc/cxxapi/classboost_1_1this__thread_1_1enable__syscall__interruption-members.html +33 -0
  84. data/doc/cxxapi/classboost_1_1this__thread_1_1enable__syscall__interruption.html +44 -0
  85. data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption-members.html +33 -0
  86. data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption.html +44 -0
  87. data/doc/cxxapi/definitions_8h-source.html +28 -0
  88. data/doc/cxxapi/doxygen.css +433 -0
  89. data/doc/cxxapi/doxygen.png +0 -0
  90. data/doc/cxxapi/files.html +42 -0
  91. data/doc/cxxapi/ftv2blank.png +0 -0
  92. data/doc/cxxapi/ftv2doc.png +0 -0
  93. data/doc/cxxapi/ftv2folderclosed.png +0 -0
  94. data/doc/cxxapi/ftv2folderopen.png +0 -0
  95. data/doc/cxxapi/ftv2lastnode.png +0 -0
  96. data/doc/cxxapi/ftv2link.png +0 -0
  97. data/doc/cxxapi/ftv2mlastnode.png +0 -0
  98. data/doc/cxxapi/ftv2mnode.png +0 -0
  99. data/doc/cxxapi/ftv2node.png +0 -0
  100. data/doc/cxxapi/ftv2plastnode.png +0 -0
  101. data/doc/cxxapi/ftv2pnode.png +0 -0
  102. data/doc/cxxapi/ftv2vertline.png +0 -0
  103. data/doc/cxxapi/functions.html +215 -0
  104. data/doc/cxxapi/functions_func.html +210 -0
  105. data/doc/cxxapi/functions_type.html +46 -0
  106. data/doc/cxxapi/functions_vars.html +48 -0
  107. data/doc/cxxapi/graph_legend.dot +22 -0
  108. data/doc/cxxapi/graph_legend.html +87 -0
  109. data/doc/cxxapi/graph_legend.png +0 -0
  110. data/doc/cxxapi/group__Configuration.html +236 -0
  111. data/doc/cxxapi/group__Configuration.png +0 -0
  112. data/doc/cxxapi/group__Core.html +51 -0
  113. data/doc/cxxapi/group__Core.png +0 -0
  114. data/doc/cxxapi/group__Exceptions.html +43 -0
  115. data/doc/cxxapi/group__Hooks.html +46 -0
  116. data/doc/cxxapi/group__Hooks.png +0 -0
  117. data/doc/cxxapi/group__Support.html +406 -0
  118. data/doc/cxxapi/hierarchy.html +67 -0
  119. data/doc/cxxapi/index.html +11 -0
  120. data/doc/cxxapi/inherit__graph__0.map +1 -0
  121. data/doc/cxxapi/inherit__graph__0.md5 +1 -0
  122. data/doc/cxxapi/inherit__graph__0.png +0 -0
  123. data/doc/cxxapi/inherit__graph__1.map +1 -0
  124. data/doc/cxxapi/inherit__graph__1.md5 +1 -0
  125. data/doc/cxxapi/inherit__graph__1.png +0 -0
  126. data/doc/cxxapi/inherit__graph__10.map +1 -0
  127. data/doc/cxxapi/inherit__graph__10.md5 +1 -0
  128. data/doc/cxxapi/inherit__graph__10.png +0 -0
  129. data/doc/cxxapi/inherit__graph__11.map +1 -0
  130. data/doc/cxxapi/inherit__graph__11.md5 +1 -0
  131. data/doc/cxxapi/inherit__graph__11.png +0 -0
  132. data/doc/cxxapi/inherit__graph__12.map +1 -0
  133. data/doc/cxxapi/inherit__graph__12.md5 +1 -0
  134. data/doc/cxxapi/inherit__graph__12.png +0 -0
  135. data/doc/cxxapi/inherit__graph__13.map +1 -0
  136. data/doc/cxxapi/inherit__graph__13.md5 +1 -0
  137. data/doc/cxxapi/inherit__graph__13.png +0 -0
  138. data/doc/cxxapi/inherit__graph__14.map +2 -0
  139. data/doc/cxxapi/inherit__graph__14.md5 +1 -0
  140. data/doc/cxxapi/inherit__graph__14.png +0 -0
  141. data/doc/cxxapi/inherit__graph__15.map +1 -0
  142. data/doc/cxxapi/inherit__graph__15.md5 +1 -0
  143. data/doc/cxxapi/inherit__graph__15.png +0 -0
  144. data/doc/cxxapi/inherit__graph__16.map +1 -0
  145. data/doc/cxxapi/inherit__graph__16.md5 +1 -0
  146. data/doc/cxxapi/inherit__graph__16.png +0 -0
  147. data/doc/cxxapi/inherit__graph__17.map +1 -0
  148. data/doc/cxxapi/inherit__graph__17.md5 +1 -0
  149. data/doc/cxxapi/inherit__graph__17.png +0 -0
  150. data/doc/cxxapi/inherit__graph__18.map +1 -0
  151. data/doc/cxxapi/inherit__graph__18.md5 +1 -0
  152. data/doc/cxxapi/inherit__graph__18.png +0 -0
  153. data/doc/cxxapi/inherit__graph__19.map +2 -0
  154. data/doc/cxxapi/inherit__graph__19.md5 +1 -0
  155. data/doc/cxxapi/inherit__graph__19.png +0 -0
  156. data/doc/cxxapi/inherit__graph__2.map +1 -0
  157. data/doc/cxxapi/inherit__graph__2.md5 +1 -0
  158. data/doc/cxxapi/inherit__graph__2.png +0 -0
  159. data/doc/cxxapi/inherit__graph__20.map +1 -0
  160. data/doc/cxxapi/inherit__graph__20.md5 +1 -0
  161. data/doc/cxxapi/inherit__graph__20.png +0 -0
  162. data/doc/cxxapi/inherit__graph__21.map +1 -0
  163. data/doc/cxxapi/inherit__graph__21.md5 +1 -0
  164. data/doc/cxxapi/inherit__graph__21.png +0 -0
  165. data/doc/cxxapi/inherit__graph__3.map +1 -0
  166. data/doc/cxxapi/inherit__graph__3.md5 +1 -0
  167. data/doc/cxxapi/inherit__graph__3.png +0 -0
  168. data/doc/cxxapi/inherit__graph__4.map +1 -0
  169. data/doc/cxxapi/inherit__graph__4.md5 +1 -0
  170. data/doc/cxxapi/inherit__graph__4.png +0 -0
  171. data/doc/cxxapi/inherit__graph__5.map +1 -0
  172. data/doc/cxxapi/inherit__graph__5.md5 +1 -0
  173. data/doc/cxxapi/inherit__graph__5.png +0 -0
  174. data/doc/cxxapi/inherit__graph__6.map +1 -0
  175. data/doc/cxxapi/inherit__graph__6.md5 +1 -0
  176. data/doc/cxxapi/inherit__graph__6.png +0 -0
  177. data/doc/cxxapi/inherit__graph__7.map +1 -0
  178. data/doc/cxxapi/inherit__graph__7.md5 +1 -0
  179. data/doc/cxxapi/inherit__graph__7.png +0 -0
  180. data/doc/cxxapi/inherit__graph__8.map +1 -0
  181. data/doc/cxxapi/inherit__graph__8.md5 +1 -0
  182. data/doc/cxxapi/inherit__graph__8.png +0 -0
  183. data/doc/cxxapi/inherit__graph__9.map +2 -0
  184. data/doc/cxxapi/inherit__graph__9.md5 +1 -0
  185. data/doc/cxxapi/inherit__graph__9.png +0 -0
  186. data/doc/cxxapi/inherits.html +102 -0
  187. data/doc/cxxapi/main.html +27 -0
  188. data/doc/cxxapi/modules.html +34 -0
  189. data/doc/cxxapi/namespacePassenger.html +208 -0
  190. data/doc/cxxapi/namespacePassenger_1_1InterruptableCalls.html +43 -0
  191. data/doc/cxxapi/namespacemembers.html +70 -0
  192. data/doc/cxxapi/namespacemembers_func.html +66 -0
  193. data/doc/cxxapi/namespacemembers_type.html +46 -0
  194. data/doc/cxxapi/namespaces.html +35 -0
  195. data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +33 -0
  196. data/doc/cxxapi/structPassenger_1_1AnythingToString.html +49 -0
  197. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +33 -0
  198. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +49 -0
  199. data/doc/cxxapi/tab_b.gif +0 -0
  200. data/doc/cxxapi/tab_l.gif +0 -0
  201. data/doc/cxxapi/tab_r.gif +0 -0
  202. data/doc/cxxapi/tabs.css +102 -0
  203. data/doc/cxxapi/tree.html +167 -0
  204. data/doc/rdoc/classes/ConditionVariable.html +160 -0
  205. data/doc/rdoc/classes/Exception.html +120 -0
  206. data/doc/rdoc/classes/GC.html +113 -0
  207. data/doc/rdoc/classes/IO.html +150 -0
  208. data/doc/rdoc/classes/Passenger.html +136 -0
  209. data/doc/rdoc/classes/Passenger/AbstractRequestHandler.html +402 -0
  210. data/doc/rdoc/classes/Passenger/AbstractServer.html +649 -0
  211. data/doc/rdoc/classes/Passenger/AbstractServer/ServerAlreadyStarted.html +97 -0
  212. data/doc/rdoc/classes/Passenger/AbstractServer/ServerError.html +96 -0
  213. data/doc/rdoc/classes/Passenger/AbstractServer/ServerNotStarted.html +97 -0
  214. data/doc/rdoc/classes/Passenger/AbstractServer/UnknownMessage.html +96 -0
  215. data/doc/rdoc/classes/Passenger/AppInitError.html +137 -0
  216. data/doc/rdoc/classes/Passenger/Application.html +298 -0
  217. data/doc/rdoc/classes/Passenger/ConsoleTextTemplate.html +172 -0
  218. data/doc/rdoc/classes/Passenger/FrameworkInitError.html +143 -0
  219. data/doc/rdoc/classes/Passenger/HTMLTemplate.html +175 -0
  220. data/doc/rdoc/classes/Passenger/InitializationError.html +141 -0
  221. data/doc/rdoc/classes/Passenger/MessageChannel.html +488 -0
  222. data/doc/rdoc/classes/Passenger/NativeSupport.html +320 -0
  223. data/doc/rdoc/classes/Passenger/SpawnManager.html +375 -0
  224. data/doc/rdoc/classes/Passenger/UnknownError.html +125 -0
  225. data/doc/rdoc/classes/Passenger/Utils.html +578 -0
  226. data/doc/rdoc/classes/Passenger/VersionNotFound.html +140 -0
  227. data/doc/rdoc/classes/PlatformInfo.html +302 -0
  228. data/doc/rdoc/classes/RakeExtensions.html +197 -0
  229. data/doc/rdoc/created.rid +1 -0
  230. data/doc/rdoc/files/DEVELOPERS_TXT.html +230 -0
  231. data/doc/rdoc/files/README.html +150 -0
  232. data/doc/rdoc/files/ext/passenger/native_support_c.html +92 -0
  233. data/doc/rdoc/files/lib/passenger/abstract_request_handler_rb.html +126 -0
  234. data/doc/rdoc/files/lib/passenger/abstract_server_rb.html +127 -0
  235. data/doc/rdoc/files/lib/passenger/application_rb.html +123 -0
  236. data/doc/rdoc/files/lib/passenger/console_text_template_rb.html +122 -0
  237. data/doc/rdoc/files/lib/passenger/constants_rb.html +114 -0
  238. data/doc/rdoc/files/lib/passenger/dependencies_rb.html +130 -0
  239. data/doc/rdoc/files/lib/passenger/exceptions_rb.html +118 -0
  240. data/doc/rdoc/files/lib/passenger/html_template_rb.html +122 -0
  241. data/doc/rdoc/files/lib/passenger/message_channel_rb.html +118 -0
  242. data/doc/rdoc/files/lib/passenger/platform_info_rb.html +122 -0
  243. data/doc/rdoc/files/lib/passenger/simple_benchmarking_rb.html +118 -0
  244. data/doc/rdoc/files/lib/passenger/spawn_manager_rb.html +139 -0
  245. data/doc/rdoc/files/lib/passenger/utils_rb.html +130 -0
  246. data/doc/rdoc/files/lib/rake/extensions_rb.html +122 -0
  247. data/doc/rdoc/fr_class_index.html +71 -0
  248. data/doc/rdoc/fr_file_index.html +63 -0
  249. data/doc/rdoc/fr_method_index.html +120 -0
  250. data/doc/rdoc/index.html +26 -0
  251. data/doc/rdoc/rdoc-style.css +187 -0
  252. data/ext/apache2/ApplicationPool.h +12 -0
  253. data/ext/apache2/ApplicationPoolServer.h +6 -0
  254. data/ext/apache2/ApplicationPoolServerExecutable.cpp +6 -0
  255. data/ext/apache2/Bucket.cpp +63 -69
  256. data/ext/apache2/Bucket.h +2 -0
  257. data/ext/apache2/Configuration.cpp +24 -0
  258. data/ext/apache2/Configuration.h +16 -1
  259. data/ext/apache2/Hooks.cpp +5 -3
  260. data/ext/apache2/StandardApplicationPool.h +30 -11
  261. data/lib/passenger/abstract_request_handler.rb +3 -0
  262. data/lib/passenger/abstract_server.rb +3 -3
  263. data/lib/passenger/application.rb +4 -2
  264. data/lib/passenger/dependencies.rb +10 -1
  265. data/lib/passenger/platform_info.rb +40 -1
  266. data/lib/passenger/rack/request_handler.rb +4 -2
  267. data/lib/passenger/railz/application_spawner.rb +7 -1
  268. data/lib/passenger/utils.rb +6 -8
  269. data/lib/rake/gempackagetask.rb +0 -6
  270. data/lib/rake/rdoctask.rb +84 -23
  271. data/test/ApplicationPoolTest.cpp +36 -0
  272. data/test/ruby/rails/minimal_spawner_spec.rb +8 -0
  273. data/test/ruby/utils_spec.rb +33 -0
  274. data/test/stub/rails_apps/foobar/config/environments/production.rb +0 -1
  275. metadata +262 -5
@@ -0,0 +1,63 @@
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: Hooks.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="namespaces.html"><span>Namespaces</span></a></li>
14
+ <li><a href="annotated.html"><span>Classes</span></a></li>
15
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
16
+ </ul>
17
+ </div>
18
+ <h1>Hooks.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
19
+ <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
20
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2008 Phusion</span>
21
+ <a name="l00004"></a>00004 <span class="comment"> *</span>
22
+ <a name="l00005"></a>00005 <span class="comment"> * Phusion Passenger is a trademark of Hongli Lai &amp; Ninh Bui.</span>
23
+ <a name="l00006"></a>00006 <span class="comment"> *</span>
24
+ <a name="l00007"></a>00007 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
25
+ <a name="l00008"></a>00008 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
26
+ <a name="l00009"></a>00009 <span class="comment"> * the Free Software Foundation; version 2 of the License.</span>
27
+ <a name="l00010"></a>00010 <span class="comment"> *</span>
28
+ <a name="l00011"></a>00011 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
29
+ <a name="l00012"></a>00012 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
30
+ <a name="l00013"></a>00013 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
31
+ <a name="l00014"></a>00014 <span class="comment"> * GNU General Public License for more details.</span>
32
+ <a name="l00015"></a>00015 <span class="comment"> *</span>
33
+ <a name="l00016"></a>00016 <span class="comment"> * You should have received a copy of the GNU General Public License along</span>
34
+ <a name="l00017"></a>00017 <span class="comment"> * with this program; if not, write to the Free Software Foundation, Inc.,</span>
35
+ <a name="l00018"></a>00018 <span class="comment"> * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span>
36
+ <a name="l00019"></a>00019 <span class="comment"> */</span>
37
+ <a name="l00020"></a>00020 <span class="preprocessor">#ifndef _PASSENGER_HOOKS_H_</span>
38
+ <a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_HOOKS_H_</span>
39
+ <a name="l00022"></a>00022 <span class="preprocessor"></span>
40
+ <a name="l00023"></a>00023 <span class="preprocessor">#include &lt;apr_pools.h&gt;</span>
41
+ <a name="l00024"></a>00024
42
+ <a name="l00025"></a>00025 <span class="preprocessor">#ifdef __cplusplus</span>
43
+ <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
44
+ <a name="l00027"></a>00027 <span class="preprocessor">#endif</span>
45
+ <a name="l00028"></a>00028 <span class="preprocessor"></span><span class="comment"></span>
46
+ <a name="l00029"></a>00029 <span class="comment">/**</span>
47
+ <a name="l00030"></a>00030 <span class="comment"> * @defgroup Hooks Apache hooks</span>
48
+ <a name="l00031"></a>00031 <span class="comment"> * @ingroup Core</span>
49
+ <a name="l00032"></a>00032 <span class="comment"> */</span>
50
+ <a name="l00033"></a>00033
51
+ <a name="l00034"></a>00034 <span class="keyword">extern</span> <span class="keywordtype">void</span> <a class="code" href="group__Hooks.html#g9d8409a5d1bee7cbe4568fac5a5ae4b3" title="Apache hook registration function.">passenger_register_hooks</a>(apr_pool_t *p);
52
+ <a name="l00035"></a>00035
53
+ <a name="l00036"></a>00036 <span class="preprocessor">#ifdef __cplusplus</span>
54
+ <a name="l00037"></a>00037 <span class="preprocessor"></span>}
55
+ <a name="l00038"></a>00038 <span class="preprocessor">#endif</span>
56
+ <a name="l00039"></a>00039 <span class="preprocessor"></span>
57
+ <a name="l00040"></a>00040 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_HOOKS_H_ */</span>
58
+ </pre></div></div>
59
+ <hr size="1"><address style="text-align: right;"><small>Generated on Mon Dec 1 14:27:22 2008 for Passenger by&nbsp;
60
+ <a href="http://www.doxygen.org/index.html">
61
+ <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.5 </small></address>
62
+ </body>
63
+ </html>
@@ -0,0 +1,136 @@
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: Logging.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="namespaces.html"><span>Namespaces</span></a></li>
14
+ <li><a href="annotated.html"><span>Classes</span></a></li>
15
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
16
+ </ul>
17
+ </div>
18
+ <h1>Logging.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
19
+ <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
20
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2008 Phusion</span>
21
+ <a name="l00004"></a>00004 <span class="comment"> *</span>
22
+ <a name="l00005"></a>00005 <span class="comment"> * Phusion Passenger is a trademark of Hongli Lai &amp; Ninh Bui.</span>
23
+ <a name="l00006"></a>00006 <span class="comment"> *</span>
24
+ <a name="l00007"></a>00007 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
25
+ <a name="l00008"></a>00008 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
26
+ <a name="l00009"></a>00009 <span class="comment"> * the Free Software Foundation; version 2 of the License.</span>
27
+ <a name="l00010"></a>00010 <span class="comment"> *</span>
28
+ <a name="l00011"></a>00011 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
29
+ <a name="l00012"></a>00012 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
30
+ <a name="l00013"></a>00013 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
31
+ <a name="l00014"></a>00014 <span class="comment"> * GNU General Public License for more details.</span>
32
+ <a name="l00015"></a>00015 <span class="comment"> *</span>
33
+ <a name="l00016"></a>00016 <span class="comment"> * You should have received a copy of the GNU General Public License along</span>
34
+ <a name="l00017"></a>00017 <span class="comment"> * with this program; if not, write to the Free Software Foundation, Inc.,</span>
35
+ <a name="l00018"></a>00018 <span class="comment"> * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span>
36
+ <a name="l00019"></a>00019 <span class="comment"> */</span>
37
+ <a name="l00020"></a>00020 <span class="preprocessor">#ifndef _PASSENGER_LOGGING_H_</span>
38
+ <a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_LOGGING_H_</span>
39
+ <a name="l00022"></a>00022 <span class="preprocessor"></span>
40
+ <a name="l00023"></a>00023 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
41
+ <a name="l00024"></a>00024 <span class="preprocessor">#include &lt;sys/time.h&gt;</span>
42
+ <a name="l00025"></a>00025 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
43
+ <a name="l00026"></a>00026 <span class="preprocessor">#include &lt;ostream&gt;</span>
44
+ <a name="l00027"></a>00027 <span class="preprocessor">#include &lt;ctime&gt;</span>
45
+ <a name="l00028"></a>00028
46
+ <a name="l00029"></a>00029 <span class="keyword">namespace </span>Passenger {
47
+ <a name="l00030"></a>00030
48
+ <a name="l00031"></a>00031 <span class="keyword">using namespace </span>std;
49
+ <a name="l00032"></a>00032
50
+ <a name="l00033"></a>00033 <span class="keyword">extern</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> _logLevel;
51
+ <a name="l00034"></a>00034 <span class="keyword">extern</span> ostream *_logStream;
52
+ <a name="l00035"></a>00035 <span class="keyword">extern</span> ostream *_debugStream;
53
+ <a name="l00036"></a>00036
54
+ <a name="l00037"></a>00037 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getLogLevel();
55
+ <a name="l00038"></a>00038 <span class="keywordtype">void</span> setLogLevel(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> value);
56
+ <a name="l00039"></a>00039 <span class="keywordtype">void</span> setDebugFile(<span class="keyword">const</span> <span class="keywordtype">char</span> *logFile = NULL);
57
+ <a name="l00040"></a>00040 <span class="comment"></span>
58
+ <a name="l00041"></a>00041 <span class="comment">/**</span>
59
+ <a name="l00042"></a>00042 <span class="comment"> * Write the given expression to the log stream.</span>
60
+ <a name="l00043"></a>00043 <span class="comment"> */</span>
61
+ <a name="l00044"></a>00044 <span class="preprocessor">#define P_LOG(expr) \</span>
62
+ <a name="l00045"></a>00045 <span class="preprocessor"> do { \</span>
63
+ <a name="l00046"></a>00046 <span class="preprocessor"> if (Passenger::_logStream != 0) { \</span>
64
+ <a name="l00047"></a>00047 <span class="preprocessor"> time_t the_time = time(NULL); \</span>
65
+ <a name="l00048"></a>00048 <span class="preprocessor"> struct tm *the_tm = localtime(&amp;the_time); \</span>
66
+ <a name="l00049"></a>00049 <span class="preprocessor"> char datetime_buf[60]; \</span>
67
+ <a name="l00050"></a>00050 <span class="preprocessor"> struct timeval tv; \</span>
68
+ <a name="l00051"></a>00051 <span class="preprocessor"> strftime(datetime_buf, sizeof(datetime_buf), "%x %H:%M:%S", the_tm); \</span>
69
+ <a name="l00052"></a>00052 <span class="preprocessor"> gettimeofday(&amp;tv, NULL); \</span>
70
+ <a name="l00053"></a>00053 <span class="preprocessor"> *Passenger::_logStream &lt;&lt; \</span>
71
+ <a name="l00054"></a>00054 <span class="preprocessor"> "[ pid=" &lt;&lt; getpid() &lt;&lt; " file=" &lt;&lt; __FILE__ &lt;&lt; ":" &lt;&lt; __LINE__ &lt;&lt; \</span>
72
+ <a name="l00055"></a>00055 <span class="preprocessor"> " time=" &lt;&lt; datetime_buf &lt;&lt; "." &lt;&lt; (tv.tv_usec / 1000) &lt;&lt; " ]:" &lt;&lt; \</span>
73
+ <a name="l00056"></a>00056 <span class="preprocessor"> "\n " &lt;&lt; expr &lt;&lt; std::endl; \</span>
74
+ <a name="l00057"></a>00057 <span class="preprocessor"> } \</span>
75
+ <a name="l00058"></a>00058 <span class="preprocessor"> } while (false)</span>
76
+ <a name="l00059"></a>00059 <span class="preprocessor"></span><span class="comment"></span>
77
+ <a name="l00060"></a>00060 <span class="comment">/**</span>
78
+ <a name="l00061"></a>00061 <span class="comment"> * Write the given expression, which represents a warning,</span>
79
+ <a name="l00062"></a>00062 <span class="comment"> * to the log stream.</span>
80
+ <a name="l00063"></a>00063 <span class="comment"> */</span>
81
+ <a name="l00064"></a>00064 <span class="preprocessor">#define P_WARN(expr) P_LOG(expr)</span>
82
+ <a name="l00065"></a>00065 <span class="preprocessor"></span><span class="comment"></span>
83
+ <a name="l00066"></a>00066 <span class="comment">/**</span>
84
+ <a name="l00067"></a>00067 <span class="comment"> * Write the given expression, which represents an error,</span>
85
+ <a name="l00068"></a>00068 <span class="comment"> * to the log stream.</span>
86
+ <a name="l00069"></a>00069 <span class="comment"> */</span>
87
+ <a name="l00070"></a>00070 <span class="preprocessor">#define P_ERROR(expr) P_LOG(expr)</span>
88
+ <a name="l00071"></a>00071 <span class="preprocessor"></span><span class="comment"></span>
89
+ <a name="l00072"></a>00072 <span class="comment">/**</span>
90
+ <a name="l00073"></a>00073 <span class="comment"> * Write the given expression, which represents a debugging message,</span>
91
+ <a name="l00074"></a>00074 <span class="comment"> * to the log stream.</span>
92
+ <a name="l00075"></a>00075 <span class="comment"> */</span>
93
+ <a name="l00076"></a>00076 <span class="preprocessor">#define P_DEBUG(expr) P_TRACE(1, expr)</span>
94
+ <a name="l00077"></a>00077 <span class="preprocessor"></span>
95
+ <a name="l00078"></a>00078 <span class="preprocessor">#ifdef PASSENGER_DEBUG</span>
96
+ <a name="l00079"></a>00079 <span class="preprocessor"></span><span class="preprocessor"> #define P_TRACE(level, expr) \</span>
97
+ <a name="l00080"></a>00080 <span class="preprocessor"> do { \</span>
98
+ <a name="l00081"></a>00081 <span class="preprocessor"> if (Passenger::_logLevel &gt;= level) { \</span>
99
+ <a name="l00082"></a>00082 <span class="preprocessor"> if (Passenger::_debugStream != 0) { \</span>
100
+ <a name="l00083"></a>00083 <span class="preprocessor"> time_t the_time = time(NULL); \</span>
101
+ <a name="l00084"></a>00084 <span class="preprocessor"> struct tm *the_tm = localtime(&amp;the_time); \</span>
102
+ <a name="l00085"></a>00085 <span class="preprocessor"> char datetime_buf[60]; \</span>
103
+ <a name="l00086"></a>00086 <span class="preprocessor"> struct timeval tv; \</span>
104
+ <a name="l00087"></a>00087 <span class="preprocessor"> strftime(datetime_buf, sizeof(datetime_buf), "%x %H:%M:%S", the_tm); \</span>
105
+ <a name="l00088"></a>00088 <span class="preprocessor"> gettimeofday(&amp;tv, NULL); \</span>
106
+ <a name="l00089"></a>00089 <span class="preprocessor"> *Passenger::_debugStream &lt;&lt; \</span>
107
+ <a name="l00090"></a>00090 <span class="preprocessor"> "[ pid=" &lt;&lt; getpid() &lt;&lt; " file=" &lt;&lt; __FILE__ &lt;&lt; ":" &lt;&lt; __LINE__ &lt;&lt; \</span>
108
+ <a name="l00091"></a>00091 <span class="preprocessor"> " time=" &lt;&lt; datetime_buf &lt;&lt; "." &lt;&lt; (tv.tv_usec / 1000) &lt;&lt; " ]:" &lt;&lt; \</span>
109
+ <a name="l00092"></a>00092 <span class="preprocessor"> "\n " &lt;&lt; expr &lt;&lt; std::endl; \</span>
110
+ <a name="l00093"></a>00093 <span class="preprocessor"> } \</span>
111
+ <a name="l00094"></a>00094 <span class="preprocessor"> } \</span>
112
+ <a name="l00095"></a>00095 <span class="preprocessor"> } while (false)</span>
113
+ <a name="l00096"></a>00096 <span class="preprocessor"></span>
114
+ <a name="l00097"></a>00097 <span class="preprocessor"> #define P_ASSERT(expr, result_if_failed, message) \</span>
115
+ <a name="l00098"></a>00098 <span class="preprocessor"> do { \</span>
116
+ <a name="l00099"></a>00099 <span class="preprocessor"> if (!(expr)) { \</span>
117
+ <a name="l00100"></a>00100 <span class="preprocessor"> P_ERROR("Assertion failed: " &lt;&lt; message); \</span>
118
+ <a name="l00101"></a>00101 <span class="preprocessor"> return result_if_failed; \</span>
119
+ <a name="l00102"></a>00102 <span class="preprocessor"> } \</span>
120
+ <a name="l00103"></a>00103 <span class="preprocessor"> } while (false)</span>
121
+ <a name="l00104"></a>00104 <span class="preprocessor"></span><span class="preprocessor">#else</span>
122
+ <a name="l00105"></a>00105 <span class="preprocessor"></span><span class="preprocessor"> #define P_TRACE(level, expr) do { </span><span class="comment">/* nothing */</span> } while (false)
123
+ <a name="l00106"></a>00106
124
+ <a name="l00107"></a>00107 <span class="preprocessor"> #define P_ASSERT(expr, result_if_failed, message) do { </span><span class="comment">/* nothing */</span> } while (false)
125
+ <a name="l00108"></a>00108 <span class="preprocessor">#endif</span>
126
+ <a name="l00109"></a>00109 <span class="preprocessor"></span>
127
+ <a name="l00110"></a>00110 } <span class="comment">// namespace Passenger</span>
128
+ <a name="l00111"></a>00111
129
+ <a name="l00112"></a>00112 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_LOGGING_H_ */</span>
130
+ <a name="l00113"></a>00113
131
+ </pre></div></div>
132
+ <hr size="1"><address style="text-align: right;"><small>Generated on Mon Dec 1 14:27:22 2008 for Passenger by&nbsp;
133
+ <a href="http://www.doxygen.org/index.html">
134
+ <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.5 </small></address>
135
+ </body>
136
+ </html>
@@ -0,0 +1,524 @@
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: MessageChannel.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="namespaces.html"><span>Namespaces</span></a></li>
14
+ <li><a href="annotated.html"><span>Classes</span></a></li>
15
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
16
+ </ul>
17
+ </div>
18
+ <h1>MessageChannel.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
19
+ <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
20
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2008 Phusion</span>
21
+ <a name="l00004"></a>00004 <span class="comment"> *</span>
22
+ <a name="l00005"></a>00005 <span class="comment"> * Phusion Passenger is a trademark of Hongli Lai &amp; Ninh Bui.</span>
23
+ <a name="l00006"></a>00006 <span class="comment"> *</span>
24
+ <a name="l00007"></a>00007 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
25
+ <a name="l00008"></a>00008 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
26
+ <a name="l00009"></a>00009 <span class="comment"> * the Free Software Foundation; version 2 of the License.</span>
27
+ <a name="l00010"></a>00010 <span class="comment"> *</span>
28
+ <a name="l00011"></a>00011 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
29
+ <a name="l00012"></a>00012 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
30
+ <a name="l00013"></a>00013 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
31
+ <a name="l00014"></a>00014 <span class="comment"> * GNU General Public License for more details.</span>
32
+ <a name="l00015"></a>00015 <span class="comment"> *</span>
33
+ <a name="l00016"></a>00016 <span class="comment"> * You should have received a copy of the GNU General Public License along</span>
34
+ <a name="l00017"></a>00017 <span class="comment"> * with this program; if not, write to the Free Software Foundation, Inc.,</span>
35
+ <a name="l00018"></a>00018 <span class="comment"> * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span>
36
+ <a name="l00019"></a>00019 <span class="comment"> */</span>
37
+ <a name="l00020"></a>00020 <span class="preprocessor">#ifndef _PASSENGER_MESSAGE_CHANNEL_H_</span>
38
+ <a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_MESSAGE_CHANNEL_H_</span>
39
+ <a name="l00022"></a>00022 <span class="preprocessor"></span>
40
+ <a name="l00023"></a>00023 <span class="preprocessor">#include &lt;algorithm&gt;</span>
41
+ <a name="l00024"></a>00024 <span class="preprocessor">#include &lt;string&gt;</span>
42
+ <a name="l00025"></a>00025 <span class="preprocessor">#include &lt;list&gt;</span>
43
+ <a name="l00026"></a>00026 <span class="preprocessor">#include &lt;vector&gt;</span>
44
+ <a name="l00027"></a>00027
45
+ <a name="l00028"></a>00028 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
46
+ <a name="l00029"></a>00029 <span class="preprocessor">#include &lt;sys/socket.h&gt;</span>
47
+ <a name="l00030"></a>00030 <span class="preprocessor">#include &lt;arpa/inet.h&gt;</span>
48
+ <a name="l00031"></a>00031 <span class="preprocessor">#include &lt;errno.h&gt;</span>
49
+ <a name="l00032"></a>00032 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
50
+ <a name="l00033"></a>00033 <span class="preprocessor">#include &lt;cstdarg&gt;</span>
51
+ <a name="l00034"></a>00034
52
+ <a name="l00035"></a>00035 <span class="preprocessor">#include "System.h"</span>
53
+ <a name="l00036"></a>00036 <span class="preprocessor">#include "Exceptions.h"</span>
54
+ <a name="l00037"></a>00037 <span class="preprocessor">#include "Utils.h"</span>
55
+ <a name="l00038"></a>00038
56
+ <a name="l00039"></a>00039 <span class="keyword">namespace </span>Passenger {
57
+ <a name="l00040"></a>00040
58
+ <a name="l00041"></a>00041 <span class="keyword">using namespace </span>std;
59
+ <a name="l00042"></a>00042 <span class="comment"></span>
60
+ <a name="l00043"></a>00043 <span class="comment">/**</span>
61
+ <a name="l00044"></a>00044 <span class="comment"> * Convenience class for I/O operations on file descriptors.</span>
62
+ <a name="l00045"></a>00045 <span class="comment"> *</span>
63
+ <a name="l00046"></a>00046 <span class="comment"> * This class provides convenience methods for:</span>
64
+ <a name="l00047"></a>00047 <span class="comment"> * - sending and receiving raw data over a file descriptor.</span>
65
+ <a name="l00048"></a>00048 <span class="comment"> * - sending and receiving messages over a file descriptor.</span>
66
+ <a name="l00049"></a>00049 <span class="comment"> * - file descriptor passing over a Unix socket.</span>
67
+ <a name="l00050"></a>00050 <span class="comment"> * All of these methods use exceptions for error reporting.</span>
68
+ <a name="l00051"></a>00051 <span class="comment"> *</span>
69
+ <a name="l00052"></a>00052 <span class="comment"> * There are two kinds of messages:</span>
70
+ <a name="l00053"></a>00053 <span class="comment"> * - Array messages. These are just a list of strings, and the message</span>
71
+ <a name="l00054"></a>00054 <span class="comment"> * itself has a specific length. The contained strings may not</span>
72
+ <a name="l00055"></a>00055 <span class="comment"> * contain NUL characters (&lt;tt&gt;'\\0'&lt;/tt&gt;). Note that an array message</span>
73
+ <a name="l00056"></a>00056 <span class="comment"> * must have at least one element.</span>
74
+ <a name="l00057"></a>00057 <span class="comment"> * - Scalar messages. These are byte strings which may contain arbitrary</span>
75
+ <a name="l00058"></a>00058 <span class="comment"> * binary data. Scalar messages also have a specific length.</span>
76
+ <a name="l00059"></a>00059 <span class="comment"> * The protocol is designed to be low overhead, easy to implement and</span>
77
+ <a name="l00060"></a>00060 <span class="comment"> * easy to parse.</span>
78
+ <a name="l00061"></a>00061 <span class="comment"> *</span>
79
+ <a name="l00062"></a>00062 <span class="comment"> * MessageChannel is to be wrapped around a file descriptor. For example:</span>
80
+ <a name="l00063"></a>00063 <span class="comment"> * @code</span>
81
+ <a name="l00064"></a>00064 <span class="comment"> * int p[2];</span>
82
+ <a name="l00065"></a>00065 <span class="comment"> * pipe(p);</span>
83
+ <a name="l00066"></a>00066 <span class="comment"> * MessageChannel channel1(p[0]);</span>
84
+ <a name="l00067"></a>00067 <span class="comment"> * MessageChannel channel2(p[1]);</span>
85
+ <a name="l00068"></a>00068 <span class="comment"> * </span>
86
+ <a name="l00069"></a>00069 <span class="comment"> * // Send an array message.</span>
87
+ <a name="l00070"></a>00070 <span class="comment"> * channel2.write("hello", "world !!", NULL);</span>
88
+ <a name="l00071"></a>00071 <span class="comment"> * list&lt;string&gt; args;</span>
89
+ <a name="l00072"></a>00072 <span class="comment"> * channel1.read(args); // args now contains { "hello", "world !!" }</span>
90
+ <a name="l00073"></a>00073 <span class="comment"> *</span>
91
+ <a name="l00074"></a>00074 <span class="comment"> * // Send a scalar message.</span>
92
+ <a name="l00075"></a>00075 <span class="comment"> * channel2.writeScalar("some long string which can contain arbitrary binary data");</span>
93
+ <a name="l00076"></a>00076 <span class="comment"> * string str;</span>
94
+ <a name="l00077"></a>00077 <span class="comment"> * channel1.readScalar(str);</span>
95
+ <a name="l00078"></a>00078 <span class="comment"> * @endcode</span>
96
+ <a name="l00079"></a>00079 <span class="comment"> *</span>
97
+ <a name="l00080"></a>00080 <span class="comment"> * The life time of a MessageChannel is independent from that of the</span>
98
+ <a name="l00081"></a>00081 <span class="comment"> * wrapped file descriptor. If a MessageChannel object is destroyed,</span>
99
+ <a name="l00082"></a>00082 <span class="comment"> * the file descriptor is not automatically closed. Call close()</span>
100
+ <a name="l00083"></a>00083 <span class="comment"> * if you want to close the file descriptor.</span>
101
+ <a name="l00084"></a>00084 <span class="comment"> *</span>
102
+ <a name="l00085"></a>00085 <span class="comment"> * @note I/O operations are not buffered.</span>
103
+ <a name="l00086"></a>00086 <span class="comment"> * @note Be careful with mixing the sending/receiving of array messages,</span>
104
+ <a name="l00087"></a>00087 <span class="comment"> * scalar messages and file descriptors. If you send a collection of any</span>
105
+ <a name="l00088"></a>00088 <span class="comment"> * of these in a specific order, then the receiving side must receive them</span>
106
+ <a name="l00089"></a>00089 <span class="comment"> * in the exact some order. So suppose you first send a message, then a</span>
107
+ <a name="l00090"></a>00090 <span class="comment"> * file descriptor, then a scalar, then the receiving side must first</span>
108
+ <a name="l00091"></a>00091 <span class="comment"> * receive a message, then a file descriptor, then a scalar. If the</span>
109
+ <a name="l00092"></a>00092 <span class="comment"> * receiving side does things in the wrong order then bad things will</span>
110
+ <a name="l00093"></a>00093 <span class="comment"> * happen.</span>
111
+ <a name="l00094"></a>00094 <span class="comment"> * @note MessageChannel is not thread-safe, but is reentrant.</span>
112
+ <a name="l00095"></a>00095 <span class="comment"> *</span>
113
+ <a name="l00096"></a>00096 <span class="comment"> * @ingroup Support</span>
114
+ <a name="l00097"></a>00097 <span class="comment"> */</span>
115
+ <a name="l00098"></a><a class="code" href="classPassenger_1_1MessageChannel.html">00098</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1MessageChannel.html" title="Convenience class for I/O operations on file descriptors.">MessageChannel</a> {
116
+ <a name="l00099"></a>00099 <span class="keyword">private</span>:
117
+ <a name="l00100"></a>00100 <span class="keyword">const</span> <span class="keyword">static</span> <span class="keywordtype">char</span> DELIMITER = <span class="charliteral">'\0'</span>;
118
+ <a name="l00101"></a>00101 <span class="keywordtype">int</span> fd;
119
+ <a name="l00102"></a>00102
120
+ <a name="l00103"></a>00103 <span class="keyword">public</span>:<span class="comment"></span>
121
+ <a name="l00104"></a>00104 <span class="comment"> /**</span>
122
+ <a name="l00105"></a>00105 <span class="comment"> * Construct a new MessageChannel with no underlying file descriptor.</span>
123
+ <a name="l00106"></a>00106 <span class="comment"> * Thus the resulting MessageChannel object will not be usable.</span>
124
+ <a name="l00107"></a>00107 <span class="comment"> * This constructor exists to allow one to declare an "empty"</span>
125
+ <a name="l00108"></a>00108 <span class="comment"> * MessageChannel variable which is to be initialized later.</span>
126
+ <a name="l00109"></a>00109 <span class="comment"> */</span>
127
+ <a name="l00110"></a><a class="code" href="classPassenger_1_1MessageChannel.html#73e7c9a8e421d29558838176aff02ca4">00110</a> <a class="code" href="classPassenger_1_1MessageChannel.html#73e7c9a8e421d29558838176aff02ca4" title="Construct a new MessageChannel with no underlying file descriptor.">MessageChannel</a>() {
128
+ <a name="l00111"></a>00111 this-&gt;fd = -1;
129
+ <a name="l00112"></a>00112 }
130
+ <a name="l00113"></a>00113 <span class="comment"></span>
131
+ <a name="l00114"></a>00114 <span class="comment"> /**</span>
132
+ <a name="l00115"></a>00115 <span class="comment"> * Construct a new MessageChannel with the given file descriptor.</span>
133
+ <a name="l00116"></a>00116 <span class="comment"> */</span>
134
+ <a name="l00117"></a><a class="code" href="classPassenger_1_1MessageChannel.html#486b6e74c4d0973eefbcfde65f898ca7">00117</a> <a class="code" href="classPassenger_1_1MessageChannel.html#73e7c9a8e421d29558838176aff02ca4" title="Construct a new MessageChannel with no underlying file descriptor.">MessageChannel</a>(<span class="keywordtype">int</span> fd) {
135
+ <a name="l00118"></a>00118 this-&gt;fd = fd;
136
+ <a name="l00119"></a>00119 }
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"> * Close the underlying file descriptor. If this method is called multiple</span>
140
+ <a name="l00123"></a>00123 <span class="comment"> * times, the file descriptor will only be closed the first time.</span>
141
+ <a name="l00124"></a>00124 <span class="comment"> *</span>
142
+ <a name="l00125"></a>00125 <span class="comment"> * @throw SystemException</span>
143
+ <a name="l00126"></a>00126 <span class="comment"> * @throw boost::thread_interrupted</span>
144
+ <a name="l00127"></a>00127 <span class="comment"> */</span>
145
+ <a name="l00128"></a><a class="code" href="classPassenger_1_1MessageChannel.html#06309e208fc5e10642a2e9bbe0f351eb">00128</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1MessageChannel.html#06309e208fc5e10642a2e9bbe0f351eb" title="Close the underlying file descriptor.">close</a>() {
146
+ <a name="l00129"></a>00129 <span class="keywordflow">if</span> (fd != -1) {
147
+ <a name="l00130"></a>00130 <span class="keywordtype">int</span> ret = InterruptableCalls::close(fd);
148
+ <a name="l00131"></a>00131 <span class="keywordflow">if</span> (ret == -1) {
149
+ <a name="l00132"></a>00132 <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 close file descriptor"</span>, errno);
150
+ <a name="l00133"></a>00133 }
151
+ <a name="l00134"></a>00134 fd = -1;
152
+ <a name="l00135"></a>00135 }
153
+ <a name="l00136"></a>00136 }
154
+ <a name="l00137"></a>00137 <span class="comment"></span>
155
+ <a name="l00138"></a>00138 <span class="comment"> /**</span>
156
+ <a name="l00139"></a>00139 <span class="comment"> * Send an array message, which consists of the given elements, over the underlying</span>
157
+ <a name="l00140"></a>00140 <span class="comment"> * file descriptor.</span>
158
+ <a name="l00141"></a>00141 <span class="comment"> *</span>
159
+ <a name="l00142"></a>00142 <span class="comment"> * @param args The message elements.</span>
160
+ <a name="l00143"></a>00143 <span class="comment"> * @throws SystemException An error occured while writing the data to the file descriptor.</span>
161
+ <a name="l00144"></a>00144 <span class="comment"> * @throws boost::thread_interrupted</span>
162
+ <a name="l00145"></a>00145 <span class="comment"> * @pre None of the message elements may contain a NUL character (&lt;tt&gt;'\\0'&lt;/tt&gt;).</span>
163
+ <a name="l00146"></a>00146 <span class="comment"> * @see read(), write(const char *, ...)</span>
164
+ <a name="l00147"></a>00147 <span class="comment"> */</span>
165
+ <a name="l00148"></a><a class="code" href="classPassenger_1_1MessageChannel.html#9ad7a978cf8409e01ab2f0a2b6be5a0a">00148</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1MessageChannel.html#9ad7a978cf8409e01ab2f0a2b6be5a0a" title="Send an array message, which consists of the given elements, over the underlying...">write</a>(<span class="keyword">const</span> list&lt;string&gt; &amp;args) {
166
+ <a name="l00149"></a>00149 list&lt;string&gt;::const_iterator it;
167
+ <a name="l00150"></a>00150 <span class="keywordtype">string</span> data;
168
+ <a name="l00151"></a>00151 uint16_t dataSize = 0;
169
+ <a name="l00152"></a>00152
170
+ <a name="l00153"></a>00153 <span class="keywordflow">for</span> (it = args.begin(); it != args.end(); it++) {
171
+ <a name="l00154"></a>00154 dataSize += it-&gt;size() + 1;
172
+ <a name="l00155"></a>00155 }
173
+ <a name="l00156"></a>00156 data.reserve(dataSize + <span class="keyword">sizeof</span>(dataSize));
174
+ <a name="l00157"></a>00157 dataSize = htons(dataSize);
175
+ <a name="l00158"></a>00158 data.append((<span class="keyword">const</span> <span class="keywordtype">char</span> *) &amp;dataSize, <span class="keyword">sizeof</span>(dataSize));
176
+ <a name="l00159"></a>00159 <span class="keywordflow">for</span> (it = args.begin(); it != args.end(); it++) {
177
+ <a name="l00160"></a>00160 data.append(*it);
178
+ <a name="l00161"></a>00161 data.append(1, DELIMITER);
179
+ <a name="l00162"></a>00162 }
180
+ <a name="l00163"></a>00163
181
+ <a name="l00164"></a>00164 <a class="code" href="classPassenger_1_1MessageChannel.html#069314e4c7e1fe8c8ab36e16d2cc5fef" title="Send a block of data over the underlying file descriptor.">writeRaw</a>(data);
182
+ <a name="l00165"></a>00165 }
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"> * Send an array message, which consists of the given strings, over the underlying</span>
186
+ <a name="l00169"></a>00169 <span class="comment"> * file descriptor.</span>
187
+ <a name="l00170"></a>00170 <span class="comment"> *</span>
188
+ <a name="l00171"></a>00171 <span class="comment"> * @param name The first element of the message to send.</span>
189
+ <a name="l00172"></a>00172 <span class="comment"> * @param ... Other elements of the message. These *must* be strings, i.e. of type char*.</span>
190
+ <a name="l00173"></a>00173 <span class="comment"> * It is also required to terminate this list with a NULL.</span>
191
+ <a name="l00174"></a>00174 <span class="comment"> * @throws SystemException An error occured while writing the data to the file descriptor.</span>
192
+ <a name="l00175"></a>00175 <span class="comment"> * @throws boost::thread_interrupted</span>
193
+ <a name="l00176"></a>00176 <span class="comment"> * @pre None of the message elements may contain a NUL character (&lt;tt&gt;'\\0'&lt;/tt&gt;).</span>
194
+ <a name="l00177"></a>00177 <span class="comment"> * @see read(), write(const list&lt;string&gt; &amp;)</span>
195
+ <a name="l00178"></a>00178 <span class="comment"> */</span>
196
+ <a name="l00179"></a><a class="code" href="classPassenger_1_1MessageChannel.html#12cce3364023eacbe4fe09006cf3d38d">00179</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1MessageChannel.html#9ad7a978cf8409e01ab2f0a2b6be5a0a" title="Send an array message, which consists of the given elements, over the underlying...">write</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, ...) {
197
+ <a name="l00180"></a>00180 list&lt;string&gt; args;
198
+ <a name="l00181"></a>00181 args.push_back(name);
199
+ <a name="l00182"></a>00182
200
+ <a name="l00183"></a>00183 va_list ap;
201
+ <a name="l00184"></a>00184 va_start(ap, name);
202
+ <a name="l00185"></a>00185 <span class="keywordflow">while</span> (<span class="keyword">true</span>) {
203
+ <a name="l00186"></a>00186 <span class="keyword">const</span> <span class="keywordtype">char</span> *arg = va_arg(ap, <span class="keyword">const</span> <span class="keywordtype">char</span> *);
204
+ <a name="l00187"></a>00187 <span class="keywordflow">if</span> (arg == NULL) {
205
+ <a name="l00188"></a>00188 <span class="keywordflow">break</span>;
206
+ <a name="l00189"></a>00189 } <span class="keywordflow">else</span> {
207
+ <a name="l00190"></a>00190 args.push_back(arg);
208
+ <a name="l00191"></a>00191 }
209
+ <a name="l00192"></a>00192 }
210
+ <a name="l00193"></a>00193 va_end(ap);
211
+ <a name="l00194"></a>00194 <a class="code" href="classPassenger_1_1MessageChannel.html#9ad7a978cf8409e01ab2f0a2b6be5a0a" title="Send an array message, which consists of the given elements, over the underlying...">write</a>(args);
212
+ <a name="l00195"></a>00195 }
213
+ <a name="l00196"></a>00196 <span class="comment"></span>
214
+ <a name="l00197"></a>00197 <span class="comment"> /**</span>
215
+ <a name="l00198"></a>00198 <span class="comment"> * Send a scalar message over the underlying file descriptor.</span>
216
+ <a name="l00199"></a>00199 <span class="comment"> *</span>
217
+ <a name="l00200"></a>00200 <span class="comment"> * @param str The scalar message's content.</span>
218
+ <a name="l00201"></a>00201 <span class="comment"> * @throws SystemException An error occured while writing the data to the file descriptor.</span>
219
+ <a name="l00202"></a>00202 <span class="comment"> * @throws boost::thread_interrupted</span>
220
+ <a name="l00203"></a>00203 <span class="comment"> * @see readScalar(), writeScalar(const char *, unsigned int)</span>
221
+ <a name="l00204"></a>00204 <span class="comment"> */</span>
222
+ <a name="l00205"></a><a class="code" href="classPassenger_1_1MessageChannel.html#44e01a783c48abadeea0d915b9893bfb">00205</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1MessageChannel.html#44e01a783c48abadeea0d915b9893bfb" title="Send a scalar message over the underlying file descriptor.">writeScalar</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;str) {
223
+ <a name="l00206"></a>00206 <a class="code" href="classPassenger_1_1MessageChannel.html#44e01a783c48abadeea0d915b9893bfb" title="Send a scalar message over the underlying file descriptor.">writeScalar</a>(str.c_str(), str.size());
224
+ <a name="l00207"></a>00207 }
225
+ <a name="l00208"></a>00208 <span class="comment"></span>
226
+ <a name="l00209"></a>00209 <span class="comment"> /**</span>
227
+ <a name="l00210"></a>00210 <span class="comment"> * Send a scalar message over the underlying file descriptor.</span>
228
+ <a name="l00211"></a>00211 <span class="comment"> *</span>
229
+ <a name="l00212"></a>00212 <span class="comment"> * @param data The scalar message's content.</span>
230
+ <a name="l00213"></a>00213 <span class="comment"> * @param size The number of bytes in &lt;tt&gt;data&lt;/tt&gt;.</span>
231
+ <a name="l00214"></a>00214 <span class="comment"> * @pre &lt;tt&gt;data != NULL&lt;/tt&gt;</span>
232
+ <a name="l00215"></a>00215 <span class="comment"> * @throws SystemException An error occured while writing the data to the file descriptor.</span>
233
+ <a name="l00216"></a>00216 <span class="comment"> * @throws boost::thread_interrupted</span>
234
+ <a name="l00217"></a>00217 <span class="comment"> * @see readScalar(), writeScalar(const string &amp;)</span>
235
+ <a name="l00218"></a>00218 <span class="comment"> */</span>
236
+ <a name="l00219"></a><a class="code" href="classPassenger_1_1MessageChannel.html#80977020ef895f3ea790c5d28a333dda">00219</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1MessageChannel.html#44e01a783c48abadeea0d915b9893bfb" title="Send a scalar message over the underlying file descriptor.">writeScalar</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size) {
237
+ <a name="l00220"></a>00220 uint32_t l = htonl(size);
238
+ <a name="l00221"></a>00221 <a class="code" href="classPassenger_1_1MessageChannel.html#069314e4c7e1fe8c8ab36e16d2cc5fef" title="Send a block of data over the underlying file descriptor.">writeRaw</a>((<span class="keyword">const</span> <span class="keywordtype">char</span> *) &amp;l, <span class="keyword">sizeof</span>(uint32_t));
239
+ <a name="l00222"></a>00222 <a class="code" href="classPassenger_1_1MessageChannel.html#069314e4c7e1fe8c8ab36e16d2cc5fef" title="Send a block of data over the underlying file descriptor.">writeRaw</a>(data, size);
240
+ <a name="l00223"></a>00223 }
241
+ <a name="l00224"></a>00224 <span class="comment"></span>
242
+ <a name="l00225"></a>00225 <span class="comment"> /**</span>
243
+ <a name="l00226"></a>00226 <span class="comment"> * Send a block of data over the underlying file descriptor.</span>
244
+ <a name="l00227"></a>00227 <span class="comment"> * This method blocks until everything is sent.</span>
245
+ <a name="l00228"></a>00228 <span class="comment"> *</span>
246
+ <a name="l00229"></a>00229 <span class="comment"> * @param data The data to send.</span>
247
+ <a name="l00230"></a>00230 <span class="comment"> * @param size The number of bytes in &lt;tt&gt;data&lt;/tt&gt;.</span>
248
+ <a name="l00231"></a>00231 <span class="comment"> * @pre &lt;tt&gt;data != NULL&lt;/tt&gt;</span>
249
+ <a name="l00232"></a>00232 <span class="comment"> * @throws SystemException An error occured while writing the data to the file descriptor.</span>
250
+ <a name="l00233"></a>00233 <span class="comment"> * @throws boost::thread_interrupted</span>
251
+ <a name="l00234"></a>00234 <span class="comment"> * @see readRaw()</span>
252
+ <a name="l00235"></a>00235 <span class="comment"> */</span>
253
+ <a name="l00236"></a><a class="code" href="classPassenger_1_1MessageChannel.html#069314e4c7e1fe8c8ab36e16d2cc5fef">00236</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1MessageChannel.html#069314e4c7e1fe8c8ab36e16d2cc5fef" title="Send a block of data over the underlying file descriptor.">writeRaw</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size) {
254
+ <a name="l00237"></a>00237 ssize_t ret;
255
+ <a name="l00238"></a>00238 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> written = 0;
256
+ <a name="l00239"></a>00239 <span class="keywordflow">do</span> {
257
+ <a name="l00240"></a>00240 ret = InterruptableCalls::write(fd, data + written, size - written);
258
+ <a name="l00241"></a>00241 <span class="keywordflow">if</span> (ret == -1) {
259
+ <a name="l00242"></a>00242 <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">"write() failed"</span>, errno);
260
+ <a name="l00243"></a>00243 } <span class="keywordflow">else</span> {
261
+ <a name="l00244"></a>00244 written += ret;
262
+ <a name="l00245"></a>00245 }
263
+ <a name="l00246"></a>00246 } <span class="keywordflow">while</span> (written &lt; size);
264
+ <a name="l00247"></a>00247 }
265
+ <a name="l00248"></a>00248 <span class="comment"></span>
266
+ <a name="l00249"></a>00249 <span class="comment"> /**</span>
267
+ <a name="l00250"></a>00250 <span class="comment"> * Send a block of data over the underlying file descriptor.</span>
268
+ <a name="l00251"></a>00251 <span class="comment"> * This method blocks until everything is sent.</span>
269
+ <a name="l00252"></a>00252 <span class="comment"> *</span>
270
+ <a name="l00253"></a>00253 <span class="comment"> * @param data The data to send.</span>
271
+ <a name="l00254"></a>00254 <span class="comment"> * @pre &lt;tt&gt;data != NULL&lt;/tt&gt;</span>
272
+ <a name="l00255"></a>00255 <span class="comment"> * @throws SystemException An error occured while writing the data to the file descriptor.</span>
273
+ <a name="l00256"></a>00256 <span class="comment"> * @throws boost::thread_interrupted</span>
274
+ <a name="l00257"></a>00257 <span class="comment"> */</span>
275
+ <a name="l00258"></a><a class="code" href="classPassenger_1_1MessageChannel.html#cfa38f4f0e22ec16350b8cc159e8e364">00258</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1MessageChannel.html#069314e4c7e1fe8c8ab36e16d2cc5fef" title="Send a block of data over the underlying file descriptor.">writeRaw</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;data) {
276
+ <a name="l00259"></a>00259 <a class="code" href="classPassenger_1_1MessageChannel.html#069314e4c7e1fe8c8ab36e16d2cc5fef" title="Send a block of data over the underlying file descriptor.">writeRaw</a>(data.c_str(), data.size());
277
+ <a name="l00260"></a>00260 }
278
+ <a name="l00261"></a>00261 <span class="comment"></span>
279
+ <a name="l00262"></a>00262 <span class="comment"> /**</span>
280
+ <a name="l00263"></a>00263 <span class="comment"> * Pass a file descriptor. This only works if the underlying file</span>
281
+ <a name="l00264"></a>00264 <span class="comment"> * descriptor is a Unix socket.</span>
282
+ <a name="l00265"></a>00265 <span class="comment"> *</span>
283
+ <a name="l00266"></a>00266 <span class="comment"> * @param fileDescriptor The file descriptor to pass.</span>
284
+ <a name="l00267"></a>00267 <span class="comment"> * @throws SystemException Something went wrong during file descriptor passing.</span>
285
+ <a name="l00268"></a>00268 <span class="comment"> * @throws boost::thread_interrupted</span>
286
+ <a name="l00269"></a>00269 <span class="comment"> * @pre &lt;tt&gt;fileDescriptor &gt;= 0&lt;/tt&gt;</span>
287
+ <a name="l00270"></a>00270 <span class="comment"> * @see readFileDescriptor()</span>
288
+ <a name="l00271"></a>00271 <span class="comment"> */</span>
289
+ <a name="l00272"></a><a class="code" href="classPassenger_1_1MessageChannel.html#73e3f3cda384c085a2af0e820ccd3e98">00272</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1MessageChannel.html#73e3f3cda384c085a2af0e820ccd3e98" title="Pass a file descriptor.">writeFileDescriptor</a>(<span class="keywordtype">int</span> fileDescriptor) {
290
+ <a name="l00273"></a>00273 <span class="keyword">struct </span>msghdr msg;
291
+ <a name="l00274"></a>00274 <span class="keyword">struct </span>iovec vec;
292
+ <a name="l00275"></a>00275 <span class="keywordtype">char</span> dummy[1];
293
+ <a name="l00276"></a>00276 <span class="preprocessor"> #ifdef __APPLE__</span>
294
+ <a name="l00277"></a>00277 <span class="preprocessor"></span> <span class="keyword">struct </span>{
295
+ <a name="l00278"></a>00278 <span class="keyword">struct </span>cmsghdr header;
296
+ <a name="l00279"></a>00279 <span class="keywordtype">int</span> fd;
297
+ <a name="l00280"></a>00280 } control_data;
298
+ <a name="l00281"></a>00281 <span class="preprocessor"> #else</span>
299
+ <a name="l00282"></a>00282 <span class="preprocessor"></span> <span class="keywordtype">char</span> control_data[CMSG_SPACE(<span class="keyword">sizeof</span>(<span class="keywordtype">int</span>))];
300
+ <a name="l00283"></a>00283 <span class="preprocessor"> #endif</span>
301
+ <a name="l00284"></a>00284 <span class="preprocessor"></span> <span class="keyword">struct </span>cmsghdr *control_header;
302
+ <a name="l00285"></a>00285 <span class="keywordtype">int</span> ret;
303
+ <a name="l00286"></a>00286
304
+ <a name="l00287"></a>00287 msg.msg_name = NULL;
305
+ <a name="l00288"></a>00288 msg.msg_namelen = 0;
306
+ <a name="l00289"></a>00289
307
+ <a name="l00290"></a>00290 <span class="comment">/* Linux and Solaris require msg_iov to be non-NULL. */</span>
308
+ <a name="l00291"></a>00291 dummy[0] = <span class="charliteral">'\0'</span>;
309
+ <a name="l00292"></a>00292 vec.iov_base = dummy;
310
+ <a name="l00293"></a>00293 vec.iov_len = <span class="keyword">sizeof</span>(dummy);
311
+ <a name="l00294"></a>00294 msg.msg_iov = &amp;vec;
312
+ <a name="l00295"></a>00295 msg.msg_iovlen = 1;
313
+ <a name="l00296"></a>00296
314
+ <a name="l00297"></a>00297 msg.msg_control = (caddr_t) &amp;control_data;
315
+ <a name="l00298"></a>00298 msg.msg_controllen = <span class="keyword">sizeof</span>(control_data);
316
+ <a name="l00299"></a>00299 msg.msg_flags = 0;
317
+ <a name="l00300"></a>00300
318
+ <a name="l00301"></a>00301 control_header = CMSG_FIRSTHDR(&amp;msg);
319
+ <a name="l00302"></a>00302 control_header-&gt;cmsg_level = SOL_SOCKET;
320
+ <a name="l00303"></a>00303 control_header-&gt;cmsg_type = SCM_RIGHTS;
321
+ <a name="l00304"></a>00304 <span class="preprocessor"> #ifdef __APPLE__</span>
322
+ <a name="l00305"></a>00305 <span class="preprocessor"></span> control_header-&gt;cmsg_len = <span class="keyword">sizeof</span>(control_data);
323
+ <a name="l00306"></a>00306 control_data.fd = fileDescriptor;
324
+ <a name="l00307"></a>00307 <span class="preprocessor"> #else</span>
325
+ <a name="l00308"></a>00308 <span class="preprocessor"></span> control_header-&gt;cmsg_len = CMSG_LEN(<span class="keyword">sizeof</span>(<span class="keywordtype">int</span>));
326
+ <a name="l00309"></a>00309 memcpy(CMSG_DATA(control_header), &amp;fileDescriptor, <span class="keyword">sizeof</span>(<span class="keywordtype">int</span>));
327
+ <a name="l00310"></a>00310 <span class="preprocessor"> #endif</span>
328
+ <a name="l00311"></a>00311 <span class="preprocessor"></span>
329
+ <a name="l00312"></a>00312 ret = InterruptableCalls::sendmsg(fd, &amp;msg, 0);
330
+ <a name="l00313"></a>00313 <span class="keywordflow">if</span> (ret == -1) {
331
+ <a name="l00314"></a>00314 <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 send file descriptor with sendmsg()"</span>, errno);
332
+ <a name="l00315"></a>00315 }
333
+ <a name="l00316"></a>00316 }
334
+ <a name="l00317"></a>00317 <span class="comment"></span>
335
+ <a name="l00318"></a>00318 <span class="comment"> /**</span>
336
+ <a name="l00319"></a>00319 <span class="comment"> * Read an array message from the underlying file descriptor.</span>
337
+ <a name="l00320"></a>00320 <span class="comment"> *</span>
338
+ <a name="l00321"></a>00321 <span class="comment"> * @param args The message will be put in this variable.</span>
339
+ <a name="l00322"></a>00322 <span class="comment"> * @return Whether end-of-file has been reached. If so, then the contents</span>
340
+ <a name="l00323"></a>00323 <span class="comment"> * of &lt;tt&gt;args&lt;/tt&gt; will be undefined.</span>
341
+ <a name="l00324"></a>00324 <span class="comment"> * @throws SystemException If an error occured while receiving the message.</span>
342
+ <a name="l00325"></a>00325 <span class="comment"> * @throws boost::thread_interrupted</span>
343
+ <a name="l00326"></a>00326 <span class="comment"> * @see write()</span>
344
+ <a name="l00327"></a>00327 <span class="comment"> */</span>
345
+ <a name="l00328"></a><a class="code" href="classPassenger_1_1MessageChannel.html#129659b60d1a663337873d2af944431e">00328</a> <span class="keywordtype">bool</span> <a class="code" href="classPassenger_1_1MessageChannel.html#129659b60d1a663337873d2af944431e" title="Read an array message from the underlying file descriptor.">read</a>(vector&lt;string&gt; &amp;args) {
346
+ <a name="l00329"></a>00329 uint16_t size;
347
+ <a name="l00330"></a>00330 <span class="keywordtype">int</span> ret;
348
+ <a name="l00331"></a>00331 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> alreadyRead = 0;
349
+ <a name="l00332"></a>00332
350
+ <a name="l00333"></a>00333 <span class="keywordflow">do</span> {
351
+ <a name="l00334"></a>00334 ret = InterruptableCalls::read(fd, (<span class="keywordtype">char</span> *) &amp;size + alreadyRead, <span class="keyword">sizeof</span>(size) - alreadyRead);
352
+ <a name="l00335"></a>00335 <span class="keywordflow">if</span> (ret == -1) {
353
+ <a name="l00336"></a>00336 <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">"read() failed"</span>, errno);
354
+ <a name="l00337"></a>00337 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ret == 0) {
355
+ <a name="l00338"></a>00338 <span class="keywordflow">return</span> <span class="keyword">false</span>;
356
+ <a name="l00339"></a>00339 }
357
+ <a name="l00340"></a>00340 alreadyRead += ret;
358
+ <a name="l00341"></a>00341 } <span class="keywordflow">while</span> (alreadyRead &lt; <span class="keyword">sizeof</span>(size));
359
+ <a name="l00342"></a>00342 size = ntohs(size);
360
+ <a name="l00343"></a>00343
361
+ <a name="l00344"></a>00344 <span class="keywordtype">string</span> buffer;
362
+ <a name="l00345"></a>00345 args.clear();
363
+ <a name="l00346"></a>00346 buffer.reserve(size);
364
+ <a name="l00347"></a>00347 <span class="keywordflow">while</span> (buffer.size() &lt; size) {
365
+ <a name="l00348"></a>00348 <span class="keywordtype">char</span> tmp[1024 * 8];
366
+ <a name="l00349"></a>00349 ret = InterruptableCalls::read(fd, tmp, min(size - buffer.size(), <span class="keyword">sizeof</span>(tmp)));
367
+ <a name="l00350"></a>00350 <span class="keywordflow">if</span> (ret == -1) {
368
+ <a name="l00351"></a>00351 <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">"read() failed"</span>, errno);
369
+ <a name="l00352"></a>00352 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ret == 0) {
370
+ <a name="l00353"></a>00353 <span class="keywordflow">return</span> <span class="keyword">false</span>;
371
+ <a name="l00354"></a>00354 }
372
+ <a name="l00355"></a>00355 buffer.append(tmp, ret);
373
+ <a name="l00356"></a>00356 }
374
+ <a name="l00357"></a>00357
375
+ <a name="l00358"></a>00358 <span class="keywordflow">if</span> (!buffer.empty()) {
376
+ <a name="l00359"></a>00359 string::size_type start = 0, pos;
377
+ <a name="l00360"></a>00360 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;const_buffer(buffer);
378
+ <a name="l00361"></a>00361 <span class="keywordflow">while</span> ((pos = const_buffer.find(<span class="charliteral">'\0'</span>, start)) != string::npos) {
379
+ <a name="l00362"></a>00362 args.push_back(const_buffer.substr(start, pos - start));
380
+ <a name="l00363"></a>00363 start = pos + 1;
381
+ <a name="l00364"></a>00364 }
382
+ <a name="l00365"></a>00365 }
383
+ <a name="l00366"></a>00366 <span class="keywordflow">return</span> <span class="keyword">true</span>;
384
+ <a name="l00367"></a>00367 }
385
+ <a name="l00368"></a>00368 <span class="comment"></span>
386
+ <a name="l00369"></a>00369 <span class="comment"> /**</span>
387
+ <a name="l00370"></a>00370 <span class="comment"> * Read a scalar message from the underlying file descriptor.</span>
388
+ <a name="l00371"></a>00371 <span class="comment"> *</span>
389
+ <a name="l00372"></a>00372 <span class="comment"> * @param output The message will be put in here.</span>
390
+ <a name="l00373"></a>00373 <span class="comment"> * @returns Whether end-of-file was reached during reading.</span>
391
+ <a name="l00374"></a>00374 <span class="comment"> * @throws SystemException An error occured while writing the data to the file descriptor.</span>
392
+ <a name="l00375"></a>00375 <span class="comment"> * @throws boost::thread_interrupted</span>
393
+ <a name="l00376"></a>00376 <span class="comment"> * @see writeScalar()</span>
394
+ <a name="l00377"></a>00377 <span class="comment"> */</span>
395
+ <a name="l00378"></a><a class="code" href="classPassenger_1_1MessageChannel.html#4ce6a0e751b5e3563bee583c231569bc">00378</a> <span class="keywordtype">bool</span> <a class="code" href="classPassenger_1_1MessageChannel.html#4ce6a0e751b5e3563bee583c231569bc" title="Read a scalar message from the underlying file descriptor.">readScalar</a>(<span class="keywordtype">string</span> &amp;output) {
396
+ <a name="l00379"></a>00379 uint32_t size;
397
+ <a name="l00380"></a>00380 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> remaining;
398
+ <a name="l00381"></a>00381
399
+ <a name="l00382"></a>00382 <span class="keywordflow">if</span> (!<a class="code" href="classPassenger_1_1MessageChannel.html#cd1d1bd1cc787784c8b54f5471fff479" title="Read exactly size bytes of data from the underlying file descriptor, and put the...">readRaw</a>(&amp;size, <span class="keyword">sizeof</span>(uint32_t))) {
400
+ <a name="l00383"></a>00383 <span class="keywordflow">return</span> <span class="keyword">false</span>;
401
+ <a name="l00384"></a>00384 }
402
+ <a name="l00385"></a>00385 size = ntohl(size);
403
+ <a name="l00386"></a>00386
404
+ <a name="l00387"></a>00387 output.clear();
405
+ <a name="l00388"></a>00388 output.reserve(size);
406
+ <a name="l00389"></a>00389 remaining = size;
407
+ <a name="l00390"></a>00390 <span class="keywordflow">while</span> (remaining &gt; 0) {
408
+ <a name="l00391"></a>00391 <span class="keywordtype">char</span> buf[1024 * 32];
409
+ <a name="l00392"></a>00392 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockSize = min((<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>) <span class="keyword">sizeof</span>(buf), remaining);
410
+ <a name="l00393"></a>00393
411
+ <a name="l00394"></a>00394 <span class="keywordflow">if</span> (!<a class="code" href="classPassenger_1_1MessageChannel.html#cd1d1bd1cc787784c8b54f5471fff479" title="Read exactly size bytes of data from the underlying file descriptor, and put the...">readRaw</a>(buf, blockSize)) {
412
+ <a name="l00395"></a>00395 <span class="keywordflow">return</span> <span class="keyword">false</span>;
413
+ <a name="l00396"></a>00396 }
414
+ <a name="l00397"></a>00397 output.append(buf, blockSize);
415
+ <a name="l00398"></a>00398 remaining -= blockSize;
416
+ <a name="l00399"></a>00399 }
417
+ <a name="l00400"></a>00400 <span class="keywordflow">return</span> <span class="keyword">true</span>;
418
+ <a name="l00401"></a>00401 }
419
+ <a name="l00402"></a>00402 <span class="comment"></span>
420
+ <a name="l00403"></a>00403 <span class="comment"> /**</span>
421
+ <a name="l00404"></a>00404 <span class="comment"> * Read exactly &lt;tt&gt;size&lt;/tt&gt; bytes of data from the underlying file descriptor,</span>
422
+ <a name="l00405"></a>00405 <span class="comment"> * and put the result in &lt;tt&gt;buf&lt;/tt&gt;. If end-of-file has been reached, or if</span>
423
+ <a name="l00406"></a>00406 <span class="comment"> * end-of-file was encountered before &lt;tt&gt;size&lt;/tt&gt; bytes have been read, then</span>
424
+ <a name="l00407"></a>00407 <span class="comment"> * &lt;tt&gt;false&lt;/tt&gt; will be returned. Otherwise (i.e. if the read was successful),</span>
425
+ <a name="l00408"></a>00408 <span class="comment"> * &lt;tt&gt;true&lt;/tt&gt; will be returned.</span>
426
+ <a name="l00409"></a>00409 <span class="comment"> *</span>
427
+ <a name="l00410"></a>00410 <span class="comment"> * @param buf The buffer to place the read data in. This buffer must be at least</span>
428
+ <a name="l00411"></a>00411 <span class="comment"> * &lt;tt&gt;size&lt;/tt&gt; bytes long.</span>
429
+ <a name="l00412"></a>00412 <span class="comment"> * @param size The number of bytes to read.</span>
430
+ <a name="l00413"></a>00413 <span class="comment"> * @return Whether reading was successful or whether EOF was reached.</span>
431
+ <a name="l00414"></a>00414 <span class="comment"> * @pre buf != NULL</span>
432
+ <a name="l00415"></a>00415 <span class="comment"> * @throws SystemException Something went wrong during reading.</span>
433
+ <a name="l00416"></a>00416 <span class="comment"> * @throws boost::thread_interrupted</span>
434
+ <a name="l00417"></a>00417 <span class="comment"> * @see writeRaw()</span>
435
+ <a name="l00418"></a>00418 <span class="comment"> */</span>
436
+ <a name="l00419"></a><a class="code" href="classPassenger_1_1MessageChannel.html#cd1d1bd1cc787784c8b54f5471fff479">00419</a> <span class="keywordtype">bool</span> <a class="code" href="classPassenger_1_1MessageChannel.html#cd1d1bd1cc787784c8b54f5471fff479" title="Read exactly size bytes of data from the underlying file descriptor, and put the...">readRaw</a>(<span class="keywordtype">void</span> *buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size) {
437
+ <a name="l00420"></a>00420 ssize_t ret;
438
+ <a name="l00421"></a>00421 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> alreadyRead = 0;
439
+ <a name="l00422"></a>00422
440
+ <a name="l00423"></a>00423 <span class="keywordflow">while</span> (alreadyRead &lt; size) {
441
+ <a name="l00424"></a>00424 ret = InterruptableCalls::read(fd, (<span class="keywordtype">char</span> *) buf + alreadyRead, size - alreadyRead);
442
+ <a name="l00425"></a>00425 <span class="keywordflow">if</span> (ret == -1) {
443
+ <a name="l00426"></a>00426 <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">"read() failed"</span>, errno);
444
+ <a name="l00427"></a>00427 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ret == 0) {
445
+ <a name="l00428"></a>00428 <span class="keywordflow">return</span> <span class="keyword">false</span>;
446
+ <a name="l00429"></a>00429 } <span class="keywordflow">else</span> {
447
+ <a name="l00430"></a>00430 alreadyRead += ret;
448
+ <a name="l00431"></a>00431 }
449
+ <a name="l00432"></a>00432 }
450
+ <a name="l00433"></a>00433 <span class="keywordflow">return</span> <span class="keyword">true</span>;
451
+ <a name="l00434"></a>00434 }
452
+ <a name="l00435"></a>00435 <span class="comment"></span>
453
+ <a name="l00436"></a>00436 <span class="comment"> /**</span>
454
+ <a name="l00437"></a>00437 <span class="comment"> * Receive a file descriptor, which had been passed over the underlying</span>
455
+ <a name="l00438"></a>00438 <span class="comment"> * file descriptor.</span>
456
+ <a name="l00439"></a>00439 <span class="comment"> *</span>
457
+ <a name="l00440"></a>00440 <span class="comment"> * @return The passed file descriptor.</span>
458
+ <a name="l00441"></a>00441 <span class="comment"> * @throws SystemException If something went wrong during the</span>
459
+ <a name="l00442"></a>00442 <span class="comment"> * receiving of a file descriptor. Perhaps the underlying</span>
460
+ <a name="l00443"></a>00443 <span class="comment"> * file descriptor isn't a Unix socket.</span>
461
+ <a name="l00444"></a>00444 <span class="comment"> * @throws IOException Whatever was received doesn't seem to be a</span>
462
+ <a name="l00445"></a>00445 <span class="comment"> * file descriptor.</span>
463
+ <a name="l00446"></a>00446 <span class="comment"> * @throws boost::thread_interrupted</span>
464
+ <a name="l00447"></a>00447 <span class="comment"> */</span>
465
+ <a name="l00448"></a><a class="code" href="classPassenger_1_1MessageChannel.html#1561b7e4a0f4d39ea431f456e5655488">00448</a> <span class="keywordtype">int</span> <a class="code" href="classPassenger_1_1MessageChannel.html#1561b7e4a0f4d39ea431f456e5655488" title="Receive a file descriptor, which had been passed over the underlying file descriptor...">readFileDescriptor</a>() {
466
+ <a name="l00449"></a>00449 <span class="keyword">struct </span>msghdr msg;
467
+ <a name="l00450"></a>00450 <span class="keyword">struct </span>iovec vec;
468
+ <a name="l00451"></a>00451 <span class="keywordtype">char</span> dummy[1];
469
+ <a name="l00452"></a>00452 <span class="preprocessor"> #ifdef __APPLE__</span>
470
+ <a name="l00453"></a>00453 <span class="preprocessor"></span> <span class="comment">// File descriptor passing macros (CMSG_*) seem to be broken</span>
471
+ <a name="l00454"></a>00454 <span class="comment">// on 64-bit MacOS X. This structure works around the problem.</span>
472
+ <a name="l00455"></a>00455 <span class="keyword">struct </span>{
473
+ <a name="l00456"></a>00456 <span class="keyword">struct </span>cmsghdr header;
474
+ <a name="l00457"></a>00457 <span class="keywordtype">int</span> fd;
475
+ <a name="l00458"></a>00458 } control_data;
476
+ <a name="l00459"></a>00459 <span class="preprocessor"> #define EXPECTED_CMSG_LEN sizeof(control_data)</span>
477
+ <a name="l00460"></a>00460 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
478
+ <a name="l00461"></a>00461 <span class="preprocessor"></span> <span class="keywordtype">char</span> control_data[CMSG_SPACE(<span class="keyword">sizeof</span>(<span class="keywordtype">int</span>))];
479
+ <a name="l00462"></a>00462 <span class="preprocessor"> #define EXPECTED_CMSG_LEN CMSG_LEN(sizeof(int))</span>
480
+ <a name="l00463"></a>00463 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
481
+ <a name="l00464"></a>00464 <span class="preprocessor"></span> <span class="keyword">struct </span>cmsghdr *control_header;
482
+ <a name="l00465"></a>00465 <span class="keywordtype">int</span> ret;
483
+ <a name="l00466"></a>00466
484
+ <a name="l00467"></a>00467 msg.msg_name = NULL;
485
+ <a name="l00468"></a>00468 msg.msg_namelen = 0;
486
+ <a name="l00469"></a>00469
487
+ <a name="l00470"></a>00470 dummy[0] = <span class="charliteral">'\0'</span>;
488
+ <a name="l00471"></a>00471 vec.iov_base = dummy;
489
+ <a name="l00472"></a>00472 vec.iov_len = <span class="keyword">sizeof</span>(dummy);
490
+ <a name="l00473"></a>00473 msg.msg_iov = &amp;vec;
491
+ <a name="l00474"></a>00474 msg.msg_iovlen = 1;
492
+ <a name="l00475"></a>00475
493
+ <a name="l00476"></a>00476 msg.msg_control = (caddr_t) &amp;control_data;
494
+ <a name="l00477"></a>00477 msg.msg_controllen = <span class="keyword">sizeof</span>(control_data);
495
+ <a name="l00478"></a>00478 msg.msg_flags = 0;
496
+ <a name="l00479"></a>00479
497
+ <a name="l00480"></a>00480 ret = InterruptableCalls::recvmsg(fd, &amp;msg, 0);
498
+ <a name="l00481"></a>00481 <span class="keywordflow">if</span> (ret == -1) {
499
+ <a name="l00482"></a>00482 <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 read file descriptor with recvmsg()"</span>, errno);
500
+ <a name="l00483"></a>00483 }
501
+ <a name="l00484"></a>00484
502
+ <a name="l00485"></a>00485 control_header = CMSG_FIRSTHDR(&amp;msg);
503
+ <a name="l00486"></a>00486 <span class="keywordflow">if</span> (control_header-&gt;cmsg_len != EXPECTED_CMSG_LEN
504
+ <a name="l00487"></a>00487 || control_header-&gt;cmsg_level != SOL_SOCKET
505
+ <a name="l00488"></a>00488 || control_header-&gt;cmsg_type != SCM_RIGHTS) {
506
+ <a name="l00489"></a>00489 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1IOException.html" title="Represents an error that occured during an I/O operation.">IOException</a>(<span class="stringliteral">"No valid file descriptor received."</span>);
507
+ <a name="l00490"></a>00490 }
508
+ <a name="l00491"></a>00491 <span class="preprocessor"> #ifdef __APPLE__</span>
509
+ <a name="l00492"></a>00492 <span class="preprocessor"></span> <span class="keywordflow">return</span> control_data.fd;
510
+ <a name="l00493"></a>00493 <span class="preprocessor"> #else</span>
511
+ <a name="l00494"></a>00494 <span class="preprocessor"></span> <span class="keywordflow">return</span> *((<span class="keywordtype">int</span> *) CMSG_DATA(control_header));
512
+ <a name="l00495"></a>00495 <span class="preprocessor"> #endif</span>
513
+ <a name="l00496"></a>00496 <span class="preprocessor"></span> }
514
+ <a name="l00497"></a>00497 };
515
+ <a name="l00498"></a>00498
516
+ <a name="l00499"></a>00499 } <span class="comment">// namespace Passenger</span>
517
+ <a name="l00500"></a>00500
518
+ <a name="l00501"></a>00501 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_MESSAGE_CHANNEL_H_ */</span>
519
+ </pre></div></div>
520
+ <hr size="1"><address style="text-align: right;"><small>Generated on Mon Dec 1 14:27:22 2008 for Passenger by&nbsp;
521
+ <a href="http://www.doxygen.org/index.html">
522
+ <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.5 </small></address>
523
+ </body>
524
+ </html>