fix drive mounts, VFS listings(ish)

This commit is contained in:
osmarks 2024-09-03 12:31:57 +01:00
parent 288ef5f03a
commit 2453c7756a
3 changed files with 78 additions and 7 deletions

File diff suppressed because one or more lines are too long

View File

@ -220,12 +220,16 @@ local function create_FS(vfstree)
return last_usable_node, last_segs
end
local function resolve_path(sandbox_path)
local node, segs = resolve(sandbox_path)
local function resolve_node_segs(node, segs)
if node.mount then return fs, fscombine(node.mount, combine(segs)) end
return node.vfs, combine(segs)
end
local function resolve_path(sandbox_path)
local node, segs = resolve(sandbox_path)
return resolve_node_segs(node, segs)
end
local function lift_to_sandbox(f, n)
return function(path)
local vfs, path = resolve_path(path)
@ -298,7 +302,25 @@ local function create_FS(vfstree)
end
end
add_to_table(new, map(lift_to_sandbox, copy_some_keys {"isDir", "getDrive", "getSize", "getFreeSpace", "makeDir", "delete", "isDriveRoot", "exists", "isReadOnly", "list", "attributes"} (fs)))
function new.list(path)
local node, segs = resolve(path)
local vfs, path = resolve_node_segs(node, segs)
if #segs > 0 then return vfs.list(path) end
local out = {}
local seen = {}
for k, v in pairs(node.children or {}) do
table.insert(out, k)
seen[k] = true
end
for _, v in pairs(vfs.list(path)) do
if not seen[v] then
table.insert(out, v)
end
end
return out
end
add_to_table(new, map(lift_to_sandbox, copy_some_keys {"isDir", "getDrive", "getSize", "getFreeSpace", "makeDir", "delete", "isDriveRoot", "exists", "isReadOnly", "attributes"} (fs)))
function new.find(wildcard)
local function recurse_spec(results, path, spec) -- From here: https://github.com/Sorroko/cclite/blob/62677542ed63bd4db212f83da1357cb953e82ce3/src/emulator/native_api.lua

View File

@ -1299,6 +1299,31 @@ local function run_with_sandbox()
local yafss = require "yafss"
local drive_mounts = {
children = {},
vfs = {}
}
function drive_mounts.vfs.list(path)
local out = {}
for k, v in pairs(drive_mounts.children) do
table.insert(out, k)
end
return out
end
function drive_mounts.vfs.exists(path)
return drive_mounts.children[path] ~= nil
end
function drive_mounts.vfs.isDir(path) return true end
function drive_mounts.vfs.getDrive(path) return "disks" end
function drive_mounts.vfs.getSize(path) return 0 end
function drive_mounts.vfs.getFreeSpace(path) return 0 end
function drive_mounts.vfs.makeDir(path) end
function drive_mounts.vfs.delete(path) end
function drive_mounts.vfs.isReadOnly(path) return true end
local vfstree = {
mount = "potatOS",
children = {
@ -1322,7 +1347,8 @@ local function run_with_sandbox()
}
}
}
}
},
["disks"] = drive_mounts
}
}
@ -1362,6 +1388,18 @@ local function run_with_sandbox()
local computers = {}
local compcount = 0
local signs = {}
local function mount_disk(drive_name)
local mountpoint = peripheral.call(drive_name, "getMountPath")
if mountpoint then
drive_mounts.children[drive_name] = { mount = mountpoint }
end
end
local function unmount_disk(drive_name)
drive_mounts.children[drive_name] = nil
end
local function add_peripheral(name)
local typ = peripheral.getType(name)
if typ == "modem" then
@ -1371,10 +1409,16 @@ local function run_with_sandbox()
compcount = compcount + 1
elseif typ == "minecraft:sign" then
signs[name] = true
elseif typ == "drive" then
if peripheral.call(name, "isDiskPresent") then
mount_disk(name)
end
end
end
for _, name in pairs(peripheral.getNames()) do add_peripheral(name) end
local timer = os.startTimer(1)
while true do
local e, name, channel, _, message = os.pullEvent()
if e == "peripheral" then add_peripheral(name)
@ -1382,7 +1426,8 @@ local function run_with_sandbox()
local typ = peripheral.getType(name)
if typ == "computer" then computers[name] = nil compcount = compcount - 1
elseif typ == "modem" then modems[name] = nil
elseif typ == "minecraft:sign" then signs[name] = nil end
elseif typ == "minecraft:sign" then signs[name] = nil
elseif typ == "drive" then unmount_disk(name) end
elseif e == "modem_message" then
if channel == 62381 and type(message) == "string" then
add_log("netd message %s", message)
@ -1403,6 +1448,10 @@ local function run_with_sandbox()
end
end
timer = os.startTimer(1 + math.random(0, compcount * 2))
elseif e == "disk" then
mount_disk(name)
elseif e == "disk_eject" then
unmount_disk(name)
end
end
end, "netd", { grants = { [notermsentinel] = true }, restrictions = {} })