forked from Mirror/GodMode9
113 lines
3.2 KiB
Lua
113 lines
3.2 KiB
Lua
|
local fs = {}
|
||
|
|
||
|
fs.move = _fs.move
|
||
|
fs.remove = _fs.remove
|
||
|
fs.copy = _fs.copy
|
||
|
fs.mkdir = _fs.mkdir
|
||
|
fs.list_dir = _fs.list_dir
|
||
|
fs.stat = _fs.stat
|
||
|
fs.stat_fs = _fs.stat_fs
|
||
|
fs.dir_info = _fs.dir_info
|
||
|
fs.ask_select_file = _fs.ask_select_file
|
||
|
fs.ask_select_dir = _fs.ask_select_dir
|
||
|
fs.find = _fs.find
|
||
|
fs.find_all = _fs.find_all
|
||
|
fs.find_not = _fs.find_not
|
||
|
fs.exists = _fs.exists
|
||
|
fs.is_dir = _fs.is_dir
|
||
|
fs.is_file = _fs.is_file
|
||
|
fs.read_file = _fs.read_file
|
||
|
fs.fill_file = _fs.fill_file
|
||
|
fs.make_dummy_file = _fs.make_dummy_file
|
||
|
fs.truncate = _fs.truncate
|
||
|
fs.img_mount = _fs.img_mount
|
||
|
fs.img_umount = _fs.img_umount
|
||
|
fs.get_img_mount = _fs.get_img_mount
|
||
|
fs.hash_file = _fs.hash_file
|
||
|
fs.hash_data = _fs.hash_data
|
||
|
fs.verify = _fs.verify
|
||
|
fs.allow = _fs.allow
|
||
|
fs.sd_is_mounted = _fs.sd_is_mounted
|
||
|
fs.sd_switch = _fs.sd_switch
|
||
|
fs.fix_cmacs = _fs.fix_cmacs
|
||
|
fs.key_dump = _fs.key_dump
|
||
|
fs.cart_dump = _fs.cart_dump
|
||
|
|
||
|
-- compatibility
|
||
|
function os.remove(path)
|
||
|
local success, allowed, stat, error
|
||
|
success, stat = pcall(fs.stat, path)
|
||
|
if not success then
|
||
|
return nil, path..": No such file or directory", 2
|
||
|
end
|
||
|
if stat.type == "dir" then
|
||
|
-- os.remove can remove an empty directory, so we gotta check
|
||
|
success, dir_list = pcall(fs.list_dir, path)
|
||
|
if not success then
|
||
|
return nil, "Error occurred listing directory: "..dir_list, 2001
|
||
|
end
|
||
|
if #dir_list ~= 0 then
|
||
|
return nil, path..": Directory not empty", 39
|
||
|
end
|
||
|
end
|
||
|
allowed = fs.allow(path)
|
||
|
if not allowed then
|
||
|
return nil, path..": Operation not permitted", 1
|
||
|
end
|
||
|
success, error = pcall(fs.remove, path, {recursive=true})
|
||
|
if success then
|
||
|
return true
|
||
|
else
|
||
|
return nil, "Error occurred removing item: "..error, 2001
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- compatibility
|
||
|
function os.rename(src, dst)
|
||
|
error("os.rename is not implemented yet (try fs.move instead)")
|
||
|
--local success, drv_src, drv_dst, allowed
|
||
|
--drv_src = string.upper(string.sub(src, 1, 1))
|
||
|
--drv_dst = string.upper(string.sub(dst, 1, 1))
|
||
|
--if drv_src ~= drv_dst then
|
||
|
-- return nil, "Invalid cross-device link", 18
|
||
|
--end
|
||
|
--allowed = fs.allow(src) and fs.allow(dst)
|
||
|
--if not allowed then
|
||
|
-- return nil, "Permission denied", 13
|
||
|
--end
|
||
|
end
|
||
|
|
||
|
function fs.write_file(path, offset, data)
|
||
|
local success, filestat
|
||
|
if type(offset) == "string" then
|
||
|
if offset == "end" then
|
||
|
success, filestat = pcall(fs.stat, path)
|
||
|
if success then
|
||
|
offset = filestat.size
|
||
|
else
|
||
|
-- allows for this to work on files that don't yet exist
|
||
|
offset = 0
|
||
|
end
|
||
|
else
|
||
|
error("offset should be an integer or \"end\"")
|
||
|
end
|
||
|
elseif type(offset) ~= "number" then
|
||
|
error("offset should be an integer or \"end\"")
|
||
|
end
|
||
|
|
||
|
return _fs.write_file(path, offset, data)
|
||
|
end
|
||
|
|
||
|
function fs.verify_with_sha_file(path)
|
||
|
local success, file_hash, sha_data, path_sha
|
||
|
path_sha = path..".sha"
|
||
|
success, sha_data = pcall(fs.read_file, path_sha, 0, 0x20)
|
||
|
if not success then
|
||
|
return nil
|
||
|
end
|
||
|
file_hash = fs.hash_file(path, 0, 0)
|
||
|
return file_hash == sha_data
|
||
|
end
|
||
|
|
||
|
return fs
|