devfs = {} devfs.files = {} devfs.fds = {} devfs.nextfd = 0 devfs.component = {} local function rfalse() return false end local function rzero() return 0 end function devfs.component.getLabel() return "devfs" end devfs.component.spaceUsed, devfs.component.spaceTotal, devfs.component.isReadOnly, devfs.component.isDirectory,devfs.component.size, devfs.component.setLabel = rzero, rzero, rfalse, rfalse, rzero, rfalse function devfs.component.exists(fname) return devfs.files[fname] ~= nil end function devfs.component.list() local t = {} for k,v in pairs(devfs.files) do t[#t+1] = k end return t end function devfs.component.open(fname, mode) fname=fname:gsub("/","") if devfs.files[fname] then local r,w,c,s = devfs.files[fname](mode) devfs.fds[devfs.nextfd] = {["read"]=r or rfalse,["write"]=w or rfalse,["seek"]=s or rfalse,["close"]=c or rfalse} devfs.nextfd = devfs.nextfd + 1 return devfs.nextfd - 1 end return false end function devfs.component.read(fd,count) if devfs.fds[fd] then return devfs.fds[fd].read(count) end end function devfs.component.write(fd,data) if devfs.fds[fd] then return devfs.fds[fd].write(data) end end function devfs.component.close(fd) if devfs.fds[fd] then devfs.fds[fd].close() end devfs.fds[fd] = nil end function devfs.component.seek(fd,...) if devfs.fds[fd] then return devfs.fds[fd].seek(...) end end function devfs.component.remove(fname) end devfs.component.address = "devfs" devfs.component.type = "devfs" function devfs.register(fname,fopen) -- string function -- -- Register a new devfs node with the name *fname* that will run the function *fopen* when opened. This function should return a function for read, a function for write, function for close, and optionally, a function for seek, in that order. devfs.files[fname] = fopen end fs.makeDirectory("/dev") fs.mount("/dev",devfs.component) --#include "module/devfs/null.lua"