adde /proc fs and working on install

This commit is contained in:
2026-03-10 09:17:21 -04:00
parent f12159bfb9
commit 12669d9f82
5 changed files with 199 additions and 27 deletions

View File

@@ -173,6 +173,27 @@ function table.indexOf(t, value)
return -1 return -1
end end
function table.merge(...)
local args={...}
local out = {}
local outi = {}
for _,t in ipairs(args) do
for i,v in pairs(t) do
out[i]=v
end
for i,v in ipairs(t) do
outi[#outi+1]=v
end
end
for i,v in ipairs(outi) do
out[i]=v
end
return out
end
function string.replace(s, target, repl) function string.replace(s, target, repl)
local result = {} local result = {}
local i = 1 local i = 1

View File

@@ -19,16 +19,128 @@ proxy.attributes = function(path) return {
created = 0 created = 0
} end } end
local function buildMeta(entries, opts)
opts = opts or {}
local uid = opts.uid or 0
local gid = opts.gid or 0
local perms = opts.perms or 0x3F -- default read/write for owner/group/world
local chunks = {}
table.insert(chunks, string.char(0x02)) -- version header
for path, target in pairs(entries) do
local name = path
local nameLen = #name
if nameLen > 255 then
error("Filename too long (>255 bytes): "..name)
end
-- Determine entry type: 0x01 = symlink if target ~= nil and target ~= ""
local entryType = 0x00
local cmeta = ""
if target and target ~= "" then
entryType = 0x01
cmeta = target
end
local cmetaLen = #cmeta
if cmetaLen > 255 then
error("cmeta too long (>255 bytes) for "..name)
end
-- Build entry as bytes
table.insert(chunks, string.char(nameLen)) -- name length
table.insert(chunks, name) -- name
table.insert(chunks, string.char(entryType)) -- entry type
table.insert(chunks, string.char(uid % 256, math.floor(uid/256) % 256)) -- uid
table.insert(chunks, string.char(gid % 256, math.floor(gid/256) % 256)) -- gid
table.insert(chunks, string.char(perms % 256, math.floor(perms/256) % 256)) -- perms
table.insert(chunks, string.char(cmetaLen)) -- cmeta length
if cmetaLen > 0 then
table.insert(chunks, cmeta)
end
end
return table.concat(chunks)
end
local function simpleFile(r,w)
return function(op, mode)
if op=="type" then
return "character device"
elseif op=="open" then
if mode=="r" then
return {
read=r
}
elseif mode=="w" then
return {
write=w
}
end
end
end
end
local function strFile(str)
local dat=tostring(str)
local pos=1
return simpleFile(function(amount)
pos=pos+amount
return dat:sub(pos-amount, pos)
end,function() error("EACCES") end)
end
local function newtaskproxy(task)
local files,siblings,children={},{},{}
if task.fd[0] then files["0"]=task.fd[0].path end
for i,v in ipairs(task.fd) do
files[tostring(i)]=tostring(v.path)
end
for i,v in ipairs(task.siblings) do
siblings[tostring(v.pid)]="/proc/"..tostring(v.pid)
end
for i,v in ipairs(task.children) do
children[tostring(v.pid)]="/proc/"..tostring(v.pid)
end
return {
[".meta"]=strFile(buildMeta({cwd=task.cwd,parent="/proc/"..tostring(task.parent.pid)})),
uid=strFile(task.uid),
comm=strFile(task.name),
fd={
[".meta"]=strFile(buildMeta(files))
},
siblings={
[".meta"]=strFile(buildMeta(siblings))
},
children={
[".meta"]=strFile(buildMeta(children))
}
}
end
function proxy:open(path, mode) function proxy:open(path, mode)
local steps = kernel.vfs.splitPath(path) local steps = kernel.vfs.splitPath(path)
local step = data local step = data
for i=1, #steps-1 do if tonumber(steps[1]) then
local dat = step[steps[i]] local task=kernel.tasks[tostring(steps[1])]
if type(dat) ~= "table" then error("ENFILE") end local step = newtaskproxy(task)
step=dat for i=2, #steps-1 do
end local dat = step[steps[i]]
if type(step[steps[#steps]]) == "function" then if type(dat) ~= "table" then error("ENFILE") end
return step[steps[#steps]]("open", mode) step=dat
end
if type(step[steps[#steps]]) == "function" then
return step[steps[#steps]]("open", mode)
end
else
for i=1, #steps-1 do
local dat = step[steps[i]]
if type(dat) ~= "table" then error("ENFILE") end
step=dat
end
if type(step[steps[#steps]]) == "function" then
return step[steps[#steps]]("open", mode)
end
end end
error("ENFILE") error("ENFILE")
end end
@@ -39,16 +151,33 @@ function proxy:type(path, mode)
if #steps == 0 then if #steps == 0 then
return "directory" return "directory"
end end
for i=1, #steps-1 do if tonumber(steps[1]) then
local dat = step[steps[i]] local task=kernel.tasks[steps[1]]
if type(dat) ~= "table" then error("ENFILE") end if #steps==1 then return "directory" end
step=dat local step = newtaskproxy(task)
end for i=2, #steps-1 do
if type(step[steps[#steps]]) == "function" then local dat = step[steps[i]]
return step[steps[#steps]]("type", mode) if type(dat) ~= "table" then error("ENFILE") end
end step=dat
if type(step[steps[#steps]]) == "table" then end
return "directory" if type(step[steps[#steps]]) == "function" then
return step[steps[#steps]]("type", mode)
end
if type(step[steps[#steps]]) == "table" then
return "directory"
end
else
for i=1, #steps-1 do
local dat = step[steps[i]]
if type(dat) ~= "table" then error("ENFILE") end
step=dat
end
if type(step[steps[#steps]]) == "function" then
return step[steps[#steps]]("type", mode)
end
if type(step[steps[#steps]]) == "table" then
return "directory"
end
end end
error("ENOENT") error("ENOENT")
end end
@@ -57,15 +186,29 @@ function proxy:list(path)
local steps = kernel.vfs.splitPath(path) local steps = kernel.vfs.splitPath(path)
local step = data local step = data
if #steps == 0 then if #steps == 0 then
return table.keys(data) return table.merge(table.keys(data),table.keys(kernel.tasks))
end end
for i=1, #steps-1 do if tonumber(steps[1]) then
local dat = step[steps[i]] local task=kernel.tasks[steps[1]]
if type(dat) ~= "table" then error("ENOENT") end local step = newtaskproxy(task)
step=dat if #steps==1 then return table.keys(step) end
end for i=2, #steps-1 do
if type(step[steps[#steps]]) == "table" then local dat = step[steps[i]]
return table.keys(step[steps[#steps]]) if type(dat) ~= "table" then error("ENOENT") end
step=dat
end
if type(step[steps[#steps]]) == "table" then
return table.keys(step[steps[#steps]])
end
else
for i=1, #steps-1 do
local dat = step[steps[i]]
if type(dat) ~= "table" then error("ENOENT") end
step=dat
end
if type(step[steps[#steps]]) == "table" then
return table.keys(step[steps[#steps]])
end
end end
error("ENOENT") error("ENOENT")
end end
@@ -77,6 +220,7 @@ function proxy:fileExists(path)
return ok return ok
end end
data.uptime=simpleFile(function()return tostring(kernel.computer:getUptime())end,function()error("EACCES")end)
kernel.procfs={} kernel.procfs={}
kernel.procfs.data=data kernel.procfs.data=data
kernel.procfs.proxy=proxy kernel.procfs.proxy=proxy

View File

@@ -148,7 +148,7 @@ if cloptions.l then
syscall.devctl(1, "sfgc", 1) syscall.devctl(1, "sfgc", 1)
end end
elseif isDir then elseif isDir then
syscall.devctl(1, "sfgc", 4) syscall.devctl(1, "sfgc", 14)
printInline(v) printInline(v)
syscall.devctl(1, "sfgc", 1) syscall.devctl(1, "sfgc", 1)
else else
@@ -177,7 +177,7 @@ for i, v in ipairs(list) do
if isSym then if isSym then
syscall.devctl(1, "sfgc", 6) syscall.devctl(1, "sfgc", 6)
elseif isDir then elseif isDir then
syscall.devctl(1, "sfgc", 4) syscall.devctl(1, "sfgc", 14)
else else
local isExec = stat and stat.perms and (math.floor(stat.perms / (2^9)) % 2 == 1) local isExec = stat and stat.perms and (math.floor(stat.perms / (2^9)) % 2 == 1)
syscall.devctl(1, "sfgc", isExec and 3 or 1) syscall.devctl(1, "sfgc", isExec and 3 or 1)

2
install/installcc.lua Normal file
View File

@@ -0,0 +1,2 @@
print("Hello, World!")
sleep()

View File

@@ -577,6 +577,11 @@ table.values=function(tabl) end
--- @return string --- @return string
table.serialize=function(tabl) end table.serialize=function(tabl) end
--- Returns a merged table with a and b
--- @param ... table
--- @return table
table.merge=function(...) end
--- Gets prefix of string with suffix --- Gets prefix of string with suffix
--- @param str string --- @param str string
--- @param suffix string --- @param suffix string