LuPPC/src/lua/core/init.lua

91 lines
2.1 KiB
Lua

function checkArg(n, have, ...)
have = type(have)
local function check(want, ...)
if not want then
return false
else
return have == want or check(...)
end
end
if not check(...) then
local msg = string.format("bad argument #%d (%s expected, got %s)",
n, table.concat({...}, " or "), have)
error(msg, 3)
end
end
-------------------------------------------------------------------------------
math.randomseed(native.uptime())--TODO: Make it better?
print("LuPI L1 INIT")
modules = {}
deadhooks = {}
local function loadModule(name)
print("LuPI L1 INIT > Load module > " .. name)
io.flush()
--TODO: PRERELEASE: Module sandboxing, preferably secure-ish
--TODO: ASAP: Handle load errors
if not moduleCode[name] then
error("No code for module " .. tostring(name))
end
local code, reason = load(moduleCode[name], "=Module "..name)
if not code then
print("Failed loading module " .. name .. ": " .. reason)
io.flush()
else
modules[name] = code()
end
end
function main()
--Load modules
--Utils
loadModule("random")
loadModule("color")
loadModule("utf8data")
loadModule("utf8")
modules.address = modules.random.uuid() --TODO: PREALPHA: Make constant
--Core
loadModule("component")
loadModule("computer")
--Components
loadModule("eeprom")
loadModule("textgpu")
loadModule("filesystem")
--Userspace
loadModule("sandbox")
loadModule("boot")
--Setup core modules
modules.component.prepare()
modules.computer.prepare()
_G.pushEvent = modules.computer.api.pushSignal
modules.eeprom.register()
modules.filesystem.register("root")
modules.filesystem.register("/") --TODO: remove from release
modules.computer.tmp = modules.filesystem.register("/tmp/lupi-" .. modules.random.uuid())
modules.textgpu.start()
modules.boot.boot()
end
local state, cause = pcall(main)
if not state then
print("LuPI finished with following error:")
print(cause)
end
print("Running shutdown hooks")
for k, hook in ipairs(deadhooks) do
local state, cause = pcall(hook)
if not state then
print("Shutdown hook with following error:")
print(cause)
end
end