You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
1.9 KiB
Lua

local component, error, math, select = component, error, math, select
local cl, ci, ct = component.list, component.invoke, component.type
local function bail(msg, ...)
if select('#', ...) > 0 then
msg = msg:format(...)
end
return error(msg, 0)
end
local function unique(addr1, addr2, what)
if addr1 and addr2 then
return bail('multiple %s: %s, %s', what, addr1, addr2)
end
return addr1 or addr2 or bail('no %s', what)
end
local eeprom
for addr in cl('eeprom') do eeprom = unique(eeprom, addr, 'eeproms') end
eeprom = unique(eeprom, nil, 'eeprom')
local data = ci(eeprom, 'getData')
local bootfs
if data == '' then
for fs in cl('filesystem') do
if ci(fs, 'exists', '/init.lua') then
bootfs = unique(bootfs, fs, 'bootable filesystems')
end
end
bootfs = unique(bootfs, nil, 'bootable filesystem')
else
local ty, err = ct(data)
if not ty then bail('bootfs %s absent', data) end
if ty ~= 'filesystem' then bail('bootfs %s is a %s', data, ty) end
bootfs = data
end
--polyfill {get,set}BootAddress like normal bios does
--they should exist! <https://github.com/MightyPirates/OpenComputers/blob/871e3c83d36c428c8652e0527eb19c217bb072d2/src/main/resources/assets/opencomputers/lua/machine.lua#L1381-L1384>
--normal lua bios says it provides {get,set}BootAddress for "backwards compatibility", but there's no replacement
function computer.getBootAddress()
return ci(eeprom, 'getData')
end
function computer.setBootAddress(addr)
return ci(eeprom, 'setData', addr)
end
local fd, err = ci(bootfs, 'open', '/init.lua')
if not fd then bail('open %s/init.lua failed: %s', bootfs:sub(1, 8), err) end
local code = ''
local lots = math.maxinteger or math.huge --read as much as possible
repeat
local chunk, err = ci(bootfs, 'read', fd, lots)
if err then bail('read %s/init.lua failed: %s', bootfs:sub(1, 8), err) end
code = code .. (chunk or '')
until not chunk
ci(bootfs, 'close', fd)
local fn = assert(load(code, '@/init.lua'))
return fn()