134 lines
3.5 KiB
Plaintext
134 lines
3.5 KiB
Plaintext
--:Minify:--
|
|
local kernel = ...
|
|
|
|
local proxy = {}
|
|
local data = {}
|
|
|
|
proxy.address = "tmpfs0000"
|
|
proxy.isvirt = true
|
|
proxy.isReadOnly = function() return false end
|
|
|
|
proxy.spaceUsed = function() return 0 end
|
|
proxy.spaceTotal = function() return 0 end
|
|
|
|
proxy.makeDirectory = function(_, path)
|
|
local steps = kernel.vfs.splitPath(path)
|
|
local step = data
|
|
for i=1,#steps do
|
|
if not step[steps[i]] then
|
|
step[steps[i]] = {}
|
|
elseif type(step[steps[i]]) ~= "table" then
|
|
error("ENOTDIR")
|
|
end
|
|
step = step[steps[i]]
|
|
end
|
|
end
|
|
|
|
proxy.remove = function(_, path)
|
|
local steps = kernel.vfs.splitPath(path)
|
|
local step = data
|
|
for i=1,#steps-1 do
|
|
step = step[steps[i]]
|
|
if not step then error("ENOENT") end
|
|
end
|
|
step[steps[#steps]] = nil
|
|
end
|
|
|
|
proxy.setLabel = function(_, label) end
|
|
proxy.getLabel = function() return "tmpfs" end
|
|
|
|
proxy.attributes = function(_, path)
|
|
local steps = kernel.vfs.splitPath(path)
|
|
local step = data
|
|
for i=1,#steps do
|
|
step = step[steps[i]]
|
|
if not step then error("ENOENT") end
|
|
end
|
|
return {
|
|
size = type(step) == "string" and #step or 0,
|
|
modified = 0,
|
|
created = 0,
|
|
}
|
|
end
|
|
|
|
function proxy:open(path, mode)
|
|
local steps = kernel.vfs.splitPath(path)
|
|
local step = data
|
|
for i=1,#steps-1 do
|
|
if not step[steps[i]] then
|
|
if mode == "w" then step[steps[i]] = {} else error("ENOENT") end
|
|
elseif type(step[steps[i]]) ~= "table" then
|
|
error("ENOTDIR")
|
|
end
|
|
step = step[steps[i]]
|
|
end
|
|
local filename = steps[#steps]
|
|
|
|
if mode == "r" then
|
|
if type(step[filename]) ~= "string" then error("ENOENT") end
|
|
local content = step[filename]
|
|
local pos = 1
|
|
return {
|
|
read = function(amount)
|
|
amount = amount or #content
|
|
local chunk = content:sub(pos, pos+amount-1)
|
|
pos = pos + #chunk
|
|
return chunk
|
|
end,
|
|
close = function() end,
|
|
}
|
|
elseif mode == "w" then
|
|
step[filename] = ""
|
|
local buf = {}
|
|
return {
|
|
write = function(str)
|
|
buf[#buf + 1] = str
|
|
end,
|
|
close = function()
|
|
step[filename] = table.concat(buf)
|
|
end,
|
|
}
|
|
elseif mode == "a" then
|
|
if type(step[filename]) ~= "string" then step[filename] = "" end
|
|
return {
|
|
write = function(str)
|
|
step[filename] = step[filename] .. str
|
|
end,
|
|
close = function() end,
|
|
}
|
|
else
|
|
error("EACCES")
|
|
end
|
|
end
|
|
|
|
function proxy:type(path)
|
|
local steps = kernel.vfs.splitPath(path)
|
|
local step = data
|
|
if #steps == 0 then return "directory" end
|
|
for i=1,#steps do
|
|
step = step[steps[i]]
|
|
if not step then return false end
|
|
end
|
|
if type(step) == "table" then return "directory" end
|
|
if type(step) == "string" then return "file" end
|
|
end
|
|
|
|
function proxy:list(path)
|
|
local steps = kernel.vfs.splitPath(path)
|
|
local step = data
|
|
for i=1,#steps do
|
|
step = step[steps[i]]
|
|
if not step then error("ENOENT") end
|
|
end
|
|
if type(step) ~= "table" then error("ENOTDIR") end
|
|
local keys = {}
|
|
for k,_ in pairs(step) do table.insert(keys, k) end
|
|
return keys
|
|
end
|
|
|
|
function proxy:fileExists(path)
|
|
local t = self:type(path)
|
|
return t == "file" or t == "directory"
|
|
end
|
|
|
|
kernel.disks["tmpfs0000"] = proxy |