diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a2521dfeba6..15a91ee762a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Compatibility: * Promote `File#path` and `File#to_path` to `IO#path` and `IO#to_path` and make IO#new accept an optional `path:` keyword argument (#3039, @moste00) * Display "unhandled exception" as the message for `RuntimeError` instances with an empty message (#3255, @nirvdrum). * Set `RbConfig::CONFIG['configure_args']` for openssl and libyaml (#3170, #3303, @eregon). +* Support `Socket.sockaddr_in(port, Socket::INADDR_ANY)` (#3361, @mtortonesi). Performance: diff --git a/lib/truffle/socket/truffle/foreign.rb b/lib/truffle/socket/truffle/foreign.rb index 9ea5838d681e..6b4e4306f3ab 100644 --- a/lib/truffle/socket/truffle/foreign.rb +++ b/lib/truffle/socket/truffle/foreign.rb @@ -266,18 +266,22 @@ def self.pack_sockaddr_in(host, port, family = ::Socket::AF_UNSPEC, # to succeed on some platforms (most notably, Solaris). Integer(port) type = ::Socket::SOCK_DGRAM - rescue ArgumentError + rescue ArgumentError, TypeError # Ignored. end end + if Primitive.nil?(port) + port = 0 + end + hints = Addrinfo.new hints[:ai_family] = family hints[:ai_socktype] = type hints[:ai_flags] = flags - if host and host.empty? + if host == ::Socket::INADDR_ANY or (host and host.empty?) host = '0.0.0.0' end diff --git a/spec/ruby/library/socket/shared/pack_sockaddr.rb b/spec/ruby/library/socket/shared/pack_sockaddr.rb index 9f6238e7bc7e..26fdf682b153 100644 --- a/spec/ruby/library/socket/shared/pack_sockaddr.rb +++ b/spec/ruby/library/socket/shared/pack_sockaddr.rb @@ -17,6 +17,9 @@ sockaddr_in = Socket.public_send(@method, nil, '127.0.0.1') Socket.unpack_sockaddr_in(sockaddr_in).should == [0, '127.0.0.1'] + + sockaddr_in = Socket.public_send(@method, 80, Socket::INADDR_ANY) + Socket.unpack_sockaddr_in(sockaddr_in).should == [80, '0.0.0.0'] end platform_is_not :solaris do diff --git a/spec/ruby/library/socket/socket/pack_sockaddr_in_spec.rb b/spec/ruby/library/socket/socket/pack_sockaddr_in_spec.rb index 63d472445309..ef2a2d4ba922 100644 --- a/spec/ruby/library/socket/socket/pack_sockaddr_in_spec.rb +++ b/spec/ruby/library/socket/socket/pack_sockaddr_in_spec.rb @@ -2,6 +2,6 @@ require_relative '../fixtures/classes' require_relative '../shared/pack_sockaddr' -describe "Socket#pack_sockaddr_in" do +describe "Socket.pack_sockaddr_in" do it_behaves_like :socket_pack_sockaddr_in, :pack_sockaddr_in end diff --git a/spec/tags/library/socket/socket/pack_sockaddr_in_tags.txt b/spec/tags/library/socket/socket/pack_sockaddr_in_tags.txt deleted file mode 100644 index 07bdf4657c5d..000000000000 --- a/spec/tags/library/socket/socket/pack_sockaddr_in_tags.txt +++ /dev/null @@ -1 +0,0 @@ -fails:Socket#pack_sockaddr_in packs and unpacks