oc firmware 1.0
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
F $;/boot/
|
||||
U $;/boot/
|
||||
V devfs0000;/dev/
|
||||
V tmpfs0000;/tmp/
|
||||
V procfs0000;/proc/
|
||||
|
||||
@@ -139,6 +139,7 @@ end
|
||||
kernel.config = config
|
||||
|
||||
local skip=false
|
||||
local mounted={}
|
||||
local root=false
|
||||
for i,v in ipairs(split(fstab,"\n")) do
|
||||
if v:sub(1,1)=="U" or v:sub(1,1)=="F" then
|
||||
@@ -152,13 +153,42 @@ for i,v in ipairs(split(fstab,"\n")) do
|
||||
if not skip then
|
||||
local path=v:sub(#id+4)
|
||||
if path=="/" then root=true end
|
||||
mounted[id]=true
|
||||
ifs.mount(id,path)
|
||||
else
|
||||
skip=false
|
||||
end
|
||||
end
|
||||
end
|
||||
if not root then kernel.panic("No disk mounted to /") end
|
||||
if not root then
|
||||
kernel.log("No rootdisk found, prompting user...", "WARN", 0xFF8800)
|
||||
screen:setTextColor(0xDDDDDD)
|
||||
screen:print("Disk to mount to /:")
|
||||
local idx=1
|
||||
local canadates={}
|
||||
for i,v in pairs(kernel.disks) do
|
||||
if not mounted[i] then
|
||||
screen:print("("..idx..") : "..i)
|
||||
canadates[idx]=i
|
||||
idx=idx+1
|
||||
end
|
||||
end
|
||||
while true do
|
||||
EFI:yield()
|
||||
local event={EFI:getMachineEvent()}
|
||||
if event[1]=="keyTyped" then
|
||||
if tonumber(event[3]) then
|
||||
if canadates[tonumber(event[3])] then
|
||||
ifs.writeAllText("/boot/fstab", "U "..canadates[tonumber(event[3])]..";/\n"..fstab)
|
||||
fstab="U "..canadates[tonumber(event[3])]..";/\n"..fstab
|
||||
ifs.mount(canadates[tonumber(event[3])], "/")
|
||||
break
|
||||
end
|
||||
end
|
||||
screen:print(event[1], event[3])
|
||||
end
|
||||
end
|
||||
end
|
||||
kernel.log("Disks initialized")
|
||||
|
||||
function kernel.saveLog()
|
||||
|
||||
@@ -1068,8 +1068,9 @@ function vfs.chown(path, uid, gid)
|
||||
if kernel.unixSockets[namei(path)] then error("EINVAL") end
|
||||
local disk = resolveMount(path)
|
||||
if disk:isReadOnly() then error("ERDONLY") end
|
||||
local _euid = (kernel.currentTask and (kernel.currentTask.euid or kernel.currentTask.uid)) or kernel.uid
|
||||
if _euid ~= 0 then error("EPERM") end
|
||||
local meta = getFileMeta(path)
|
||||
local euid = (kernel.currentTask and (kernel.currentTask.euid or kernel.currentTask.uid)) or kernel.uid
|
||||
if euid ~= 0 and euid ~= meta.owner then error("EPERM") end
|
||||
updateMeta(path, function(e) e.owner = uid; e.group = gid end)
|
||||
end
|
||||
|
||||
|
||||
@@ -128,11 +128,12 @@ function sys.exec(path, args, envars)
|
||||
local task = kernel.currentTask
|
||||
local func, euid, _ = loadExecutable(path, kernel._U)
|
||||
|
||||
if task.fd then
|
||||
for fd, _ in pairs(task.fd) do
|
||||
if fd > 2 then pcall(kernel.vfs.close, fd) end
|
||||
end
|
||||
end
|
||||
-- no idea why this is here?
|
||||
--if task.fd then
|
||||
-- for fd, _ in pairs(task.fd) do
|
||||
-- if fd > 2 then pcall(kernel.vfs.close, fd) end
|
||||
-- end
|
||||
--end
|
||||
|
||||
task.euid = euid
|
||||
task.args = args or {}
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
local kernel = ...
|
||||
|
||||
if kernel.firstBoot then
|
||||
kernel.log("Seeding filesystem permissions...")
|
||||
|
||||
local P = kernel.vfs.P
|
||||
local PERM = kernel.vfs.PERM
|
||||
|
||||
@@ -14,107 +16,44 @@ if kernel.firstBoot then
|
||||
local RWXRWXRWX = PERM.RWXRWXRWX
|
||||
local SUID_755 = PERM.SUID_755
|
||||
|
||||
local META_VERSION = 0x02
|
||||
local rootDisk = kernel.disks["$"]
|
||||
|
||||
local function makeEntry(name, etype, owner, group, perms, cmeta)
|
||||
cmeta = cmeta or ""
|
||||
local plo = perms % 256
|
||||
local phi = math.floor(perms / 256) % 256
|
||||
local olo = (owner or 0) % 256
|
||||
local ohi = math.floor((owner or 0) / 256) % 256
|
||||
local glo = (group or 0) % 256
|
||||
local ghi = math.floor((group or 0) / 256) % 256
|
||||
return string.char(#name) .. name
|
||||
.. string.char(etype, olo, ohi, glo, ghi, plo, phi)
|
||||
.. string.char(#cmeta) .. cmeta
|
||||
end
|
||||
|
||||
local REG = 0x00
|
||||
|
||||
local function mergeMeta(dir, entries)
|
||||
local diskDir = dir
|
||||
if diskDir:sub(1,1) == "/" then diskDir = diskDir:sub(2) end
|
||||
local metaPath = (diskDir == "" and ".meta" or diskDir .. "/.meta")
|
||||
|
||||
local existing = {}
|
||||
local rok, rf = pcall(function() return rootDisk:open(metaPath, "r") end)
|
||||
if rok and rf then
|
||||
local raw = rf.read(65535)
|
||||
if rf.close then rf.close() end
|
||||
existing = (kernel.vfs._parseMetafile and kernel.vfs._parseMetafile(raw)) or {}
|
||||
end
|
||||
|
||||
for _, e in ipairs(entries) do
|
||||
local name = e[1]
|
||||
local etype = e[2] or REG
|
||||
local owner = e[3] or 0
|
||||
local group = e[4] or 0
|
||||
local perms = e[5] or RWX_RX_RX
|
||||
local cmeta = e[6] or ""
|
||||
existing[name] = {
|
||||
etype = etype,
|
||||
owner = owner,
|
||||
group = group,
|
||||
perms = perms,
|
||||
cmeta = cmeta,
|
||||
}
|
||||
end
|
||||
|
||||
local data = string.char(META_VERSION)
|
||||
for name, m in pairs(existing) do
|
||||
data = data .. makeEntry(
|
||||
name,
|
||||
m.etype or REG,
|
||||
m.owner or 0,
|
||||
m.group or 0,
|
||||
m.perms or RWX_RX_RX,
|
||||
m.cmeta or ""
|
||||
)
|
||||
end
|
||||
|
||||
local ok, err = pcall(function()
|
||||
local f = rootDisk:open(metaPath, "w")
|
||||
f.write(data)
|
||||
f.close()
|
||||
end)
|
||||
if not ok then
|
||||
kernel.log("permissions: failed to write " .. metaPath .. ": " .. tostring(err), "WARN", 0xFF8800)
|
||||
local function seed(root, data)
|
||||
for i=1,#data do
|
||||
local entry=data[1]
|
||||
kernel.vfs.chmod(root..entry[1],entry[2],entry[3])
|
||||
kernel.vfs.chown(root..entry[1],entry[4])
|
||||
end
|
||||
end
|
||||
|
||||
kernel.log("Seeding filesystem permissions...")
|
||||
|
||||
mergeMeta("/", {
|
||||
{"bin", REG, 0, 0, RWX_RX_RX},
|
||||
{"boot", REG, 0, 0, RWX_RX_RX},
|
||||
{"dev", REG, 0, 0, RWXRWXRWX},
|
||||
{"etc", REG, 0, 0, RWX_RX_RX},
|
||||
{"home", REG, 0, 0, RWX_RX_RX},
|
||||
{"lib", REG, 0, 0, RWX_RX_RX},
|
||||
{"proc", REG, 0, 0, RWXRWXRWX},
|
||||
{"root", REG, 0, 0, RW____ },
|
||||
{"sbin", REG, 0, 0, RWX_RX_RX},
|
||||
{"tmp", REG, 0, 0, RWXRWXRWX},
|
||||
{"usr", REG, 0, 0, RWX_RX_RX},
|
||||
{"var", REG, 0, 0, RWXRWXRWX},
|
||||
{"opt", REG, 0, 0, RWX_RX_RX},
|
||||
seed("/", {
|
||||
{"bin", 0, 0, RWX_RX_RX},
|
||||
{"boot", 0, 0, RWX_RX_RX},
|
||||
{"dev", 0, 0, RWXRWXRWX},
|
||||
{"etc", 0, 0, RWX_RX_RX},
|
||||
{"home", 0, 0, RWX_RX_RX},
|
||||
{"lib", 0, 0, RWX_RX_RX},
|
||||
{"proc", 0, 0, RWXRWXRWX},
|
||||
{"root", 0, 0, RW____ },
|
||||
{"sbin", 0, 0, RWX_RX_RX},
|
||||
{"tmp", 0, 0, RWXRWXRWX},
|
||||
{"usr", 0, 0, RWX_RX_RX},
|
||||
{"var", 0, 0, RWXRWXRWX},
|
||||
{"opt", 0, 0, RWX_RX_RX},
|
||||
})
|
||||
|
||||
mergeMeta("/bin", {
|
||||
{"login", REG, 0, 0, SUID_755 },
|
||||
{"su", REG, 0, 0, SUID_755 },
|
||||
{"sudo", REG, 0, 0, SUID_755 },
|
||||
seed("/bin/", {
|
||||
{"login", 0, 0, SUID_755 },
|
||||
{"su", 0, 0, SUID_755 },
|
||||
{"sudo", 0, 0, SUID_755 },
|
||||
})
|
||||
|
||||
mergeMeta("/etc", {
|
||||
{"passwd", REG, 0, 0, RW_R_R },
|
||||
{"shadow", REG, 0, 0, RW____ },
|
||||
{"pam.d", REG, 0, 0, RW____ },
|
||||
seed("/etc/", {
|
||||
{"passwd", 0, 0, RW_R_R },
|
||||
{"shadow", 0, 0, RW____ },
|
||||
{"pam.d", 0, 0, RW____ },
|
||||
})
|
||||
|
||||
mergeMeta("/etc/pam.d", {
|
||||
{"secret", REG, 0, 0, RW____},
|
||||
seed("/etc/pam.d/", {
|
||||
{"secret", 0, 0, RW____},
|
||||
})
|
||||
|
||||
kernel.log("Filesystem permissions seeded.")
|
||||
|
||||
Reference in New Issue
Block a user