OC-PsychOS2/module/fs.lua

125 lines
3.4 KiB
Lua
Raw Normal View History

2019-11-08 12:42:49 +11:00
do
2018-11-03 03:05:41 +11:00
fs = {}
2019-11-08 12:42:49 +11:00
local fsmounts = {}
2018-11-03 03:05:41 +11:00
-- basics
2019-01-08 18:00:11 +11:00
function fs.segments(path) -- splits *path* on each /
2018-11-03 03:05:41 +11:00
local segments = {}
for segment in path:gmatch("[^/]+") do
segments[#segments+1] = segment
end
return segments
end
2019-01-08 18:00:11 +11:00
function fs.resolve(path) -- resolves *path* to a specific filesystem mount and path
2019-01-02 16:40:55 +11:00
if not path or path == "." then path = os.getenv("PWD") end
if path:sub(1,1) ~= "/" then path=(os.getenv("PWD") or "").."/"..path end
2019-11-08 12:42:49 +11:00
local segments, rpath, rfs= fs.segments(path)
local rc = #segments
for i = #segments, 1, -1 do
if fsmounts[table.concat(segments, "/", 1, i)] ~= nil then
return table.concat(segments, "/", 1, i), table.concat(segments, "/", i+1)
end
2018-11-03 03:05:41 +11:00
end
2019-11-08 12:42:49 +11:00
return "/", table.concat(segments,"/")
2018-11-03 03:05:41 +11:00
end
-- generate some simple functions
for k,v in pairs({"makeDirectory","exists","isDirectory","list","lastModified","remove","size","spaceUsed","spaceTotal","isReadOnly","getLabel"}) do
2018-11-03 03:05:41 +11:00
fs[v] = function(path)
local fsi,path = fs.resolve(path)
2019-11-08 12:42:49 +11:00
return fsmounts[fsi][v](path)
2018-11-03 03:05:41 +11:00
end
end
local function fread(self,length)
2019-11-08 12:42:49 +11:00
return fsmounts[self.fs].read(self.fid,length)
2018-11-03 03:05:41 +11:00
end
local function fwrite(self,data)
return fsmounts[self.fs].write(self.fid,data)
2018-11-03 03:05:41 +11:00
end
local function fseek(self,dist)
return fsmounts[self.fs].seek(self.fid,dist)
end
2018-11-03 03:05:41 +11:00
local function fclose(self)
return fsmounts[self.fs].close(self.fid)
2018-11-03 03:05:41 +11:00
end
2019-01-08 18:00:11 +11:00
function fs.open(path,mode) -- opens file *path* with mode *mode*
2018-11-03 03:05:41 +11:00
mode = mode or "rb"
local fsi,path = fs.resolve(path)
2019-11-08 12:42:49 +11:00
if not fsmounts[fsi] then return false end
local fid = fsmounts[fsi].open(path,mode)
2018-11-03 03:05:41 +11:00
if fid then
local fobj = {["fs"]=fsi,["fid"]=fid,["seek"]=fseek,["close"]=fclose}
2019-07-14 20:52:56 +10:00
if mode:find("r") then
2018-11-03 03:05:41 +11:00
fobj.read = fread
2019-07-14 20:52:56 +10:00
end
if mode:find("w") then
2018-11-03 03:05:41 +11:00
fobj.write = fwrite
end
return fobj
end
return false
end
2019-01-08 18:00:11 +11:00
function fs.copy(from,to) -- copies a file from *from* to *to*
2018-11-03 03:05:41 +11:00
local of = fs.open(from,"rb")
local df = fs.open(to,"wb")
if not of or not df then
return false
end
df:write(of:read("*a"))
df:close()
of:close()
end
2019-01-08 18:00:11 +11:00
function fs.rename(from,to) -- moves file *from* to *to*
2018-11-03 03:05:41 +11:00
local ofsi, opath = fs.resolve(from)
local dfsi, dpath = fs.resolve(to)
if ofsi == dfsi then
2019-11-08 12:42:49 +11:00
fsmounts[ofsi].rename(opath,dpath)
2018-11-03 03:05:41 +11:00
return true
end
fs.copy(from,to)
fs.remove(from)
return true
end
2019-11-09 13:10:15 +11:00
function fs.mount(path,proxy) -- mounts the filesystem *proxy* to the mount point *path* if it is a directory. BYO proxy.
if fs.isDirectory(path) and not fsmounts[table.concat(fs.segments(path),"/")] then
2019-11-08 12:42:49 +11:00
fsmounts[table.concat(fs.segments(path),"/")] = proxy
return true
end
return false, "path is not a directory"
end
function fs.umount(path)
local fsi,_ = fs.resolve(path)
fsmounts[fsi] = nil
end
2018-11-03 03:05:41 +11:00
2019-11-09 13:10:15 +11:00
function fs.mounts() -- returns a table containing the mount points of all mounted filesystems
local rt = {}
for k,v in pairs(fsmounts) do
rt[#rt+1] = k,v.address or "unknown"
end
return rt
end
function fs.address(path) -- returns the address of the filesystem at a given path, if applicable; do not expect a sensical response
local fsi,_ = fs.resolve(path)
return fsmounts[fsi].address
end
2019-11-09 13:10:15 +11:00
function fs.type(path) -- returns the component type of the filesystem at a given path, if applicable
local fsi,_ = fs.resolve(path)
2020-03-26 17:25:36 +11:00
return fsmounts[fsi].type or "filesystem"
end
2019-11-08 12:42:49 +11:00
fsmounts["/"] = component.proxy(computer.tmpAddress())
fs.makeDirectory("temp")
2018-11-03 03:05:41 +11:00
if computer.getBootAddress then
2019-11-08 12:42:49 +11:00
fs.makeDirectory("boot")
fs.mount("boot",component.proxy(computer.getBootAddress()))
2018-11-03 03:05:41 +11:00
end
end