added a heap of tape-related functionality. I'm not really happy with it yet.
This commit is contained in:
parent
221d0fbd1b
commit
0f6d126eaf
@ -15,6 +15,7 @@ modules/net/net-ext.lua
|
|||||||
modules/applications/luash.lua
|
modules/applications/luash.lua
|
||||||
modules/applications/genkernel.lua
|
modules/applications/genkernel.lua
|
||||||
modules/applications/skex2.lua
|
modules/applications/skex2.lua
|
||||||
|
modules/util/tape.lua
|
||||||
modules/util/fs-automount.lua
|
modules/util/fs-automount.lua
|
||||||
modules/setup.lua
|
modules/setup.lua
|
||||||
modules/base/footer.lua
|
modules/base/footer.lua
|
||||||
|
@ -1,9 +1,5 @@
|
|||||||
do
|
do
|
||||||
local C=0
|
local C=0
|
||||||
if component.type(computer.getBootAddress()) == "tape_drive" then
|
|
||||||
fs.mount("boot",computer.tmpAddress())
|
|
||||||
print(computer.tmpAddress():sub(1,8).." mounted as boot")
|
|
||||||
end
|
|
||||||
for c in component.list("filesystem") do
|
for c in component.list("filesystem") do
|
||||||
if c == computer.tmpAddress() then
|
if c == computer.tmpAddress() then
|
||||||
fs.mount("tmp",component.proxy(c))
|
fs.mount("tmp",component.proxy(c))
|
||||||
@ -21,4 +17,25 @@ do
|
|||||||
print(c:sub(1,8).." mounted as fs"..string.format("%02d",C))
|
print(c:sub(1,8).." mounted as fs"..string.format("%02d",C))
|
||||||
C=C+1
|
C=C+1
|
||||||
end
|
end
|
||||||
|
if component.type(computer.getBootAddress()) == "tape_drive" then
|
||||||
|
fs.mount("boot",component.proxy(computer.tmpAddress()))
|
||||||
|
print(computer.tmpAddress():sub(1,8).." mounted as boot")
|
||||||
|
if tape then
|
||||||
|
tape.rewind()
|
||||||
|
local pt = tape.records()
|
||||||
|
for k,v in ipairs(pt) do
|
||||||
|
if v[1] == "D" then
|
||||||
|
print(tostring(k).."\t"..v[1].."\t/boot/"..tape.rrecord(k))
|
||||||
|
fs.mkdir("/boot/"..tape.rrecord(k))
|
||||||
|
elseif v[1] == "f" then
|
||||||
|
local fn,fc = tape.parsefile(tape.rrecord(k))
|
||||||
|
print(tostring(k).."\t"..v[1].."\t/boot/"..fn)
|
||||||
|
local f=io.open("/boot/"..fn,"wb")
|
||||||
|
f:write(fc)
|
||||||
|
f:close()
|
||||||
|
end
|
||||||
|
computer.beep()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
161
modules/util/tape.lua
Normal file
161
modules/util/tape.lua
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
tape = {}
|
||||||
|
tape.types = {}
|
||||||
|
tape.types["!"] = "executable"
|
||||||
|
tape.types["t"] = "tar"
|
||||||
|
tape.types["d"] = "data"
|
||||||
|
tape.types["D"] = "directory"
|
||||||
|
tape.types["f"] = "file"
|
||||||
|
function tape.records(addr) -- { { type, start, end, length } }
|
||||||
|
local tp,ct = {},0
|
||||||
|
addr = addr or component.list("tape_drive")()
|
||||||
|
local t = component.proxy(addr)
|
||||||
|
local function read(n)
|
||||||
|
n=n or 1
|
||||||
|
ct=ct+n
|
||||||
|
return t.read(n)
|
||||||
|
end
|
||||||
|
local function seek(n)
|
||||||
|
n=n or 1
|
||||||
|
ct=ct+n
|
||||||
|
return t.seek(n)
|
||||||
|
end
|
||||||
|
while true do
|
||||||
|
local ty = read()
|
||||||
|
if not tape.types[ty] then break end
|
||||||
|
tp[#tp+1] = {ty,ct+8} -- type, start,
|
||||||
|
local ln = tonumber(read(8)) or 0
|
||||||
|
tp[#tp][#tp[#tp]+1] = ct+ln -- end
|
||||||
|
tp[#tp][#tp[#tp]+1] = ln -- length
|
||||||
|
seek(ln)
|
||||||
|
end
|
||||||
|
return tp
|
||||||
|
end
|
||||||
|
function tape.precords(addr)
|
||||||
|
tape.rewind(addr)
|
||||||
|
local pt = tape.records(addr)
|
||||||
|
for k,v in ipairs(pt) do
|
||||||
|
print(k.."\t"..v[1].."\t"..v[2].."\t"..v[3].."\t"..v[4])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function tape.drecord(n,addr)
|
||||||
|
addr = addr or component.list("tape_drive")()
|
||||||
|
tape.rewind(addr)
|
||||||
|
local pt = tape.records(addr)
|
||||||
|
tape.rewind(addr)
|
||||||
|
local t = component.proxy(addr)
|
||||||
|
print(pt[n][2]-9)
|
||||||
|
t.seek(pt[n][2]-9)
|
||||||
|
t.write("\0")
|
||||||
|
tape.rewind()
|
||||||
|
end
|
||||||
|
function tape.wrecord(c,ty,s,addr)
|
||||||
|
ty = ty or "!"
|
||||||
|
addr = addr or component.list("tape_drive")()
|
||||||
|
local t = component.proxy(addr)
|
||||||
|
if s then
|
||||||
|
t.seek(-math.huge)
|
||||||
|
t.seek(s)
|
||||||
|
end
|
||||||
|
local fh=ty:sub(1,1)..string.format("%8d",c:len())
|
||||||
|
print("Header: "..fh)
|
||||||
|
t.write(fh)
|
||||||
|
t.write(c)
|
||||||
|
end
|
||||||
|
function tape.rrecord(pn,addr)
|
||||||
|
addr = addr or component.list("tape_drive")()
|
||||||
|
pn = pn or 1
|
||||||
|
local t = component.proxy(addr)
|
||||||
|
local pP = t.seek(-math.huge)
|
||||||
|
local pt = tape.records(addr)
|
||||||
|
t.seek(-math.huge)
|
||||||
|
local pstart,plen = pt[pn][2],pt[pn][4]
|
||||||
|
t.seek(pstart)
|
||||||
|
C=t.read(plen)
|
||||||
|
t.seek(-math.huge)
|
||||||
|
t.seek(pP)
|
||||||
|
return C
|
||||||
|
end
|
||||||
|
function tape.nrecord(addr)
|
||||||
|
addr = addr or component.list("tape_drive")()
|
||||||
|
local t = component.proxy(addr)
|
||||||
|
local pP = t.seek(-math.huge)
|
||||||
|
local pt = tape.records(addr)
|
||||||
|
t.seek(-math.huge)
|
||||||
|
t.seek(pP)
|
||||||
|
return pt[#pt][3]
|
||||||
|
end
|
||||||
|
function tape.rewind(addr)
|
||||||
|
addr = addr or component.list("tape_drive")()
|
||||||
|
local t = component.proxy(addr)
|
||||||
|
t.seek(-math.huge)
|
||||||
|
end
|
||||||
|
function tape.parsefile(str)
|
||||||
|
return str:sub(1,64):gsub("\0",""), str:sub(65)
|
||||||
|
end
|
||||||
|
function tape.unparsefile(fname,str)
|
||||||
|
local nul = "\0"
|
||||||
|
nul=nul:rep(64-#fname)
|
||||||
|
fname=nul..fname
|
||||||
|
return fname..str
|
||||||
|
end
|
||||||
|
function tape.mkdir(str,addr)
|
||||||
|
tape.wrecord(str,"D",tape.nrecord(),addr)
|
||||||
|
end
|
||||||
|
function tape.wfile(fname,fcont,addr)
|
||||||
|
tape.wrecord(str,"f",tape.nrecord(),addr)
|
||||||
|
end
|
||||||
|
function tape.wtree(addr)
|
||||||
|
local ft = {""}
|
||||||
|
local rft = {}
|
||||||
|
addr = addr or component.list("tape_drive")()
|
||||||
|
local t = component.proxy(addr)
|
||||||
|
for _,d in ipairs(ft) do
|
||||||
|
local ls = fs.list(d)
|
||||||
|
for k,v in ipairs(ls) do
|
||||||
|
v=d..v
|
||||||
|
if fs.isdir(v) then
|
||||||
|
ft[#ft+1] = v
|
||||||
|
else
|
||||||
|
rft[#rft+1] = v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
tape.rewind(addr)
|
||||||
|
t.seek(tape.nrecord(addr))
|
||||||
|
for k,v in ipairs(ft) do
|
||||||
|
if v ~= "" then
|
||||||
|
print(v)
|
||||||
|
local fh="D"..string.format("%8d",v:len())
|
||||||
|
t.write(fh)
|
||||||
|
t.write(v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for k,v in ipairs(rft) do
|
||||||
|
print(v)
|
||||||
|
local f=io.open(v,"rb")
|
||||||
|
local fc = f:read("*a")
|
||||||
|
local fc = tape.unparsefile(v,fc)
|
||||||
|
f:close()
|
||||||
|
local fh="f"..string.format("%8d",fc:len())
|
||||||
|
t.write(fh)
|
||||||
|
t.write(fc)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function tape.rtree(pref,addr)
|
||||||
|
tape.rewind()
|
||||||
|
local pt = tape.records()
|
||||||
|
for k,v in ipairs(pt) do
|
||||||
|
if v[1] == "D" then
|
||||||
|
print(tostring(k).."\t"..v[1].."\t"..pref..tape.rrecord(k))
|
||||||
|
fs.mkdir(pref..tape.rrecord(k))
|
||||||
|
elseif v[1] == "f" then
|
||||||
|
local fn,fc = tape.parsefile(tape.rrecord(k))
|
||||||
|
print(tostring(k).."\t"..v[1].."\t"..pref..fn)
|
||||||
|
local f=io.open(pref..fn,"wb")
|
||||||
|
f:write(fc)
|
||||||
|
f:close()
|
||||||
|
end
|
||||||
|
computer.beep()
|
||||||
|
coroutine.yield()
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user