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 ( )