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

Sign up to get free protection for your applications and to get access to all the features.
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
+ }