# <!-- rdoc-file=ext/socket/raddrinfo.c -->
# The Addrinfo class maps `struct addrinfo` to ruby.  This structure identifies
# an Internet host and a service.
#
class Addrinfo
  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - foreach(nodename, service, family=nil, socktype=nil, protocol=nil, flags=nil, timeout: nil, &block)
  # -->
  # iterates over the list of Addrinfo objects obtained by Addrinfo.getaddrinfo.
  #
  #     Addrinfo.foreach(nil, 80) {|x| p x }
  #     #=> #<Addrinfo: 127.0.0.1:80 TCP (:80)>
  #     #   #<Addrinfo: 127.0.0.1:80 UDP (:80)>
  #     #   #<Addrinfo: [::1]:80 TCP (:80)>
  #     #   #<Addrinfo: [::1]:80 UDP (:80)>
  #
  def self.foreach: (String? nodename, String | Integer service, ?Integer? family, ?Symbol socktype, ?Symbol | Integer protocol, ?Integer flags, ?timeout: Numeric) { (Addrinfo) -> void } -> void
                  | (String? nodename, String | Integer service, ?Integer? family, ?Symbol socktype, ?Symbol | Integer protocol, ?Integer flags, ?timeout: Numeric) -> Enumerable[Addrinfo]

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - Addrinfo.getaddrinfo(nodename, service, family, socktype, protocol, flags) => [addrinfo, ...]
  #   - Addrinfo.getaddrinfo(nodename, service, family, socktype, protocol)        => [addrinfo, ...]
  #   - Addrinfo.getaddrinfo(nodename, service, family, socktype)                  => [addrinfo, ...]
  #   - Addrinfo.getaddrinfo(nodename, service, family)                            => [addrinfo, ...]
  #   - Addrinfo.getaddrinfo(nodename, service)                                    => [addrinfo, ...]
  # -->
  # returns a list of addrinfo objects as an array.
  #
  # This method converts nodename (hostname) and service (port) to addrinfo. Since
  # the conversion is not unique, the result is a list of addrinfo objects.
  #
  # nodename or service can be nil if no conversion intended.
  #
  # family, socktype and protocol are hint for preferred protocol. If the result
  # will be used for a socket with SOCK_STREAM, SOCK_STREAM should be specified as
  # socktype. If so, Addrinfo.getaddrinfo returns addrinfo list appropriate for
  # SOCK_STREAM. If they are omitted or nil is given, the result is not
  # restricted.
  #
  # Similarly, PF_INET6 as family restricts for IPv6.
  #
  # flags should be bitwise OR of Socket::AI_??? constants such as follows. Note
  # that the exact list of the constants depends on OS.
  #
  #     AI_PASSIVE      Get address to use with bind()
  #     AI_CANONNAME    Fill in the canonical name
  #     AI_NUMERICHOST  Prevent host name resolution
  #     AI_NUMERICSERV  Prevent service name resolution
  #     AI_V4MAPPED     Accept IPv4-mapped IPv6 addresses
  #     AI_ALL          Allow all addresses
  #     AI_ADDRCONFIG   Accept only if any address is assigned
  #
  # Note that socktype should be specified whenever application knows the usage of
  # the address. Some platform causes an error when socktype is omitted and
  # servname is specified as an integer because some port numbers, 512 for
  # example, are ambiguous without socktype.
  #
  #     Addrinfo.getaddrinfo("www.kame.net", 80, nil, :STREAM)
  #     #=> [#<Addrinfo: 203.178.141.194:80 TCP (www.kame.net)>,
  #     #    #<Addrinfo: [2001:200:dff:fff1:216:3eff:feb1:44d7]:80 TCP (www.kame.net)>]
  #
  def self.getaddrinfo: (String nodename, ?String | Integer | nil service, ?Symbol? family, ?Symbol | Integer protocol) -> Array[Addrinfo]
                      | (String? nodename, ?String | Integer service, ?Symbol? family, ?Symbol | Integer protocol) -> Array[Addrinfo]

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - Addrinfo.ip(host) => addrinfo
  # -->
  # returns an addrinfo object for IP address.
  #
  # The port, socktype, protocol of the result is filled by zero. So, it is not
  # appropriate to create a socket.
  #
  #     Addrinfo.ip("localhost") #=> #<Addrinfo: 127.0.0.1 (localhost)>
  #
  def self.ip: (String host) -> Addrinfo

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - Addrinfo.tcp(host, port) => addrinfo
  # -->
  # returns an addrinfo object for TCP address.
  #
  #     Addrinfo.tcp("localhost", "smtp") #=> #<Addrinfo: 127.0.0.1:25 TCP (localhost:smtp)>
  #
  def self.tcp: (String host, String | Integer service) -> Addrinfo

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - Addrinfo.udp(host, port) => addrinfo
  # -->
  # returns an addrinfo object for UDP address.
  #
  #     Addrinfo.udp("localhost", "daytime") #=> #<Addrinfo: 127.0.0.1:13 UDP (localhost:daytime)>
  #
  def self.udp: (String host, String | Integer service) -> Addrinfo

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - Addrinfo.unix(path [, socktype]) => addrinfo
  # -->
  # returns an addrinfo object for UNIX socket address.
  #
  # *socktype* specifies the socket type. If it is omitted, :STREAM is used.
  #
  #     Addrinfo.unix("/tmp/sock")         #=> #<Addrinfo: /tmp/sock SOCK_STREAM>
  #     Addrinfo.unix("/tmp/sock", :DGRAM) #=> #<Addrinfo: /tmp/sock SOCK_DGRAM>
  #
  def self.unix: (String path, ?Symbol socktype) -> Addrinfo

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.afamily => integer
  # -->
  # returns the address family as an integer.
  #
  #     Addrinfo.tcp("localhost", 80).afamily == Socket::AF_INET #=> true
  #
  def afamily: () -> Integer

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - bind() { |sock| ... }
  # -->
  # creates a socket bound to self.
  #
  # If a block is given, it is called with the socket and the value of the block
  # is returned. The socket is returned otherwise.
  #
  #     Addrinfo.udp("0.0.0.0", 9981).bind {|s|
  #       s.local_address.connect {|s| s.send "hello", 0 }
  #       p s.recv(10) #=> "hello"
  #     }
  #
  def bind: () -> Socket
          | () { (Socket) -> void } -> void

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.canonname => string or nil
  # -->
  # returns the canonical name as a string.
  #
  # nil is returned if no canonical name.
  #
  # The canonical name is set by Addrinfo.getaddrinfo when AI_CANONNAME is
  # specified.
  #
  #     list = Addrinfo.getaddrinfo("www.ruby-lang.org", 80, :INET, :STREAM, nil, Socket::AI_CANONNAME)
  #     p list[0] #=> #<Addrinfo: 221.186.184.68:80 TCP carbon.ruby-lang.org (www.ruby-lang.org)>
  #     p list[0].canonname #=> "carbon.ruby-lang.org"
  #
  def canonname: () -> String

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - addrinfo.connect([opts]) {|socket| ... }
  #   - addrinfo.connect([opts])
  # -->
  # creates a socket connected to the address of self.
  #
  # The optional argument *opts* is options represented by a hash. *opts* may have
  # following options:
  #
  # :timeout
  # :   specify the timeout in seconds.
  #
  #
  # If a block is given, it is called with the socket and the value of the block
  # is returned. The socket is returned otherwise.
  #
  #     Addrinfo.tcp("www.ruby-lang.org", 80).connect {|s|
  #       s.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
  #       puts s.read
  #     }
  #
  def connect: (?timeout: Numeric) { (Socket) -> void } -> void
             | (?timeout: Numeric) -> Socket

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - addrinfo.connect_from([local_addr_args], [opts]) {|socket| ... }
  #   - addrinfo.connect_from([local_addr_args], [opts])
  # -->
  # creates a socket connected to the address of self.
  #
  # If one or more arguments given as *local_addr_args*, it is used as the local
  # address of the socket. *local_addr_args* is given for family_addrinfo to
  # obtain actual address.
  #
  # If *local_addr_args* is not given, the local address of the socket is not
  # bound.
  #
  # The optional last argument *opts* is options represented by a hash. *opts* may
  # have following options:
  #
  # :timeout
  # :   specify the timeout in seconds.
  #
  #
  # If a block is given, it is called with the socket and the value of the block
  # is returned. The socket is returned otherwise.
  #
  #     Addrinfo.tcp("www.ruby-lang.org", 80).connect_from("0.0.0.0", 4649) {|s|
  #       s.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
  #       puts s.read
  #     }
  #
  #     # Addrinfo object can be taken for the argument.
  #     Addrinfo.tcp("www.ruby-lang.org", 80).connect_from(Addrinfo.tcp("0.0.0.0", 4649)) {|s|
  #       s.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
  #       puts s.read
  #     }
  #
  def connect_from: (String host, Integer port, ?timeout: Numeric) { (Socket) -> void } -> void
                  | (String host, Integer port, ?timeout: Numeric) -> Socket
                  | (Addrinfo sockaddr, ?timeout: Numeric) { (Socket) -> void } -> void
                  | (Addrinfo sockaddr, ?timeout: Numeric) -> Socket

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - addrinfo.connect_to([remote_addr_args], [opts]) {|socket| ... }
  #   - addrinfo.connect_to([remote_addr_args], [opts])
  # -->
  # creates a socket connected to *remote_addr_args* and bound to self.
  #
  # The optional last argument *opts* is options represented by a hash. *opts* may
  # have following options:
  #
  # :timeout
  # :   specify the timeout in seconds.
  #
  #
  # If a block is given, it is called with the socket and the value of the block
  # is returned. The socket is returned otherwise.
  #
  #     Addrinfo.tcp("0.0.0.0", 4649).connect_to("www.ruby-lang.org", 80) {|s|
  #       s.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
  #       puts s.read
  #     }
  #
  def connect_to: (String host, Integer port, ?timeout: Numeric) { (Socket) -> void } -> void
                | (String host, Integer port, ?timeout: Numeric) -> Socket
                | (Addrinfo sockaddr, ?timeout: Numeric) { (Socket) -> void } -> void
                | (Addrinfo sockaddr, ?timeout: Numeric) -> Socket

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - family_addrinfo(*args)
  # -->
  # creates an Addrinfo object from the arguments.
  #
  # The arguments are interpreted as similar to self.
  #
  #     Addrinfo.tcp("0.0.0.0", 4649).family_addrinfo("www.ruby-lang.org", 80)
  #     #=> #<Addrinfo: 221.186.184.68:80 TCP (www.ruby-lang.org:80)>
  #
  #     Addrinfo.unix("/tmp/sock").family_addrinfo("/tmp/sock2")
  #     #=> #<Addrinfo: /tmp/sock2 SOCK_STREAM>
  #
  def family_addrinfo: (String host, Integer port) -> Addrinfo
                     | (String path) -> Addrinfo

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.getnameinfo        => [nodename, service]
  #   - addrinfo.getnameinfo(flags) => [nodename, service]
  # -->
  # returns nodename and service as a pair of strings. This converts struct
  # sockaddr in addrinfo to textual representation.
  #
  # flags should be bitwise OR of Socket::NI_??? constants.
  #
  #     Addrinfo.tcp("127.0.0.1", 80).getnameinfo #=> ["localhost", "www"]
  #
  #     Addrinfo.tcp("127.0.0.1", 80).getnameinfo(Socket::NI_NUMERICSERV)
  #     #=> ["localhost", "80"]
  #
  def getnameinfo: (?Integer flags) -> [ String, Integer ]

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.inspect => string
  # -->
  # returns a string which shows addrinfo in human-readable form.
  #
  #     Addrinfo.tcp("localhost", 80).inspect #=> "#<Addrinfo: 127.0.0.1:80 TCP (localhost)>"
  #     Addrinfo.unix("/tmp/sock").inspect    #=> "#<Addrinfo: /tmp/sock SOCK_STREAM>"
  #
  def inspect: () -> String

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.inspect_sockaddr => string
  # -->
  # returns a string which shows the sockaddr in *addrinfo* with human-readable
  # form.
  #
  #     Addrinfo.tcp("localhost", 80).inspect_sockaddr     #=> "127.0.0.1:80"
  #     Addrinfo.tcp("ip6-localhost", 80).inspect_sockaddr #=> "[::1]:80"
  #     Addrinfo.unix("/tmp/sock").inspect_sockaddr        #=> "/tmp/sock"
  #
  def inspect_sockaddr: () -> String

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.ip? => true or false
  # -->
  # returns true if addrinfo is internet (IPv4/IPv6) address. returns false
  # otherwise.
  #
  #     Addrinfo.tcp("127.0.0.1", 80).ip? #=> true
  #     Addrinfo.tcp("::1", 80).ip?       #=> true
  #     Addrinfo.unix("/tmp/sock").ip?    #=> false
  #
  def ip?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.ip_address => string
  # -->
  # Returns the IP address as a string.
  #
  #     Addrinfo.tcp("127.0.0.1", 80).ip_address    #=> "127.0.0.1"
  #     Addrinfo.tcp("::1", 80).ip_address          #=> "::1"
  #
  def ip_address: () -> String

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.ip_port => port
  # -->
  # Returns the port number as an integer.
  #
  #     Addrinfo.tcp("127.0.0.1", 80).ip_port    #=> 80
  #     Addrinfo.tcp("::1", 80).ip_port          #=> 80
  #
  def ip_port: () -> Integer

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.ip_unpack => [addr, port]
  # -->
  # Returns the IP address and port number as 2-element array.
  #
  #     Addrinfo.tcp("127.0.0.1", 80).ip_unpack    #=> ["127.0.0.1", 80]
  #     Addrinfo.tcp("::1", 80).ip_unpack          #=> ["::1", 80]
  #
  def ip_unpack: () -> [ String, Integer ]

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.ipv4? => true or false
  # -->
  # returns true if addrinfo is IPv4 address. returns false otherwise.
  #
  #     Addrinfo.tcp("127.0.0.1", 80).ipv4? #=> true
  #     Addrinfo.tcp("::1", 80).ipv4?       #=> false
  #     Addrinfo.unix("/tmp/sock").ipv4?    #=> false
  #
  def ipv4?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv4_loopback?()
  # -->
  # Returns true for IPv4 loopback address (127.0.0.0/8). It returns false
  # otherwise.
  #
  def ipv4_loopback?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv4_multicast?()
  # -->
  # Returns true for IPv4 multicast address (224.0.0.0/4). It returns false
  # otherwise.
  #
  def ipv4_multicast?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv4_private?()
  # -->
  # Returns true for IPv4 private address (10.0.0.0/8, 172.16.0.0/12,
  # 192.168.0.0/16). It returns false otherwise.
  #
  def ipv4_private?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.ipv6? => true or false
  # -->
  # returns true if addrinfo is IPv6 address. returns false otherwise.
  #
  #     Addrinfo.tcp("127.0.0.1", 80).ipv6? #=> false
  #     Addrinfo.tcp("::1", 80).ipv6?       #=> true
  #     Addrinfo.unix("/tmp/sock").ipv6?    #=> false
  #
  def ipv6?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_linklocal?()
  # -->
  # Returns true for IPv6 link local address (fe80::/10). It returns false
  # otherwise.
  #
  def ipv6_linklocal?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_loopback?()
  # -->
  # Returns true for IPv6 loopback address (::1). It returns false otherwise.
  #
  def ipv6_loopback?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_mc_global?()
  # -->
  # Returns true for IPv6 multicast global scope address. It returns false
  # otherwise.
  #
  def ipv6_mc_global?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_mc_linklocal?()
  # -->
  # Returns true for IPv6 multicast link-local scope address. It returns false
  # otherwise.
  #
  def ipv6_mc_linklocal?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_mc_nodelocal?()
  # -->
  # Returns true for IPv6 multicast node-local scope address. It returns false
  # otherwise.
  #
  def ipv6_mc_nodelocal?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_mc_orglocal?()
  # -->
  # Returns true for IPv6 multicast organization-local scope address. It returns
  # false otherwise.
  #
  def ipv6_mc_orglocal?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_mc_sitelocal?()
  # -->
  # Returns true for IPv6 multicast site-local scope address. It returns false
  # otherwise.
  #
  def ipv6_mc_sitelocal?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_multicast?()
  # -->
  # Returns true for IPv6 multicast address (ff00::/8). It returns false
  # otherwise.
  #
  def ipv6_multicast?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_sitelocal?()
  # -->
  # Returns true for IPv6 site local address (fec0::/10). It returns false
  # otherwise.
  #
  def ipv6_sitelocal?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_to_ipv4()
  # -->
  # Returns IPv4 address of IPv4 mapped/compatible IPv6 address. It returns nil if
  # `self` is not IPv4 mapped/compatible IPv6 address.
  #
  #     Addrinfo.ip("::192.0.2.3").ipv6_to_ipv4      #=> #<Addrinfo: 192.0.2.3>
  #     Addrinfo.ip("::ffff:192.0.2.3").ipv6_to_ipv4 #=> #<Addrinfo: 192.0.2.3>
  #     Addrinfo.ip("::1").ipv6_to_ipv4              #=> nil
  #     Addrinfo.ip("192.0.2.3").ipv6_to_ipv4        #=> nil
  #     Addrinfo.unix("/tmp/sock").ipv6_to_ipv4      #=> nil
  #
  def ipv6_to_ipv4: () -> Addrinfo?

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_unique_local?()
  # -->
  # Returns true for IPv6 unique local address (fc00::/7, RFC4193). It returns
  # false otherwise.
  #
  def ipv6_unique_local?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_unspecified?()
  # -->
  # Returns true for IPv6 unspecified address (::). It returns false otherwise.
  #
  def ipv6_unspecified?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_v4compat?()
  # -->
  # Returns true for IPv4-compatible IPv6 address (::/80). It returns false
  # otherwise.
  #
  def ipv6_v4compat?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - ipv6_v4mapped?()
  # -->
  # Returns true for IPv4-mapped IPv6 address (::ffff:0:0/80). It returns false
  # otherwise.
  #
  def ipv6_v4mapped?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - listen(backlog=Socket::SOMAXCONN) { |sock| ... }
  # -->
  # creates a listening socket bound to self.
  #
  def listen: (Integer backlog) -> void

  def marshal_dump: () -> String

  def marshal_load: (String) -> self

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.pfamily => integer
  # -->
  # returns the protocol family as an integer.
  #
  #     Addrinfo.tcp("localhost", 80).pfamily == Socket::PF_INET #=> true
  #
  def pfamily: () -> Integer

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.protocol => integer
  # -->
  # returns the socket type as an integer.
  #
  #     Addrinfo.tcp("localhost", 80).protocol == Socket::IPPROTO_TCP #=> true
  #
  def protocol: () -> Integer

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.socktype => integer
  # -->
  # returns the socket type as an integer.
  #
  #     Addrinfo.tcp("localhost", 80).socktype == Socket::SOCK_STREAM #=> true
  #
  def socktype: () -> Integer

  # <!-- rdoc-file=ext/socket/raddrinfo.c -->
  # returns the socket address as packed struct sockaddr string.
  #
  #     Addrinfo.tcp("localhost", 80).to_sockaddr
  #     #=> "\x02\x00\x00P\x7F\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00"
  #
  def to_s: () -> String

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.to_sockaddr => string
  #   - addrinfo.to_s => string
  # -->
  # returns the socket address as packed struct sockaddr string.
  #
  #     Addrinfo.tcp("localhost", 80).to_sockaddr
  #     #=> "\x02\x00\x00P\x7F\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00"
  #
  def to_sockaddr: () -> String

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.unix? => true or false
  # -->
  # returns true if addrinfo is UNIX address. returns false otherwise.
  #
  #     Addrinfo.tcp("127.0.0.1", 80).unix? #=> false
  #     Addrinfo.tcp("::1", 80).unix?       #=> false
  #     Addrinfo.unix("/tmp/sock").unix?    #=> true
  #
  def unix?: () -> bool

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - addrinfo.unix_path => path
  # -->
  # Returns the socket path as a string.
  #
  #     Addrinfo.unix("/tmp/sock").unix_path       #=> "/tmp/sock"
  #
  def unix_path: () -> String

  private

  # <!--
  #   rdoc-file=ext/socket/raddrinfo.c
  #   - Addrinfo.new(sockaddr)                             => addrinfo
  #   - Addrinfo.new(sockaddr, family)                     => addrinfo
  #   - Addrinfo.new(sockaddr, family, socktype)           => addrinfo
  #   - Addrinfo.new(sockaddr, family, socktype, protocol) => addrinfo
  # -->
  # returns a new instance of Addrinfo. The instance contains sockaddr, family,
  # socktype, protocol. sockaddr means struct sockaddr which can be used for
  # connect(2), etc. family, socktype and protocol are integers which is used for
  # arguments of socket(2).
  #
  # sockaddr is specified as an array or a string. The array should be compatible
  # to the value of IPSocket#addr or UNIXSocket#addr. The string should be struct
  # sockaddr as generated by Socket.sockaddr_in or Socket.unpack_sockaddr_un.
  #
  # sockaddr examples:
  # *   `["AF_INET", 46102, "localhost.localdomain", "127.0.0.1"]`
  # *   `["AF_INET6", 42304, "ip6-localhost", "::1"]`
  # *   `["AF_UNIX", "/tmp/sock"]`
  # *   `Socket.sockaddr_in("smtp", "2001:DB8::1")`
  # *   `Socket.sockaddr_in(80, "172.18.22.42")`
  # *   `Socket.sockaddr_in(80, "www.ruby-lang.org")`
  # *   `Socket.sockaddr_un("/tmp/sock")`
  #
  # In an AF_INET/AF_INET6 sockaddr array, the 4th element, numeric IP address, is
  # used to construct socket address in the Addrinfo instance. If the 3rd element,
  # textual host name, is non-nil, it is also recorded but used only for
  # Addrinfo#inspect.
  #
  # family is specified as an integer to specify the protocol family such as
  # Socket::PF_INET. It can be a symbol or a string which is the constant name
  # with or without PF_ prefix such as :INET, :INET6, :UNIX, "PF_INET", etc. If
  # omitted, PF_UNSPEC is assumed.
  #
  # socktype is specified as an integer to specify the socket type such as
  # Socket::SOCK_STREAM. It can be a symbol or a string which is the constant name
  # with or without SOCK_ prefix such as :STREAM, :DGRAM, :RAW, "SOCK_STREAM",
  # etc. If omitted, 0 is assumed.
  #
  # protocol is specified as an integer to specify the protocol such as
  # Socket::IPPROTO_TCP. It must be an integer, unlike family and socktype. If
  # omitted, 0 is assumed. Note that 0 is reasonable value for most protocols,
  # except raw socket.
  #
  def initialize: (String sockaddr, ?Symbol family, ?(Symbol | Integer)? socktype, ?Integer? protocol) -> untyped
end
