rhodes 3.2.0.beta.4 → 3.2.0.beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (667) hide show
  1. data/CHANGELOG +2 -0
  2. data/Manifest.txt +517 -23
  3. data/Rakefile +52 -7
  4. data/doc/build.txt +7 -1
  5. data/doc/device-caps.txt +1 -1
  6. data/doc/install.txt +12 -0
  7. data/doc/jqt-jqm-transition.txt +121 -0
  8. data/doc/release.txt +6 -1
  9. data/doc/ui.txt +4 -2
  10. data/installer/icon.ico +0 -0
  11. data/lib/extensions/barcode/ext/barcode/shared/src/zbar.c +7 -0
  12. data/lib/extensions/barcode/ext/barcode/shared/zbar/rho_bridge.c +3 -3
  13. data/lib/extensions/barcode/ext/barcode/shared/zbar/zbar/README.TXT +74 -3
  14. data/lib/extensions/fcntl/ext/Rakefile +57 -38
  15. data/lib/extensions/fcntl/ext/build.bat +1 -0
  16. data/lib/extensions/fcntl/ext/fcntl.vcproj +323 -0
  17. data/lib/extensions/fileutils/fileutils.rb +57 -33
  18. data/lib/extensions/net-http/net/ftp.rb +40 -36
  19. data/lib/extensions/net-http/net/http.rb +98 -38
  20. data/lib/extensions/net-http/net/https.rb +3 -13
  21. data/lib/extensions/net-http/net/protocol.rb +20 -4
  22. data/lib/extensions/rexml/rexml/document.rb +11 -9
  23. data/lib/extensions/rexml/rexml/element.rb +1 -1
  24. data/lib/extensions/rexml/rexml/entity.rb +1 -1
  25. data/lib/extensions/rexml/rexml/formatters/default.rb +3 -1
  26. data/lib/extensions/rexml/rexml/formatters/pretty.rb +1 -1
  27. data/lib/extensions/rexml/rexml/light/node.rb +1 -2
  28. data/lib/extensions/rexml/rexml/parent.rb +1 -0
  29. data/lib/extensions/rexml/rexml/parsers/xpathparser.rb +2 -1
  30. data/lib/extensions/rexml/rexml/quickpath.rb +4 -1
  31. data/lib/extensions/rexml/rexml/rexml.rb +1 -1
  32. data/lib/extensions/rexml/rexml/source.rb +25 -14
  33. data/lib/extensions/rexml/rexml/text.rb +20 -21
  34. data/lib/extensions/rexml/rexml/xmldecl.rb +2 -2
  35. data/lib/extensions/rexml/rexml/xmltokens.rb +2 -2
  36. data/lib/extensions/rexml/rexml/xpath_parser.rb +2 -1
  37. data/lib/extensions/set/set.rb +100 -25
  38. data/lib/extensions/uri/uri/common.rb +134 -4
  39. data/lib/extensions/uri/uri/ftp.rb +14 -3
  40. data/lib/extensions/uri/uri/generic.rb +53 -44
  41. data/lib/extensions/uri/uri/http.rb +1 -1
  42. data/lib/extensions/uri/uri/https.rb +1 -1
  43. data/lib/extensions/uri/uri/ldap.rb +1 -1
  44. data/lib/extensions/uri/uri/mailto.rb +9 -9
  45. data/lib/framework/rho/rhoviewhelpers.rb +3 -2
  46. data/lib/framework/rholang/localization_simplified.rb +5 -3
  47. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Logger.java +14 -1
  48. data/platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCapture.java +1 -1
  49. data/platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCaptureCallback.java +0 -1
  50. data/platform/android/Rhodes/src/com/rhomobile/rhodes/file/RhoFileApi.java +12 -5
  51. data/platform/android/build/android.rake +7 -7
  52. data/platform/iphone/Classes/AppManager/AppManager.m +19 -7
  53. data/platform/iphone/rbuild/iphone.rake +1 -1
  54. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore +0 -0
  55. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui +0 -0
  56. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtNetwork.framework/Versions/4/QtNetwork +0 -0
  57. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtWebKit.framework/Versions/4/QtWebKit +0 -0
  58. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/phonon.framework/Versions/4/phonon +0 -0
  59. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Info.plist +1 -1
  60. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/MacOS/RhoSimulator +0 -0
  61. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/accessible/libqtaccessiblewidgets.dylib +0 -0
  62. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/bearer/libqgenericbearer.dylib +0 -0
  63. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/codecs/libqcncodecs.dylib +0 -0
  64. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/codecs/libqjpcodecs.dylib +0 -0
  65. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/codecs/libqkrcodecs.dylib +0 -0
  66. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/codecs/libqtwcodecs.dylib +0 -0
  67. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/graphicssystems/libqtracegraphicssystem.dylib +0 -0
  68. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqgif.dylib +0 -0
  69. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqico.dylib +0 -0
  70. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqjpeg.dylib +0 -0
  71. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqmng.dylib +0 -0
  72. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqtiff.dylib +0 -0
  73. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/phonon_backend/libphonon_qt7.dylib +0 -0
  74. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/qmltooling/libqmldbg_tcp.dylib +0 -0
  75. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Resources/rho.icns +0 -0
  76. data/platform/osx/build/osx.rake +25 -3
  77. data/platform/shared/common/AutoPointer.h +1 -1
  78. data/platform/shared/common/RhoStd.h +10 -10
  79. data/platform/shared/common/RhodesAppBase.cpp +3 -0
  80. data/platform/shared/logging/RhoLogConf.cpp +1 -1
  81. data/platform/shared/qt/rhodes/QtMainWindow.cpp +7 -0
  82. data/platform/shared/qt/rhodes/RhoSimulator.h +3 -1
  83. data/platform/shared/qt/rhodes/main.cpp +3 -0
  84. data/platform/shared/qt/rhodes/resources/rho.icns +0 -0
  85. data/platform/shared/qt/rhodes/resources/rho.ico +0 -0
  86. data/platform/shared/qt/rhodes/resources/rho.png +0 -0
  87. data/platform/shared/qt/rhodes/resources/simulator.qrc +5 -0
  88. data/platform/shared/qt/rhodes/rhodes.pro +2 -0
  89. data/platform/shared/ruby/ext/rho/rhosupport.c +21 -2
  90. data/platform/shared/ruby/ext/socket_192/addrinfo.h +191 -0
  91. data/platform/shared/ruby/ext/socket_192/ancdata.c +1800 -0
  92. data/platform/shared/ruby/ext/socket_192/basicsocket.c +771 -0
  93. data/platform/shared/ruby/ext/socket_192/constants.c +145 -0
  94. data/platform/shared/ruby/ext/socket_192/depend +25 -0
  95. data/platform/shared/ruby/ext/socket_192/extconf.rb +365 -0
  96. data/platform/shared/ruby/ext/socket_192/getaddrinfo.c +674 -0
  97. data/platform/shared/ruby/ext/socket_192/getnameinfo.c +260 -0
  98. data/platform/shared/ruby/ext/socket_192/init.c +575 -0
  99. data/platform/shared/ruby/ext/socket_192/ipsocket.c +308 -0
  100. data/platform/shared/ruby/ext/socket_192/lib/socket.rb +755 -0
  101. data/platform/shared/ruby/ext/socket_192/mkconstants.rb +696 -0
  102. data/platform/shared/ruby/ext/socket_192/option.c +692 -0
  103. data/platform/shared/ruby/ext/socket_192/raddrinfo.c +2211 -0
  104. data/platform/shared/ruby/ext/socket_192/rubysocket.h +306 -0
  105. data/platform/shared/ruby/ext/socket_192/socket.c +1870 -0
  106. data/platform/shared/ruby/ext/socket_192/sockport.h +84 -0
  107. data/platform/shared/ruby/ext/socket_192/sockssocket.c +58 -0
  108. data/platform/shared/ruby/ext/socket_192/tcpserver.c +145 -0
  109. data/platform/shared/ruby/ext/socket_192/tcpsocket.c +69 -0
  110. data/platform/shared/ruby/ext/socket_192/udpsocket.c +264 -0
  111. data/platform/shared/ruby/ext/socket_192/unixserver.c +154 -0
  112. data/platform/shared/ruby/ext/socket_192/unixsocket.c +514 -0
  113. data/platform/shared/ruby/ext/stringio/stringio.c +158 -61
  114. data/platform/shared/ruby/ext/strscan/strscan.c +18 -31
  115. data/platform/shared/ruby/iphone/ruby/config.h +2 -1
  116. data/platform/shared/ruby/linux/ruby/config.h +2 -1
  117. data/platform/shared/ruby/symbian/ruby/config.h +2 -1
  118. data/platform/shared/ruby/win32/ruby/config.h +1 -0
  119. data/platform/shared/ruby/win32/ruby/constdefs.c +5866 -0
  120. data/platform/shared/ruby/win32/ruby/constdefs.h +1788 -0
  121. data/platform/shared/ruby/wince/ruby/config.h +1 -0
  122. data/platform/shared/ruby/wince/ruby/constdefs.c +5866 -0
  123. data/platform/shared/ruby/wince/ruby/constdefs.h +1788 -0
  124. data/platform/symbian/build/symbian.rake +8 -0
  125. data/platform/symbian/rhodes/rhodes.pro +3 -3
  126. data/platform/win32/RhoSimulator/RhoSimulator.exe +0 -0
  127. data/platform/wm/build/wm.rake +1 -1
  128. data/platform/wm/rhodes/Rhodes.cpp +3 -0
  129. data/platform/wm/rhodes/rhodes.vcproj +612 -6
  130. data/platform/wm/rhodes/rhosim.rc +394 -0
  131. data/platform/wm/rhodes/simulator/MainWindowQt.cpp +2 -2
  132. data/platform/wp7/RhoRubyLib/common/RhodesApp.cs +8 -2
  133. data/platform/wp7/RhoRubyLib/net/NetRequest.cs +5 -1
  134. data/platform/wp7/build/wp.rake +1 -1
  135. data/rakefile.rb +52 -7
  136. data/res/generators/templates/application/app/layout.erb +4 -4
  137. data/res/generators/templates/application/public/jqmobile/{jquery.mobile-1.0b3.css → jquery.mobile-1.0rc1.css} +507 -457
  138. data/res/generators/templates/application/public/jqmobile/{jquery.mobile-1.0b3.js → jquery.mobile-1.0rc1.js} +565 -458
  139. data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.0rc1.min.css +12 -0
  140. data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.0rc1.min.js +170 -0
  141. data/res/generators/templates/application/public/jquery/{jquery-1.6.3.js → jquery-1.6.4.js} +10 -8
  142. data/res/generators/templates/application/public/jquery/jquery-1.6.4.min.js +4 -0
  143. data/res/generators/templates/application/public/js/jqmobile-patch.js +47 -1
  144. data/res/icons/rho.icns +0 -0
  145. data/res/icons/rho.ico +0 -0
  146. data/res/icons/rho.png +0 -0
  147. data/res/icons/rho.psd +0 -0
  148. data/res/icons/rhodes.icns +0 -0
  149. data/res/icons/rhodes.ico +0 -0
  150. data/res/icons/rhodes.png +0 -0
  151. data/res/icons/rhodes.psd +0 -0
  152. data/res/icons/rhosim.icns +0 -0
  153. data/res/icons/rhosim.ico +0 -0
  154. data/res/icons/rhosim.png +0 -0
  155. data/res/icons/rhosim.psd +0 -0
  156. data/rhodes.gemspec +1 -1
  157. data/spec/framework_spec/app/spec/core/file/expand_path_spec.rb +4 -4
  158. data/spec/framework_spec/app/spec/library/net/FTPError_spec.rb +8 -0
  159. data/spec/framework_spec/app/spec/library/net/FTPPermError_spec.rb +12 -0
  160. data/spec/framework_spec/app/spec/library/net/FTPProtoError_spec.rb +12 -0
  161. data/spec/framework_spec/app/spec/library/net/FTPReplyError_spec.rb +12 -0
  162. data/spec/framework_spec/app/spec/library/net/FTPTempError_spec.rb +12 -0
  163. data/spec/framework_spec/app/spec/library/net/ftp/abort_spec.rb +62 -0
  164. data/spec/framework_spec/app/spec/library/net/ftp/acct_spec.rb +58 -0
  165. data/spec/framework_spec/app/spec/library/net/ftp/binary_spec.rb +24 -0
  166. data/spec/framework_spec/app/spec/library/net/ftp/chdir_spec.rb +101 -0
  167. data/spec/framework_spec/app/spec/library/net/ftp/close_spec.rb +28 -0
  168. data/spec/framework_spec/app/spec/library/net/ftp/closed_spec.rb +21 -0
  169. data/spec/framework_spec/app/spec/library/net/ftp/connect_spec.rb +49 -0
  170. data/spec/framework_spec/app/spec/library/net/ftp/debug_mode_spec.rb +23 -0
  171. data/spec/framework_spec/app/spec/library/net/ftp/delete_spec.rb +59 -0
  172. data/spec/framework_spec/app/spec/library/net/ftp/dir_spec.rb +8 -0
  173. data/spec/framework_spec/app/spec/library/net/ftp/fixtures/putbinaryfile +3 -0
  174. data/spec/framework_spec/app/spec/library/net/ftp/fixtures/puttextfile +3 -0
  175. data/spec/framework_spec/app/spec/library/net/ftp/fixtures/server.rb +258 -0
  176. data/spec/framework_spec/app/spec/library/net/ftp/get_spec.rb +21 -0
  177. data/spec/framework_spec/app/spec/library/net/ftp/getbinaryfile_spec.rb +8 -0
  178. data/spec/framework_spec/app/spec/library/net/ftp/getdir_spec.rb +7 -0
  179. data/spec/framework_spec/app/spec/library/net/ftp/gettextfile_spec.rb +8 -0
  180. data/spec/framework_spec/app/spec/library/net/ftp/help_spec.rb +66 -0
  181. data/spec/framework_spec/app/spec/library/net/ftp/initialize_spec.rb +87 -0
  182. data/spec/framework_spec/app/spec/library/net/ftp/last_response_code_spec.rb +8 -0
  183. data/spec/framework_spec/app/spec/library/net/ftp/last_response_spec.rb +25 -0
  184. data/spec/framework_spec/app/spec/library/net/ftp/lastresp_spec.rb +8 -0
  185. data/spec/framework_spec/app/spec/library/net/ftp/list_spec.rb +8 -0
  186. data/spec/framework_spec/app/spec/library/net/ftp/login_spec.rb +216 -0
  187. data/spec/framework_spec/app/spec/library/net/ftp/ls_spec.rb +8 -0
  188. data/spec/framework_spec/app/spec/library/net/ftp/mdtm_spec.rb +38 -0
  189. data/spec/framework_spec/app/spec/library/net/ftp/mkdir_spec.rb +61 -0
  190. data/spec/framework_spec/app/spec/library/net/ftp/mtime_spec.rb +50 -0
  191. data/spec/framework_spec/app/spec/library/net/ftp/nlst_spec.rb +122 -0
  192. data/spec/framework_spec/app/spec/library/net/ftp/noop_spec.rb +38 -0
  193. data/spec/framework_spec/app/spec/library/net/ftp/open_spec.rb +55 -0
  194. data/spec/framework_spec/app/spec/library/net/ftp/passive_spec.rb +24 -0
  195. data/spec/framework_spec/app/spec/library/net/ftp/put_spec.rb +21 -0
  196. data/spec/framework_spec/app/spec/library/net/ftp/putbinaryfile_spec.rb +8 -0
  197. data/spec/framework_spec/app/spec/library/net/ftp/puttextfile_spec.rb +8 -0
  198. data/spec/framework_spec/app/spec/library/net/ftp/pwd_spec.rb +53 -0
  199. data/spec/framework_spec/app/spec/library/net/ftp/quit_spec.rb +33 -0
  200. data/spec/framework_spec/app/spec/library/net/ftp/rename_spec.rb +94 -0
  201. data/spec/framework_spec/app/spec/library/net/ftp/resume_spec.rb +23 -0
  202. data/spec/framework_spec/app/spec/library/net/ftp/retrbinary_spec.rb +31 -0
  203. data/spec/framework_spec/app/spec/library/net/ftp/retrlines_spec.rb +35 -0
  204. data/spec/framework_spec/app/spec/library/net/ftp/return_code_spec.rb +24 -0
  205. data/spec/framework_spec/app/spec/library/net/ftp/rmdir_spec.rb +58 -0
  206. data/spec/framework_spec/app/spec/library/net/ftp/sendcmd_spec.rb +54 -0
  207. data/spec/framework_spec/app/spec/library/net/ftp/set_socket_spec.rb +8 -0
  208. data/spec/framework_spec/app/spec/library/net/ftp/shared/getbinaryfile.rb +180 -0
  209. data/spec/framework_spec/app/spec/library/net/ftp/shared/gettextfile.rb +130 -0
  210. data/spec/framework_spec/app/spec/library/net/ftp/shared/last_response_code.rb +25 -0
  211. data/spec/framework_spec/app/spec/library/net/ftp/shared/list.rb +134 -0
  212. data/spec/framework_spec/app/spec/library/net/ftp/shared/putbinaryfile.rb +233 -0
  213. data/spec/framework_spec/app/spec/library/net/ftp/shared/puttextfile.rb +150 -0
  214. data/spec/framework_spec/app/spec/library/net/ftp/shared/pwd.rb +3 -0
  215. data/spec/framework_spec/app/spec/library/net/ftp/site_spec.rb +53 -0
  216. data/spec/framework_spec/app/spec/library/net/ftp/size_spec.rb +48 -0
  217. data/spec/framework_spec/app/spec/library/net/ftp/status_spec.rb +63 -0
  218. data/spec/framework_spec/app/spec/library/net/ftp/storbinary_spec.rb +49 -0
  219. data/spec/framework_spec/app/spec/library/net/ftp/storlines_spec.rb +44 -0
  220. data/spec/framework_spec/app/spec/library/net/ftp/system_spec.rb +48 -0
  221. data/spec/framework_spec/app/spec/library/net/ftp/voidcmd_spec.rb +54 -0
  222. data/spec/framework_spec/app/spec/library/net/ftp/welcome_spec.rb +25 -0
  223. data/spec/framework_spec/app/spec/library/net/http/HTTPBadResponse_spec.rb +8 -0
  224. data/spec/framework_spec/app/spec/library/net/http/HTTPError_spec.rb +12 -0
  225. data/spec/framework_spec/app/spec/library/net/http/HTTPFatalError_spec.rb +12 -0
  226. data/spec/framework_spec/app/spec/library/net/http/HTTPHeaderSyntaxError_spec.rb +8 -0
  227. data/spec/framework_spec/app/spec/library/net/http/HTTPRetriableError_spec.rb +12 -0
  228. data/spec/framework_spec/app/spec/library/net/http/HTTPServerException_spec.rb +12 -0
  229. data/spec/framework_spec/app/spec/library/net/http/http/Proxy_spec.rb +35 -0
  230. data/spec/framework_spec/app/spec/library/net/http/http/active_spec.rb +8 -0
  231. data/spec/framework_spec/app/spec/library/net/http/http/address_spec.rb +9 -0
  232. data/spec/framework_spec/app/spec/library/net/http/http/close_on_empty_response_spec.rb +10 -0
  233. data/spec/framework_spec/app/spec/library/net/http/http/copy_spec.rb +23 -0
  234. data/spec/framework_spec/app/spec/library/net/http/http/default_port_spec.rb +8 -0
  235. data/spec/framework_spec/app/spec/library/net/http/http/delete_spec.rb +23 -0
  236. data/spec/framework_spec/app/spec/library/net/http/http/finish_spec.rb +31 -0
  237. data/spec/framework_spec/app/spec/library/net/http/http/fixtures/http_server.rb +97 -0
  238. data/spec/framework_spec/app/spec/library/net/http/http/get2_spec.rb +8 -0
  239. data/spec/framework_spec/app/spec/library/net/http/http/get_print_spec.rb +29 -0
  240. data/spec/framework_spec/app/spec/library/net/http/http/get_response_spec.rb +29 -0
  241. data/spec/framework_spec/app/spec/library/net/http/http/get_spec.rb +52 -0
  242. data/spec/framework_spec/app/spec/library/net/http/http/head2_spec.rb +9 -0
  243. data/spec/framework_spec/app/spec/library/net/http/http/head_spec.rb +27 -0
  244. data/spec/framework_spec/app/spec/library/net/http/http/http_default_port_spec.rb +8 -0
  245. data/spec/framework_spec/app/spec/library/net/http/http/https_default_port_spec.rb +8 -0
  246. data/spec/framework_spec/app/spec/library/net/http/http/initialize_spec.rb +46 -0
  247. data/spec/framework_spec/app/spec/library/net/http/http/inspect_spec.rb +26 -0
  248. data/spec/framework_spec/app/spec/library/net/http/http/is_version_1_1_spec.rb +7 -0
  249. data/spec/framework_spec/app/spec/library/net/http/http/is_version_1_2_spec.rb +7 -0
  250. data/spec/framework_spec/app/spec/library/net/http/http/lock_spec.rb +23 -0
  251. data/spec/framework_spec/app/spec/library/net/http/http/mkcol_spec.rb +23 -0
  252. data/spec/framework_spec/app/spec/library/net/http/http/move_spec.rb +27 -0
  253. data/spec/framework_spec/app/spec/library/net/http/http/new_spec.rb +86 -0
  254. data/spec/framework_spec/app/spec/library/net/http/http/newobj_spec.rb +48 -0
  255. data/spec/framework_spec/app/spec/library/net/http/http/open_timeout_spec.rb +24 -0
  256. data/spec/framework_spec/app/spec/library/net/http/http/options_spec.rb +27 -0
  257. data/spec/framework_spec/app/spec/library/net/http/http/port_spec.rb +9 -0
  258. data/spec/framework_spec/app/spec/library/net/http/http/post2_spec.rb +8 -0
  259. data/spec/framework_spec/app/spec/library/net/http/http/post_form_spec.rb +21 -0
  260. data/spec/framework_spec/app/spec/library/net/http/http/post_spec.rb +40 -0
  261. data/spec/framework_spec/app/spec/library/net/http/http/propfind_spec.rb +26 -0
  262. data/spec/framework_spec/app/spec/library/net/http/http/proppatch_spec.rb +26 -0
  263. data/spec/framework_spec/app/spec/library/net/http/http/proxy_address_spec.rb +31 -0
  264. data/spec/framework_spec/app/spec/library/net/http/http/proxy_class_spec.rb +9 -0
  265. data/spec/framework_spec/app/spec/library/net/http/http/proxy_pass_spec.rb +39 -0
  266. data/spec/framework_spec/app/spec/library/net/http/http/proxy_port_spec.rb +39 -0
  267. data/spec/framework_spec/app/spec/library/net/http/http/proxy_user_spec.rb +39 -0
  268. data/spec/framework_spec/app/spec/library/net/http/http/put2_spec.rb +8 -0
  269. data/spec/framework_spec/app/spec/library/net/http/http/put_spec.rb +26 -0
  270. data/spec/framework_spec/app/spec/library/net/http/http/read_timeout_spec.rb +24 -0
  271. data/spec/framework_spec/app/spec/library/net/http/http/request_get_spec.rb +8 -0
  272. data/spec/framework_spec/app/spec/library/net/http/http/request_head_spec.rb +8 -0
  273. data/spec/framework_spec/app/spec/library/net/http/http/request_post_spec.rb +8 -0
  274. data/spec/framework_spec/app/spec/library/net/http/http/request_put_spec.rb +8 -0
  275. data/spec/framework_spec/app/spec/library/net/http/http/request_spec.rb +111 -0
  276. data/spec/framework_spec/app/spec/library/net/http/http/request_types_spec.rb +254 -0
  277. data/spec/framework_spec/app/spec/library/net/http/http/send_request_spec.rb +120 -0
  278. data/spec/framework_spec/app/spec/library/net/http/http/set_debug_output_spec.rb +35 -0
  279. data/spec/framework_spec/app/spec/library/net/http/http/shared/request_get.rb +45 -0
  280. data/spec/framework_spec/app/spec/library/net/http/http/shared/request_head.rb +45 -0
  281. data/spec/framework_spec/app/spec/library/net/http/http/shared/request_post.rb +45 -0
  282. data/spec/framework_spec/app/spec/library/net/http/http/shared/request_put.rb +45 -0
  283. data/spec/framework_spec/app/spec/library/net/http/http/shared/started.rb +28 -0
  284. data/spec/framework_spec/app/spec/library/net/http/http/shared/version_1_1.rb +19 -0
  285. data/spec/framework_spec/app/spec/library/net/http/http/shared/version_1_2.rb +6 -0
  286. data/spec/framework_spec/app/spec/library/net/http/http/socket_type_spec.rb +8 -0
  287. data/spec/framework_spec/app/spec/library/net/http/http/start_spec.rb +103 -0
  288. data/spec/framework_spec/app/spec/library/net/http/http/started_spec.rb +8 -0
  289. data/spec/framework_spec/app/spec/library/net/http/http/trace_spec.rb +26 -0
  290. data/spec/framework_spec/app/spec/library/net/http/http/unlock_spec.rb +26 -0
  291. data/spec/framework_spec/app/spec/library/net/http/http/use_ssl_spec.rb +9 -0
  292. data/spec/framework_spec/app/spec/library/net/http/http/version_1_1_spec.rb +22 -0
  293. data/spec/framework_spec/app/spec/library/net/http/http/version_1_2_spec.rb +20 -0
  294. data/spec/framework_spec/app/spec/library/net/http/httpexceptions/fixtures/classes.rb +5 -0
  295. data/spec/framework_spec/app/spec/library/net/http/httpexceptions/initialize_spec.rb +17 -0
  296. data/spec/framework_spec/app/spec/library/net/http/httpexceptions/response_spec.rb +10 -0
  297. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/body_exist_spec.rb +27 -0
  298. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/body_spec.rb +30 -0
  299. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/body_stream_spec.rb +32 -0
  300. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/exec_spec.rb +122 -0
  301. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/inspect_spec.rb +25 -0
  302. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/method_spec.rb +15 -0
  303. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/path_spec.rb +12 -0
  304. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/request_body_permitted_spec.rb +12 -0
  305. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/response_body_permitted_spec.rb +12 -0
  306. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/set_body_internal_spec.rb +21 -0
  307. data/spec/framework_spec/app/spec/library/net/http/httpheader/add_field_spec.rb +31 -0
  308. data/spec/framework_spec/app/spec/library/net/http/httpheader/basic_auth_spec.rb +14 -0
  309. data/spec/framework_spec/app/spec/library/net/http/httpheader/canonical_each_spec.rb +8 -0
  310. data/spec/framework_spec/app/spec/library/net/http/httpheader/chunked_spec.rb +22 -0
  311. data/spec/framework_spec/app/spec/library/net/http/httpheader/content_length_spec.rb +54 -0
  312. data/spec/framework_spec/app/spec/library/net/http/httpheader/content_range_spec.rb +34 -0
  313. data/spec/framework_spec/app/spec/library/net/http/httpheader/content_type_spec.rb +26 -0
  314. data/spec/framework_spec/app/spec/library/net/http/httpheader/delete_spec.rb +30 -0
  315. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_capitalized_name_spec.rb +45 -0
  316. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_capitalized_spec.rb +9 -0
  317. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_header_spec.rb +8 -0
  318. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_key_spec.rb +8 -0
  319. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_name_spec.rb +8 -0
  320. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_spec.rb +8 -0
  321. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_value_spec.rb +46 -0
  322. data/spec/framework_spec/app/spec/library/net/http/httpheader/element_reference_spec.rb +39 -0
  323. data/spec/framework_spec/app/spec/library/net/http/httpheader/element_set_spec.rb +41 -0
  324. data/spec/framework_spec/app/spec/library/net/http/httpheader/fetch_spec.rb +69 -0
  325. data/spec/framework_spec/app/spec/library/net/http/httpheader/fixtures/classes.rb +11 -0
  326. data/spec/framework_spec/app/spec/library/net/http/httpheader/form_data_spec.rb +8 -0
  327. data/spec/framework_spec/app/spec/library/net/http/httpheader/get_fields_spec.rb +39 -0
  328. data/spec/framework_spec/app/spec/library/net/http/httpheader/initialize_http_header_spec.rb +29 -0
  329. data/spec/framework_spec/app/spec/library/net/http/httpheader/key_spec.rb +21 -0
  330. data/spec/framework_spec/app/spec/library/net/http/httpheader/length_spec.rb +8 -0
  331. data/spec/framework_spec/app/spec/library/net/http/httpheader/main_type_spec.rb +24 -0
  332. data/spec/framework_spec/app/spec/library/net/http/httpheader/proxy_basic_auth_spec.rb +14 -0
  333. data/spec/framework_spec/app/spec/library/net/http/httpheader/range_length_spec.rb +32 -0
  334. data/spec/framework_spec/app/spec/library/net/http/httpheader/range_spec.rb +48 -0
  335. data/spec/framework_spec/app/spec/library/net/http/httpheader/set_content_type_spec.rb +8 -0
  336. data/spec/framework_spec/app/spec/library/net/http/httpheader/set_form_data_spec.rb +8 -0
  337. data/spec/framework_spec/app/spec/library/net/http/httpheader/set_range_spec.rb +8 -0
  338. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/each_capitalized.rb +42 -0
  339. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/each_header.rb +42 -0
  340. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/each_name.rb +39 -0
  341. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/set_content_type.rb +18 -0
  342. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/set_form_data.rb +27 -0
  343. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/set_range.rb +89 -0
  344. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/size.rb +18 -0
  345. data/spec/framework_spec/app/spec/library/net/http/httpheader/size_spec.rb +8 -0
  346. data/spec/framework_spec/app/spec/library/net/http/httpheader/sub_type_spec.rb +32 -0
  347. data/spec/framework_spec/app/spec/library/net/http/httpheader/to_hash_spec.rb +25 -0
  348. data/spec/framework_spec/app/spec/library/net/http/httpheader/type_params_spec.rb +24 -0
  349. data/spec/framework_spec/app/spec/library/net/http/httprequest/initialize_spec.rb +45 -0
  350. data/spec/framework_spec/app/spec/library/net/http/httpresponse/body_permitted_spec.rb +13 -0
  351. data/spec/framework_spec/app/spec/library/net/http/httpresponse/body_spec.rb +7 -0
  352. data/spec/framework_spec/app/spec/library/net/http/httpresponse/code_spec.rb +24 -0
  353. data/spec/framework_spec/app/spec/library/net/http/httpresponse/code_type_spec.rb +24 -0
  354. data/spec/framework_spec/app/spec/library/net/http/httpresponse/entity_spec.rb +7 -0
  355. data/spec/framework_spec/app/spec/library/net/http/httpresponse/error_spec.rb +24 -0
  356. data/spec/framework_spec/app/spec/library/net/http/httpresponse/error_type_spec.rb +24 -0
  357. data/spec/framework_spec/app/spec/library/net/http/httpresponse/exception_type_spec.rb +13 -0
  358. data/spec/framework_spec/app/spec/library/net/http/httpresponse/header_spec.rb +9 -0
  359. data/spec/framework_spec/app/spec/library/net/http/httpresponse/http_version_spec.rb +12 -0
  360. data/spec/framework_spec/app/spec/library/net/http/httpresponse/initialize_spec.rb +11 -0
  361. data/spec/framework_spec/app/spec/library/net/http/httpresponse/inspect_spec.rb +15 -0
  362. data/spec/framework_spec/app/spec/library/net/http/httpresponse/message_spec.rb +9 -0
  363. data/spec/framework_spec/app/spec/library/net/http/httpresponse/msg_spec.rb +9 -0
  364. data/spec/framework_spec/app/spec/library/net/http/httpresponse/read_body_spec.rb +86 -0
  365. data/spec/framework_spec/app/spec/library/net/http/httpresponse/read_header_spec.rb +9 -0
  366. data/spec/framework_spec/app/spec/library/net/http/httpresponse/read_new_spec.rb +22 -0
  367. data/spec/framework_spec/app/spec/library/net/http/httpresponse/reading_body_spec.rb +58 -0
  368. data/spec/framework_spec/app/spec/library/net/http/httpresponse/response_spec.rb +9 -0
  369. data/spec/framework_spec/app/spec/library/net/http/httpresponse/shared/body.rb +18 -0
  370. data/spec/framework_spec/app/spec/library/net/http/httpresponse/to_ary_spec.rb +26 -0
  371. data/spec/framework_spec/app/spec/library/net/http/httpresponse/value_spec.rb +24 -0
  372. data/spec/framework_spec/app/spec/library/rexml/attribute/clone_spec.rb +11 -0
  373. data/spec/framework_spec/app/spec/library/rexml/attribute/element_spec.rb +23 -0
  374. data/spec/framework_spec/app/spec/library/rexml/attribute/equal_value_spec.rb +18 -0
  375. data/spec/framework_spec/app/spec/library/rexml/attribute/hash_spec.rb +13 -0
  376. data/spec/framework_spec/app/spec/library/rexml/attribute/initialize_spec.rb +29 -0
  377. data/spec/framework_spec/app/spec/library/rexml/attribute/inspect_spec.rb +20 -0
  378. data/spec/framework_spec/app/spec/library/rexml/attribute/namespace_spec.rb +24 -0
  379. data/spec/framework_spec/app/spec/library/rexml/attribute/node_type_spec.rb +10 -0
  380. data/spec/framework_spec/app/spec/library/rexml/attribute/prefix_spec.rb +18 -0
  381. data/spec/framework_spec/app/spec/library/rexml/attribute/remove_spec.rb +20 -0
  382. data/spec/framework_spec/app/spec/library/rexml/attribute/to_s_spec.rb +14 -0
  383. data/spec/framework_spec/app/spec/library/rexml/attribute/to_string_spec.rb +15 -0
  384. data/spec/framework_spec/app/spec/library/rexml/attribute/value_spec.rb +15 -0
  385. data/spec/framework_spec/app/spec/library/rexml/attribute/write_spec.rb +23 -0
  386. data/spec/framework_spec/app/spec/library/rexml/attribute/xpath_spec.rb +20 -0
  387. data/spec/framework_spec/app/spec/library/rexml/attributes/add_spec.rb +7 -0
  388. data/spec/framework_spec/app/spec/library/rexml/attributes/append_spec.rb +7 -0
  389. data/spec/framework_spec/app/spec/library/rexml/attributes/delete_all_spec.rb +31 -0
  390. data/spec/framework_spec/app/spec/library/rexml/attributes/delete_spec.rb +27 -0
  391. data/spec/framework_spec/app/spec/library/rexml/attributes/each_attribute_spec.rb +24 -0
  392. data/spec/framework_spec/app/spec/library/rexml/attributes/each_spec.rb +24 -0
  393. data/spec/framework_spec/app/spec/library/rexml/attributes/element_reference_spec.rb +19 -0
  394. data/spec/framework_spec/app/spec/library/rexml/attributes/element_set_spec.rb +26 -0
  395. data/spec/framework_spec/app/spec/library/rexml/attributes/get_attribute_ns_spec.rb +14 -0
  396. data/spec/framework_spec/app/spec/library/rexml/attributes/get_attribute_spec.rb +29 -0
  397. data/spec/framework_spec/app/spec/library/rexml/attributes/initialize_spec.rb +19 -0
  398. data/spec/framework_spec/app/spec/library/rexml/attributes/length_spec.rb +7 -0
  399. data/spec/framework_spec/app/spec/library/rexml/attributes/namespaces_spec.rb +6 -0
  400. data/spec/framework_spec/app/spec/library/rexml/attributes/prefixes_spec.rb +24 -0
  401. data/spec/framework_spec/app/spec/library/rexml/attributes/shared/add.rb +17 -0
  402. data/spec/framework_spec/app/spec/library/rexml/attributes/shared/length.rb +13 -0
  403. data/spec/framework_spec/app/spec/library/rexml/attributes/size_spec.rb +7 -0
  404. data/spec/framework_spec/app/spec/library/rexml/attributes/to_a_spec.rb +20 -0
  405. data/spec/framework_spec/app/spec/library/rexml/cdata/clone_spec.rb +10 -0
  406. data/spec/framework_spec/app/spec/library/rexml/cdata/initialize_spec.rb +25 -0
  407. data/spec/framework_spec/app/spec/library/rexml/cdata/shared/to_s.rb +11 -0
  408. data/spec/framework_spec/app/spec/library/rexml/cdata/to_s_spec.rb +7 -0
  409. data/spec/framework_spec/app/spec/library/rexml/cdata/value_spec.rb +7 -0
  410. data/spec/framework_spec/app/spec/library/rexml/document/add_element_spec.rb +31 -0
  411. data/spec/framework_spec/app/spec/library/rexml/document/add_spec.rb +61 -0
  412. data/spec/framework_spec/app/spec/library/rexml/document/clone_spec.rb +20 -0
  413. data/spec/framework_spec/app/spec/library/rexml/document/doctype_spec.rb +15 -0
  414. data/spec/framework_spec/app/spec/library/rexml/document/encoding_spec.rb +22 -0
  415. data/spec/framework_spec/app/spec/library/rexml/document/expanded_name_spec.rb +16 -0
  416. data/spec/framework_spec/app/spec/library/rexml/document/new_spec.rb +38 -0
  417. data/spec/framework_spec/app/spec/library/rexml/document/node_type_spec.rb +8 -0
  418. data/spec/framework_spec/app/spec/library/rexml/document/root_spec.rb +12 -0
  419. data/spec/framework_spec/app/spec/library/rexml/document/stand_alone_spec.rb +19 -0
  420. data/spec/framework_spec/app/spec/library/rexml/document/version_spec.rb +14 -0
  421. data/spec/framework_spec/app/spec/library/rexml/document/write_spec.rb +39 -0
  422. data/spec/framework_spec/app/spec/library/rexml/document/xml_decl_spec.rb +15 -0
  423. data/spec/framework_spec/app/spec/library/rexml/element/add_attribute_spec.rb +41 -0
  424. data/spec/framework_spec/app/spec/library/rexml/element/add_attributes_spec.rb +22 -0
  425. data/spec/framework_spec/app/spec/library/rexml/element/add_element_spec.rb +39 -0
  426. data/spec/framework_spec/app/spec/library/rexml/element/add_namespace_spec.rb +24 -0
  427. data/spec/framework_spec/app/spec/library/rexml/element/add_text_spec.rb +24 -0
  428. data/spec/framework_spec/app/spec/library/rexml/element/attribute_spec.rb +17 -0
  429. data/spec/framework_spec/app/spec/library/rexml/element/attributes_spec.rb +19 -0
  430. data/spec/framework_spec/app/spec/library/rexml/element/cdatas_spec.rb +24 -0
  431. data/spec/framework_spec/app/spec/library/rexml/element/clone_spec.rb +29 -0
  432. data/spec/framework_spec/app/spec/library/rexml/element/comments_spec.rb +21 -0
  433. data/spec/framework_spec/app/spec/library/rexml/element/delete_attribute_spec.rb +39 -0
  434. data/spec/framework_spec/app/spec/library/rexml/element/delete_element_spec.rb +51 -0
  435. data/spec/framework_spec/app/spec/library/rexml/element/delete_namespace_spec.rb +25 -0
  436. data/spec/framework_spec/app/spec/library/rexml/element/document_spec.rb +18 -0
  437. data/spec/framework_spec/app/spec/library/rexml/element/each_element_with_attribute_spec.rb +35 -0
  438. data/spec/framework_spec/app/spec/library/rexml/element/each_element_with_text_spec.rb +31 -0
  439. data/spec/framework_spec/app/spec/library/rexml/element/get_text_spec.rb +18 -0
  440. data/spec/framework_spec/app/spec/library/rexml/element/has_attributes_spec.rb +17 -0
  441. data/spec/framework_spec/app/spec/library/rexml/element/has_elements_spec.rb +18 -0
  442. data/spec/framework_spec/app/spec/library/rexml/element/has_text_spec.rb +16 -0
  443. data/spec/framework_spec/app/spec/library/rexml/element/inspect_spec.rb +27 -0
  444. data/spec/framework_spec/app/spec/library/rexml/element/instructions_spec.rb +21 -0
  445. data/spec/framework_spec/app/spec/library/rexml/element/namespace_spec.rb +27 -0
  446. data/spec/framework_spec/app/spec/library/rexml/element/namespaces_spec.rb +32 -0
  447. data/spec/framework_spec/app/spec/library/rexml/element/new_spec.rb +35 -0
  448. data/spec/framework_spec/app/spec/library/rexml/element/next_element_spec.rb +19 -0
  449. data/spec/framework_spec/app/spec/library/rexml/element/node_type_spec.rb +8 -0
  450. data/spec/framework_spec/app/spec/library/rexml/element/prefixes_spec.rb +23 -0
  451. data/spec/framework_spec/app/spec/library/rexml/element/previous_element_spec.rb +20 -0
  452. data/spec/framework_spec/app/spec/library/rexml/element/raw_spec.rb +24 -0
  453. data/spec/framework_spec/app/spec/library/rexml/element/root_spec.rb +28 -0
  454. data/spec/framework_spec/app/spec/library/rexml/element/text_spec.rb +46 -0
  455. data/spec/framework_spec/app/spec/library/rexml/element/texts_spec.rb +16 -0
  456. data/spec/framework_spec/app/spec/library/rexml/element/whitespace_spec.rb +23 -0
  457. data/spec/framework_spec/app/spec/library/rexml/node/each_recursive_spec.rb +21 -0
  458. data/spec/framework_spec/app/spec/library/rexml/node/find_first_recursive_spec.rb +25 -0
  459. data/spec/framework_spec/app/spec/library/rexml/node/index_in_parent_spec.rb +15 -0
  460. data/spec/framework_spec/app/spec/library/rexml/node/next_sibling_node_spec.rb +21 -0
  461. data/spec/framework_spec/app/spec/library/rexml/node/parent_spec.rb +21 -0
  462. data/spec/framework_spec/app/spec/library/rexml/node/previous_sibling_node_spec.rb +21 -0
  463. data/spec/framework_spec/app/spec/library/rexml/shared/each_element.rb +36 -0
  464. data/spec/framework_spec/app/spec/library/rexml/shared/elements_to_a.rb +36 -0
  465. data/spec/framework_spec/app/spec/library/rexml/text/append_spec.rb +10 -0
  466. data/spec/framework_spec/app/spec/library/rexml/text/clone_spec.rb +10 -0
  467. data/spec/framework_spec/app/spec/library/rexml/text/comparison_spec.rb +25 -0
  468. data/spec/framework_spec/app/spec/library/rexml/text/empty_spec.rb +12 -0
  469. data/spec/framework_spec/app/spec/library/rexml/text/indent_text_spec.rb +24 -0
  470. data/spec/framework_spec/app/spec/library/rexml/text/inspect_spec.rb +8 -0
  471. data/spec/framework_spec/app/spec/library/rexml/text/new_spec.rb +49 -0
  472. data/spec/framework_spec/app/spec/library/rexml/text/node_type_spec.rb +8 -0
  473. data/spec/framework_spec/app/spec/library/rexml/text/normalize_spec.rb +8 -0
  474. data/spec/framework_spec/app/spec/library/rexml/text/read_with_substitution_spec.rb +13 -0
  475. data/spec/framework_spec/app/spec/library/rexml/text/to_s_spec.rb +18 -0
  476. data/spec/framework_spec/app/spec/library/rexml/text/unnormalize_spec.rb +8 -0
  477. data/spec/framework_spec/app/spec/library/rexml/text/value_spec.rb +37 -0
  478. data/spec/framework_spec/app/spec/library/rexml/text/wrap_spec.rb +21 -0
  479. data/spec/framework_spec/app/spec/library/rexml/text/write_with_substitution_spec.rb +33 -0
  480. data/spec/framework_spec/app/spec/library/set/exclusion_spec.rb +2 -2
  481. data/spec/framework_spec/app/spec/library/set/merge_spec.rb +2 -2
  482. data/spec/framework_spec/app/spec/library/set/shared/difference.rb +2 -2
  483. data/spec/framework_spec/app/spec/library/set/shared/intersection.rb +2 -2
  484. data/spec/framework_spec/app/spec/library/set/shared/union.rb +2 -2
  485. data/spec/framework_spec/app/spec/library/set/sortedset/exclusion_spec.rb +2 -2
  486. data/spec/framework_spec/app/spec/library/set/sortedset/merge_spec.rb +2 -2
  487. data/spec/framework_spec/app/spec/library/set/sortedset/shared/difference.rb +2 -2
  488. data/spec/framework_spec/app/spec/library/set/sortedset/shared/intersection.rb +2 -2
  489. data/spec/framework_spec/app/spec/library/set/sortedset/shared/union.rb +2 -2
  490. data/spec/framework_spec/app/spec/library/timeout/timeout_spec.rb +37 -0
  491. data/spec/framework_spec/app/spec/library/uri/eql_spec.rb +12 -0
  492. data/spec/framework_spec/app/spec/library/uri/equality_spec.rb +48 -0
  493. data/spec/framework_spec/app/spec/library/uri/escape/decode_spec.rb +6 -0
  494. data/spec/framework_spec/app/spec/library/uri/escape/encode_spec.rb +6 -0
  495. data/spec/framework_spec/app/spec/library/uri/escape/escape_spec.rb +6 -0
  496. data/spec/framework_spec/app/spec/library/uri/escape/unescape_spec.rb +6 -0
  497. data/spec/framework_spec/app/spec/library/uri/extract_spec.rb +86 -0
  498. data/spec/framework_spec/app/spec/library/uri/fixtures/classes.rb +11 -0
  499. data/spec/framework_spec/app/spec/library/uri/fixtures/normalization.rb +54 -0
  500. data/spec/framework_spec/app/spec/library/uri/ftp/build_spec.rb +6 -0
  501. data/spec/framework_spec/app/spec/library/uri/ftp/merge_spec.rb +6 -0
  502. data/spec/framework_spec/app/spec/library/uri/ftp/new2_spec.rb +6 -0
  503. data/spec/framework_spec/app/spec/library/uri/ftp/path_spec.rb +56 -0
  504. data/spec/framework_spec/app/spec/library/uri/ftp/set_typecode_spec.rb +6 -0
  505. data/spec/framework_spec/app/spec/library/uri/ftp/to_s_spec.rb +25 -0
  506. data/spec/framework_spec/app/spec/library/uri/ftp/typecode_spec.rb +10 -0
  507. data/spec/framework_spec/app/spec/library/uri/generic/absolute_spec.rb +10 -0
  508. data/spec/framework_spec/app/spec/library/uri/generic/build2_spec.rb +6 -0
  509. data/spec/framework_spec/app/spec/library/uri/generic/build_spec.rb +6 -0
  510. data/spec/framework_spec/app/spec/library/uri/generic/coerce_spec.rb +6 -0
  511. data/spec/framework_spec/app/spec/library/uri/generic/component_ary_spec.rb +6 -0
  512. data/spec/framework_spec/app/spec/library/uri/generic/component_spec.rb +10 -0
  513. data/spec/framework_spec/app/spec/library/uri/generic/default_port_spec.rb +10 -0
  514. data/spec/framework_spec/app/spec/library/uri/generic/eql_spec.rb +6 -0
  515. data/spec/framework_spec/app/spec/library/uri/generic/equal_value_spec.rb +6 -0
  516. data/spec/framework_spec/app/spec/library/uri/generic/fragment_spec.rb +10 -0
  517. data/spec/framework_spec/app/spec/library/uri/generic/hash_spec.rb +6 -0
  518. data/spec/framework_spec/app/spec/library/uri/generic/hierarchical_spec.rb +6 -0
  519. data/spec/framework_spec/app/spec/library/uri/generic/host_spec.rb +10 -0
  520. data/spec/framework_spec/app/spec/library/uri/generic/inspect_spec.rb +6 -0
  521. data/spec/framework_spec/app/spec/library/uri/generic/merge_spec.rb +10 -0
  522. data/spec/framework_spec/app/spec/library/uri/generic/minus_spec.rb +6 -0
  523. data/spec/framework_spec/app/spec/library/uri/generic/normalize_spec.rb +10 -0
  524. data/spec/framework_spec/app/spec/library/uri/generic/opaque_spec.rb +10 -0
  525. data/spec/framework_spec/app/spec/library/uri/generic/password_spec.rb +10 -0
  526. data/spec/framework_spec/app/spec/library/uri/generic/path_spec.rb +10 -0
  527. data/spec/framework_spec/app/spec/library/uri/generic/plus_spec.rb +6 -0
  528. data/spec/framework_spec/app/spec/library/uri/generic/port_spec.rb +10 -0
  529. data/spec/framework_spec/app/spec/library/uri/generic/query_spec.rb +10 -0
  530. data/spec/framework_spec/app/spec/library/uri/generic/registry_spec.rb +10 -0
  531. data/spec/framework_spec/app/spec/library/uri/generic/relative_spec.rb +6 -0
  532. data/spec/framework_spec/app/spec/library/uri/generic/route_from_spec.rb +6 -0
  533. data/spec/framework_spec/app/spec/library/uri/generic/route_to_spec.rb +6 -0
  534. data/spec/framework_spec/app/spec/library/uri/generic/scheme_spec.rb +10 -0
  535. data/spec/framework_spec/app/spec/library/uri/generic/select_spec.rb +6 -0
  536. data/spec/framework_spec/app/spec/library/uri/generic/set_fragment_spec.rb +6 -0
  537. data/spec/framework_spec/app/spec/library/uri/generic/set_host_spec.rb +6 -0
  538. data/spec/framework_spec/app/spec/library/uri/generic/set_opaque_spec.rb +6 -0
  539. data/spec/framework_spec/app/spec/library/uri/generic/set_password_spec.rb +6 -0
  540. data/spec/framework_spec/app/spec/library/uri/generic/set_path_spec.rb +6 -0
  541. data/spec/framework_spec/app/spec/library/uri/generic/set_port_spec.rb +6 -0
  542. data/spec/framework_spec/app/spec/library/uri/generic/set_query_spec.rb +6 -0
  543. data/spec/framework_spec/app/spec/library/uri/generic/set_registry_spec.rb +6 -0
  544. data/spec/framework_spec/app/spec/library/uri/generic/set_scheme_spec.rb +6 -0
  545. data/spec/framework_spec/app/spec/library/uri/generic/set_user_spec.rb +6 -0
  546. data/spec/framework_spec/app/spec/library/uri/generic/set_userinfo_spec.rb +6 -0
  547. data/spec/framework_spec/app/spec/library/uri/generic/to_s_spec.rb +6 -0
  548. data/spec/framework_spec/app/spec/library/uri/generic/use_registry_spec.rb +6 -0
  549. data/spec/framework_spec/app/spec/library/uri/generic/user_spec.rb +10 -0
  550. data/spec/framework_spec/app/spec/library/uri/generic/userinfo_spec.rb +10 -0
  551. data/spec/framework_spec/app/spec/library/uri/http/build_spec.rb +6 -0
  552. data/spec/framework_spec/app/spec/library/uri/http/request_uri_spec.rb +16 -0
  553. data/spec/framework_spec/app/spec/library/uri/join_spec.rb +61 -0
  554. data/spec/framework_spec/app/spec/library/uri/ldap/attributes_spec.rb +10 -0
  555. data/spec/framework_spec/app/spec/library/uri/ldap/build_spec.rb +6 -0
  556. data/spec/framework_spec/app/spec/library/uri/ldap/dn_spec.rb +10 -0
  557. data/spec/framework_spec/app/spec/library/uri/ldap/extensions_spec.rb +10 -0
  558. data/spec/framework_spec/app/spec/library/uri/ldap/filter_spec.rb +10 -0
  559. data/spec/framework_spec/app/spec/library/uri/ldap/hierarchical_spec.rb +6 -0
  560. data/spec/framework_spec/app/spec/library/uri/ldap/scope_spec.rb +10 -0
  561. data/spec/framework_spec/app/spec/library/uri/ldap/set_attributes_spec.rb +6 -0
  562. data/spec/framework_spec/app/spec/library/uri/ldap/set_dn_spec.rb +6 -0
  563. data/spec/framework_spec/app/spec/library/uri/ldap/set_extensions_spec.rb +6 -0
  564. data/spec/framework_spec/app/spec/library/uri/ldap/set_filter_spec.rb +6 -0
  565. data/spec/framework_spec/app/spec/library/uri/ldap/set_scope_spec.rb +6 -0
  566. data/spec/framework_spec/app/spec/library/uri/mailto/build_spec.rb +99 -0
  567. data/spec/framework_spec/app/spec/library/uri/mailto/headers_spec.rb +10 -0
  568. data/spec/framework_spec/app/spec/library/uri/mailto/set_headers_spec.rb +6 -0
  569. data/spec/framework_spec/app/spec/library/uri/mailto/set_to_spec.rb +6 -0
  570. data/spec/framework_spec/app/spec/library/uri/mailto/to_mailtext_spec.rb +6 -0
  571. data/spec/framework_spec/app/spec/library/uri/mailto/to_rfc822text_spec.rb +6 -0
  572. data/spec/framework_spec/app/spec/library/uri/mailto/to_s_spec.rb +6 -0
  573. data/spec/framework_spec/app/spec/library/uri/mailto/to_spec.rb +10 -0
  574. data/spec/framework_spec/app/spec/library/uri/merge_spec.rb +22 -0
  575. data/spec/framework_spec/app/spec/library/uri/normalize_spec.rb +35 -0
  576. data/spec/framework_spec/app/spec/library/uri/parse_spec.rb +249 -0
  577. data/spec/framework_spec/app/spec/library/uri/plus_spec.rb +489 -0
  578. data/spec/framework_spec/app/spec/library/uri/regexp_spec.rb +18 -0
  579. data/spec/framework_spec/app/spec/library/uri/route_from_spec.rb +25 -0
  580. data/spec/framework_spec/app/spec/library/uri/route_to_spec.rb +28 -0
  581. data/spec/framework_spec/app/spec/library/uri/select_spec.rb +31 -0
  582. data/spec/framework_spec/app/spec/library/uri/set_component_spec.rb +47 -0
  583. data/spec/framework_spec/app/spec/library/uri/shared/eql.rb +17 -0
  584. data/spec/framework_spec/app/spec/library/uri/split_spec.rb +6 -0
  585. data/spec/framework_spec/app/spec/library/uri/uri_spec.rb +31 -0
  586. data/spec/framework_spec/app/spec/library/uri/util/make_components_hash_spec.rb +6 -0
  587. data/spec/framework_spec/build.yml +2 -2
  588. data/spec/framework_spec/extensions/test-libs/test/unit.rb +328 -0
  589. data/spec/framework_spec/extensions/test-libs/test/unit/assertionfailederror.rb +25 -0
  590. data/spec/framework_spec/extensions/test-libs/test/unit/assertions.rb +1878 -0
  591. data/spec/framework_spec/extensions/test-libs/test/unit/attribute.rb +129 -0
  592. data/spec/framework_spec/extensions/test-libs/test/unit/autorunner.rb +422 -0
  593. data/spec/framework_spec/extensions/test-libs/test/unit/collector.rb +38 -0
  594. data/spec/framework_spec/extensions/test-libs/test/unit/collector/descendant.rb +23 -0
  595. data/spec/framework_spec/extensions/test-libs/test/unit/collector/dir.rb +108 -0
  596. data/spec/framework_spec/extensions/test-libs/test/unit/collector/load.rb +187 -0
  597. data/spec/framework_spec/extensions/test-libs/test/unit/collector/objectspace.rb +34 -0
  598. data/spec/framework_spec/extensions/test-libs/test/unit/collector/xml.rb +250 -0
  599. data/spec/framework_spec/extensions/test-libs/test/unit/color-scheme.rb +153 -0
  600. data/spec/framework_spec/extensions/test-libs/test/unit/color.rb +123 -0
  601. data/spec/framework_spec/extensions/test-libs/test/unit/data.rb +80 -0
  602. data/spec/framework_spec/extensions/test-libs/test/unit/diff.rb +740 -0
  603. data/spec/framework_spec/extensions/test-libs/test/unit/error.rb +151 -0
  604. data/spec/framework_spec/extensions/test-libs/test/unit/exceptionhandler.rb +39 -0
  605. data/spec/framework_spec/extensions/test-libs/test/unit/failure.rb +136 -0
  606. data/spec/framework_spec/extensions/test-libs/test/unit/fixture.rb +214 -0
  607. data/spec/framework_spec/extensions/test-libs/test/unit/notification.rb +133 -0
  608. data/spec/framework_spec/extensions/test-libs/test/unit/omission.rb +191 -0
  609. data/spec/framework_spec/extensions/test-libs/test/unit/pending.rb +150 -0
  610. data/spec/framework_spec/extensions/test-libs/test/unit/priority.rb +182 -0
  611. data/spec/framework_spec/extensions/test-libs/test/unit/runner/console.rb +59 -0
  612. data/spec/framework_spec/extensions/test-libs/test/unit/runner/emacs.rb +8 -0
  613. data/spec/framework_spec/extensions/test-libs/test/unit/runner/tap.rb +8 -0
  614. data/spec/framework_spec/extensions/test-libs/test/unit/runner/xml.rb +15 -0
  615. data/spec/framework_spec/extensions/test-libs/test/unit/testcase.rb +601 -0
  616. data/spec/framework_spec/extensions/test-libs/test/unit/testresult.rb +125 -0
  617. data/spec/framework_spec/extensions/test-libs/test/unit/testsuite.rb +134 -0
  618. data/spec/framework_spec/extensions/test-libs/test/unit/testsuitecreator.rb +79 -0
  619. data/spec/framework_spec/extensions/test-libs/test/unit/ui/console/outputlevel.rb +15 -0
  620. data/spec/framework_spec/extensions/test-libs/test/unit/ui/console/testrunner.rb +561 -0
  621. data/spec/framework_spec/extensions/test-libs/test/unit/ui/emacs/testrunner.rb +63 -0
  622. data/spec/framework_spec/extensions/test-libs/test/unit/ui/tap/testrunner.rb +82 -0
  623. data/spec/framework_spec/extensions/test-libs/test/unit/ui/testrunner.rb +53 -0
  624. data/spec/framework_spec/extensions/test-libs/test/unit/ui/testrunnermediator.rb +86 -0
  625. data/spec/framework_spec/extensions/test-libs/test/unit/ui/testrunnerutilities.rb +41 -0
  626. data/spec/framework_spec/extensions/test-libs/test/unit/ui/xml/testrunner.rb +224 -0
  627. data/spec/framework_spec/extensions/test-libs/test/unit/util/backtracefilter.rb +42 -0
  628. data/spec/framework_spec/extensions/test-libs/test/unit/util/method-owner-finder.rb +28 -0
  629. data/spec/framework_spec/extensions/test-libs/test/unit/util/observable.rb +90 -0
  630. data/spec/framework_spec/extensions/test-libs/test/unit/util/output.rb +31 -0
  631. data/spec/framework_spec/extensions/test-libs/test/unit/util/procwrapper.rb +48 -0
  632. data/spec/framework_spec/extensions/test-libs/test/unit/version.rb +5 -0
  633. data/spec/framework_spec/extensions/test-libs/webrick/accesslog.rb +10 -2
  634. data/spec/framework_spec/extensions/test-libs/webrick/cgi.rb +1 -1
  635. data/spec/framework_spec/extensions/test-libs/webrick/config.rb +1 -1
  636. data/spec/framework_spec/extensions/test-libs/webrick/httpauth/digestauth.rb +1 -1
  637. data/spec/framework_spec/extensions/test-libs/webrick/httpresponse.rb +1 -1
  638. data/spec/framework_spec/extensions/test-libs/webrick/https.rb +2 -2
  639. data/spec/framework_spec/extensions/test-libs/webrick/httpservlet/abstract.rb +1 -2
  640. data/spec/framework_spec/extensions/test-libs/webrick/httpservlet/cgihandler.rb +2 -2
  641. data/spec/framework_spec/extensions/test-libs/webrick/httpservlet/filehandler.rb +9 -5
  642. data/spec/framework_spec/extensions/test-libs/webrick/httpstatus.rb +32 -321
  643. data/spec/framework_spec/extensions/test-libs/webrick/httputils.rb +3 -3
  644. data/spec/framework_spec/extensions/test-libs/webrick/ssl.rb +3 -2
  645. data/spec/phone_spec/build.yml +1 -1
  646. data/version +1 -0
  647. metadata +521 -27
  648. data/lib/extensions/net-http/monitor.rb +0 -265
  649. data/lib/extensions/net-http/thread.rb +0 -367
  650. data/lib/extensions/net-http/timeout.rb +0 -114
  651. data/lib/extensions/net-http/uri.rb +0 -29
  652. data/lib/extensions/net-http/uri/common.rb +0 -727
  653. data/lib/extensions/net-http/uri/ftp.rb +0 -198
  654. data/lib/extensions/net-http/uri/generic.rb +0 -1128
  655. data/lib/extensions/net-http/uri/http.rb +0 -100
  656. data/lib/extensions/net-http/uri/https.rb +0 -20
  657. data/lib/extensions/net-http/uri/ldap.rb +0 -190
  658. data/lib/extensions/net-http/uri/ldaps.rb +0 -12
  659. data/lib/extensions/net-http/uri/mailto.rb +0 -266
  660. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtDBus.framework/Versions/4/QtDBus +0 -0
  661. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtXml.framework/Versions/4/QtXml +0 -0
  662. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/qmltooling/libtcpserver.dylib +0 -0
  663. data/res/generators/templates/application/public/jqmobile/images/icon-search-black.png +0 -0
  664. data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.0b3.min.css +0 -8
  665. data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.0b3.min.js +0 -169
  666. data/res/generators/templates/application/public/jquery/jquery-1.6.3.min.js +0 -4
  667. data/spec/framework_spec/extensions/test-libs/thread.rb +0 -391
