2023-08-03 17:20:19 +10:00
|
|
|
local partition = {}
|
|
|
|
|
|
|
|
local eformat = "c20c4>I4>I4"
|
|
|
|
function partition.parse(s)
|
|
|
|
local rt = {}
|
|
|
|
for i = 1, s:len(), 32 do
|
|
|
|
local n, t, start, length = string.unpack(eformat, s, i)
|
|
|
|
n = n:gsub("\0", "")
|
|
|
|
if n ~= "" then
|
|
|
|
rt[#rt+1] = {n,t,start,length}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return rt
|
|
|
|
end
|
|
|
|
function partition.generate(pt)
|
|
|
|
local ps = ""
|
|
|
|
for k,v in ipairs(pt) do
|
|
|
|
ps = ps .. string.pack(eformat, table.unpack(v))
|
|
|
|
end
|
|
|
|
return ps
|
|
|
|
end
|
2023-08-01 17:55:45 +10:00
|
|
|
|
|
|
|
local function getProxy(addr)
|
|
|
|
if type(addr) == "string" then
|
|
|
|
return component.proxy(component.get(addr))
|
|
|
|
end
|
|
|
|
return addr
|
|
|
|
end
|
|
|
|
|
|
|
|
function partition.getPartitions(drive)
|
|
|
|
drive = getProxy(drive)
|
2023-08-03 17:20:19 +10:00
|
|
|
local rv = partition.parse(drive.readSector(drive.getCapacity() / drive.getSectorSize()))
|
|
|
|
return rv[1][2] == "mtpt" and rv or {}
|
2023-08-01 17:55:45 +10:00
|
|
|
end
|
|
|
|
function partition.setPartitions(drive, pt, name)
|
|
|
|
drive = getProxy(drive)
|
2023-08-03 17:20:19 +10:00
|
|
|
name = name or ""
|
|
|
|
if pt[1][2] ~= "mtpt" then table.insert(pt, 1, {name, "mtpt", 0, 0}) end
|
|
|
|
local ns = partition.generate(pt)
|
|
|
|
return drive.writeSector(drive.getCapacity() / drive.getSectorSize(), ns .. ("\0"):rep(drive.getSectorSize() - #ns))
|
2023-08-01 17:55:45 +10:00
|
|
|
end
|
|
|
|
|
|
|
|
function partition.proxyPartition(drive, index)
|
|
|
|
drive = getProxy(drive)
|
|
|
|
local part = partition.getPartitions(drive)[index]
|
|
|
|
local sectorOffset, byteOffset, finish = part[3] - 1, (part[3]-1) * drive.getSectorSize()
|
2023-08-03 17:20:19 +10:00
|
|
|
local proxy = {label=part[1],ptype=part[2]}
|
2023-08-01 17:55:45 +10:00
|
|
|
|
2023-08-03 17:20:19 +10:00
|
|
|
function proxy.getCapacity()
|
|
|
|
return drive.getSectorSize() * part[4]
|
|
|
|
end
|
2023-08-01 17:55:45 +10:00
|
|
|
function proxy.getLabel()
|
|
|
|
return part[1]
|
|
|
|
end
|
|
|
|
function proxy.setLabel()
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
local function offsetSector(sector)
|
|
|
|
if sector < 1 or sector > part[4] then error("invalid offset, not in a usable sector") end
|
|
|
|
return sectorOffset + sector
|
|
|
|
end
|
|
|
|
function proxy.readSector(sector)
|
|
|
|
return drive.readSector(offsetSector(sector))
|
|
|
|
end
|
|
|
|
function proxy.writeSector(sector, data)
|
|
|
|
return drive.writeSector(offsetSector(sector), data)
|
|
|
|
end
|
|
|
|
|
|
|
|
local function offsetByte(byte)
|
|
|
|
if byte < 1 or byte > part[4]*drive.getSectorSize() then return 0 end
|
|
|
|
return byteOffset + byte
|
|
|
|
end
|
|
|
|
function proxy.readByte(byte)
|
|
|
|
return drive.readByte(offsetByte(byte))
|
|
|
|
end
|
|
|
|
function proxy.writeByte(byte, data)
|
|
|
|
return drive.writeByte(offsetByte(byte), data)
|
|
|
|
end
|
|
|
|
for k,v in pairs(drive) do
|
|
|
|
proxy[k] = proxy[k] or v
|
|
|
|
end
|
|
|
|
return proxy
|
|
|
|
end
|
|
|
|
|
|
|
|
return partition
|