147 lines
3.6 KiB
Plaintext
147 lines
3.6 KiB
Plaintext
--:Minify:--
|
|
local kernel = ...
|
|
|
|
local proxy = {}
|
|
local data = {}
|
|
|
|
proxy.address = "devfs0000"
|
|
proxy.isvirt = true
|
|
proxy.isReadOnly = function() return false end
|
|
proxy.spaceUsed = function() return 0 end
|
|
proxy.spaceTotal = function() return 0 end
|
|
proxy.makeDirectory = function() error("EACCES") end
|
|
proxy.remove = function() error("EACCES") end
|
|
proxy.setLabel = function() error("EACCES") end
|
|
proxy.getLabel = function() return "devfs" end
|
|
proxy.attributes = function(path) return {
|
|
size = 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
|
|
local dat = step[steps[i]]
|
|
if type(dat) ~= "table" then error("ENFILE") end
|
|
step=dat
|
|
end
|
|
if type(step[steps[#steps]]) == "function" then
|
|
return step[steps[#steps]]("open", mode)
|
|
end
|
|
error("ENFILE")
|
|
end
|
|
|
|
function proxy:type(path, mode)
|
|
local steps = kernel.vfs.splitPath(path)
|
|
local step = data
|
|
if #steps == 0 then
|
|
return "directory"
|
|
end
|
|
for i=1, #steps-1 do
|
|
local dat = step[steps[i]]
|
|
if type(dat) ~= "table" then error("ENFILE") end
|
|
step=dat
|
|
end
|
|
if type(step[steps[#steps]]) == "function" then
|
|
return step[steps[#steps]]("type", mode)
|
|
end
|
|
if type(step[steps[#steps]]) == "table" then
|
|
return "directory"
|
|
end
|
|
error("ENOENT")
|
|
end
|
|
|
|
function proxy:list(path)
|
|
local steps = kernel.vfs.splitPath(path)
|
|
local step = data
|
|
if #steps == 0 then
|
|
return table.keys(data)
|
|
end
|
|
for i=1, #steps-1 do
|
|
local dat = step[steps[i]]
|
|
if type(dat) ~= "table" then error("ENOENT") end
|
|
step=dat
|
|
end
|
|
if type(step[steps[#steps]]) == "table" then
|
|
return table.keys(step[steps[#steps]])
|
|
end
|
|
error("ENOENT")
|
|
end
|
|
|
|
function proxy:fileExists(path)
|
|
local ok = pcall(function()
|
|
return self:type(path)
|
|
end)
|
|
return ok
|
|
end
|
|
|
|
function data.random(op, mode)
|
|
if op=="type" then
|
|
return "character device"
|
|
elseif op=="open" then
|
|
if mode=="r" then
|
|
return {
|
|
read=function(amount)
|
|
local str = ""
|
|
for i=1, amount or 1 do
|
|
str=str..string.char(math.random(0, 255))
|
|
end
|
|
return str
|
|
end
|
|
}
|
|
elseif mode=="w" or mode=="a" then
|
|
return {
|
|
write=function() end
|
|
}
|
|
else error("EACCES")
|
|
end
|
|
end
|
|
end
|
|
|
|
function data.null(op, mode)
|
|
if op=="type" then
|
|
return "character device"
|
|
elseif op=="open" then
|
|
if mode=="r" then
|
|
return {
|
|
read=function(amount) end
|
|
}
|
|
elseif mode=="w" or mode=="a" then
|
|
return {
|
|
write=function() end
|
|
}
|
|
else error("EACCES")
|
|
end
|
|
end
|
|
end
|
|
|
|
function data.zero(op, mode)
|
|
if op=="type" then
|
|
return "character device"
|
|
elseif op=="open" then
|
|
if mode=="r" then
|
|
return {
|
|
read=function(amount)
|
|
local str = ""
|
|
for i=1, amount or 1 do
|
|
str=str..string.char(0)
|
|
end
|
|
return str
|
|
end
|
|
}
|
|
elseif mode=="w" or mode=="a" then
|
|
return {
|
|
write=function() end
|
|
}
|
|
else error("EACCES")
|
|
end
|
|
end
|
|
end
|
|
|
|
data["disk"]={}
|
|
kernel.devfs={}
|
|
kernel.devfs.data=data
|
|
kernel.devfs.proxy=proxy
|
|
kernel.disks["devfs0000"]=proxy |