Class: NetworkUtils
- Inherits:
-
Object
- Object
- NetworkUtils
- Defined in:
- lib/resolvers/windows/ffi/network_utils.rb
Class Method Summary collapse
- .address_to_string(addr) ⇒ Object
- .build_binding(addr, mask_length) ⇒ Object
- .extract_address(addr) ⇒ Object
- .find_mac_address(adapter) ⇒ Object
- .get_scope(sockaddr) ⇒ Object
- .ignored_ip_address(addr) ⇒ Object
Class Method Details
.address_to_string(addr) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# File 'lib/resolvers/windows/ffi/network_utils.rb', line 6 def address_to_string(addr) return if addr[:lpSockaddr] == FFI::Pointer::NULL size = FFI::MemoryPointer.new(NetworkingFFI::INET6_ADDRSTRLEN + 1) buffer = FFI::MemoryPointer.new(:wchar, NetworkingFFI::INET6_ADDRSTRLEN + 1) error = nil 3.times do error = NetworkingFFI::WSAAddressToStringW(addr[:lpSockaddr], addr[:iSockaddrLength], FFI::Pointer::NULL, buffer, size) break if error.zero? end unless error.zero? @log.debug 'address to string translation failed!' return end extract_address(buffer) end |
.build_binding(addr, mask_length) ⇒ Object
38 39 40 41 42 43 44 45 46 |
# File 'lib/resolvers/windows/ffi/network_utils.rb', line 38 def build_binding(addr, mask_length) ip = IPAddr.new(addr) mask = if ip.ipv6? IPAddr.new('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff').mask(mask_length) else IPAddr.new('255.255.255.255').mask(mask_length) end { address: addr, netmask: mask, network: ip.mask(mask_length) } end |
.extract_address(addr) ⇒ Object
24 25 26 |
# File 'lib/resolvers/windows/ffi/network_utils.rb', line 24 def extract_address(addr) addr.read_wide_string_without_length.split('%').first end |
.find_mac_address(adapter) ⇒ Object
32 33 34 35 36 |
# File 'lib/resolvers/windows/ffi/network_utils.rb', line 32 def find_mac_address(adapter) adapter[:PhysicalAddress].first(adapter[:PhysicalAddressLength]) .map { |e| format('%<mac_address>02x', mac_address: e.to_i) } .join(':').upcase end |
.get_scope(sockaddr) ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/resolvers/windows/ffi/network_utils.rb', line 48 def get_scope(sockaddr) require 'socket' scope6 = [] addrinfo = Addrinfo.new(['AF_INET6', 0, nil, sockaddr], :INET6) scope6 << 'compat,' if addrinfo.ipv6_v4compat? scope6 << if addrinfo.ipv6_linklocal? 'link' elsif addrinfo.ipv6_sitelocal? 'site' elsif addrinfo.ipv6_loopback? 'host' else 'global' end scope6.join end |
.ignored_ip_address(addr) ⇒ Object
28 29 30 |
# File 'lib/resolvers/windows/ffi/network_utils.rb', line 28 def ignored_ip_address(addr) addr.empty? || addr.start_with?('127.', '169.254.') || addr.start_with?('fe80') || addr.eql?('::1') end |