Current File : //opt/puppetlabs/puppet/lib/ruby/vendor_ruby/facter/resolvers/solaris/ffi/structs.rb |
# frozen_string_literal: true
module Facter
module Resolvers
module Solaris
module FFI
class SockaddrStorage < ::FFI::Struct
layout :ss_family, :int16,
:pad, [:char, 254]
end
class Sockaddr < ::FFI::Struct
layout :sa_family, :sa_family_t,
:sa_data, [:uchar, 14]
end
class Lifnum < ::FFI::Struct
layout :lifn_family, :sa_family_t,
:lifn_flags, :int,
:lifn_count, :int
end
class Arpreq < ::FFI::Struct
layout :arp_pa, Sockaddr,
:arp_ha, Sockaddr,
:arp_flags, :int
def sa_data_to_mac
self[:arp_ha][:sa_data].entries[0, 6].map do |s|
s.to_s(16).rjust(2, '0')
end.join ':'
end
def self.new_for_ioctl(lifreq)
arp = Arpreq.new
arp_addr = SockaddrIn.new(arp[:arp_pa].to_ptr)
arp_addr[:sin_addr][:s_addr] = SockaddrIn.new(lifreq.lifru_addr.to_ptr).s_addr
arp
end
end
class Lifru1 < ::FFI::Union
layout :lifru_addrlen, :int,
:lifru_ppa, :uint_t
end
class Lifru < ::FFI::Union
layout :lifru_addr, SockaddrStorage,
:lifru_dstaddr, SockaddrStorage,
:lifru_broadaddr, SockaddrStorage,
:lifru_token, SockaddrStorage,
:lifru_subnet, SockaddrStorage,
:lifru_flags, :uint64,
:lifru_metric, :int,
:pad, [:char, 80]
end
class Lifreq < ::FFI::Struct
layout :lifr_name, [:char, 32],
:lifr_lifru1, Lifru1,
:lifr_movetoindex, :int,
:lifr_lifru, Lifru,
:pad, [:char, 80]
def name
self[:lifr_name].to_s
end
def ss_family
self[:lifr_lifru][:lifru_addr][:ss_family]
end
def lifru_addr
self[:lifr_lifru][:lifru_addr]
end
end
class Lifconf < ::FFI::Struct
layout :lifc_family, :uint,
:lifc_flags, :int,
:lifc_len, :int,
:lifc_buf, :pointer
def self.new_for_ioctl(interface_count)
lifconf = new
lifconf[:lifc_family] = 0
lifconf[:lifc_flags] = 0
lifconf[:lifc_len] = interface_count * Lifreq.size
lifconf[:lifc_buf] = ::FFI::MemoryPointer.new(Lifreq, interface_count)
lifconf
end
end
class Lifcu < ::FFI::Union
layout :lifcu_buf, :caddr_t,
:lifcu_req, Lifreq
end
class InAddr < ::FFI::Struct
layout :s_addr, :uint32_t
end
class SockaddrIn < ::FFI::Struct
layout :sin_family, :sa_family_t,
:sin_port, :in_port_t,
:sin_addr, InAddr,
:sin_zero, [:char, 8]
def s_addr
self[:sin_addr][:s_addr]
end
end
class In6Addr < ::FFI::Struct
layout :s_addr, [:uint32_t, 4]
end
class SockaddrIn6 < ::FFI::Struct
layout :sin6_family, :sa_family_t,
:sin6_port, :in_port_t,
:sin6_flowinfo, :uint32_t,
:sin6_addr, In6Addr,
:sin6_scope_id, :uint32_t
end
end
end
end
end