From c6ee7bcd73cc45b49a15680e9942e30173bd72ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20M=C3=BCller?= Date: Wed, 12 Sep 2018 16:58:48 +0200 Subject: [PATCH] Fix Socket#reuse_port? if SO_REUSEPORT is not supported (#6706) * Fix Socket#reuse_port? if SO_REUSEPORT is not supported * fixup! Fix Socket#reuse_port? if SO_REUSEPORT is not supported --- src/socket.cr | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/socket.cr b/src/socket.cr index 2f1a0a58fe4a..3dc108e1c92b 100644 --- a/src/socket.cr +++ b/src/socket.cr @@ -391,7 +391,15 @@ class Socket < IO end def reuse_port? - getsockopt_bool LibC::SO_REUSEPORT + ret = getsockopt(LibC::SO_REUSEPORT, 0) do |errno| + # If SO_REUSEPORT is not supported, the return value should be `false` + if errno.errno == Errno::ENOPROTOOPT + return false + else + raise errno + end + end + ret != 0 end def reuse_port=(val : Bool) @@ -445,9 +453,13 @@ class Socket < IO # Returns the modified *optval*. def getsockopt(optname, optval, level = LibC::SOL_SOCKET) + getsockopt(optname, optval, level) { |errno| raise errno } + end + + protected def getsockopt(optname, optval, level = LibC::SOL_SOCKET) optsize = LibC::SocklenT.new(sizeof(typeof(optval))) ret = LibC.getsockopt(fd, level, optname, (pointerof(optval).as(Void*)), pointerof(optsize)) - raise Errno.new("getsockopt") if ret == -1 + yield Errno.new("getsockopt") if ret == -1 optval end