2 changed files with 117 additions and 0 deletions
@ -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 |
@ -0,0 +1,3 @@ |
|||
{["name"]="libunionfs", |
|||
["description"]="Library for creating unionfs filesystem objects.", |
|||
["authors"]="Izaya"} |
Loading…
issues.context.reference_issue