mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00
58 lines
1.4 KiB
Ruby
58 lines
1.4 KiB
Ruby
![]() |
# typed: strict
|
||
|
# frozen_string_literal: true
|
||
|
|
||
|
require "socket"
|
||
|
|
||
|
module Utils
|
||
|
# Wrapper around UNIXSocket to allow > 104 characters on macOS.
|
||
|
module UNIXSocketExt
|
||
|
extend T::Generic
|
||
|
|
||
|
sig {
|
||
|
type_parameters(:U).params(
|
||
|
path: String,
|
||
|
_block: T.proc.params(arg0: UNIXSocket).returns(T.type_parameter(:U)),
|
||
|
).returns(T.type_parameter(:U))
|
||
|
}
|
||
|
def self.open(path, &_block)
|
||
|
socket = Socket.new(:UNIX, :STREAM)
|
||
|
socket.connect(sockaddr_un(path))
|
||
|
unix_socket = UNIXSocket.for_fd(socket.fileno)
|
||
|
socket.autoclose = false # Transfer autoclose responsibility to UNIXSocket
|
||
|
yield unix_socket
|
||
|
end
|
||
|
|
||
|
sig { params(path: String).returns(String) }
|
||
|
def self.sockaddr_un(path)
|
||
|
Socket.sockaddr_un(path)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# Wrapper around UNIXServer to allow > 104 characters on macOS.
|
||
|
class UNIXServerExt < Socket
|
||
|
extend T::Generic
|
||
|
|
||
|
Elem = type_member(:out) { { fixed: String } }
|
||
|
|
||
|
sig { returns(String) }
|
||
|
attr_reader :path
|
||
|
|
||
|
sig { params(path: String).void }
|
||
|
def initialize(path)
|
||
|
super(:UNIX, :STREAM)
|
||
|
bind(UNIXSocketExt.sockaddr_un(path))
|
||
|
listen(Socket::SOMAXCONN)
|
||
|
@path = path
|
||
|
end
|
||
|
|
||
|
sig { returns(UNIXSocket) }
|
||
|
def accept_nonblock
|
||
|
socket, = super
|
||
|
socket.autoclose = false # Transfer autoclose responsibility to UNIXSocket
|
||
|
UNIXSocket.for_fd(socket.fileno)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
require "extend/os/utils/socket"
|