1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
-- detect netbsd version
local abi = require "syscall.abi"
local ffi = require "ffi"
require "syscall.ffitypes"
local version, major, minor
local function inlibc_fn(k) return ffi.C[k] end
-- NetBSD ABI version
-- TODO if running rump on NetBSD the version detection is a bit flaky if the host and rump differ
-- normally this is ok if you init netbsd first and have compat installed for rump, or do not use both...
ffi.cdef[[
int sysctl(const int *, unsigned int, void *, size_t *, const void *, size_t);
int __sysctl(const int *, unsigned int, void *, size_t *, const void *, size_t);
int rump_getversion(void);
]]
local sc = ffi.new("int[2]", 1, 3) -- kern.osrev
local osrevision = ffi.new("int[1]")
local lenp = ffi.new("unsigned long[1]", ffi.sizeof("int"))
local major, minor
local ok, res
if abi.host == "netbsd" then
ok, res = pcall(ffi.C.sysctl, sc, 2, osrevision, lenp, nil, 0)
osrevision = osrevision[0]
end
if not ok or res == -1 then if pcall(inlibc_fn, "rump_getversion") then ok, osrevision = pcall(ffi.C.rump_getversion) end end
if not ok then
version = 7
else
major = math.floor(osrevision / 100000000)
minor = math.floor(osrevision / 1000000) - major * 100
version = major
if minor == 99 then version = version + 1 end
end
return {version = version, major = major, minor = minor}
|