From d0378582ae9b6ed043372c948d227e02f0406f66 Mon Sep 17 00:00:00 2001 From: XeonSquared Date: Sun, 7 Jun 2020 23:22:36 +1000 Subject: [PATCH] import unionfs library from main PsychOS repo --- unionfs/lib/unionfs.lua | 114 ++++++++++++++++++++++++++++++++++++++++ unionfs/package.cfg | 3 ++ 2 files changed, 117 insertions(+) create mode 100644 unionfs/lib/unionfs.lua create mode 100644 unionfs/package.cfg diff --git a/unionfs/lib/unionfs.lua b/unionfs/lib/unionfs.lua new file mode 100644 index 0000000..ca4051d --- /dev/null +++ b/unionfs/lib/unionfs.lua @@ -0,0 +1,114 @@ +local unionfs = {} + +local function normalise(path) + return table.concat(fs.segments(path),"/") +end + +function unionfs.create(...) -- string -- table -- Returns a unionfs object of the directories specified in *...*. + local paths,fids,fc = {...}, {}, 0 + for k,v in pairs(paths) do + paths[k] = "/"..normalise(v) + end + local proxy = {} + local function realpath(path) + path = path or "" + for k,v in pairs(paths) do + if fs.exists(v.."/"..path) then + return v.."/"..path + end + end + return paths[1].."/"..path + end + + function proxy.setLabel() + return false + end + + function proxy.spaceUsed() + return fs.spaceUsed(paths[1]) + end + function proxy.spaceTotal() + return fs.spaceTotal(paths[1]) + end + function proxy.isReadOnly() + return fs.isReadOnly(paths[1]) + end + function proxy.isDirectory(path) + return fs.isDirectory(realpath(path)) + end + function proxy.lastModified(path) + return fs.lastModified(realpath(path)) + end + function proxy.getLabel() + return fs.getLabel(paths[1]) + end + + function proxy.exists(path) + return fs.exists(realpath(path)) + end + function proxy.remove(path) + return fs.remove(realpath(path)) + end + function proxy.size(path) + return fs.size(realpath(path)) + end + + function proxy.list(path) + local nt,rt = {},{} + if #fs.segments(path) < 1 then + for k,v in pairs(paths) do + for l,m in ipairs(fs.list(v.."/"..path)) do + nt[m] = true + end + end + for k,v in pairs(nt) do + rt[#rt+1] = k + end + table.sort(rt) + return rt + else + return fs.list(realpath(path)) + end + end + + function proxy.open(path,mode) + local fh, r = fs.open(realpath(path),mode) + if not fh then return fh, r end + fids[fc] = fh + fc = fc + 1 + return fc - 1 + end + + function proxy.close(fid) + if not fids[fid] then + return false, "file not open" + end + local rfh = fids[fid] + fids[fid] = nil + return rfh:close() + end + function proxy.write(fid,d) + if not fids[fid] then + return false, "file not open" + end + return fids[fid]:write(d) + end + function proxy.read(fid,d) + if not fids[fid] then + return false, "file not open" + end + local rb = fids[fid]:read(d) + if rb == "" then rb = nil end + return rb + end + function proxy.seek(fid,d) + if not fids[fid] then + return false, "file not open" + end + return fids[fid]:seek(d) + end + + return proxy +end + +return unionfs diff --git a/unionfs/package.cfg b/unionfs/package.cfg new file mode 100644 index 0000000..5d5bdc4 --- /dev/null +++ b/unionfs/package.cfg @@ -0,0 +1,3 @@ +{["name"]="libunionfs", + ["description"]="Library for creating unionfs filesystem objects.", + ["authors"]="Izaya"}