rhodes 3.2.0.beta.4 → 3.2.0.beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +2 -0
- data/Manifest.txt +517 -23
- data/Rakefile +52 -7
- data/doc/build.txt +7 -1
- data/doc/device-caps.txt +1 -1
- data/doc/install.txt +12 -0
- data/doc/jqt-jqm-transition.txt +121 -0
- data/doc/release.txt +6 -1
- data/doc/ui.txt +4 -2
- data/installer/icon.ico +0 -0
- data/lib/extensions/barcode/ext/barcode/shared/src/zbar.c +7 -0
- data/lib/extensions/barcode/ext/barcode/shared/zbar/rho_bridge.c +3 -3
- data/lib/extensions/barcode/ext/barcode/shared/zbar/zbar/README.TXT +74 -3
- data/lib/extensions/fcntl/ext/Rakefile +57 -38
- data/lib/extensions/fcntl/ext/build.bat +1 -0
- data/lib/extensions/fcntl/ext/fcntl.vcproj +323 -0
- data/lib/extensions/fileutils/fileutils.rb +57 -33
- data/lib/extensions/net-http/net/ftp.rb +40 -36
- data/lib/extensions/net-http/net/http.rb +98 -38
- data/lib/extensions/net-http/net/https.rb +3 -13
- data/lib/extensions/net-http/net/protocol.rb +20 -4
- data/lib/extensions/rexml/rexml/document.rb +11 -9
- data/lib/extensions/rexml/rexml/element.rb +1 -1
- data/lib/extensions/rexml/rexml/entity.rb +1 -1
- data/lib/extensions/rexml/rexml/formatters/default.rb +3 -1
- data/lib/extensions/rexml/rexml/formatters/pretty.rb +1 -1
- data/lib/extensions/rexml/rexml/light/node.rb +1 -2
- data/lib/extensions/rexml/rexml/parent.rb +1 -0
- data/lib/extensions/rexml/rexml/parsers/xpathparser.rb +2 -1
- data/lib/extensions/rexml/rexml/quickpath.rb +4 -1
- data/lib/extensions/rexml/rexml/rexml.rb +1 -1
- data/lib/extensions/rexml/rexml/source.rb +25 -14
- data/lib/extensions/rexml/rexml/text.rb +20 -21
- data/lib/extensions/rexml/rexml/xmldecl.rb +2 -2
- data/lib/extensions/rexml/rexml/xmltokens.rb +2 -2
- data/lib/extensions/rexml/rexml/xpath_parser.rb +2 -1
- data/lib/extensions/set/set.rb +100 -25
- data/lib/extensions/uri/uri/common.rb +134 -4
- data/lib/extensions/uri/uri/ftp.rb +14 -3
- data/lib/extensions/uri/uri/generic.rb +53 -44
- data/lib/extensions/uri/uri/http.rb +1 -1
- data/lib/extensions/uri/uri/https.rb +1 -1
- data/lib/extensions/uri/uri/ldap.rb +1 -1
- data/lib/extensions/uri/uri/mailto.rb +9 -9
- data/lib/framework/rho/rhoviewhelpers.rb +3 -2
- data/lib/framework/rholang/localization_simplified.rb +5 -3
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/Logger.java +14 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCapture.java +1 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCaptureCallback.java +0 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/file/RhoFileApi.java +12 -5
- data/platform/android/build/android.rake +7 -7
- data/platform/iphone/Classes/AppManager/AppManager.m +19 -7
- data/platform/iphone/rbuild/iphone.rake +1 -1
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtNetwork.framework/Versions/4/QtNetwork +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtWebKit.framework/Versions/4/QtWebKit +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/phonon.framework/Versions/4/phonon +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Info.plist +1 -1
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/MacOS/RhoSimulator +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/accessible/libqtaccessiblewidgets.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/bearer/libqgenericbearer.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/codecs/libqcncodecs.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/codecs/libqjpcodecs.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/codecs/libqkrcodecs.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/codecs/libqtwcodecs.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/graphicssystems/libqtracegraphicssystem.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqgif.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqico.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqjpeg.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqmng.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqtiff.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/phonon_backend/libphonon_qt7.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/qmltooling/libqmldbg_tcp.dylib +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Resources/rho.icns +0 -0
- data/platform/osx/build/osx.rake +25 -3
- data/platform/shared/common/AutoPointer.h +1 -1
- data/platform/shared/common/RhoStd.h +10 -10
- data/platform/shared/common/RhodesAppBase.cpp +3 -0
- data/platform/shared/logging/RhoLogConf.cpp +1 -1
- data/platform/shared/qt/rhodes/QtMainWindow.cpp +7 -0
- data/platform/shared/qt/rhodes/RhoSimulator.h +3 -1
- data/platform/shared/qt/rhodes/main.cpp +3 -0
- data/platform/shared/qt/rhodes/resources/rho.icns +0 -0
- data/platform/shared/qt/rhodes/resources/rho.ico +0 -0
- data/platform/shared/qt/rhodes/resources/rho.png +0 -0
- data/platform/shared/qt/rhodes/resources/simulator.qrc +5 -0
- data/platform/shared/qt/rhodes/rhodes.pro +2 -0
- data/platform/shared/ruby/ext/rho/rhosupport.c +21 -2
- data/platform/shared/ruby/ext/socket_192/addrinfo.h +191 -0
- data/platform/shared/ruby/ext/socket_192/ancdata.c +1800 -0
- data/platform/shared/ruby/ext/socket_192/basicsocket.c +771 -0
- data/platform/shared/ruby/ext/socket_192/constants.c +145 -0
- data/platform/shared/ruby/ext/socket_192/depend +25 -0
- data/platform/shared/ruby/ext/socket_192/extconf.rb +365 -0
- data/platform/shared/ruby/ext/socket_192/getaddrinfo.c +674 -0
- data/platform/shared/ruby/ext/socket_192/getnameinfo.c +260 -0
- data/platform/shared/ruby/ext/socket_192/init.c +575 -0
- data/platform/shared/ruby/ext/socket_192/ipsocket.c +308 -0
- data/platform/shared/ruby/ext/socket_192/lib/socket.rb +755 -0
- data/platform/shared/ruby/ext/socket_192/mkconstants.rb +696 -0
- data/platform/shared/ruby/ext/socket_192/option.c +692 -0
- data/platform/shared/ruby/ext/socket_192/raddrinfo.c +2211 -0
- data/platform/shared/ruby/ext/socket_192/rubysocket.h +306 -0
- data/platform/shared/ruby/ext/socket_192/socket.c +1870 -0
- data/platform/shared/ruby/ext/socket_192/sockport.h +84 -0
- data/platform/shared/ruby/ext/socket_192/sockssocket.c +58 -0
- data/platform/shared/ruby/ext/socket_192/tcpserver.c +145 -0
- data/platform/shared/ruby/ext/socket_192/tcpsocket.c +69 -0
- data/platform/shared/ruby/ext/socket_192/udpsocket.c +264 -0
- data/platform/shared/ruby/ext/socket_192/unixserver.c +154 -0
- data/platform/shared/ruby/ext/socket_192/unixsocket.c +514 -0
- data/platform/shared/ruby/ext/stringio/stringio.c +158 -61
- data/platform/shared/ruby/ext/strscan/strscan.c +18 -31
- data/platform/shared/ruby/iphone/ruby/config.h +2 -1
- data/platform/shared/ruby/linux/ruby/config.h +2 -1
- data/platform/shared/ruby/symbian/ruby/config.h +2 -1
- data/platform/shared/ruby/win32/ruby/config.h +1 -0
- data/platform/shared/ruby/win32/ruby/constdefs.c +5866 -0
- data/platform/shared/ruby/win32/ruby/constdefs.h +1788 -0
- data/platform/shared/ruby/wince/ruby/config.h +1 -0
- data/platform/shared/ruby/wince/ruby/constdefs.c +5866 -0
- data/platform/shared/ruby/wince/ruby/constdefs.h +1788 -0
- data/platform/symbian/build/symbian.rake +8 -0
- data/platform/symbian/rhodes/rhodes.pro +3 -3
- data/platform/win32/RhoSimulator/RhoSimulator.exe +0 -0
- data/platform/wm/build/wm.rake +1 -1
- data/platform/wm/rhodes/Rhodes.cpp +3 -0
- data/platform/wm/rhodes/rhodes.vcproj +612 -6
- data/platform/wm/rhodes/rhosim.rc +394 -0
- data/platform/wm/rhodes/simulator/MainWindowQt.cpp +2 -2
- data/platform/wp7/RhoRubyLib/common/RhodesApp.cs +8 -2
- data/platform/wp7/RhoRubyLib/net/NetRequest.cs +5 -1
- data/platform/wp7/build/wp.rake +1 -1
- data/rakefile.rb +52 -7
- data/res/generators/templates/application/app/layout.erb +4 -4
- data/res/generators/templates/application/public/jqmobile/{jquery.mobile-1.0b3.css → jquery.mobile-1.0rc1.css} +507 -457
- data/res/generators/templates/application/public/jqmobile/{jquery.mobile-1.0b3.js → jquery.mobile-1.0rc1.js} +565 -458
- data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.0rc1.min.css +12 -0
- data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.0rc1.min.js +170 -0
- data/res/generators/templates/application/public/jquery/{jquery-1.6.3.js → jquery-1.6.4.js} +10 -8
- data/res/generators/templates/application/public/jquery/jquery-1.6.4.min.js +4 -0
- data/res/generators/templates/application/public/js/jqmobile-patch.js +47 -1
- data/res/icons/rho.icns +0 -0
- data/res/icons/rho.ico +0 -0
- data/res/icons/rho.png +0 -0
- data/res/icons/rho.psd +0 -0
- data/res/icons/rhodes.icns +0 -0
- data/res/icons/rhodes.ico +0 -0
- data/res/icons/rhodes.png +0 -0
- data/res/icons/rhodes.psd +0 -0
- data/res/icons/rhosim.icns +0 -0
- data/res/icons/rhosim.ico +0 -0
- data/res/icons/rhosim.png +0 -0
- data/res/icons/rhosim.psd +0 -0
- data/rhodes.gemspec +1 -1
- data/spec/framework_spec/app/spec/core/file/expand_path_spec.rb +4 -4
- data/spec/framework_spec/app/spec/library/net/FTPError_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/FTPPermError_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/net/FTPProtoError_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/net/FTPReplyError_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/net/FTPTempError_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/net/ftp/abort_spec.rb +62 -0
- data/spec/framework_spec/app/spec/library/net/ftp/acct_spec.rb +58 -0
- data/spec/framework_spec/app/spec/library/net/ftp/binary_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/net/ftp/chdir_spec.rb +101 -0
- data/spec/framework_spec/app/spec/library/net/ftp/close_spec.rb +28 -0
- data/spec/framework_spec/app/spec/library/net/ftp/closed_spec.rb +21 -0
- data/spec/framework_spec/app/spec/library/net/ftp/connect_spec.rb +49 -0
- data/spec/framework_spec/app/spec/library/net/ftp/debug_mode_spec.rb +23 -0
- data/spec/framework_spec/app/spec/library/net/ftp/delete_spec.rb +59 -0
- data/spec/framework_spec/app/spec/library/net/ftp/dir_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/ftp/fixtures/putbinaryfile +3 -0
- data/spec/framework_spec/app/spec/library/net/ftp/fixtures/puttextfile +3 -0
- data/spec/framework_spec/app/spec/library/net/ftp/fixtures/server.rb +258 -0
- data/spec/framework_spec/app/spec/library/net/ftp/get_spec.rb +21 -0
- data/spec/framework_spec/app/spec/library/net/ftp/getbinaryfile_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/ftp/getdir_spec.rb +7 -0
- data/spec/framework_spec/app/spec/library/net/ftp/gettextfile_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/ftp/help_spec.rb +66 -0
- data/spec/framework_spec/app/spec/library/net/ftp/initialize_spec.rb +87 -0
- data/spec/framework_spec/app/spec/library/net/ftp/last_response_code_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/ftp/last_response_spec.rb +25 -0
- data/spec/framework_spec/app/spec/library/net/ftp/lastresp_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/ftp/list_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/ftp/login_spec.rb +216 -0
- data/spec/framework_spec/app/spec/library/net/ftp/ls_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/ftp/mdtm_spec.rb +38 -0
- data/spec/framework_spec/app/spec/library/net/ftp/mkdir_spec.rb +61 -0
- data/spec/framework_spec/app/spec/library/net/ftp/mtime_spec.rb +50 -0
- data/spec/framework_spec/app/spec/library/net/ftp/nlst_spec.rb +122 -0
- data/spec/framework_spec/app/spec/library/net/ftp/noop_spec.rb +38 -0
- data/spec/framework_spec/app/spec/library/net/ftp/open_spec.rb +55 -0
- data/spec/framework_spec/app/spec/library/net/ftp/passive_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/net/ftp/put_spec.rb +21 -0
- data/spec/framework_spec/app/spec/library/net/ftp/putbinaryfile_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/ftp/puttextfile_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/ftp/pwd_spec.rb +53 -0
- data/spec/framework_spec/app/spec/library/net/ftp/quit_spec.rb +33 -0
- data/spec/framework_spec/app/spec/library/net/ftp/rename_spec.rb +94 -0
- data/spec/framework_spec/app/spec/library/net/ftp/resume_spec.rb +23 -0
- data/spec/framework_spec/app/spec/library/net/ftp/retrbinary_spec.rb +31 -0
- data/spec/framework_spec/app/spec/library/net/ftp/retrlines_spec.rb +35 -0
- data/spec/framework_spec/app/spec/library/net/ftp/return_code_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/net/ftp/rmdir_spec.rb +58 -0
- data/spec/framework_spec/app/spec/library/net/ftp/sendcmd_spec.rb +54 -0
- data/spec/framework_spec/app/spec/library/net/ftp/set_socket_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/ftp/shared/getbinaryfile.rb +180 -0
- data/spec/framework_spec/app/spec/library/net/ftp/shared/gettextfile.rb +130 -0
- data/spec/framework_spec/app/spec/library/net/ftp/shared/last_response_code.rb +25 -0
- data/spec/framework_spec/app/spec/library/net/ftp/shared/list.rb +134 -0
- data/spec/framework_spec/app/spec/library/net/ftp/shared/putbinaryfile.rb +233 -0
- data/spec/framework_spec/app/spec/library/net/ftp/shared/puttextfile.rb +150 -0
- data/spec/framework_spec/app/spec/library/net/ftp/shared/pwd.rb +3 -0
- data/spec/framework_spec/app/spec/library/net/ftp/site_spec.rb +53 -0
- data/spec/framework_spec/app/spec/library/net/ftp/size_spec.rb +48 -0
- data/spec/framework_spec/app/spec/library/net/ftp/status_spec.rb +63 -0
- data/spec/framework_spec/app/spec/library/net/ftp/storbinary_spec.rb +49 -0
- data/spec/framework_spec/app/spec/library/net/ftp/storlines_spec.rb +44 -0
- data/spec/framework_spec/app/spec/library/net/ftp/system_spec.rb +48 -0
- data/spec/framework_spec/app/spec/library/net/ftp/voidcmd_spec.rb +54 -0
- data/spec/framework_spec/app/spec/library/net/ftp/welcome_spec.rb +25 -0
- data/spec/framework_spec/app/spec/library/net/http/HTTPBadResponse_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/HTTPError_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/net/http/HTTPFatalError_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/net/http/HTTPHeaderSyntaxError_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/HTTPRetriableError_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/net/http/HTTPServerException_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/net/http/http/Proxy_spec.rb +35 -0
- data/spec/framework_spec/app/spec/library/net/http/http/active_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/http/address_spec.rb +9 -0
- data/spec/framework_spec/app/spec/library/net/http/http/close_on_empty_response_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/net/http/http/copy_spec.rb +23 -0
- data/spec/framework_spec/app/spec/library/net/http/http/default_port_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/http/delete_spec.rb +23 -0
- data/spec/framework_spec/app/spec/library/net/http/http/finish_spec.rb +31 -0
- data/spec/framework_spec/app/spec/library/net/http/http/fixtures/http_server.rb +97 -0
- data/spec/framework_spec/app/spec/library/net/http/http/get2_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/http/get_print_spec.rb +29 -0
- data/spec/framework_spec/app/spec/library/net/http/http/get_response_spec.rb +29 -0
- data/spec/framework_spec/app/spec/library/net/http/http/get_spec.rb +52 -0
- data/spec/framework_spec/app/spec/library/net/http/http/head2_spec.rb +9 -0
- data/spec/framework_spec/app/spec/library/net/http/http/head_spec.rb +27 -0
- data/spec/framework_spec/app/spec/library/net/http/http/http_default_port_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/http/https_default_port_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/http/initialize_spec.rb +46 -0
- data/spec/framework_spec/app/spec/library/net/http/http/inspect_spec.rb +26 -0
- data/spec/framework_spec/app/spec/library/net/http/http/is_version_1_1_spec.rb +7 -0
- data/spec/framework_spec/app/spec/library/net/http/http/is_version_1_2_spec.rb +7 -0
- data/spec/framework_spec/app/spec/library/net/http/http/lock_spec.rb +23 -0
- data/spec/framework_spec/app/spec/library/net/http/http/mkcol_spec.rb +23 -0
- data/spec/framework_spec/app/spec/library/net/http/http/move_spec.rb +27 -0
- data/spec/framework_spec/app/spec/library/net/http/http/new_spec.rb +86 -0
- data/spec/framework_spec/app/spec/library/net/http/http/newobj_spec.rb +48 -0
- data/spec/framework_spec/app/spec/library/net/http/http/open_timeout_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/net/http/http/options_spec.rb +27 -0
- data/spec/framework_spec/app/spec/library/net/http/http/port_spec.rb +9 -0
- data/spec/framework_spec/app/spec/library/net/http/http/post2_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/http/post_form_spec.rb +21 -0
- data/spec/framework_spec/app/spec/library/net/http/http/post_spec.rb +40 -0
- data/spec/framework_spec/app/spec/library/net/http/http/propfind_spec.rb +26 -0
- data/spec/framework_spec/app/spec/library/net/http/http/proppatch_spec.rb +26 -0
- data/spec/framework_spec/app/spec/library/net/http/http/proxy_address_spec.rb +31 -0
- data/spec/framework_spec/app/spec/library/net/http/http/proxy_class_spec.rb +9 -0
- data/spec/framework_spec/app/spec/library/net/http/http/proxy_pass_spec.rb +39 -0
- data/spec/framework_spec/app/spec/library/net/http/http/proxy_port_spec.rb +39 -0
- data/spec/framework_spec/app/spec/library/net/http/http/proxy_user_spec.rb +39 -0
- data/spec/framework_spec/app/spec/library/net/http/http/put2_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/http/put_spec.rb +26 -0
- data/spec/framework_spec/app/spec/library/net/http/http/read_timeout_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/net/http/http/request_get_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/http/request_head_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/http/request_post_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/http/request_put_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/http/request_spec.rb +111 -0
- data/spec/framework_spec/app/spec/library/net/http/http/request_types_spec.rb +254 -0
- data/spec/framework_spec/app/spec/library/net/http/http/send_request_spec.rb +120 -0
- data/spec/framework_spec/app/spec/library/net/http/http/set_debug_output_spec.rb +35 -0
- data/spec/framework_spec/app/spec/library/net/http/http/shared/request_get.rb +45 -0
- data/spec/framework_spec/app/spec/library/net/http/http/shared/request_head.rb +45 -0
- data/spec/framework_spec/app/spec/library/net/http/http/shared/request_post.rb +45 -0
- data/spec/framework_spec/app/spec/library/net/http/http/shared/request_put.rb +45 -0
- data/spec/framework_spec/app/spec/library/net/http/http/shared/started.rb +28 -0
- data/spec/framework_spec/app/spec/library/net/http/http/shared/version_1_1.rb +19 -0
- data/spec/framework_spec/app/spec/library/net/http/http/shared/version_1_2.rb +6 -0
- data/spec/framework_spec/app/spec/library/net/http/http/socket_type_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/http/start_spec.rb +103 -0
- data/spec/framework_spec/app/spec/library/net/http/http/started_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/http/trace_spec.rb +26 -0
- data/spec/framework_spec/app/spec/library/net/http/http/unlock_spec.rb +26 -0
- data/spec/framework_spec/app/spec/library/net/http/http/use_ssl_spec.rb +9 -0
- data/spec/framework_spec/app/spec/library/net/http/http/version_1_1_spec.rb +22 -0
- data/spec/framework_spec/app/spec/library/net/http/http/version_1_2_spec.rb +20 -0
- data/spec/framework_spec/app/spec/library/net/http/httpexceptions/fixtures/classes.rb +5 -0
- data/spec/framework_spec/app/spec/library/net/http/httpexceptions/initialize_spec.rb +17 -0
- data/spec/framework_spec/app/spec/library/net/http/httpexceptions/response_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/body_exist_spec.rb +27 -0
- data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/body_spec.rb +30 -0
- data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/body_stream_spec.rb +32 -0
- data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/exec_spec.rb +122 -0
- data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/inspect_spec.rb +25 -0
- data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/method_spec.rb +15 -0
- data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/path_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/request_body_permitted_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/response_body_permitted_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/set_body_internal_spec.rb +21 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/add_field_spec.rb +31 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/basic_auth_spec.rb +14 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/canonical_each_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/chunked_spec.rb +22 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/content_length_spec.rb +54 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/content_range_spec.rb +34 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/content_type_spec.rb +26 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/delete_spec.rb +30 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/each_capitalized_name_spec.rb +45 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/each_capitalized_spec.rb +9 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/each_header_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/each_key_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/each_name_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/each_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/each_value_spec.rb +46 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/element_reference_spec.rb +39 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/element_set_spec.rb +41 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/fetch_spec.rb +69 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/fixtures/classes.rb +11 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/form_data_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/get_fields_spec.rb +39 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/initialize_http_header_spec.rb +29 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/key_spec.rb +21 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/length_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/main_type_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/proxy_basic_auth_spec.rb +14 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/range_length_spec.rb +32 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/range_spec.rb +48 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/set_content_type_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/set_form_data_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/set_range_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/each_capitalized.rb +42 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/each_header.rb +42 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/each_name.rb +39 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/set_content_type.rb +18 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/set_form_data.rb +27 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/set_range.rb +89 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/size.rb +18 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/size_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/sub_type_spec.rb +32 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/to_hash_spec.rb +25 -0
- data/spec/framework_spec/app/spec/library/net/http/httpheader/type_params_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/net/http/httprequest/initialize_spec.rb +45 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/body_permitted_spec.rb +13 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/body_spec.rb +7 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/code_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/code_type_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/entity_spec.rb +7 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/error_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/error_type_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/exception_type_spec.rb +13 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/header_spec.rb +9 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/http_version_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/initialize_spec.rb +11 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/inspect_spec.rb +15 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/message_spec.rb +9 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/msg_spec.rb +9 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/read_body_spec.rb +86 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/read_header_spec.rb +9 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/read_new_spec.rb +22 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/reading_body_spec.rb +58 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/response_spec.rb +9 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/shared/body.rb +18 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/to_ary_spec.rb +26 -0
- data/spec/framework_spec/app/spec/library/net/http/httpresponse/value_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/clone_spec.rb +11 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/element_spec.rb +23 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/equal_value_spec.rb +18 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/hash_spec.rb +13 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/initialize_spec.rb +29 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/inspect_spec.rb +20 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/namespace_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/node_type_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/prefix_spec.rb +18 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/remove_spec.rb +20 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/to_s_spec.rb +14 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/to_string_spec.rb +15 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/value_spec.rb +15 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/write_spec.rb +23 -0
- data/spec/framework_spec/app/spec/library/rexml/attribute/xpath_spec.rb +20 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/add_spec.rb +7 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/append_spec.rb +7 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/delete_all_spec.rb +31 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/delete_spec.rb +27 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/each_attribute_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/each_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/element_reference_spec.rb +19 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/element_set_spec.rb +26 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/get_attribute_ns_spec.rb +14 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/get_attribute_spec.rb +29 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/initialize_spec.rb +19 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/length_spec.rb +7 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/namespaces_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/prefixes_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/shared/add.rb +17 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/shared/length.rb +13 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/size_spec.rb +7 -0
- data/spec/framework_spec/app/spec/library/rexml/attributes/to_a_spec.rb +20 -0
- data/spec/framework_spec/app/spec/library/rexml/cdata/clone_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/rexml/cdata/initialize_spec.rb +25 -0
- data/spec/framework_spec/app/spec/library/rexml/cdata/shared/to_s.rb +11 -0
- data/spec/framework_spec/app/spec/library/rexml/cdata/to_s_spec.rb +7 -0
- data/spec/framework_spec/app/spec/library/rexml/cdata/value_spec.rb +7 -0
- data/spec/framework_spec/app/spec/library/rexml/document/add_element_spec.rb +31 -0
- data/spec/framework_spec/app/spec/library/rexml/document/add_spec.rb +61 -0
- data/spec/framework_spec/app/spec/library/rexml/document/clone_spec.rb +20 -0
- data/spec/framework_spec/app/spec/library/rexml/document/doctype_spec.rb +15 -0
- data/spec/framework_spec/app/spec/library/rexml/document/encoding_spec.rb +22 -0
- data/spec/framework_spec/app/spec/library/rexml/document/expanded_name_spec.rb +16 -0
- data/spec/framework_spec/app/spec/library/rexml/document/new_spec.rb +38 -0
- data/spec/framework_spec/app/spec/library/rexml/document/node_type_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/rexml/document/root_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/rexml/document/stand_alone_spec.rb +19 -0
- data/spec/framework_spec/app/spec/library/rexml/document/version_spec.rb +14 -0
- data/spec/framework_spec/app/spec/library/rexml/document/write_spec.rb +39 -0
- data/spec/framework_spec/app/spec/library/rexml/document/xml_decl_spec.rb +15 -0
- data/spec/framework_spec/app/spec/library/rexml/element/add_attribute_spec.rb +41 -0
- data/spec/framework_spec/app/spec/library/rexml/element/add_attributes_spec.rb +22 -0
- data/spec/framework_spec/app/spec/library/rexml/element/add_element_spec.rb +39 -0
- data/spec/framework_spec/app/spec/library/rexml/element/add_namespace_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/rexml/element/add_text_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/rexml/element/attribute_spec.rb +17 -0
- data/spec/framework_spec/app/spec/library/rexml/element/attributes_spec.rb +19 -0
- data/spec/framework_spec/app/spec/library/rexml/element/cdatas_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/rexml/element/clone_spec.rb +29 -0
- data/spec/framework_spec/app/spec/library/rexml/element/comments_spec.rb +21 -0
- data/spec/framework_spec/app/spec/library/rexml/element/delete_attribute_spec.rb +39 -0
- data/spec/framework_spec/app/spec/library/rexml/element/delete_element_spec.rb +51 -0
- data/spec/framework_spec/app/spec/library/rexml/element/delete_namespace_spec.rb +25 -0
- data/spec/framework_spec/app/spec/library/rexml/element/document_spec.rb +18 -0
- data/spec/framework_spec/app/spec/library/rexml/element/each_element_with_attribute_spec.rb +35 -0
- data/spec/framework_spec/app/spec/library/rexml/element/each_element_with_text_spec.rb +31 -0
- data/spec/framework_spec/app/spec/library/rexml/element/get_text_spec.rb +18 -0
- data/spec/framework_spec/app/spec/library/rexml/element/has_attributes_spec.rb +17 -0
- data/spec/framework_spec/app/spec/library/rexml/element/has_elements_spec.rb +18 -0
- data/spec/framework_spec/app/spec/library/rexml/element/has_text_spec.rb +16 -0
- data/spec/framework_spec/app/spec/library/rexml/element/inspect_spec.rb +27 -0
- data/spec/framework_spec/app/spec/library/rexml/element/instructions_spec.rb +21 -0
- data/spec/framework_spec/app/spec/library/rexml/element/namespace_spec.rb +27 -0
- data/spec/framework_spec/app/spec/library/rexml/element/namespaces_spec.rb +32 -0
- data/spec/framework_spec/app/spec/library/rexml/element/new_spec.rb +35 -0
- data/spec/framework_spec/app/spec/library/rexml/element/next_element_spec.rb +19 -0
- data/spec/framework_spec/app/spec/library/rexml/element/node_type_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/rexml/element/prefixes_spec.rb +23 -0
- data/spec/framework_spec/app/spec/library/rexml/element/previous_element_spec.rb +20 -0
- data/spec/framework_spec/app/spec/library/rexml/element/raw_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/rexml/element/root_spec.rb +28 -0
- data/spec/framework_spec/app/spec/library/rexml/element/text_spec.rb +46 -0
- data/spec/framework_spec/app/spec/library/rexml/element/texts_spec.rb +16 -0
- data/spec/framework_spec/app/spec/library/rexml/element/whitespace_spec.rb +23 -0
- data/spec/framework_spec/app/spec/library/rexml/node/each_recursive_spec.rb +21 -0
- data/spec/framework_spec/app/spec/library/rexml/node/find_first_recursive_spec.rb +25 -0
- data/spec/framework_spec/app/spec/library/rexml/node/index_in_parent_spec.rb +15 -0
- data/spec/framework_spec/app/spec/library/rexml/node/next_sibling_node_spec.rb +21 -0
- data/spec/framework_spec/app/spec/library/rexml/node/parent_spec.rb +21 -0
- data/spec/framework_spec/app/spec/library/rexml/node/previous_sibling_node_spec.rb +21 -0
- data/spec/framework_spec/app/spec/library/rexml/shared/each_element.rb +36 -0
- data/spec/framework_spec/app/spec/library/rexml/shared/elements_to_a.rb +36 -0
- data/spec/framework_spec/app/spec/library/rexml/text/append_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/rexml/text/clone_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/rexml/text/comparison_spec.rb +25 -0
- data/spec/framework_spec/app/spec/library/rexml/text/empty_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/rexml/text/indent_text_spec.rb +24 -0
- data/spec/framework_spec/app/spec/library/rexml/text/inspect_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/rexml/text/new_spec.rb +49 -0
- data/spec/framework_spec/app/spec/library/rexml/text/node_type_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/rexml/text/normalize_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/rexml/text/read_with_substitution_spec.rb +13 -0
- data/spec/framework_spec/app/spec/library/rexml/text/to_s_spec.rb +18 -0
- data/spec/framework_spec/app/spec/library/rexml/text/unnormalize_spec.rb +8 -0
- data/spec/framework_spec/app/spec/library/rexml/text/value_spec.rb +37 -0
- data/spec/framework_spec/app/spec/library/rexml/text/wrap_spec.rb +21 -0
- data/spec/framework_spec/app/spec/library/rexml/text/write_with_substitution_spec.rb +33 -0
- data/spec/framework_spec/app/spec/library/set/exclusion_spec.rb +2 -2
- data/spec/framework_spec/app/spec/library/set/merge_spec.rb +2 -2
- data/spec/framework_spec/app/spec/library/set/shared/difference.rb +2 -2
- data/spec/framework_spec/app/spec/library/set/shared/intersection.rb +2 -2
- data/spec/framework_spec/app/spec/library/set/shared/union.rb +2 -2
- data/spec/framework_spec/app/spec/library/set/sortedset/exclusion_spec.rb +2 -2
- data/spec/framework_spec/app/spec/library/set/sortedset/merge_spec.rb +2 -2
- data/spec/framework_spec/app/spec/library/set/sortedset/shared/difference.rb +2 -2
- data/spec/framework_spec/app/spec/library/set/sortedset/shared/intersection.rb +2 -2
- data/spec/framework_spec/app/spec/library/set/sortedset/shared/union.rb +2 -2
- data/spec/framework_spec/app/spec/library/timeout/timeout_spec.rb +37 -0
- data/spec/framework_spec/app/spec/library/uri/eql_spec.rb +12 -0
- data/spec/framework_spec/app/spec/library/uri/equality_spec.rb +48 -0
- data/spec/framework_spec/app/spec/library/uri/escape/decode_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/escape/encode_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/escape/escape_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/escape/unescape_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/extract_spec.rb +86 -0
- data/spec/framework_spec/app/spec/library/uri/fixtures/classes.rb +11 -0
- data/spec/framework_spec/app/spec/library/uri/fixtures/normalization.rb +54 -0
- data/spec/framework_spec/app/spec/library/uri/ftp/build_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/ftp/merge_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/ftp/new2_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/ftp/path_spec.rb +56 -0
- data/spec/framework_spec/app/spec/library/uri/ftp/set_typecode_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/ftp/to_s_spec.rb +25 -0
- data/spec/framework_spec/app/spec/library/uri/ftp/typecode_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/absolute_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/build2_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/build_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/coerce_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/component_ary_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/component_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/default_port_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/eql_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/equal_value_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/fragment_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/hash_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/hierarchical_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/host_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/inspect_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/merge_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/minus_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/normalize_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/opaque_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/password_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/path_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/plus_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/port_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/query_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/registry_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/relative_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/route_from_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/route_to_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/scheme_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/select_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/set_fragment_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/set_host_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/set_opaque_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/set_password_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/set_path_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/set_port_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/set_query_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/set_registry_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/set_scheme_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/set_user_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/set_userinfo_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/to_s_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/use_registry_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/generic/user_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/generic/userinfo_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/http/build_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/http/request_uri_spec.rb +16 -0
- data/spec/framework_spec/app/spec/library/uri/join_spec.rb +61 -0
- data/spec/framework_spec/app/spec/library/uri/ldap/attributes_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/ldap/build_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/ldap/dn_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/ldap/extensions_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/ldap/filter_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/ldap/hierarchical_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/ldap/scope_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/ldap/set_attributes_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/ldap/set_dn_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/ldap/set_extensions_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/ldap/set_filter_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/ldap/set_scope_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/mailto/build_spec.rb +99 -0
- data/spec/framework_spec/app/spec/library/uri/mailto/headers_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/mailto/set_headers_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/mailto/set_to_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/mailto/to_mailtext_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/mailto/to_rfc822text_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/mailto/to_s_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/mailto/to_spec.rb +10 -0
- data/spec/framework_spec/app/spec/library/uri/merge_spec.rb +22 -0
- data/spec/framework_spec/app/spec/library/uri/normalize_spec.rb +35 -0
- data/spec/framework_spec/app/spec/library/uri/parse_spec.rb +249 -0
- data/spec/framework_spec/app/spec/library/uri/plus_spec.rb +489 -0
- data/spec/framework_spec/app/spec/library/uri/regexp_spec.rb +18 -0
- data/spec/framework_spec/app/spec/library/uri/route_from_spec.rb +25 -0
- data/spec/framework_spec/app/spec/library/uri/route_to_spec.rb +28 -0
- data/spec/framework_spec/app/spec/library/uri/select_spec.rb +31 -0
- data/spec/framework_spec/app/spec/library/uri/set_component_spec.rb +47 -0
- data/spec/framework_spec/app/spec/library/uri/shared/eql.rb +17 -0
- data/spec/framework_spec/app/spec/library/uri/split_spec.rb +6 -0
- data/spec/framework_spec/app/spec/library/uri/uri_spec.rb +31 -0
- data/spec/framework_spec/app/spec/library/uri/util/make_components_hash_spec.rb +6 -0
- data/spec/framework_spec/build.yml +2 -2
- data/spec/framework_spec/extensions/test-libs/test/unit.rb +328 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/assertionfailederror.rb +25 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/assertions.rb +1878 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/attribute.rb +129 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/autorunner.rb +422 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/collector.rb +38 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/collector/descendant.rb +23 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/collector/dir.rb +108 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/collector/load.rb +187 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/collector/objectspace.rb +34 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/collector/xml.rb +250 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/color-scheme.rb +153 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/color.rb +123 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/data.rb +80 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/diff.rb +740 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/error.rb +151 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/exceptionhandler.rb +39 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/failure.rb +136 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/fixture.rb +214 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/notification.rb +133 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/omission.rb +191 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/pending.rb +150 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/priority.rb +182 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/runner/console.rb +59 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/runner/emacs.rb +8 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/runner/tap.rb +8 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/runner/xml.rb +15 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/testcase.rb +601 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/testresult.rb +125 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/testsuite.rb +134 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/testsuitecreator.rb +79 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/ui/console/outputlevel.rb +15 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/ui/console/testrunner.rb +561 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/ui/emacs/testrunner.rb +63 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/ui/tap/testrunner.rb +82 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/ui/testrunner.rb +53 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/ui/testrunnermediator.rb +86 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/ui/testrunnerutilities.rb +41 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/ui/xml/testrunner.rb +224 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/util/backtracefilter.rb +42 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/util/method-owner-finder.rb +28 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/util/observable.rb +90 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/util/output.rb +31 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/util/procwrapper.rb +48 -0
- data/spec/framework_spec/extensions/test-libs/test/unit/version.rb +5 -0
- data/spec/framework_spec/extensions/test-libs/webrick/accesslog.rb +10 -2
- data/spec/framework_spec/extensions/test-libs/webrick/cgi.rb +1 -1
- data/spec/framework_spec/extensions/test-libs/webrick/config.rb +1 -1
- data/spec/framework_spec/extensions/test-libs/webrick/httpauth/digestauth.rb +1 -1
- data/spec/framework_spec/extensions/test-libs/webrick/httpresponse.rb +1 -1
- data/spec/framework_spec/extensions/test-libs/webrick/https.rb +2 -2
- data/spec/framework_spec/extensions/test-libs/webrick/httpservlet/abstract.rb +1 -2
- data/spec/framework_spec/extensions/test-libs/webrick/httpservlet/cgihandler.rb +2 -2
- data/spec/framework_spec/extensions/test-libs/webrick/httpservlet/filehandler.rb +9 -5
- data/spec/framework_spec/extensions/test-libs/webrick/httpstatus.rb +32 -321
- data/spec/framework_spec/extensions/test-libs/webrick/httputils.rb +3 -3
- data/spec/framework_spec/extensions/test-libs/webrick/ssl.rb +3 -2
- data/spec/phone_spec/build.yml +1 -1
- data/version +1 -0
- metadata +521 -27
- data/lib/extensions/net-http/monitor.rb +0 -265
- data/lib/extensions/net-http/thread.rb +0 -367
- data/lib/extensions/net-http/timeout.rb +0 -114
- data/lib/extensions/net-http/uri.rb +0 -29
- data/lib/extensions/net-http/uri/common.rb +0 -727
- data/lib/extensions/net-http/uri/ftp.rb +0 -198
- data/lib/extensions/net-http/uri/generic.rb +0 -1128
- data/lib/extensions/net-http/uri/http.rb +0 -100
- data/lib/extensions/net-http/uri/https.rb +0 -20
- data/lib/extensions/net-http/uri/ldap.rb +0 -190
- data/lib/extensions/net-http/uri/ldaps.rb +0 -12
- data/lib/extensions/net-http/uri/mailto.rb +0 -266
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtDBus.framework/Versions/4/QtDBus +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtXml.framework/Versions/4/QtXml +0 -0
- data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/qmltooling/libtcpserver.dylib +0 -0
- data/res/generators/templates/application/public/jqmobile/images/icon-search-black.png +0 -0
- data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.0b3.min.css +0 -8
- data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.0b3.min.js +0 -169
- data/res/generators/templates/application/public/jquery/jquery-1.6.3.min.js +0 -4
- 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
|
+
}
|