@@ -0,0 +1,2211 @@
1
+ /************************************************
2
+
3
+ ainfo.c -
4
+
5
+ created at: Thu Mar 31 12:21:29 JST 1994
6
+
7
+ Copyright (C) 1993-2007 Yukihiro Matsumoto
8
+
9
+ ************************************************/
10
+
11
+ #include "rubysocket.h"
12
+
13
+ #if defined(INET6) && (defined(LOOKUP_ORDER_HACK_INET) || defined(LOOKUP_ORDER_HACK_INET6))
14
+ #define LOOKUP_ORDERS (sizeof(lookup_order_table) / sizeof(lookup_order_table[0]))
15
+ static const int lookup_order_table[] = {
16
+ #if defined(LOOKUP_ORDER_HACK_INET)
17
+ PF_INET, PF_INET6, PF_UNSPEC,
18
+ #elif defined(LOOKUP_ORDER_HACK_INET6)
19
+ PF_INET6, PF_INET, PF_UNSPEC,
20
+ #else
21
+ /* should not happen */
22
+ #endif
23
+ };
24
+
25
+ static int
26
+ ruby_getaddrinfo(const char *nodename, const char *servname,
27
+ const struct addrinfo *hints, struct addrinfo **res)
28
+ {
29
+ struct addrinfo tmp_hints;
30
+ int i, af, error;
31
+
32
+ if (hints->ai_family != PF_UNSPEC) {
33
+ return getaddrinfo(nodename, servname, hints, res);
34
+ }
35
+
36
+ for (i = 0; i < LOOKUP_ORDERS; i++) {
37
+ af = lookup_order_table[i];
38
+ MEMCPY(&tmp_hints, hints, struct addrinfo, 1);
39
+ tmp_hints.ai_family = af;
40
+ error = getaddrinfo(nodename, servname, &tmp_hints, res);
41
+ if (error) {
42
+ if (tmp_hints.ai_family == PF_UNSPEC) {
43
+ break;
44
+ }
45
+ }
46
+ else {
47
+ break;
48
+ }
49
+ }
50
+
51
+ return error;
52
+ }
53
+ #define getaddrinfo(node,serv,hints,res) ruby_getaddrinfo((node),(serv),(hints),(res))
54
+ #endif
55
+
56
+ #if defined(_AIX)
57
+ static int
58
+ ruby_getaddrinfo__aix(const char *nodename, const char *servname,
59
+ struct addrinfo *hints, struct addrinfo **res)
60
+ {
61
+ int error = getaddrinfo(nodename, servname, hints, res);
62
+ struct addrinfo *r;
63
+ if (error)
64
+ return error;
65
+ for (r = *res; r != NULL; r = r->ai_next) {
66
+ if (r->ai_addr->sa_family == 0)
67
+ r->ai_addr->sa_family = r->ai_family;
68
+ if (r->ai_addr->sa_len == 0)
69
+ r->ai_addr->sa_len = r->ai_addrlen;
70
+ }
71
+ return 0;
72
+ }
73
+ #undef getaddrinfo
74
+ #define getaddrinfo(node,serv,hints,res) ruby_getaddrinfo__aix((node),(serv),(hints),(res))
75
+ static int
76
+ ruby_getnameinfo__aix(const struct sockaddr *sa, size_t salen,
77
+ char *host, size_t hostlen,
78
+ char *serv, size_t servlen, int flags)
79
+ {
80
+ struct sockaddr_in6 *sa6;
81
+ u_int32_t *a6;
82
+
83
+ if (sa->sa_family == AF_INET6) {
84
+ sa6 = (struct sockaddr_in6 *)sa;
85
+ a6 = sa6->sin6_addr.u6_addr.u6_addr32;
86
+
87
+ if (a6[0] == 0 && a6[1] == 0 && a6[2] == 0 && a6[3] == 0) {
88
+ strncpy(host, "::", hostlen);
89
+ snprintf(serv, servlen, "%d", sa6->sin6_port);
90
+ return 0;
91
+ }
92
+ }
93
+ return getnameinfo(sa, salen, host, hostlen, serv, servlen, flags);
94
+ }
95
+ #undef getnameinfo
96
+ #define getnameinfo(sa, salen, host, hostlen, serv, servlen, flags) \
97
+ ruby_getnameinfo__aix((sa), (salen), (host), (hostlen), (serv), (servlen), (flags))
98
+ #endif
99
+
100
+ static int str_is_number(const char *);
101
+
102
+ #if defined(__APPLE__)
103
+ /* fix [ruby-core:29427] */
104
+ static int
105
+ ruby_getaddrinfo__darwin(const char *nodename, const char *servname,
106
+ struct addrinfo *hints, struct addrinfo **res)
107
+ {
108
+ const char *tmp_servname;
109
+ struct addrinfo tmp_hints;
110
+ tmp_servname = servname;
111
+ MEMCPY(&tmp_hints, hints, struct addrinfo, 1);
112
+ if (nodename && servname) {
113
+ if (str_is_number(tmp_servname) && atoi(servname) == 0) {
114
+ tmp_servname = NULL;
115
+ #ifdef AI_NUMERICSERV
116
+ if (tmp_hints.ai_flags) tmp_hints.ai_flags &= ~AI_NUMERICSERV;
117
+ #endif
118
+ }
119
+ }
120
+ int error = getaddrinfo(nodename, tmp_servname, &tmp_hints, res);
121
+ return error;
122
+ }
123
+ #undef getaddrinfo
124
+ #define getaddrinfo(node,serv,hints,res) ruby_getaddrinfo__darwin((node),(serv),(hints),(res))
125
+ #endif
126
+
127
+ #ifndef GETADDRINFO_EMU
128
+ struct getaddrinfo_arg
129
+ {
130
+ const char *node;
131
+ const char *service;
132
+ const struct addrinfo *hints;
133
+ struct addrinfo **res;
134
+ };
135
+
136
+ static VALUE
137
+ nogvl_getaddrinfo(void *arg)
138
+ {
139
+ struct getaddrinfo_arg *ptr = arg;
140
+ return getaddrinfo(ptr->node, ptr->service,
141
+ ptr->hints, ptr->res);
142
+ }
143
+ #endif
144
+
145
+ int
146
+ rb_getaddrinfo(const char *node, const char *service,
147
+ const struct addrinfo *hints,
148
+ struct addrinfo **res)
149
+ {
150
+ #ifdef GETADDRINFO_EMU
151
+ return getaddrinfo(node, service, hints, res);
152
+ #else
153
+ struct getaddrinfo_arg arg;
154
+ int ret;
155
+ MEMZERO(&arg, sizeof arg, 1);
156
+ arg.node = node;
157
+ arg.service = service;
158
+ arg.hints = hints;
159
+ arg.res = res;
160
+ ret = (int)BLOCKING_REGION(nogvl_getaddrinfo, &arg);
161
+ return ret;
162
+ #endif
163
+ }
164
+
165
+ #ifndef GETADDRINFO_EMU
166
+ struct getnameinfo_arg
167
+ {
168
+ const struct sockaddr *sa;
169
+ socklen_t salen;
170
+ char *host;
171
+ size_t hostlen;
172
+ char *serv;
173
+ size_t servlen;
174
+ int flags;
175
+ };
176
+
177
+ static VALUE
178
+ nogvl_getnameinfo(void *arg)
179
+ {
180
+ struct getnameinfo_arg *ptr = arg;
181
+ return getnameinfo(ptr->sa, ptr->salen,
182
+ ptr->host, (socklen_t)ptr->hostlen,
183
+ ptr->serv, (socklen_t)ptr->servlen,
184
+ ptr->flags);
185
+ }
186
+ #endif
187
+
188
+ int
189
+ rb_getnameinfo(const struct sockaddr *sa, socklen_t salen,
190
+ char *host, size_t hostlen,
191
+ char *serv, size_t servlen, int flags)
192
+ {
193
+ #ifdef GETADDRINFO_EMU
194
+ return getnameinfo(sa, salen, host, hostlen, serv, servlen, flags);
195
+ #else
196
+ struct getnameinfo_arg arg;
197
+ int ret;
198
+ arg.sa = sa;
199
+ arg.salen = salen;
200
+ arg.host = host;
201
+ arg.hostlen = hostlen;
202
+ arg.serv = serv;
203
+ arg.servlen = servlen;
204
+ arg.flags = flags;
205
+ ret = (int)BLOCKING_REGION(nogvl_getnameinfo, &arg);
206
+ return ret;
207
+ #endif
208
+ }
209
+
210
+ static void
211
+ make_ipaddr0(struct sockaddr *addr, char *buf, size_t len)
212
+ {
213
+ int error;
214
+
215
+ error = rb_getnameinfo(addr, SA_LEN(addr), buf, len, NULL, 0, NI_NUMERICHOST);
216
+ if (error) {
217
+ rsock_raise_socket_error("getnameinfo", error);
218
+ }
219
+ }
220
+
221
+ VALUE
222
+ rsock_make_ipaddr(struct sockaddr *addr)
223
+ {
224
+ char hbuf[1024];
225
+
226
+ make_ipaddr0(addr, hbuf, sizeof(hbuf));
227
+ return rb_str_new2(hbuf);
228
+ }
229
+
230
+ static void
231
+ make_inetaddr(unsigned int host, char *buf, size_t len)
232
+ {
233
+ struct sockaddr_in sin;
234
+
235
+ MEMZERO(&sin, struct sockaddr_in, 1);
236
+ sin.sin_family = AF_INET;
237
+ SET_SIN_LEN(&sin, sizeof(sin));
238
+ sin.sin_addr.s_addr = host;
239
+ make_ipaddr0((struct sockaddr*)&sin, buf, len);
240
+ }
241
+
242
+ static int
243
+ str_is_number(const char *p)
244
+ {
245
+ char *ep;
246
+
247
+ if (!p || *p == '\0')
248
+ return 0;
249
+ ep = NULL;
250
+ (void)STRTOUL(p, &ep, 10);
251
+ if (ep && *ep == '\0')
252
+ return 1;
253
+ else
254
+ return 0;
255
+ }
256
+
257
+ static char*
258
+ host_str(VALUE host, char *hbuf, size_t len, int *flags_ptr)
259
+ {
260
+ if (NIL_P(host)) {
261
+ return NULL;
262
+ }
263
+ else if (rb_obj_is_kind_of(host, rb_cInteger)) {
264
+ unsigned int i = NUM2UINT(host);
265
+
266
+ make_inetaddr(htonl(i), hbuf, len);
267
+ if (flags_ptr) *flags_ptr |= AI_NUMERICHOST;
268
+ return hbuf;
269
+ }
270
+ else {
271
+ char *name;
272
+
273
+ SafeStringValue(host);
274
+ name = RSTRING_PTR(host);
275
+ if (!name || *name == 0 || (name[0] == '<' && strcmp(name, "<any>") == 0)) {
276
+ make_inetaddr(INADDR_ANY, hbuf, len);
277
+ if (flags_ptr) *flags_ptr |= AI_NUMERICHOST;
278
+ }
279
+ else if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
280
+ make_inetaddr(INADDR_BROADCAST, hbuf, len);
281
+ if (flags_ptr) *flags_ptr |= AI_NUMERICHOST;
282
+ }
283
+ else if (strlen(name) >= len) {
284
+ rb_raise(rb_eArgError, "hostname too long (%"PRIuSIZE")",
285
+ strlen(name));
286
+ }
287
+ else {
288
+ strcpy(hbuf, name);
289
+ }
290
+ return hbuf;
291
+ }
292
+ }
293
+
294
+ static char*
295
+ port_str(VALUE port, char *pbuf, size_t len, int *flags_ptr)
296
+ {
297
+ if (NIL_P(port)) {
298
+ return 0;
299
+ }
300
+ else if (FIXNUM_P(port)) {
301
+ snprintf(pbuf, len, "%ld", FIX2LONG(port));
302
+ #ifdef AI_NUMERICSERV
303
+ if (flags_ptr) *flags_ptr |= AI_NUMERICSERV;
304
+ #endif
305
+ return pbuf;
306
+ }
307
+ else {
308
+ char *serv;
309
+
310
+ SafeStringValue(port);
311
+ serv = RSTRING_PTR(port);
312
+ if (strlen(serv) >= len) {
313
+ rb_raise(rb_eArgError, "service name too long (%"PRIuSIZE")",
314
+ strlen(serv));
315
+ }
316
+ strcpy(pbuf, serv);
317
+ return pbuf;
318
+ }
319
+ }
320
+
321
+ struct addrinfo*
322
+ rsock_getaddrinfo(VALUE host, VALUE port, struct addrinfo *hints, int socktype_hack)
323
+ {
324
+ struct addrinfo* res = NULL;
325
+ char *hostp, *portp;
326
+ int error;
327
+ char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
328
+ int additional_flags = 0;
329
+
330
+ hostp = host_str(host, hbuf, sizeof(hbuf), &additional_flags);
331
+ portp = port_str(port, pbuf, sizeof(pbuf), &additional_flags);
332
+
333
+ if (socktype_hack && hints->ai_socktype == 0 && str_is_number(portp)) {
334
+ hints->ai_socktype = SOCK_DGRAM;
335
+ }
336
+ hints->ai_flags |= additional_flags;
337
+
338
+ error = rb_getaddrinfo(hostp, portp, hints, &res);
339
+ if (error) {
340
+ if (hostp && hostp[strlen(hostp)-1] == '\n') {
341
+ rb_raise(rb_eSocket, "newline at the end of hostname");
342
+ }
343
+ rsock_raise_socket_error("getaddrinfo", error);
344
+ }
345
+
346
+ #if defined(__APPLE__) && defined(__MACH__)
347
+ /* [ruby-dev:23164] */
348
+ {
349
+ struct addrinfo *r;
350
+ r = res;
351
+ while (r) {
352
+ if (! r->ai_socktype) r->ai_socktype = hints->ai_socktype;
353
+ if (! r->ai_protocol) {
354
+ if (r->ai_socktype == SOCK_DGRAM) {
355
+ r->ai_protocol = IPPROTO_UDP;
356
+ }
357
+ else if (r->ai_socktype == SOCK_STREAM) {
358
+ r->ai_protocol = IPPROTO_TCP;
359
+ }
360
+ }
361
+ r = r->ai_next;
362
+ }
363
+ }
364
+ #endif
365
+ return res;
366
+ }
367
+
368
+ struct addrinfo*
369
+ rsock_addrinfo(VALUE host, VALUE port, int socktype, int flags)
370
+ {
371
+ struct addrinfo hints;
372
+
373
+ MEMZERO(&hints, struct addrinfo, 1);
374
+ hints.ai_family = AF_UNSPEC;
375
+ hints.ai_socktype = socktype;
376
+ hints.ai_flags = flags;
377
+ return rsock_getaddrinfo(host, port, &hints, 1);
378
+ }
379
+
380
+ VALUE
381
+ rsock_ipaddr(struct sockaddr *sockaddr, int norevlookup)
382
+ {
383
+ VALUE family, port, addr1, addr2;
384
+ VALUE ary;
385
+ int error;
386
+ char hbuf[1024], pbuf[1024];
387
+ ID id;
388
+
389
+ id = rsock_intern_family(sockaddr->sa_family);
390
+ if (id) {
391
+ family = rb_str_dup(rb_id2str(id));
392
+ }
393
+ else {
394
+ sprintf(pbuf, "unknown:%d", sockaddr->sa_family);
395
+ family = rb_str_new2(pbuf);
396
+ }
397
+
398
+ addr1 = Qnil;
399
+ if (!norevlookup) {
400
+ error = rb_getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf),
401
+ NULL, 0, 0);
402
+ if (! error) {
403
+ addr1 = rb_str_new2(hbuf);
404
+ }
405
+ }
406
+ error = rb_getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf),
407
+ pbuf, sizeof(pbuf), NI_NUMERICHOST | NI_NUMERICSERV);
408
+ if (error) {
409
+ rsock_raise_socket_error("getnameinfo", error);
410
+ }
411
+ addr2 = rb_str_new2(hbuf);
412
+ if (addr1 == Qnil) {
413
+ addr1 = addr2;
414
+ }
415
+ port = INT2FIX(atoi(pbuf));
416
+ ary = rb_ary_new3(4, family, port, addr1, addr2);
417
+
418
+ return ary;
419
+ }
420
+
421
+ #ifdef HAVE_SYS_UN_H
422
+ const char*
423
+ rsock_unixpath(struct sockaddr_un *sockaddr, socklen_t len)
424
+ {
425
+ if (sockaddr->sun_path < (char*)sockaddr + len)
426
+ return sockaddr->sun_path;
427
+ else
428
+ return "";
429
+ }
430
+
431
+ VALUE
432
+ rsock_unixaddr(struct sockaddr_un *sockaddr, socklen_t len)
433
+ {
434
+ return rb_assoc_new(rb_str_new2("AF_UNIX"),
435
+ rb_str_new2(rsock_unixpath(sockaddr, len)));
436
+ }
437
+ #endif
438
+
439
+ struct hostent_arg {
440
+ VALUE host;
441
+ struct addrinfo* addr;
442
+ VALUE (*ipaddr)(struct sockaddr*, size_t);
443
+ };
444
+
445
+ static VALUE
446
+ make_hostent_internal(struct hostent_arg *arg)
447
+ {
448
+ VALUE host = arg->host;
449
+ struct addrinfo* addr = arg->addr;
450
+ VALUE (*ipaddr)(struct sockaddr*, size_t) = arg->ipaddr;
451
+
452
+ struct addrinfo *ai;
453
+ struct hostent *h;
454
+ VALUE ary, names;
455
+ char **pch;
456
+ const char* hostp;
457
+ char hbuf[NI_MAXHOST];
458
+
459
+ ary = rb_ary_new();
460
+ if (addr->ai_canonname) {
461
+ hostp = addr->ai_canonname;
462
+ }
463
+ else {
464
+ hostp = host_str(host, hbuf, sizeof(hbuf), NULL);
465
+ }
466
+ rb_ary_push(ary, rb_str_new2(hostp));
467
+
468
+ if (addr->ai_canonname && (h = gethostbyname(addr->ai_canonname))) {
469
+ names = rb_ary_new();
470
+ if (h->h_aliases != NULL) {
471
+ for (pch = h->h_aliases; *pch; pch++) {
472
+ rb_ary_push(names, rb_str_new2(*pch));
473
+ }
474
+ }
475
+ }
476
+ else {
477
+ names = rb_ary_new2(0);
478
+ }
479
+ rb_ary_push(ary, names);
480
+ rb_ary_push(ary, INT2NUM(addr->ai_family));
481
+ for (ai = addr; ai; ai = ai->ai_next) {
482
+ rb_ary_push(ary, (*ipaddr)(ai->ai_addr, ai->ai_addrlen));
483
+ }
484
+
485
+ return ary;
486
+ }
487
+
488
+ VALUE
489
+ rsock_freeaddrinfo(struct addrinfo *addr)
490
+ {
491
+ freeaddrinfo(addr);
492
+ return Qnil;
493
+ }
494
+
495
+ VALUE
496
+ rsock_make_hostent(VALUE host, struct addrinfo *addr, VALUE (*ipaddr)(struct sockaddr *, size_t))
497
+ {
498
+ struct hostent_arg arg;
499
+
500
+ arg.host = host;
501
+ arg.addr = addr;
502
+ arg.ipaddr = ipaddr;
503
+ return rb_ensure(make_hostent_internal, (VALUE)&arg,
504
+ rsock_freeaddrinfo, (VALUE)addr);
505
+ }
506
+
507
+ typedef struct {
508
+ VALUE inspectname;
509
+ VALUE canonname;
510
+ int pfamily;
511
+ int socktype;
512
+ int protocol;
513
+ socklen_t sockaddr_len;
514
+ struct sockaddr_storage addr;
515
+ } rb_addrinfo_t;
516
+
517
+ static void
518
+ addrinfo_mark(void *ptr)
519
+ {
520
+ rb_addrinfo_t *rai = ptr;
521
+ if (rai) {
522
+ rb_gc_mark(rai->inspectname);
523
+ rb_gc_mark(rai->canonname);
524
+ }
525
+ }
526
+
527
+ #define addrinfo_free RUBY_TYPED_DEFAULT_FREE
528
+
529
+ static size_t
530
+ addrinfo_memsize(const void *ptr)
531
+ {
532
+ return ptr ? sizeof(rb_addrinfo_t) : 0;
533
+ }
534
+
535
+ static const rb_data_type_t addrinfo_type = {
536
+ "socket/addrinfo",
537
+ addrinfo_mark, addrinfo_free, addrinfo_memsize,
538
+ };
539
+
540
+ static VALUE
541
+ addrinfo_s_allocate(VALUE klass)
542
+ {
543
+ return TypedData_Wrap_Struct(klass, &addrinfo_type, 0);
544
+ }
545
+
546
+ #define IS_ADDRINFO(obj) rb_typeddata_is_kind_of(obj, &addrinfo_type)
547
+ static inline rb_addrinfo_t *
548
+ check_addrinfo(VALUE self)
549
+ {
550
+ return rb_check_typeddata(self, &addrinfo_type);
551
+ }
552
+
553
+ static rb_addrinfo_t *
554
+ get_addrinfo(VALUE self)
555
+ {
556
+ rb_addrinfo_t *rai = check_addrinfo(self);
557
+
558
+ if (!rai) {
559
+ rb_raise(rb_eTypeError, "uninitialized socket address");
560
+ }
561
+ return rai;
562
+ }
563
+
564
+
565
+ static rb_addrinfo_t *
566
+ alloc_addrinfo()
567
+ {
568
+ rb_addrinfo_t *rai = ALLOC(rb_addrinfo_t);
569
+ memset(rai, 0, sizeof(rb_addrinfo_t));
570
+ rai->inspectname = Qnil;
571
+ rai->canonname = Qnil;
572
+ return rai;
573
+ }
574
+
575
+ static void
576
+ init_addrinfo(rb_addrinfo_t *rai, struct sockaddr *sa, socklen_t len,
577
+ int pfamily, int socktype, int protocol,
578
+ VALUE canonname, VALUE inspectname)
579
+ {
580
+ if (sizeof(rai->addr) < len)
581
+ rb_raise(rb_eArgError, "sockaddr string too big");
582
+ memcpy((void *)&rai->addr, (void *)sa, len);
583
+ rai->sockaddr_len = len;
584
+
585
+ rai->pfamily = pfamily;
586
+ rai->socktype = socktype;
587
+ rai->protocol = protocol;
588
+ rai->canonname = canonname;
589
+ rai->inspectname = inspectname;
590
+ }
591
+
592
+ VALUE
593
+ rsock_addrinfo_new(struct sockaddr *addr, socklen_t len,
594
+ int family, int socktype, int protocol,
595
+ VALUE canonname, VALUE inspectname)
596
+ {
597
+ VALUE a;
598
+ rb_addrinfo_t *rai;
599
+
600
+ a = addrinfo_s_allocate(rb_cAddrinfo);
601
+ DATA_PTR(a) = rai = alloc_addrinfo();
602
+ init_addrinfo(rai, addr, len, family, socktype, protocol, canonname, inspectname);
603
+ return a;
604
+ }
605
+
606
+ static struct addrinfo *
607
+ call_getaddrinfo(VALUE node, VALUE service,
608
+ VALUE family, VALUE socktype, VALUE protocol, VALUE flags,
609
+ int socktype_hack)
610
+ {
611
+ struct addrinfo hints, *res;
612
+
613
+ MEMZERO(&hints, struct addrinfo, 1);
614
+ hints.ai_family = NIL_P(family) ? PF_UNSPEC : rsock_family_arg(family);
615
+
616
+ if (!NIL_P(socktype)) {
617
+ hints.ai_socktype = rsock_socktype_arg(socktype);
618
+ }
619
+ if (!NIL_P(protocol)) {
620
+ hints.ai_protocol = NUM2INT(protocol);
621
+ }
622
+ if (!NIL_P(flags)) {
623
+ hints.ai_flags = NUM2INT(flags);
624
+ }
625
+ res = rsock_getaddrinfo(node, service, &hints, socktype_hack);
626
+
627
+ if (res == NULL)
628
+ rb_raise(rb_eSocket, "host not found");
629
+ return res;
630
+ }
631
+
632
+ static VALUE make_inspectname(VALUE node, VALUE service, struct addrinfo *res);
633
+
634
+ static void
635
+ init_addrinfo_getaddrinfo(rb_addrinfo_t *rai, VALUE node, VALUE service,
636
+ VALUE family, VALUE socktype, VALUE protocol, VALUE flags,
637
+ VALUE inspectnode, VALUE inspectservice)
638
+ {
639
+ struct addrinfo *res = call_getaddrinfo(node, service, family, socktype, protocol, flags, 1);
640
+ VALUE canonname;
641
+ VALUE inspectname = rb_str_equal(node, inspectnode) ? Qnil : make_inspectname(inspectnode, inspectservice, res);
642
+
643
+ canonname = Qnil;
644
+ if (res->ai_canonname) {
645
+ canonname = rb_tainted_str_new_cstr(res->ai_canonname);
646
+ OBJ_FREEZE(canonname);
647
+ }
648
+
649
+ init_addrinfo(rai, res->ai_addr, res->ai_addrlen,
650
+ NUM2INT(family), NUM2INT(socktype), NUM2INT(protocol),
651
+ canonname, inspectname);
652
+
653
+ freeaddrinfo(res);
654
+ }
655
+
656
+ static VALUE
657
+ make_inspectname(VALUE node, VALUE service, struct addrinfo *res)
658
+ {
659
+ VALUE inspectname = Qnil;
660
+
661
+ if (res) {
662
+ char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
663
+ int ret;
664
+ ret = rb_getnameinfo(res->ai_addr, res->ai_addrlen, hbuf,
665
+ sizeof(hbuf), pbuf, sizeof(pbuf),
666
+ NI_NUMERICHOST|NI_NUMERICSERV);
667
+ if (ret == 0) {
668
+ if (TYPE(node) == T_STRING && strcmp(hbuf, RSTRING_PTR(node)) == 0)
669
+ node = Qnil;
670
+ if (TYPE(service) == T_STRING && strcmp(pbuf, RSTRING_PTR(service)) == 0)
671
+ service = Qnil;
672
+ else if (TYPE(service) == T_FIXNUM && atoi(pbuf) == FIX2INT(service))
673
+ service = Qnil;
674
+ }
675
+ }
676
+
677
+ if (TYPE(node) == T_STRING) {
678
+ inspectname = rb_str_dup(node);
679
+ }
680
+ if (TYPE(service) == T_STRING) {
681
+ if (NIL_P(inspectname))
682
+ inspectname = rb_sprintf(":%s", StringValueCStr(service));
683
+ else
684
+ rb_str_catf(inspectname, ":%s", StringValueCStr(service));
685
+ }
686
+ else if (TYPE(service) == T_FIXNUM && FIX2INT(service) != 0)
687
+ {
688
+ if (NIL_P(inspectname))
689
+ inspectname = rb_sprintf(":%d", FIX2INT(service));
690
+ else
691
+ rb_str_catf(inspectname, ":%d", FIX2INT(service));
692
+ }
693
+ if (!NIL_P(inspectname)) {
694
+ OBJ_INFECT(inspectname, node);
695
+ OBJ_INFECT(inspectname, service);
696
+ OBJ_FREEZE(inspectname);
697
+ }
698
+ return inspectname;
699
+ }
700
+
701
+ static VALUE
702
+ addrinfo_firstonly_new(VALUE node, VALUE service, VALUE family, VALUE socktype, VALUE protocol, VALUE flags)
703
+ {
704
+ VALUE ret;
705
+ VALUE canonname;
706
+ VALUE inspectname;
707
+
708
+ struct addrinfo *res = call_getaddrinfo(node, service, family, socktype, protocol, flags, 0);
709
+
710
+ inspectname = make_inspectname(node, service, res);
711
+
712
+ canonname = Qnil;
713
+ if (res->ai_canonname) {
714
+ canonname = rb_tainted_str_new_cstr(res->ai_canonname);
715
+ OBJ_FREEZE(canonname);
716
+ }
717
+
718
+ ret = rsock_addrinfo_new(res->ai_addr, res->ai_addrlen,
719
+ res->ai_family, res->ai_socktype, res->ai_protocol,
720
+ canonname, inspectname);
721
+
722
+ freeaddrinfo(res);
723
+ return ret;
724
+ }
725
+
726
+ static VALUE
727
+ addrinfo_list_new(VALUE node, VALUE service, VALUE family, VALUE socktype, VALUE protocol, VALUE flags)
728
+ {
729
+ VALUE ret;
730
+ struct addrinfo *r;
731
+ VALUE inspectname;
732
+
733
+ struct addrinfo *res = call_getaddrinfo(node, service, family, socktype, protocol, flags, 0);
734
+
735
+ inspectname = make_inspectname(node, service, res);
736
+
737
+ ret = rb_ary_new();
738
+ for (r = res; r; r = r->ai_next) {
739
+ VALUE addr;
740
+ VALUE canonname = Qnil;
741
+
742
+ if (r->ai_canonname) {
743
+ canonname = rb_tainted_str_new_cstr(r->ai_canonname);
744
+ OBJ_FREEZE(canonname);
745
+ }
746
+
747
+ addr = rsock_addrinfo_new(r->ai_addr, r->ai_addrlen,
748
+ r->ai_family, r->ai_socktype, r->ai_protocol,
749
+ canonname, inspectname);
750
+
751
+ rb_ary_push(ret, addr);
752
+ }
753
+
754
+ freeaddrinfo(res);
755
+ return ret;
756
+ }
757
+
758
+
759
+ #ifdef HAVE_SYS_UN_H
760
+ static void
761
+ init_unix_addrinfo(rb_addrinfo_t *rai, VALUE path, int socktype)
762
+ {
763
+ struct sockaddr_un un;
764
+
765
+ StringValue(path);
766
+
767
+ if (sizeof(un.sun_path) <= (size_t)RSTRING_LEN(path))
768
+ rb_raise(rb_eArgError, "too long unix socket path (max: %dbytes)",
769
+ (int)sizeof(un.sun_path)-1);
770
+
771
+ MEMZERO(&un, struct sockaddr_un, 1);
772
+
773
+ un.sun_family = AF_UNIX;
774
+ memcpy((void*)&un.sun_path, RSTRING_PTR(path), RSTRING_LEN(path));
775
+
776
+ init_addrinfo(rai, (struct sockaddr *)&un, (socklen_t)sizeof(un),
777
+ PF_UNIX, socktype, 0, Qnil, Qnil);
778
+ }
779
+ #endif
780
+
781
+ /*
782
+ * call-seq:
783
+ * Addrinfo.new(sockaddr) => addrinfo
784
+ * Addrinfo.new(sockaddr, family) => addrinfo
785
+ * Addrinfo.new(sockaddr, family, socktype) => addrinfo
786
+ * Addrinfo.new(sockaddr, family, socktype, protocol) => addrinfo
787
+ *
788
+ * returns a new instance of Addrinfo.
789
+ * The instance contains sockaddr, family, socktype, protocol.
790
+ * sockaddr means struct sockaddr which can be used for connect(2), etc.
791
+ * family, socktype and protocol are integers which is used for arguments of socket(2).
792
+ *
793
+ * sockaddr is specified as an array or a string.
794
+ * The array should be compatible to the value of IPSocket#addr or UNIXSocket#addr.
795
+ * The string should be struct sockaddr as generated by
796
+ * Socket.sockaddr_in or Socket.unpack_sockaddr_un.
797
+ *
798
+ * sockaddr examples:
799
+ * - ["AF_INET", 46102, "localhost.localdomain", "127.0.0.1"]
800
+ * - ["AF_INET6", 42304, "ip6-localhost", "::1"]
801
+ * - ["AF_UNIX", "/tmp/sock"]
802
+ * - Socket.sockaddr_in("smtp", "2001:DB8::1")
803
+ * - Socket.sockaddr_in(80, "172.18.22.42")
804
+ * - Socket.sockaddr_in(80, "www.ruby-lang.org")
805
+ * - Socket.sockaddr_un("/tmp/sock")
806
+ *
807
+ * In an AF_INET/AF_INET6 sockaddr array, the 4th element,
808
+ * numeric IP address, is used to construct socket address in the Addrinfo instance.
809
+ * If the 3rd element, textual host name, is non-nil, it is also recorded but used only for Addrinfo#inspect.
810
+ *
811
+ * family is specified as an integer to specify the protocol family such as Socket::PF_INET.
812
+ * It can be a symbol or a string which is the constant name
813
+ * with or without PF_ prefix such as :INET, :INET6, :UNIX, "PF_INET", etc.
814
+ * If omitted, PF_UNSPEC is assumed.
815
+ *
816
+ * socktype is specified as an integer to specify the socket type such as Socket::SOCK_STREAM.
817
+ * It can be a symbol or a string which is the constant name
818
+ * with or without SOCK_ prefix such as :STREAM, :DGRAM, :RAW, "SOCK_STREAM", etc.
819
+ * If omitted, 0 is assumed.
820
+ *
821
+ * protocol is specified as an integer to specify the protocol such as Socket::IPPROTO_TCP.
822
+ * It must be an integer, unlike family and socktype.
823
+ * If omitted, 0 is assumed.
824
+ * Note that 0 is reasonable value for most protocols, except raw socket.
825
+ *
826
+ */
827
+ static VALUE
828
+ addrinfo_initialize(int argc, VALUE *argv, VALUE self)
829
+ {
830
+ rb_addrinfo_t *rai;
831
+ VALUE sockaddr_arg, sockaddr_ary, pfamily, socktype, protocol;
832
+ int i_pfamily, i_socktype, i_protocol;
833
+ struct sockaddr *sockaddr_ptr;
834
+ socklen_t sockaddr_len;
835
+ VALUE canonname = Qnil, inspectname = Qnil;
836
+
837
+ if (check_addrinfo(self))
838
+ rb_raise(rb_eTypeError, "already initialized socket address");
839
+ DATA_PTR(self) = rai = alloc_addrinfo();
840
+
841
+ rb_scan_args(argc, argv, "13", &sockaddr_arg, &pfamily, &socktype, &protocol);
842
+
843
+ i_pfamily = NIL_P(pfamily) ? PF_UNSPEC : rsock_family_arg(pfamily);
844
+ i_socktype = NIL_P(socktype) ? 0 : rsock_socktype_arg(socktype);
845
+ i_protocol = NIL_P(protocol) ? 0 : NUM2INT(protocol);
846
+
847
+ sockaddr_ary = rb_check_array_type(sockaddr_arg);
848
+ if (!NIL_P(sockaddr_ary)) {
849
+ VALUE afamily = rb_ary_entry(sockaddr_ary, 0);
850
+ int af;
851
+ StringValue(afamily);
852
+ if (rsock_family_to_int(RSTRING_PTR(afamily), RSTRING_LEN(afamily), &af) == -1)
853
+ rb_raise(rb_eSocket, "unknown address family: %s", StringValueCStr(afamily));
854
+ switch (af) {
855
+ case AF_INET: /* ["AF_INET", 46102, "localhost.localdomain", "127.0.0.1"] */
856
+ #ifdef INET6
857
+ case AF_INET6: /* ["AF_INET6", 42304, "ip6-localhost", "::1"] */
858
+ #endif
859
+ {
860
+ VALUE service = rb_ary_entry(sockaddr_ary, 1);
861
+ VALUE nodename = rb_ary_entry(sockaddr_ary, 2);
862
+ VALUE numericnode = rb_ary_entry(sockaddr_ary, 3);
863
+ int flags;
864
+
865
+ service = INT2NUM(NUM2INT(service));
866
+ if (!NIL_P(nodename))
867
+ StringValue(nodename);
868
+ StringValue(numericnode);
869
+ flags = AI_NUMERICHOST;
870
+ #ifdef AI_NUMERICSERV
871
+ flags |= AI_NUMERICSERV;
872
+ #endif
873
+
874
+ init_addrinfo_getaddrinfo(rai, numericnode, service,
875
+ INT2NUM(i_pfamily ? i_pfamily : af), INT2NUM(i_socktype), INT2NUM(i_protocol),
876
+ INT2NUM(flags),
877
+ nodename, service);
878
+ break;
879
+ }
880
+
881
+ #ifdef HAVE_SYS_UN_H
882
+ case AF_UNIX: /* ["AF_UNIX", "/tmp/sock"] */
883
+ {
884
+ VALUE path = rb_ary_entry(sockaddr_ary, 1);
885
+ StringValue(path);
886
+ init_unix_addrinfo(rai, path, SOCK_STREAM);
887
+ break;
888
+ }
889
+ #endif
890
+
891
+ default:
892
+ rb_raise(rb_eSocket, "unexpected address family");
893
+ }
894
+ }
895
+ else {
896
+ StringValue(sockaddr_arg);
897
+ sockaddr_ptr = (struct sockaddr *)RSTRING_PTR(sockaddr_arg);
898
+ sockaddr_len = RSTRING_LENINT(sockaddr_arg);
899
+ init_addrinfo(rai, sockaddr_ptr, sockaddr_len,
900
+ i_pfamily, i_socktype, i_protocol,
901
+ canonname, inspectname);
902
+ }
903
+
904
+ return self;
905
+ }
906
+
907
+ static int
908
+ get_afamily(struct sockaddr *addr, socklen_t len)
909
+ {
910
+ if ((char*)&addr->sa_family + sizeof(addr->sa_family) - (char*)addr <= len)
911
+ return addr->sa_family;
912
+ else
913
+ return AF_UNSPEC;
914
+ }
915
+
916
+ static int
917
+ ai_get_afamily(rb_addrinfo_t *rai)
918
+ {
919
+ return get_afamily((struct sockaddr *)&rai->addr, rai->sockaddr_len);
920
+ }
921
+
922
+ static VALUE
923
+ inspect_sockaddr(VALUE addrinfo, VALUE ret)
924
+ {
925
+ rb_addrinfo_t *rai = get_addrinfo(addrinfo);
926
+
927
+ if (rai->sockaddr_len == 0) {
928
+ rb_str_cat2(ret, "empty-sockaddr");
929
+ }
930
+ else if ((long)rai->sockaddr_len < ((char*)&rai->addr.ss_family + sizeof(rai->addr.ss_family)) - (char*)&rai->addr)
931
+ rb_str_cat2(ret, "too-short-sockaddr");
932
+ else {
933
+ switch (rai->addr.ss_family) {
934
+ case AF_INET:
935
+ {
936
+ struct sockaddr_in *addr;
937
+ int port;
938
+ if (rai->sockaddr_len < sizeof(struct sockaddr_in)) {
939
+ rb_str_cat2(ret, "too-short-AF_INET-sockaddr");
940
+ }
941
+ else {
942
+ addr = (struct sockaddr_in *)&rai->addr;
943
+ rb_str_catf(ret, "%d.%d.%d.%d",
944
+ ((unsigned char*)&addr->sin_addr)[0],
945
+ ((unsigned char*)&addr->sin_addr)[1],
946
+ ((unsigned char*)&addr->sin_addr)[2],
947
+ ((unsigned char*)&addr->sin_addr)[3]);
948
+ port = ntohs(addr->sin_port);
949
+ if (port)
950
+ rb_str_catf(ret, ":%d", port);
951
+ if (sizeof(struct sockaddr_in) < rai->sockaddr_len)
952
+ rb_str_catf(ret, "(sockaddr %d bytes too long)", (int)(rai->sockaddr_len - sizeof(struct sockaddr_in)));
953
+ }
954
+ break;
955
+ }
956
+
957
+ #ifdef AF_INET6
958
+ case AF_INET6:
959
+ {
960
+ struct sockaddr_in6 *addr;
961
+ char hbuf[1024];
962
+ int port;
963
+ int error;
964
+ if (rai->sockaddr_len < sizeof(struct sockaddr_in6)) {
965
+ rb_str_cat2(ret, "too-short-AF_INET6-sockaddr");
966
+ }
967
+ else {
968
+ addr = (struct sockaddr_in6 *)&rai->addr;
969
+ /* use getnameinfo for scope_id.
970
+ * RFC 4007: IPv6 Scoped Address Architecture
971
+ * draft-ietf-ipv6-scope-api-00.txt: Scoped Address Extensions to the IPv6 Basic Socket API
972
+ */
973
+ error = getnameinfo((struct sockaddr *)&rai->addr, rai->sockaddr_len,
974
+ hbuf, (socklen_t)sizeof(hbuf), NULL, 0,
975
+ NI_NUMERICHOST|NI_NUMERICSERV);
976
+ if (error) {
977
+ rsock_raise_socket_error("getnameinfo", error);
978
+ }
979
+ if (addr->sin6_port == 0) {
980
+ rb_str_cat2(ret, hbuf);
981
+ }
982
+ else {
983
+ port = ntohs(addr->sin6_port);
984
+ rb_str_catf(ret, "[%s]:%d", hbuf, port);
985
+ }
986
+ if (sizeof(struct sockaddr_in6) < rai->sockaddr_len)
987
+ rb_str_catf(ret, "(sockaddr %d bytes too long)", (int)(rai->sockaddr_len - sizeof(struct sockaddr_in6)));
988
+ }
989
+ break;
990
+ }
991
+ #endif
992
+
993
+ #ifdef HAVE_SYS_UN_H
994
+ case AF_UNIX:
995
+ {
996
+ struct sockaddr_un *addr = (struct sockaddr_un *)&rai->addr;
997
+ char *p, *s, *t, *e;
998
+ s = addr->sun_path;
999
+ e = (char*)addr + rai->sockaddr_len;
1000
+ if (e < s)
1001
+ rb_str_cat2(ret, "too-short-AF_UNIX-sockaddr");
1002
+ else if (s == e)
1003
+ rb_str_cat2(ret, "empty-path-AF_UNIX-sockaddr");
1004
+ else {
1005
+ int printable_only = 1;
1006
+ p = s;
1007
+ while (p < e && *p != '\0') {
1008
+ printable_only = printable_only && ISPRINT(*p) && !ISSPACE(*p);
1009
+ p++;
1010
+ }
1011
+ t = p;
1012
+ while (p < e && *p == '\0')
1013
+ p++;
1014
+ if (printable_only && /* only printable, no space */
1015
+ t < e && /* NUL terminated */
1016
+ p == e) { /* no data after NUL */
1017
+ if (s == t)
1018
+ rb_str_cat2(ret, "empty-path-AF_UNIX-sockaddr");
1019
+ else if (s[0] == '/') /* absolute path */
1020
+ rb_str_cat2(ret, s);
1021
+ else
1022
+ rb_str_catf(ret, "AF_UNIX %s", s);
1023
+ }
1024
+ else {
1025
+ rb_str_cat2(ret, "AF_UNIX");
1026
+ e = (char *)addr->sun_path + sizeof(addr->sun_path);
1027
+ while (s < e && *(e-1) == '\0')
1028
+ e--;
1029
+ while (s < e)
1030
+ rb_str_catf(ret, ":%02x", (unsigned char)*s++);
1031
+ }
1032
+ if (addr->sun_path + sizeof(addr->sun_path) < (char*)&rai->addr + rai->sockaddr_len)
1033
+ rb_str_catf(ret, "(sockaddr %d bytes too long)",
1034
+ (int)(rai->sockaddr_len - (addr->sun_path + sizeof(addr->sun_path) - (char*)&rai->addr)));
1035
+ }
1036
+ break;
1037
+ }
1038
+ #endif
1039
+
1040
+ default:
1041
+ {
1042
+ ID id = rsock_intern_family(rai->addr.ss_family);
1043
+ if (id == 0)
1044
+ rb_str_catf(ret, "unknown address family %d", rai->addr.ss_family);
1045
+ else
1046
+ rb_str_catf(ret, "%s address format unknown", rb_id2name(id));
1047
+ break;
1048
+ }
1049
+ }
1050
+ }
1051
+
1052
+ return ret;
1053
+ }
1054
+
1055
+ /*
1056
+ * call-seq:
1057
+ * addrinfo.inspect => string
1058
+ *
1059
+ * returns a string which shows addrinfo in human-readable form.
1060
+ *
1061
+ * Addrinfo.tcp("localhost", 80).inspect #=> "#<Addrinfo: 127.0.0.1:80 TCP (localhost:80)>"
1062
+ * Addrinfo.unix("/tmp/sock").inspect #=> "#<Addrinfo: /tmp/sock SOCK_STREAM>"
1063
+ *
1064
+ */
1065
+ static VALUE
1066
+ addrinfo_inspect(VALUE self)
1067
+ {
1068
+ rb_addrinfo_t *rai = get_addrinfo(self);
1069
+ int internet_p;
1070
+ VALUE ret;
1071
+
1072
+ ret = rb_sprintf("#<%s: ", rb_obj_classname(self));
1073
+
1074
+ inspect_sockaddr(self, ret);
1075
+
1076
+ if (rai->pfamily && ai_get_afamily(rai) != rai->pfamily) {
1077
+ ID id = rsock_intern_protocol_family(rai->pfamily);
1078
+ if (id)
1079
+ rb_str_catf(ret, " %s", rb_id2name(id));
1080
+ else
1081
+ rb_str_catf(ret, " PF_\?\?\?(%d)", rai->pfamily);
1082
+ }
1083
+
1084
+ internet_p = rai->pfamily == PF_INET;
1085
+ #ifdef INET6
1086
+ internet_p = internet_p || rai->pfamily == PF_INET6;
1087
+ #endif
1088
+ if (internet_p && rai->socktype == SOCK_STREAM &&
1089
+ (rai->protocol == 0 || rai->protocol == IPPROTO_TCP)) {
1090
+ rb_str_cat2(ret, " TCP");
1091
+ }
1092
+ else if (internet_p && rai->socktype == SOCK_DGRAM &&
1093
+ (rai->protocol == 0 || rai->protocol == IPPROTO_UDP)) {
1094
+ rb_str_cat2(ret, " UDP");
1095
+ }
1096
+ else {
1097
+ if (rai->socktype) {
1098
+ ID id = rsock_intern_socktype(rai->socktype);
1099
+ if (id)
1100
+ rb_str_catf(ret, " %s", rb_id2name(id));
1101
+ else
1102
+ rb_str_catf(ret, " SOCK_\?\?\?(%d)", rai->socktype);
1103
+ }
1104
+
1105
+ if (rai->protocol) {
1106
+ if (internet_p) {
1107
+ ID id = rsock_intern_ipproto(rai->protocol);
1108
+ if (id)
1109
+ rb_str_catf(ret, " %s", rb_id2name(id));
1110
+ else
1111
+ goto unknown_protocol;
1112
+ }
1113
+ else {
1114
+ unknown_protocol:
1115
+ rb_str_catf(ret, " UNKNOWN_PROTOCOL(%d)", rai->protocol);
1116
+ }
1117
+ }
1118
+ }
1119
+
1120
+ if (!NIL_P(rai->canonname)) {
1121
+ VALUE name = rai->canonname;
1122
+ rb_str_catf(ret, " %s", StringValueCStr(name));
1123
+ }
1124
+
1125
+ if (!NIL_P(rai->inspectname)) {
1126
+ VALUE name = rai->inspectname;
1127
+ rb_str_catf(ret, " (%s)", StringValueCStr(name));
1128
+ }
1129
+
1130
+ rb_str_buf_cat2(ret, ">");
1131
+ return ret;
1132
+ }
1133
+
1134
+ /*
1135
+ * call-seq:
1136
+ * addrinfo.inspect_sockaddr => string
1137
+ *
1138
+ * returns a string which shows the sockaddr in _addrinfo_ with human-readable form.
1139
+ *
1140
+ * Addrinfo.tcp("localhost", 80).inspect_sockaddr #=> "127.0.0.1:80"
1141
+ * Addrinfo.tcp("ip6-localhost", 80).inspect_sockaddr #=> "[::1]:80"
1142
+ * Addrinfo.unix("/tmp/sock").inspect_sockaddr #=> "/tmp/sock"
1143
+ *
1144
+ */
1145
+ static VALUE
1146
+ addrinfo_inspect_sockaddr(VALUE self)
1147
+ {
1148
+ return inspect_sockaddr(self, rb_str_new("", 0));
1149
+ }
1150
+
1151
+ /* :nodoc: */
1152
+ static VALUE
1153
+ addrinfo_mdump(VALUE self)
1154
+ {
1155
+ rb_addrinfo_t *rai = get_addrinfo(self);
1156
+ VALUE sockaddr, afamily, pfamily, socktype, protocol, canonname, inspectname;
1157
+ int afamily_int = ai_get_afamily(rai);
1158
+ ID id;
1159
+
1160
+ id = rsock_intern_protocol_family(rai->pfamily);
1161
+ if (id == 0)
1162
+ rb_raise(rb_eSocket, "unknown protocol family: %d", rai->pfamily);
1163
+ pfamily = rb_id2str(id);
1164
+
1165
+ if (rai->socktype == 0)
1166
+ socktype = INT2FIX(0);
1167
+ else {
1168
+ id = rsock_intern_socktype(rai->socktype);
1169
+ if (id == 0)
1170
+ rb_raise(rb_eSocket, "unknown socktype: %d", rai->socktype);
1171
+ socktype = rb_id2str(id);
1172
+ }
1173
+
1174
+ if (rai->protocol == 0)
1175
+ protocol = INT2FIX(0);
1176
+ else if (IS_IP_FAMILY(afamily_int)) {
1177
+ id = rsock_intern_ipproto(rai->protocol);
1178
+ if (id == 0)
1179
+ rb_raise(rb_eSocket, "unknown IP protocol: %d", rai->protocol);
1180
+ protocol = rb_id2str(id);
1181
+ }
1182
+ else {
1183
+ rb_raise(rb_eSocket, "unknown protocol: %d", rai->protocol);
1184
+ }
1185
+
1186
+ canonname = rai->canonname;
1187
+
1188
+ inspectname = rai->inspectname;
1189
+
1190
+ id = rsock_intern_family(afamily_int);
1191
+ if (id == 0)
1192
+ rb_raise(rb_eSocket, "unknown address family: %d", afamily_int);
1193
+ afamily = rb_id2str(id);
1194
+
1195
+ switch(afamily_int) {
1196
+ #ifdef HAVE_SYS_UN_H
1197
+ case AF_UNIX:
1198
+ {
1199
+ struct sockaddr_un *su = (struct sockaddr_un *)&rai->addr;
1200
+ char *s, *e;
1201
+ s = su->sun_path;
1202
+ e = (char*)s + sizeof(su->sun_path);
1203
+ while (s < e && *(e-1) == '\0')
1204
+ e--;
1205
+ sockaddr = rb_str_new(s, e-s);
1206
+ break;
1207
+ }
1208
+ #endif
1209
+
1210
+ default:
1211
+ {
1212
+ char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
1213
+ int error;
1214
+ error = getnameinfo((struct sockaddr *)&rai->addr, rai->sockaddr_len,
1215
+ hbuf, (socklen_t)sizeof(hbuf), pbuf, (socklen_t)sizeof(pbuf),
1216
+ NI_NUMERICHOST|NI_NUMERICSERV);
1217
+ if (error) {
1218
+ rsock_raise_socket_error("getnameinfo", error);
1219
+ }
1220
+ sockaddr = rb_assoc_new(rb_str_new_cstr(hbuf), rb_str_new_cstr(pbuf));
1221
+ break;
1222
+ }
1223
+ }
1224
+
1225
+ return rb_ary_new3(7, afamily, sockaddr, pfamily, socktype, protocol, canonname, inspectname);
1226
+ }
1227
+
1228
+ /* :nodoc: */
1229
+ static VALUE
1230
+ addrinfo_mload(VALUE self, VALUE ary)
1231
+ {
1232
+ VALUE v;
1233
+ VALUE canonname, inspectname;
1234
+ int afamily, pfamily, socktype, protocol;
1235
+ struct sockaddr_storage ss;
1236
+ socklen_t len;
1237
+ rb_addrinfo_t *rai;
1238
+
1239
+ if (check_addrinfo(self))
1240
+ rb_raise(rb_eTypeError, "already initialized socket address");
1241
+
1242
+ ary = rb_convert_type(ary, T_ARRAY, "Array", "to_ary");
1243
+
1244
+ v = rb_ary_entry(ary, 0);
1245
+ StringValue(v);
1246
+ if (rsock_family_to_int(RSTRING_PTR(v), RSTRING_LEN(v), &afamily) == -1)
1247
+ rb_raise(rb_eTypeError, "unexpected address family");
1248
+
1249
+ v = rb_ary_entry(ary, 2);
1250
+ StringValue(v);
1251
+ if (rsock_family_to_int(RSTRING_PTR(v), RSTRING_LEN(v), &pfamily) == -1)
1252
+ rb_raise(rb_eTypeError, "unexpected protocol family");
1253
+
1254
+ v = rb_ary_entry(ary, 3);
1255
+ if (v == INT2FIX(0))
1256
+ socktype = 0;
1257
+ else {
1258
+ StringValue(v);
1259
+ if (rsock_socktype_to_int(RSTRING_PTR(v), RSTRING_LEN(v), &socktype) == -1)
1260
+ rb_raise(rb_eTypeError, "unexpected socktype");
1261
+ }
1262
+
1263
+ v = rb_ary_entry(ary, 4);
1264
+ if (v == INT2FIX(0))
1265
+ protocol = 0;
1266
+ else {
1267
+ StringValue(v);
1268
+ if (IS_IP_FAMILY(afamily)) {
1269
+ if (rsock_ipproto_to_int(RSTRING_PTR(v), RSTRING_LEN(v), &protocol) == -1)
1270
+ rb_raise(rb_eTypeError, "unexpected protocol");
1271
+ }
1272
+ else {
1273
+ rb_raise(rb_eTypeError, "unexpected protocol");
1274
+ }
1275
+ }
1276
+
1277
+ v = rb_ary_entry(ary, 5);
1278
+ if (NIL_P(v))
1279
+ canonname = Qnil;
1280
+ else {
1281
+ StringValue(v);
1282
+ canonname = v;
1283
+ }
1284
+
1285
+ v = rb_ary_entry(ary, 6);
1286
+ if (NIL_P(v))
1287
+ inspectname = Qnil;
1288
+ else {
1289
+ StringValue(v);
1290
+ inspectname = v;
1291
+ }
1292
+
1293
+ v = rb_ary_entry(ary, 1);
1294
+ switch(afamily) {
1295
+ #ifdef HAVE_SYS_UN_H
1296
+ case AF_UNIX:
1297
+ {
1298
+ struct sockaddr_un uaddr;
1299
+ memset(&uaddr, 0, sizeof(uaddr));
1300
+ uaddr.sun_family = AF_UNIX;
1301
+
1302
+ StringValue(v);
1303
+ if (sizeof(uaddr.sun_path) <= (size_t)RSTRING_LEN(v))
1304
+ rb_raise(rb_eSocket, "too long AF_UNIX path");
1305
+ memcpy(uaddr.sun_path, RSTRING_PTR(v), RSTRING_LEN(v));
1306
+ len = (socklen_t)sizeof(uaddr);
1307
+ memcpy(&ss, &uaddr, len);
1308
+ break;
1309
+ }
1310
+ #endif
1311
+
1312
+ default:
1313
+ {
1314
+ VALUE pair = rb_convert_type(v, T_ARRAY, "Array", "to_ary");
1315
+ struct addrinfo *res;
1316
+ int flags = AI_NUMERICHOST;
1317
+ #ifdef AI_NUMERICSERV
1318
+ flags |= AI_NUMERICSERV;
1319
+ #endif
1320
+ res = call_getaddrinfo(rb_ary_entry(pair, 0), rb_ary_entry(pair, 1),
1321
+ INT2NUM(pfamily), INT2NUM(socktype), INT2NUM(protocol),
1322
+ INT2NUM(flags), 1);
1323
+
1324
+ len = res->ai_addrlen;
1325
+ memcpy(&ss, res->ai_addr, res->ai_addrlen);
1326
+ break;
1327
+ }
1328
+ }
1329
+
1330
+ DATA_PTR(self) = rai = alloc_addrinfo();
1331
+ init_addrinfo(rai, (struct sockaddr *)&ss, len,
1332
+ pfamily, socktype, protocol,
1333
+ canonname, inspectname);
1334
+ return self;
1335
+ }
1336
+
1337
+ /*
1338
+ * call-seq:
1339
+ * addrinfo.afamily => integer
1340
+ *
1341
+ * returns the address family as an integer.
1342
+ *
1343
+ * Addrinfo.tcp("localhost", 80).afamily == Socket::AF_INET #=> true
1344
+ *
1345
+ */
1346
+ static VALUE
1347
+ addrinfo_afamily(VALUE self)
1348
+ {
1349
+ rb_addrinfo_t *rai = get_addrinfo(self);
1350
+ return INT2NUM(ai_get_afamily(rai));
1351
+ }
1352
+
1353
+ /*
1354
+ * call-seq:
1355
+ * addrinfo.pfamily => integer
1356
+ *
1357
+ * returns the protocol family as an integer.
1358
+ *
1359
+ * Addrinfo.tcp("localhost", 80).pfamily == Socket::PF_INET #=> true
1360
+ *
1361
+ */
1362
+ static VALUE
1363
+ addrinfo_pfamily(VALUE self)
1364
+ {
1365
+ rb_addrinfo_t *rai = get_addrinfo(self);
1366
+ return INT2NUM(rai->pfamily);
1367
+ }
1368
+
1369
+ /*
1370
+ * call-seq:
1371
+ * addrinfo.socktype => integer
1372
+ *
1373
+ * returns the socket type as an integer.
1374
+ *
1375
+ * Addrinfo.tcp("localhost", 80).socktype == Socket::SOCK_STREAM #=> true
1376
+ *
1377
+ */
1378
+ static VALUE
1379
+ addrinfo_socktype(VALUE self)
1380
+ {
1381
+ rb_addrinfo_t *rai = get_addrinfo(self);
1382
+ return INT2NUM(rai->socktype);
1383
+ }
1384
+
1385
+ /*
1386
+ * call-seq:
1387
+ * addrinfo.protocol => integer
1388
+ *
1389
+ * returns the socket type as an integer.
1390
+ *
1391
+ * Addrinfo.tcp("localhost", 80).protocol == Socket::IPPROTO_TCP #=> true
1392
+ *
1393
+ */
1394
+ static VALUE
1395
+ addrinfo_protocol(VALUE self)
1396
+ {
1397
+ rb_addrinfo_t *rai = get_addrinfo(self);
1398
+ return INT2NUM(rai->protocol);
1399
+ }
1400
+
1401
+ /*
1402
+ * call-seq:
1403
+ * addrinfo.to_sockaddr => string
1404
+ *
1405
+ * returns the socket address as packed struct sockaddr string.
1406
+ *
1407
+ * Addrinfo.tcp("localhost", 80).to_sockaddr
1408
+ * #=> "\x02\x00\x00P\x7F\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00"
1409
+ *
1410
+ */
1411
+ static VALUE
1412
+ addrinfo_to_sockaddr(VALUE self)
1413
+ {
1414
+ rb_addrinfo_t *rai = get_addrinfo(self);
1415
+ VALUE ret;
1416
+ ret = rb_str_new((char*)&rai->addr, rai->sockaddr_len);
1417
+ OBJ_INFECT(ret, self);
1418
+ return ret;
1419
+ }
1420
+
1421
+ /*
1422
+ * call-seq:
1423
+ * addrinfo.canonname => string or nil
1424
+ *
1425
+ * returns the canonical name as an string.
1426
+ *
1427
+ * nil is returned if no canonical name.
1428
+ *
1429
+ * The canonical name is set by Addrinfo.getaddrinfo when AI_CANONNAME is specified.
1430
+ *
1431
+ * list = Addrinfo.getaddrinfo("www.ruby-lang.org", 80, :INET, :STREAM, nil, Socket::AI_CANONNAME)
1432
+ * p list[0] #=> #<Addrinfo: 221.186.184.68:80 TCP carbon.ruby-lang.org (www.ruby-lang.org:80)>
1433
+ * p list[0].canonname #=> "carbon.ruby-lang.org"
1434
+ *
1435
+ */
1436
+ static VALUE
1437
+ addrinfo_canonname(VALUE self)
1438
+ {
1439
+ rb_addrinfo_t *rai = get_addrinfo(self);
1440
+ return rai->canonname;
1441
+ }
1442
+
1443
+ /*
1444
+ * call-seq:
1445
+ * addrinfo.ip? => true or false
1446
+ *
1447
+ * returns true if addrinfo is internet (IPv4/IPv6) address.
1448
+ * returns false otherwise.
1449
+ *
1450
+ * Addrinfo.tcp("127.0.0.1", 80).ip? #=> true
1451
+ * Addrinfo.tcp("::1", 80).ip? #=> true
1452
+ * Addrinfo.unix("/tmp/sock").ip? #=> false
1453
+ *
1454
+ */
1455
+ static VALUE
1456
+ addrinfo_ip_p(VALUE self)
1457
+ {
1458
+ rb_addrinfo_t *rai = get_addrinfo(self);
1459
+ int family = ai_get_afamily(rai);
1460
+ return IS_IP_FAMILY(family) ? Qtrue : Qfalse;
1461
+ }
1462
+
1463
+ /*
1464
+ * call-seq:
1465
+ * addrinfo.ipv4? => true or false
1466
+ *
1467
+ * returns true if addrinfo is IPv4 address.
1468
+ * returns false otherwise.
1469
+ *
1470
+ * Addrinfo.tcp("127.0.0.1", 80).ipv4? #=> true
1471
+ * Addrinfo.tcp("::1", 80).ipv4? #=> false
1472
+ * Addrinfo.unix("/tmp/sock").ipv4? #=> false
1473
+ *
1474
+ */
1475
+ static VALUE
1476
+ addrinfo_ipv4_p(VALUE self)
1477
+ {
1478
+ rb_addrinfo_t *rai = get_addrinfo(self);
1479
+ return ai_get_afamily(rai) == AF_INET ? Qtrue : Qfalse;
1480
+ }
1481
+
1482
+ /*
1483
+ * call-seq:
1484
+ * addrinfo.ipv6? => true or false
1485
+ *
1486
+ * returns true if addrinfo is IPv6 address.
1487
+ * returns false otherwise.
1488
+ *
1489
+ * Addrinfo.tcp("127.0.0.1", 80).ipv6? #=> false
1490
+ * Addrinfo.tcp("::1", 80).ipv6? #=> true
1491
+ * Addrinfo.unix("/tmp/sock").ipv6? #=> false
1492
+ *
1493
+ */
1494
+ static VALUE
1495
+ addrinfo_ipv6_p(VALUE self)
1496
+ {
1497
+ #ifdef AF_INET6
1498
+ rb_addrinfo_t *rai = get_addrinfo(self);
1499
+ return ai_get_afamily(rai) == AF_INET6 ? Qtrue : Qfalse;
1500
+ #else
1501
+ return Qfalse;
1502
+ #endif
1503
+ }
1504
+
1505
+ /*
1506
+ * call-seq:
1507
+ * addrinfo.unix? => true or false
1508
+ *
1509
+ * returns true if addrinfo is UNIX address.
1510
+ * returns false otherwise.
1511
+ *
1512
+ * Addrinfo.tcp("127.0.0.1", 80).unix? #=> false
1513
+ * Addrinfo.tcp("::1", 80).unix? #=> false
1514
+ * Addrinfo.unix("/tmp/sock").unix? #=> true
1515
+ *
1516
+ */
1517
+ static VALUE
1518
+ addrinfo_unix_p(VALUE self)
1519
+ {
1520
+ rb_addrinfo_t *rai = get_addrinfo(self);
1521
+ #ifdef AF_UNIX
1522
+ return ai_get_afamily(rai) == AF_UNIX ? Qtrue : Qfalse;
1523
+ #else
1524
+ return Qfalse;
1525
+ #endif
1526
+ }
1527
+
1528
+ /*
1529
+ * call-seq:
1530
+ * addrinfo.getnameinfo => [nodename, service]
1531
+ * addrinfo.getnameinfo(flags) => [nodename, service]
1532
+ *
1533
+ * returns nodename and service as a pair of strings.
1534
+ * This converts struct sockaddr in addrinfo to textual representation.
1535
+ *
1536
+ * flags should be bitwise OR of Socket::NI_??? constants.
1537
+ *
1538
+ * Addrinfo.tcp("127.0.0.1", 80).getnameinfo #=> ["localhost", "www"]
1539
+ *
1540
+ * Addrinfo.tcp("127.0.0.1", 80).getnameinfo(Socket::NI_NUMERICSERV)
1541
+ * #=> ["localhost", "80"]
1542
+ */
1543
+ static VALUE
1544
+ addrinfo_getnameinfo(int argc, VALUE *argv, VALUE self)
1545
+ {
1546
+ rb_addrinfo_t *rai = get_addrinfo(self);
1547
+ VALUE vflags;
1548
+ char hbuf[1024], pbuf[1024];
1549
+ int flags, error;
1550
+
1551
+ rb_scan_args(argc, argv, "01", &vflags);
1552
+
1553
+ flags = NIL_P(vflags) ? 0 : NUM2INT(vflags);
1554
+
1555
+ if (rai->socktype == SOCK_DGRAM)
1556
+ flags |= NI_DGRAM;
1557
+
1558
+ error = getnameinfo((struct sockaddr *)&rai->addr, rai->sockaddr_len,
1559
+ hbuf, (socklen_t)sizeof(hbuf), pbuf, (socklen_t)sizeof(pbuf),
1560
+ flags);
1561
+ if (error) {
1562
+ rsock_raise_socket_error("getnameinfo", error);
1563
+ }
1564
+
1565
+ return rb_assoc_new(rb_str_new2(hbuf), rb_str_new2(pbuf));
1566
+ }
1567
+
1568
+ /*
1569
+ * call-seq:
1570
+ * addrinfo.ip_unpack => [addr, port]
1571
+ *
1572
+ * Returns the IP address and port number as 2-element array.
1573
+ *
1574
+ * Addrinfo.tcp("127.0.0.1", 80).ip_unpack #=> ["127.0.0.1", 80]
1575
+ * Addrinfo.tcp("::1", 80).ip_unpack #=> ["::1", 80]
1576
+ */
1577
+ static VALUE
1578
+ addrinfo_ip_unpack(VALUE self)
1579
+ {
1580
+ rb_addrinfo_t *rai = get_addrinfo(self);
1581
+ int family = ai_get_afamily(rai);
1582
+ VALUE vflags;
1583
+ VALUE ret, portstr;
1584
+
1585
+ if (!IS_IP_FAMILY(family))
1586
+ rb_raise(rb_eSocket, "need IPv4 or IPv6 address");
1587
+
1588
+ vflags = INT2NUM(NI_NUMERICHOST|NI_NUMERICSERV);
1589
+ ret = addrinfo_getnameinfo(1, &vflags, self);
1590
+ portstr = rb_ary_entry(ret, 1);
1591
+ rb_ary_store(ret, 1, INT2NUM(atoi(StringValueCStr(portstr))));
1592
+ return ret;
1593
+ }
1594
+
1595
+ /*
1596
+ * call-seq:
1597
+ * addrinfo.ip_address => string
1598
+ *
1599
+ * Returns the IP address as a string.
1600
+ *
1601
+ * Addrinfo.tcp("127.0.0.1", 80).ip_address #=> "127.0.0.1"
1602
+ * Addrinfo.tcp("::1", 80).ip_address #=> "::1"
1603
+ */
1604
+ static VALUE
1605
+ addrinfo_ip_address(VALUE self)
1606
+ {
1607
+ rb_addrinfo_t *rai = get_addrinfo(self);
1608
+ int family = ai_get_afamily(rai);
1609
+ VALUE vflags;
1610
+ VALUE ret;
1611
+
1612
+ if (!IS_IP_FAMILY(family))
1613
+ rb_raise(rb_eSocket, "need IPv4 or IPv6 address");
1614
+
1615
+ vflags = INT2NUM(NI_NUMERICHOST|NI_NUMERICSERV);
1616
+ ret = addrinfo_getnameinfo(1, &vflags, self);
1617
+ return rb_ary_entry(ret, 0);
1618
+ }
1619
+
1620
+ /*
1621
+ * call-seq:
1622
+ * addrinfo.ip_port => port
1623
+ *
1624
+ * Returns the port number as an integer.
1625
+ *
1626
+ * Addrinfo.tcp("127.0.0.1", 80).ip_port #=> 80
1627
+ * Addrinfo.tcp("::1", 80).ip_port #=> 80
1628
+ */
1629
+ static VALUE
1630
+ addrinfo_ip_port(VALUE self)
1631
+ {
1632
+ rb_addrinfo_t *rai = get_addrinfo(self);
1633
+ int family = ai_get_afamily(rai);
1634
+ int port;
1635
+
1636
+ if (!IS_IP_FAMILY(family)) {
1637
+ bad_family:
1638
+ #ifdef AF_INET6
1639
+ rb_raise(rb_eSocket, "need IPv4 or IPv6 address");
1640
+ #else
1641
+ rb_raise(rb_eSocket, "need IPv4 address");
1642
+ #endif
1643
+ }
1644
+
1645
+ switch (family) {
1646
+ case AF_INET:
1647
+ if (rai->sockaddr_len != sizeof(struct sockaddr_in))
1648
+ rb_raise(rb_eSocket, "unexpected sockaddr size for IPv4");
1649
+ port = ntohs(((struct sockaddr_in *)&rai->addr)->sin_port);
1650
+ break;
1651
+
1652
+ #ifdef AF_INET6
1653
+ case AF_INET6:
1654
+ if (rai->sockaddr_len != sizeof(struct sockaddr_in6))
1655
+ rb_raise(rb_eSocket, "unexpected sockaddr size for IPv6");
1656
+ port = ntohs(((struct sockaddr_in6 *)&rai->addr)->sin6_port);
1657
+ break;
1658
+ #endif
1659
+
1660
+ default:
1661
+ goto bad_family;
1662
+ }
1663
+
1664
+ return INT2NUM(port);
1665
+ }
1666
+
1667
+ static int
1668
+ extract_in_addr(VALUE self, uint32_t *addrp)
1669
+ {
1670
+ rb_addrinfo_t *rai = get_addrinfo(self);
1671
+ int family = ai_get_afamily(rai);
1672
+ if (family != AF_INET) return 0;
1673
+ *addrp = ntohl(((struct sockaddr_in *)&rai->addr)->sin_addr.s_addr);
1674
+ return 1;
1675
+ }
1676
+
1677
+ /*
1678
+ * Returns true for IPv4 private address (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16).
1679
+ * It returns false otherwise.
1680
+ */
1681
+ static VALUE
1682
+ addrinfo_ipv4_private_p(VALUE self)
1683
+ {
1684
+ uint32_t a;
1685
+ if (!extract_in_addr(self, &a)) return Qfalse;
1686
+ if ((a & 0xff000000) == 0x0a000000 || /* 10.0.0.0/8 */
1687
+ (a & 0xfff00000) == 0xac100000 || /* 172.16.0.0/12 */
1688
+ (a & 0xffff0000) == 0xc0a80000) /* 192.168.0.0/16 */
1689
+ return Qtrue;
1690
+ return Qfalse;
1691
+ }
1692
+
1693
+ /*
1694
+ * Returns true for IPv4 loopback address (127.0.0.0/8).
1695
+ * It returns false otherwise.
1696
+ */
1697
+ static VALUE
1698
+ addrinfo_ipv4_loopback_p(VALUE self)
1699
+ {
1700
+ uint32_t a;
1701
+ if (!extract_in_addr(self, &a)) return Qfalse;
1702
+ if ((a & 0xff000000) == 0x7f000000) /* 127.0.0.0/8 */
1703
+ return Qtrue;
1704
+ return Qfalse;
1705
+ }
1706
+
1707
+ /*
1708
+ * Returns true for IPv4 multicast address (224.0.0.0/4).
1709
+ * It returns false otherwise.
1710
+ */
1711
+ static VALUE
1712
+ addrinfo_ipv4_multicast_p(VALUE self)
1713
+ {
1714
+ uint32_t a;
1715
+ if (!extract_in_addr(self, &a)) return Qfalse;
1716
+ if ((a & 0xf0000000) == 0xe0000000) /* 224.0.0.0/4 */
1717
+ return Qtrue;
1718
+ return Qfalse;
1719
+ }
1720
+
1721
+ #ifdef INET6
1722
+
1723
+ static struct in6_addr *
1724
+ extract_in6_addr(VALUE self)
1725
+ {
1726
+ rb_addrinfo_t *rai = get_addrinfo(self);
1727
+ int family = ai_get_afamily(rai);
1728
+ if (family != AF_INET6) return NULL;
1729
+ return &((struct sockaddr_in6 *)&rai->addr)->sin6_addr;
1730
+ }
1731
+
1732
+ /*
1733
+ * Returns true for IPv6 unspecified address (::).
1734
+ * It returns false otherwise.
1735
+ */
1736
+ static VALUE
1737
+ addrinfo_ipv6_unspecified_p(VALUE self)
1738
+ {
1739
+ struct in6_addr *addr = extract_in6_addr(self);
1740
+ if (addr && IN6_IS_ADDR_UNSPECIFIED(addr)) return Qtrue;
1741
+ return Qfalse;
1742
+ }
1743
+
1744
+ /*
1745
+ * Returns true for IPv6 loopback address (::1).
1746
+ * It returns false otherwise.
1747
+ */
1748
+ static VALUE
1749
+ addrinfo_ipv6_loopback_p(VALUE self)
1750
+ {
1751
+ struct in6_addr *addr = extract_in6_addr(self);
1752
+ if (addr && IN6_IS_ADDR_LOOPBACK(addr)) return Qtrue;
1753
+ return Qfalse;
1754
+ }
1755
+
1756
+ /*
1757
+ * Returns true for IPv6 multicast address (ff00::/8).
1758
+ * It returns false otherwise.
1759
+ */
1760
+ static VALUE
1761
+ addrinfo_ipv6_multicast_p(VALUE self)
1762
+ {
1763
+ struct in6_addr *addr = extract_in6_addr(self);
1764
+ if (addr && IN6_IS_ADDR_MULTICAST(addr)) return Qtrue;
1765
+ return Qfalse;
1766
+ }
1767
+
1768
+ /*
1769
+ * Returns true for IPv6 link local address (ff80::/10).
1770
+ * It returns false otherwise.
1771
+ */
1772
+ static VALUE
1773
+ addrinfo_ipv6_linklocal_p(VALUE self)
1774
+ {
1775
+ struct in6_addr *addr = extract_in6_addr(self);
1776
+ if (addr && IN6_IS_ADDR_LINKLOCAL(addr)) return Qtrue;
1777
+ return Qfalse;
1778
+ }
1779
+
1780
+ /*
1781
+ * Returns true for IPv6 site local address (ffc0::/10).
1782
+ * It returns false otherwise.
1783
+ */
1784
+ static VALUE
1785
+ addrinfo_ipv6_sitelocal_p(VALUE self)
1786
+ {
1787
+ struct in6_addr *addr = extract_in6_addr(self);
1788
+ if (addr && IN6_IS_ADDR_SITELOCAL(addr)) return Qtrue;
1789
+ return Qfalse;
1790
+ }
1791
+
1792
+ /*
1793
+ * Returns true for IPv4-mapped IPv6 address (::ffff:0:0/80).
1794
+ * It returns false otherwise.
1795
+ */
1796
+ static VALUE
1797
+ addrinfo_ipv6_v4mapped_p(VALUE self)
1798
+ {
1799
+ struct in6_addr *addr = extract_in6_addr(self);
1800
+ if (addr && IN6_IS_ADDR_V4MAPPED(addr)) return Qtrue;
1801
+ return Qfalse;
1802
+ }
1803
+
1804
+ /*
1805
+ * Returns true for IPv4-compatible IPv6 address (::/80).
1806
+ * It returns false otherwise.
1807
+ */
1808
+ static VALUE
1809
+ addrinfo_ipv6_v4compat_p(VALUE self)
1810
+ {
1811
+ struct in6_addr *addr = extract_in6_addr(self);
1812
+ if (addr && IN6_IS_ADDR_V4COMPAT(addr)) return Qtrue;
1813
+ return Qfalse;
1814
+ }
1815
+
1816
+ /*
1817
+ * Returns true for IPv6 multicast node-local scope address.
1818
+ * It returns false otherwise.
1819
+ */
1820
+ static VALUE
1821
+ addrinfo_ipv6_mc_nodelocal_p(VALUE self)
1822
+ {
1823
+ struct in6_addr *addr = extract_in6_addr(self);
1824
+ if (addr && IN6_IS_ADDR_MC_NODELOCAL(addr)) return Qtrue;
1825
+ return Qfalse;
1826
+ }
1827
+
1828
+ /*
1829
+ * Returns true for IPv6 multicast link-local scope address.
1830
+ * It returns false otherwise.
1831
+ */
1832
+ static VALUE
1833
+ addrinfo_ipv6_mc_linklocal_p(VALUE self)
1834
+ {
1835
+ struct in6_addr *addr = extract_in6_addr(self);
1836
+ if (addr && IN6_IS_ADDR_MC_LINKLOCAL(addr)) return Qtrue;
1837
+ return Qfalse;
1838
+ }
1839
+
1840
+ /*
1841
+ * Returns true for IPv6 multicast site-local scope address.
1842
+ * It returns false otherwise.
1843
+ */
1844
+ static VALUE
1845
+ addrinfo_ipv6_mc_sitelocal_p(VALUE self)
1846
+ {
1847
+ struct in6_addr *addr = extract_in6_addr(self);
1848
+ if (addr && IN6_IS_ADDR_MC_SITELOCAL(addr)) return Qtrue;
1849
+ return Qfalse;
1850
+ }
1851
+
1852
+ /*
1853
+ * Returns true for IPv6 multicast organization-local scope address.
1854
+ * It returns false otherwise.
1855
+ */
1856
+ static VALUE
1857
+ addrinfo_ipv6_mc_orglocal_p(VALUE self)
1858
+ {
1859
+ struct in6_addr *addr = extract_in6_addr(self);
1860
+ if (addr && IN6_IS_ADDR_MC_ORGLOCAL(addr)) return Qtrue;
1861
+ return Qfalse;
1862
+ }
1863
+
1864
+ /*
1865
+ * Returns true for IPv6 multicast global scope address.
1866
+ * It returns false otherwise.
1867
+ */
1868
+ static VALUE
1869
+ addrinfo_ipv6_mc_global_p(VALUE self)
1870
+ {
1871
+ struct in6_addr *addr = extract_in6_addr(self);
1872
+ if (addr && IN6_IS_ADDR_MC_GLOBAL(addr)) return Qtrue;
1873
+ return Qfalse;
1874
+ }
1875
+
1876
+ /*
1877
+ * Returns IPv4 address of IPv4 mapped/compatible IPv6 address.
1878
+ * It returns nil if +self+ is not IPv4 mapped/compatible IPv6 address.
1879
+ *
1880
+ * Addrinfo.ip("::192.0.2.3").ipv6_to_ipv4 #=> #<Addrinfo: 192.0.2.3>
1881
+ * Addrinfo.ip("::ffff:192.0.2.3").ipv6_to_ipv4 #=> #<Addrinfo: 192.0.2.3>
1882
+ * Addrinfo.ip("::1").ipv6_to_ipv4 #=> nil
1883
+ * Addrinfo.ip("192.0.2.3").ipv6_to_ipv4 #=> nil
1884
+ * Addrinfo.unix("/tmp/sock").ipv6_to_ipv4 #=> nil
1885
+ */
1886
+ static VALUE
1887
+ addrinfo_ipv6_to_ipv4(VALUE self)
1888
+ {
1889
+ rb_addrinfo_t *rai = get_addrinfo(self);
1890
+ struct in6_addr *addr;
1891
+ int family = ai_get_afamily(rai);
1892
+ if (family != AF_INET6) return Qnil;
1893
+ addr = &((struct sockaddr_in6 *)&rai->addr)->sin6_addr;
1894
+ if (IN6_IS_ADDR_V4MAPPED(addr) || IN6_IS_ADDR_V4COMPAT(addr)) {
1895
+ struct sockaddr_in sin4;
1896
+ MEMZERO(&sin4, struct sockaddr_in, 1);
1897
+ sin4.sin_family = AF_INET;
1898
+ SET_SIN_LEN(&sin4, sizeof(sin4));
1899
+ memcpy(&sin4.sin_addr, (char*)addr + sizeof(*addr) - sizeof(sin4.sin_addr), sizeof(sin4.sin_addr));
1900
+ return rsock_addrinfo_new((struct sockaddr *)&sin4, (socklen_t)sizeof(sin4),
1901
+ PF_INET, rai->socktype, rai->protocol,
1902
+ rai->canonname, rai->inspectname);
1903
+ }
1904
+ else {
1905
+ return Qnil;
1906
+ }
1907
+ }
1908
+
1909
+ #endif
1910
+
1911
+ #ifdef HAVE_SYS_UN_H
1912
+ /*
1913
+ * call-seq:
1914
+ * addrinfo.unix_path => path
1915
+ *
1916
+ * Returns the socket path as a string.
1917
+ *
1918
+ * Addrinfo.unix("/tmp/sock").unix_path #=> "/tmp/sock"
1919
+ */
1920
+ static VALUE
1921
+ addrinfo_unix_path(VALUE self)
1922
+ {
1923
+ rb_addrinfo_t *rai = get_addrinfo(self);
1924
+ int family = ai_get_afamily(rai);
1925
+ struct sockaddr_un *addr;
1926
+ char *s, *e;
1927
+
1928
+ if (family != AF_UNIX)
1929
+ rb_raise(rb_eSocket, "need AF_UNIX address");
1930
+
1931
+ addr = (struct sockaddr_un *)&rai->addr;
1932
+
1933
+ s = addr->sun_path;
1934
+ e = (char*)addr + rai->sockaddr_len;
1935
+ if (e < s)
1936
+ rb_raise(rb_eSocket, "too short AF_UNIX address");
1937
+ if (addr->sun_path + sizeof(addr->sun_path) < e)
1938
+ rb_raise(rb_eSocket, "too long AF_UNIX address");
1939
+ while (s < e && *(e-1) == '\0')
1940
+ e--;
1941
+ return rb_str_new(s, e-s);
1942
+ }
1943
+ #endif
1944
+
1945
+ /*
1946
+ * call-seq:
1947
+ * Addrinfo.getaddrinfo(nodename, service, family, socktype, protocol, flags) => [addrinfo, ...]
1948
+ * Addrinfo.getaddrinfo(nodename, service, family, socktype, protocol) => [addrinfo, ...]
1949
+ * Addrinfo.getaddrinfo(nodename, service, family, socktype) => [addrinfo, ...]
1950
+ * Addrinfo.getaddrinfo(nodename, service, family) => [addrinfo, ...]
1951
+ * Addrinfo.getaddrinfo(nodename, service) => [addrinfo, ...]
1952
+ *
1953
+ * returns a list of addrinfo objects as an array.
1954
+ *
1955
+ * This method converts nodename (hostname) and service (port) to addrinfo.
1956
+ * Since the conversion is not unique, the result is a list of addrinfo objects.
1957
+ *
1958
+ * nodename or service can be nil if no conversion intended.
1959
+ *
1960
+ * family, socktype and protocol are hint for preferred protocol.
1961
+ * If the result will be used for a socket with SOCK_STREAM,
1962
+ * SOCK_STREAM should be specified as socktype.
1963
+ * If so, Addrinfo.getaddrinfo returns addrinfo list appropriate for SOCK_STREAM.
1964
+ * If they are omitted or nil is given, the result is not restricted.
1965
+ *
1966
+ * Similarly, PF_INET6 as family restricts for IPv6.
1967
+ *
1968
+ * flags should be bitwise OR of Socket::AI_??? constants.
1969
+ *
1970
+ * Note that socktype should be specified whenever application knows the usage of the address.
1971
+ * Some platform causes an error when socktype is omitted and servname is specified as an integer
1972
+ * because some port numbers, 512 for example, are ambiguous without socktype.
1973
+ *
1974
+ * Addrinfo.getaddrinfo("www.kame.net", 80, nil, :STREAM)
1975
+ * #=> [#<Addrinfo: 203.178.141.194:80 TCP (www.kame.net:80)>,
1976
+ * # #<Addrinfo: [2001:200:0:8002:203:47ff:fea5:3085]:80 TCP (www.kame.net:80)>]
1977
+ *
1978
+ */
1979
+ static VALUE
1980
+ addrinfo_s_getaddrinfo(int argc, VALUE *argv, VALUE self)
1981
+ {
1982
+ VALUE node, service, family, socktype, protocol, flags;
1983
+
1984
+ rb_scan_args(argc, argv, "24", &node, &service, &family, &socktype, &protocol, &flags);
1985
+ return addrinfo_list_new(node, service, family, socktype, protocol, flags);
1986
+ }
1987
+
1988
+ /*
1989
+ * call-seq:
1990
+ * Addrinfo.ip(host) => addrinfo
1991
+ *
1992
+ * returns an addrinfo object for IP address.
1993
+ *
1994
+ * The port, socktype, protocol of the result is filled by zero.
1995
+ * So, it is not appropriate to create a socket.
1996
+ *
1997
+ * Addrinfo.ip("localhost") #=> #<Addrinfo: 127.0.0.1 (localhost)>
1998
+ */
1999
+ static VALUE
2000
+ addrinfo_s_ip(VALUE self, VALUE host)
2001
+ {
2002
+ VALUE ret;
2003
+ rb_addrinfo_t *rai;
2004
+ ret = addrinfo_firstonly_new(host, Qnil,
2005
+ INT2NUM(PF_UNSPEC), INT2FIX(0), INT2FIX(0), INT2FIX(0));
2006
+ rai = get_addrinfo(ret);
2007
+ rai->socktype = 0;
2008
+ rai->protocol = 0;
2009
+ return ret;
2010
+ }
2011
+
2012
+ /*
2013
+ * call-seq:
2014
+ * Addrinfo.tcp(host, port) => addrinfo
2015
+ *
2016
+ * returns an addrinfo object for TCP address.
2017
+ *
2018
+ * Addrinfo.tcp("localhost", "smtp") #=> #<Addrinfo: 127.0.0.1:25 TCP (localhost:smtp)>
2019
+ */
2020
+ static VALUE
2021
+ addrinfo_s_tcp(VALUE self, VALUE host, VALUE port)
2022
+ {
2023
+ return addrinfo_firstonly_new(host, port,
2024
+ INT2NUM(PF_UNSPEC), INT2NUM(SOCK_STREAM), INT2NUM(IPPROTO_TCP), INT2FIX(0));
2025
+ }
2026
+
2027
+ /*
2028
+ * call-seq:
2029
+ * Addrinfo.udp(host, port) => addrinfo
2030
+ *
2031
+ * returns an addrinfo object for UDP address.
2032
+ *
2033
+ * Addrinfo.udp("localhost", "daytime") #=> #<Addrinfo: 127.0.0.1:13 UDP (localhost:daytime)>
2034
+ */
2035
+ static VALUE
2036
+ addrinfo_s_udp(VALUE self, VALUE host, VALUE port)
2037
+ {
2038
+ return addrinfo_firstonly_new(host, port,
2039
+ INT2NUM(PF_UNSPEC), INT2NUM(SOCK_DGRAM), INT2NUM(IPPROTO_UDP), INT2FIX(0));
2040
+ }
2041
+
2042
+ #ifdef HAVE_SYS_UN_H
2043
+
2044
+ /*
2045
+ * call-seq:
2046
+ * Addrinfo.unix(path [, socktype]) => addrinfo
2047
+ *
2048
+ * returns an addrinfo object for UNIX socket address.
2049
+ *
2050
+ * _socktype_ specifies the socket type.
2051
+ * If it is omitted, :STREAM is used.
2052
+ *
2053
+ * Addrinfo.unix("/tmp/sock") #=> #<Addrinfo: /tmp/sock SOCK_STREAM>
2054
+ * Addrinfo.unix("/tmp/sock", :DGRAM) #=> #<Addrinfo: /tmp/sock SOCK_DGRAM>
2055
+ */
2056
+ static VALUE
2057
+ addrinfo_s_unix(int argc, VALUE *argv, VALUE self)
2058
+ {
2059
+ VALUE path, vsocktype, addr;
2060
+ int socktype;
2061
+ rb_addrinfo_t *rai;
2062
+
2063
+ rb_scan_args(argc, argv, "11", &path, &vsocktype);
2064
+
2065
+ if (NIL_P(vsocktype))
2066
+ socktype = SOCK_STREAM;
2067
+ else
2068
+ socktype = rsock_socktype_arg(vsocktype);
2069
+
2070
+ addr = addrinfo_s_allocate(rb_cAddrinfo);
2071
+ DATA_PTR(addr) = rai = alloc_addrinfo();
2072
+ init_unix_addrinfo(rai, path, socktype);
2073
+ OBJ_INFECT(addr, path);
2074
+ return addr;
2075
+ }
2076
+
2077
+ #endif
2078
+
2079
+ VALUE
2080
+ rsock_sockaddr_string_value(volatile VALUE *v)
2081
+ {
2082
+ VALUE val = *v;
2083
+ if (IS_ADDRINFO(val)) {
2084
+ *v = addrinfo_to_sockaddr(val);
2085
+ }
2086
+ StringValue(*v);
2087
+ return *v;
2088
+ }
2089
+
2090
+ char *
2091
+ rsock_sockaddr_string_value_ptr(volatile VALUE *v)
2092
+ {
2093
+ rsock_sockaddr_string_value(v);
2094
+ return RSTRING_PTR(*v);
2095
+ }
2096
+
2097
+ VALUE
2098
+ rb_check_sockaddr_string_type(VALUE val)
2099
+ {
2100
+ if (IS_ADDRINFO(val))
2101
+ return addrinfo_to_sockaddr(val);
2102
+ return rb_check_string_type(val);
2103
+ }
2104
+
2105
+ VALUE
2106
+ rsock_fd_socket_addrinfo(int fd, struct sockaddr *addr, socklen_t len)
2107
+ {
2108
+ int family;
2109
+ int socktype;
2110
+ int ret;
2111
+ socklen_t optlen = (socklen_t)sizeof(socktype);
2112
+
2113
+ /* assumes protocol family and address family are identical */
2114
+ family = get_afamily(addr, len);
2115
+
2116
+ ret = getsockopt(fd, SOL_SOCKET, SO_TYPE, (void*)&socktype, &optlen);
2117
+ if (ret == -1) {
2118
+ rb_sys_fail("getsockopt(SO_TYPE)");
2119
+ }
2120
+
2121
+ return rsock_addrinfo_new(addr, len, family, socktype, 0, Qnil, Qnil);
2122
+ }
2123
+
2124
+ VALUE
2125
+ rsock_io_socket_addrinfo(VALUE io, struct sockaddr *addr, socklen_t len)
2126
+ {
2127
+ rb_io_t *fptr;
2128
+
2129
+ switch (TYPE(io)) {
2130
+ case T_FIXNUM:
2131
+ return rsock_fd_socket_addrinfo(FIX2INT(io), addr, len);
2132
+
2133
+ case T_BIGNUM:
2134
+ return rsock_fd_socket_addrinfo(NUM2INT(io), addr, len);
2135
+
2136
+ case T_FILE:
2137
+ GetOpenFile(io, fptr);
2138
+ return rsock_fd_socket_addrinfo(fptr->fd, addr, len);
2139
+
2140
+ default:
2141
+ rb_raise(rb_eTypeError, "neither IO nor file descriptor");
2142
+ }
2143
+ }
2144
+
2145
+ /*
2146
+ * Addrinfo class
2147
+ */
2148
+ void
2149
+ rsock_init_addrinfo(void)
2150
+ {
2151
+ rb_cAddrinfo = rb_define_class("Addrinfo", rb_cData);
2152
+ rb_define_alloc_func(rb_cAddrinfo, addrinfo_s_allocate);
2153
+ rb_define_method(rb_cAddrinfo, "initialize", addrinfo_initialize, -1);
2154
+ rb_define_method(rb_cAddrinfo, "inspect", addrinfo_inspect, 0);
2155
+ rb_define_method(rb_cAddrinfo, "inspect_sockaddr", addrinfo_inspect_sockaddr, 0);
2156
+ rb_define_singleton_method(rb_cAddrinfo, "getaddrinfo", addrinfo_s_getaddrinfo, -1);
2157
+ rb_define_singleton_method(rb_cAddrinfo, "ip", addrinfo_s_ip, 1);
2158
+ rb_define_singleton_method(rb_cAddrinfo, "tcp", addrinfo_s_tcp, 2);
2159
+ rb_define_singleton_method(rb_cAddrinfo, "udp", addrinfo_s_udp, 2);
2160
+ #ifdef HAVE_SYS_UN_H
2161
+ rb_define_singleton_method(rb_cAddrinfo, "unix", addrinfo_s_unix, -1);
2162
+ #endif
2163
+
2164
+ rb_define_method(rb_cAddrinfo, "afamily", addrinfo_afamily, 0);
2165
+ rb_define_method(rb_cAddrinfo, "pfamily", addrinfo_pfamily, 0);
2166
+ rb_define_method(rb_cAddrinfo, "socktype", addrinfo_socktype, 0);
2167
+ rb_define_method(rb_cAddrinfo, "protocol", addrinfo_protocol, 0);
2168
+ rb_define_method(rb_cAddrinfo, "canonname", addrinfo_canonname, 0);
2169
+
2170
+ rb_define_method(rb_cAddrinfo, "ipv4?", addrinfo_ipv4_p, 0);
2171
+ rb_define_method(rb_cAddrinfo, "ipv6?", addrinfo_ipv6_p, 0);
2172
+ rb_define_method(rb_cAddrinfo, "unix?", addrinfo_unix_p, 0);
2173
+
2174
+ rb_define_method(rb_cAddrinfo, "ip?", addrinfo_ip_p, 0);
2175
+ rb_define_method(rb_cAddrinfo, "ip_unpack", addrinfo_ip_unpack, 0);
2176
+ rb_define_method(rb_cAddrinfo, "ip_address", addrinfo_ip_address, 0);
2177
+ rb_define_method(rb_cAddrinfo, "ip_port", addrinfo_ip_port, 0);
2178
+
2179
+ rb_define_method(rb_cAddrinfo, "ipv4_private?", addrinfo_ipv4_private_p, 0);
2180
+ rb_define_method(rb_cAddrinfo, "ipv4_loopback?", addrinfo_ipv4_loopback_p, 0);
2181
+ rb_define_method(rb_cAddrinfo, "ipv4_multicast?", addrinfo_ipv4_multicast_p, 0);
2182
+
2183
+ #ifdef INET6
2184
+ rb_define_method(rb_cAddrinfo, "ipv6_unspecified?", addrinfo_ipv6_unspecified_p, 0);
2185
+ rb_define_method(rb_cAddrinfo, "ipv6_loopback?", addrinfo_ipv6_loopback_p, 0);
2186
+ rb_define_method(rb_cAddrinfo, "ipv6_multicast?", addrinfo_ipv6_multicast_p, 0);
2187
+ rb_define_method(rb_cAddrinfo, "ipv6_linklocal?", addrinfo_ipv6_linklocal_p, 0);
2188
+ rb_define_method(rb_cAddrinfo, "ipv6_sitelocal?", addrinfo_ipv6_sitelocal_p, 0);
2189
+ rb_define_method(rb_cAddrinfo, "ipv6_v4mapped?", addrinfo_ipv6_v4mapped_p, 0);
2190
+ rb_define_method(rb_cAddrinfo, "ipv6_v4compat?", addrinfo_ipv6_v4compat_p, 0);
2191
+ rb_define_method(rb_cAddrinfo, "ipv6_mc_nodelocal?", addrinfo_ipv6_mc_nodelocal_p, 0);
2192
+ rb_define_method(rb_cAddrinfo, "ipv6_mc_linklocal?", addrinfo_ipv6_mc_linklocal_p, 0);
2193
+ rb_define_method(rb_cAddrinfo, "ipv6_mc_sitelocal?", addrinfo_ipv6_mc_sitelocal_p, 0);
2194
+ rb_define_method(rb_cAddrinfo, "ipv6_mc_orglocal?", addrinfo_ipv6_mc_orglocal_p, 0);
2195
+ rb_define_method(rb_cAddrinfo, "ipv6_mc_global?", addrinfo_ipv6_mc_global_p, 0);
2196
+
2197
+ rb_define_method(rb_cAddrinfo, "ipv6_to_ipv4", addrinfo_ipv6_to_ipv4, 0);
2198
+ #endif
2199
+
2200
+ #ifdef HAVE_SYS_UN_H
2201
+ rb_define_method(rb_cAddrinfo, "unix_path", addrinfo_unix_path, 0);
2202
+ #endif
2203
+
2204
+ rb_define_method(rb_cAddrinfo, "to_sockaddr", addrinfo_to_sockaddr, 0);
2205
+ rb_define_method(rb_cAddrinfo, "to_s", addrinfo_to_sockaddr, 0); /* compatibility for ruby before 1.9.2 */
2206
+
2207
+ rb_define_method(rb_cAddrinfo, "getnameinfo", addrinfo_getnameinfo, -1);
2208
+
2209
+ rb_define_method(rb_cAddrinfo, "marshal_dump", addrinfo_mdump, 0);
2210
+ rb_define_method(rb_cAddrinfo, "marshal_load", addrinfo_mload, 1);
2211
+ }