File: version.lua

package info (click to toggle)
lua-ljsyscall 0.12-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,732 kB
  • sloc: ansic: 434; sh: 59; makefile: 3
file content (40 lines) | stat: -rw-r--r-- 1,319 bytes parent folder | download | duplicates (3)
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}