69 lines
1.9 KiB
Lua
69 lines
1.9 KiB
Lua
local loadfile = ... -- raw loadfile from boot.lua
|
|
local component
|
|
|
|
if loadfile then
|
|
component = loadfile("/halyde/lib/component.lua")(loadfile)
|
|
else
|
|
component = import("component")
|
|
end
|
|
|
|
local filesystem = {}
|
|
|
|
function filesystem.processPath(path) -- returns the address and absolute path of a filesystem path as well as sanitizing it
|
|
checkArg(1, path, "string")
|
|
absPath = path:gsub("/+", "/"):gsub("/$", "")
|
|
local address = nil
|
|
if absPath:find("^/mnt/.../") then
|
|
address = component.get(path:sub(6,8))
|
|
if not address then
|
|
address = computer.getBootAddress()
|
|
else
|
|
absPath = absPath:sub(9)
|
|
end
|
|
else
|
|
address = computer.getBootAddress()
|
|
end
|
|
if not address then
|
|
return nil, "no such device"
|
|
end
|
|
return address, absPath
|
|
end
|
|
|
|
function filesystem.exists(path) -- check if path exists
|
|
checkArg(1, path, "string")
|
|
local address, absPath = filesystem.processPath(path)
|
|
if not address then
|
|
return false
|
|
end
|
|
return component.invoke(address, "exists", absPath)
|
|
end
|
|
|
|
function filesystem.open(path, mode) -- opens a file and returns its handle
|
|
checkArg(1, path, "string")
|
|
checkArg(2, mode, "string", "nil")
|
|
if not mode then
|
|
mode = "r"
|
|
end
|
|
if not (mode == "r" or mode == "w" or mode == "rb" or mode == "wb") then
|
|
return nil, "invalid handle type"
|
|
end
|
|
local address, absPath = filesystem.processPath(path)
|
|
local handle = component.invoke(address, "open", absPath, mode)
|
|
local properHandle = {}
|
|
properHandle.handle = handle
|
|
properHandle.address = address
|
|
function properHandle.read(self, amount)
|
|
checkArg(2, amount, "number")
|
|
return component.invoke(self.address, "read", self.handle, amount)
|
|
end
|
|
function properHandle.write(self, data)
|
|
checkArg(2, data, "string")
|
|
return component.invoke(self.address, "write", self.handle, data)
|
|
end
|
|
function properHandle.close(self)
|
|
return component.invoke(self.address, "close", self.handle)
|
|
end
|
|
return properHandle
|
|
end
|
|
|
|
return(filesystem) |