diff --git a/partman/service/partman.lua b/partman/service/partman.lua index 14eac8c..caab4fc 100644 --- a/partman/service/partman.lua +++ b/partman/service/partman.lua @@ -1,59 +1,54 @@ local diskpart = require "diskpart" local vcomponent = require "vcomponent" local partman = {} -partman.fstypes = {"rtfs"} -local run = true -local function attachPartition(addr) - syslog("Finding filesystem that will mount "..addr) - for _,n in ipairs(partman.fstypes) do - local w,l = pcall(require,string.format("fs.%s",n)) - if w then - syslog("Trying "..n) - local w, f = pcall(l.mount,addr) - if w then - syslog(n.." successful!") - vcomponent.register(string.format("%s/%s",addr,n), "filesystem",f) - break +local hooks = {} + +function hooks.component_added(_,a,t) + if t ~= "drive" then return end + for k,v in ipairs(diskpart.getPartitions(a)) do + if v[4] > 0 then + syslog(string.format("Registering vcomponent for partition %s/%i",a,k)) + vcomponent.register(string.format("%s/%i",a,k), "partition", diskpart.proxyPartition(a, k)) + local w,l = pcall(require,string.format("fs.%s",v[2])) + if w and l and l.mount then + syslog(string.format("Trying to mount %s/%i as %s", a, k, v[2])) + local w, f = pcall(l.mount, string.format("%s/%i",a,k)) + if w then + vcomponent.register(string.format("%s/%i/%s",a,k,v[2]), f.type or "filesystem", f) + end end end end end -local function attachDrive(addr) - for k,v in ipairs(diskpart.getPartitions(addr)) do - if v[4] > 0 then - syslog(string.format("Registering vcomponent for partition %s/%i",addr,k)) - vcomponent.register(string.format("%s/%i",addr,k), "partition", diskpart.proxyPartition(addr, k)) - syslog("Attempting to mount a filesystem...") - attachPartition(string.format("%s/%i",addr,k)) +function hooks.component_removed(_,a,t) + if t ~= "drive" then return end + for ca,t in component.list() do + if (t == "partition" or t == "filesystem") and ca:sub(1,a:len()) == a then + vcomponent.unregister(ca) end end end function partman.start() - run = true - os.spawn(function() - for a,_ in component.list("drive") do - attachDrive(a) + return os.spawn(function() + for a,t in component.list("drive") do + hooks.component_added(nil, a, t) end - while run do + while true do local tE = {coroutine.yield()} - if tE[1] == "component_added" and tE[3] == "drive" then - attachDrive(tE[2]) - elseif tE[1] == "component_removed" and tE[3] == "drive" then - for a,t in component.list() do - if (t == "partition" or t == "filesystem") and a:sub(1,tE[2]:len()) == tE[2] then - syslog("Removing "..t.." vcomponent "..a) - vcomponent.unregister(a) - end - end + if tE[1] and hooks[tE[1]] then + hooks[tE[1]](table.unpack(tE)) end end end, "partman") end + function partman.stop() - run = false + for a,t in component.list("drive") do + hooks.component_removed(nil, a, t) + end end return partman