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,9 +19,120 @@ 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
if tonumber(steps[1]) then
local task=kernel.tasks[tostring(steps[1])]
local step = newtaskproxy(task)
for i=2, #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
else
for i=1, #steps-1 do for i=1, #steps-1 do
local dat = step[steps[i]] local dat = step[steps[i]]
if type(dat) ~= "table" then error("ENFILE") end if type(dat) ~= "table" then error("ENFILE") end
@@ -30,6 +141,7 @@ function proxy:open(path, mode)
if type(step[steps[#steps]]) == "function" then if type(step[steps[#steps]]) == "function" then
return step[steps[#steps]]("open", mode) return step[steps[#steps]]("open", mode)
end end
end
error("ENFILE") error("ENFILE")
end end
@@ -39,6 +151,22 @@ function proxy:type(path, mode)
if #steps == 0 then if #steps == 0 then
return "directory" return "directory"
end end
if tonumber(steps[1]) then
local task=kernel.tasks[steps[1]]
if #steps==1 then return "directory" end
local step = newtaskproxy(task)
for i=2, #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
else
for i=1, #steps-1 do for i=1, #steps-1 do
local dat = step[steps[i]] local dat = step[steps[i]]
if type(dat) ~= "table" then error("ENFILE") end if type(dat) ~= "table" then error("ENFILE") end
@@ -50,6 +178,7 @@ function proxy:type(path, mode)
if type(step[steps[#steps]]) == "table" then if type(step[steps[#steps]]) == "table" then
return "directory" return "directory"
end end
end
error("ENOENT") error("ENOENT")
end end
@@ -57,8 +186,21 @@ 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
if tonumber(steps[1]) then
local task=kernel.tasks[steps[1]]
local step = newtaskproxy(task)
if #steps==1 then return table.keys(step) end
for i=2, #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
else
for i=1, #steps-1 do for i=1, #steps-1 do
local dat = step[steps[i]] local dat = step[steps[i]]
if type(dat) ~= "table" then error("ENOENT") end if type(dat) ~= "table" then error("ENOENT") end
@@ -67,6 +209,7 @@ function proxy:list(path)
if type(step[steps[#steps]]) == "table" then if type(step[steps[#steps]]) == "table" then
return table.keys(step[steps[#steps]]) 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