Merge pull request 'made newer installer that does not require tar stuff' (#17) from 1.2-dev into main
Reviewed-on: #17
This commit was merged in pull request #17.
This commit is contained in:
commit
041663e1e8
107 files changed
+640
-345
No files matched your search
@@ -249,6 +249,14 @@ local ok, err = xpcall(function()
|
|||||||
return value
|
return value
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local allscreens = {apis.peripheral.find("monitor")}
|
||||||
|
for i=1, #allscreens do
|
||||||
|
allscreens[i].setTextScale(.5)
|
||||||
|
allscreens[i].clear()
|
||||||
|
allscreens[i].setCursorPos(1,1)
|
||||||
|
allscreens[i].write("Initializing...")
|
||||||
|
end
|
||||||
|
|
||||||
local EFI = {
|
local EFI = {
|
||||||
getEpochMs = function() return apis.os.epoch("utc") end,
|
getEpochMs = function() return apis.os.epoch("utc") end,
|
||||||
getUptime = function() return apis.os.clock() * 1000 end,
|
getUptime = function() return apis.os.clock() * 1000 end,
|
||||||
@@ -303,7 +311,8 @@ local ok, err = xpcall(function()
|
|||||||
h.close()
|
h.close()
|
||||||
end,
|
end,
|
||||||
firmware=apis,
|
firmware=apis,
|
||||||
reboot=false
|
reboot=false,
|
||||||
|
beep=function() end
|
||||||
}
|
}
|
||||||
|
|
||||||
apis.term.setBackgroundColor(0x8000)
|
apis.term.setBackgroundColor(0x8000)
|
||||||
@@ -340,7 +349,7 @@ local ok, err = xpcall(function()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
write("Loaded in " .. tostring(apis.os.clock()) .. " seconds.\n")
|
EFI.screenCtl:print("Loaded in " .. tostring(apis.os.clock()) .. " seconds.\n")
|
||||||
|
|
||||||
while true do
|
while true do
|
||||||
local status, err = coroutine.resumeWithTimeout(kernelCoro, 50)
|
local status, err = coroutine.resumeWithTimeout(kernelCoro, 50)
|
||||||
|
|||||||
File renamed without changes.
File renamed without changes.
@@ -1,7 +1,6 @@
|
|||||||
--:Minify:--
|
--:Minify:--
|
||||||
local kernel = ...
|
local kernel = ...
|
||||||
local peripheral=kernel.cct.peripheral
|
local peripheral=kernel.cct.peripheral
|
||||||
local keys=kernel.apis.keys
|
|
||||||
|
|
||||||
local colors = {
|
local colors = {
|
||||||
[0xFFFFFF]=0x0001,
|
[0xFFFFFF]=0x0001,
|
||||||
@@ -146,7 +145,7 @@ local function write(text, term)
|
|||||||
end
|
end
|
||||||
|
|
||||||
kernel.devfs.data.tty={}
|
kernel.devfs.data.tty={}
|
||||||
local ctrl,alt = false, false
|
kernel.cct.ctrl,kernel.cct.alt = false, false
|
||||||
|
|
||||||
local function serializeBool(bool)
|
local function serializeBool(bool)
|
||||||
if bool then
|
if bool then
|
||||||
@@ -222,7 +221,7 @@ local function newtty(obj, id, ev)
|
|||||||
return bg
|
return bg
|
||||||
end,
|
end,
|
||||||
gctrl=function()
|
gctrl=function()
|
||||||
return serializeBool(ctrl)..";"..serializeBool(alt)
|
return serializeBool(kernel.cct.ctrl)..";"..serializeBool(kernel.cct.alt)
|
||||||
end,
|
end,
|
||||||
gplt=function()
|
gplt=function()
|
||||||
return plt
|
return plt
|
||||||
@@ -242,83 +241,7 @@ local function newtty(obj, id, ev)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local fifo = kernel.newFifo()
|
local fifo = kernel.newFifo()
|
||||||
|
kernel.cct.fifo=fifo
|
||||||
kernel.processes.cctmond = function()
|
|
||||||
local timeout = false
|
|
||||||
while true do
|
|
||||||
local event = {kernel.EFI:getMachineEvent()}
|
|
||||||
|
|
||||||
if event[1] then
|
|
||||||
local eventType = event[1]
|
|
||||||
local charOrKey = event[3]
|
|
||||||
|
|
||||||
local ctrlKeyMap = {
|
|
||||||
[keys.a]=1, [keys.b]=2, [keys.c]=3,
|
|
||||||
[keys.d]=4, [keys.e]=5, [keys.f]=6,
|
|
||||||
[keys.g]=7, [keys.h]=8, [keys.i]=9,
|
|
||||||
[keys.j]=10, [keys.k]=11, [keys.l]=12,
|
|
||||||
[keys.m]=13, [keys.n]=14, [keys.o]=15,
|
|
||||||
[keys.p]=16, [keys.q]=17, [keys.r]=18,
|
|
||||||
[keys.s]=19, [keys.t]=20, [keys.u]=21,
|
|
||||||
[keys.v]=22, [keys.w]=23, [keys.x]=24,
|
|
||||||
[keys.y]=25, [keys.z]=26,
|
|
||||||
}
|
|
||||||
|
|
||||||
if eventType == "keyPressed" then
|
|
||||||
if charOrKey == keys.leftCtrl or charOrKey == keys.rightCtrl then
|
|
||||||
ctrl = true
|
|
||||||
elseif charOrKey == keys.leftAlt or charOrKey == keys.rightAlt then
|
|
||||||
alt = true
|
|
||||||
end
|
|
||||||
|
|
||||||
if ctrl then
|
|
||||||
local ctrlByte = ctrlKeyMap[charOrKey]
|
|
||||||
if ctrlByte then
|
|
||||||
if ctrlByte == 3 then
|
|
||||||
for _, task in ipairs(syscall.getTasks()) do
|
|
||||||
syscall.sigsend(task, 1)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
fifo.push(string.char(ctrlByte))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
local specialKeyMap = {
|
|
||||||
[keys.up] = "[A",
|
|
||||||
[keys.down] = "[B",
|
|
||||||
[keys.right] = "[C",
|
|
||||||
[keys.left] = "[D",
|
|
||||||
[keys.home] = "[H",
|
|
||||||
[keys["end"]] = "[F",
|
|
||||||
[keys.pageUp] = "[5~",
|
|
||||||
[keys.pageDown] = "[6~",
|
|
||||||
[keys.delete] = "[3~",
|
|
||||||
}
|
|
||||||
local special = specialKeyMap[charOrKey]
|
|
||||||
if special then fifo.push(special) end
|
|
||||||
end
|
|
||||||
|
|
||||||
elseif eventType == "keyReleased" then
|
|
||||||
if charOrKey == keys.leftCtrl or charOrKey == keys.rightCtrl then
|
|
||||||
ctrl = false
|
|
||||||
elseif charOrKey == keys.leftAlt or charOrKey == keys.rightAlt then
|
|
||||||
alt = false
|
|
||||||
end
|
|
||||||
|
|
||||||
elseif eventType == "keyTyped" then
|
|
||||||
if charOrKey then fifo.push(charOrKey) end
|
|
||||||
end
|
|
||||||
|
|
||||||
timeout = false
|
|
||||||
else
|
|
||||||
timeout = true
|
|
||||||
end
|
|
||||||
|
|
||||||
if timeout then
|
|
||||||
sleep(0.05)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
newtty(kernel.apis.term, "1", fifo.pop)
|
newtty(kernel.apis.term, "1", fifo.pop)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
--:Minify:--
|
||||||
|
local kernel=...
|
||||||
|
local keys=kernel.apis.keys
|
||||||
|
|
||||||
|
kernel.processes.cctdeamon = function()
|
||||||
|
local timeout = false
|
||||||
|
while true do
|
||||||
|
local event = {kernel.EFI:getMachineEvent()}
|
||||||
|
|
||||||
|
if event[1] then
|
||||||
|
local eventType = event[1]
|
||||||
|
local charOrKey = event[3]
|
||||||
|
|
||||||
|
local ctrlKeyMap = {
|
||||||
|
[keys.a]=1, [keys.b]=2, [keys.c]=3,
|
||||||
|
[keys.d]=4, [keys.e]=5, [keys.f]=6,
|
||||||
|
[keys.g]=7, [keys.h]=8, [keys.i]=9,
|
||||||
|
[keys.j]=10, [keys.k]=11, [keys.l]=12,
|
||||||
|
[keys.m]=13, [keys.n]=14, [keys.o]=15,
|
||||||
|
[keys.p]=16, [keys.q]=17, [keys.r]=18,
|
||||||
|
[keys.s]=19, [keys.t]=20, [keys.u]=21,
|
||||||
|
[keys.v]=22, [keys.w]=23, [keys.x]=24,
|
||||||
|
[keys.y]=25, [keys.z]=26,
|
||||||
|
}
|
||||||
|
|
||||||
|
if eventType == "keyPressed" then
|
||||||
|
if charOrKey == keys.leftCtrl or charOrKey == keys.rightCtrl then
|
||||||
|
kernel.cct.ctrl = true
|
||||||
|
elseif charOrKey == keys.leftAlt or charOrKey == keys.rightAlt then
|
||||||
|
kernel.cct.alt = true
|
||||||
|
end
|
||||||
|
|
||||||
|
if kernel.cct.ctrl then
|
||||||
|
local ctrlByte = ctrlKeyMap[charOrKey]
|
||||||
|
if ctrlByte then
|
||||||
|
if ctrlByte == 3 then
|
||||||
|
for _, task in ipairs(syscall.getTasks()) do
|
||||||
|
syscall.sigsend(task, 1)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
kernel.cct.fifo.push(string.char(ctrlByte))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local specialKeyMap = {
|
||||||
|
[keys.up] = "[A",
|
||||||
|
[keys.down] = "[B",
|
||||||
|
[keys.right] = "[C",
|
||||||
|
[keys.left] = "[D",
|
||||||
|
[keys.home] = "[H",
|
||||||
|
[keys["end"]] = "[F",
|
||||||
|
[keys.pageUp] = "[5~",
|
||||||
|
[keys.pageDown] = "[6~",
|
||||||
|
[keys.delete] = "[3~",
|
||||||
|
}
|
||||||
|
local special = specialKeyMap[charOrKey]
|
||||||
|
if special then kernel.cct.fifo.push(special) end
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif eventType == "keyReleased" then
|
||||||
|
if charOrKey == keys.leftCtrl or charOrKey == keys.rightCtrl then
|
||||||
|
kernel.cct.ctrl = false
|
||||||
|
elseif charOrKey == keys.leftAlt or charOrKey == keys.rightAlt then
|
||||||
|
kernel.cct.alt = false
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif eventType == "keyTyped" then
|
||||||
|
if charOrKey then kernel.cct.fifo.push(charOrKey) end
|
||||||
|
elseif eventType == "http_success" then
|
||||||
|
kernel.cct.httpqueue[event[2]]=nil
|
||||||
|
kernel.cct.httpresponse[event[2]]=event[3]
|
||||||
|
elseif eventType == "http_failure" then
|
||||||
|
kernel.cct.httpqueue[event[2]]=nil
|
||||||
|
kernel.cct.httperror[event[2]]=event[3]
|
||||||
|
end
|
||||||
|
|
||||||
|
timeout = false
|
||||||
|
else
|
||||||
|
timeout = true
|
||||||
|
end
|
||||||
|
|
||||||
|
if timeout then
|
||||||
|
sleep(0.05)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
--:Minify:--
|
--:Minify:--
|
||||||
local EFI=...
|
local EFI=...
|
||||||
|
EFI.beep(440, 500)
|
||||||
local screen=EFI.screenCtl
|
local screen=EFI.screenCtl
|
||||||
local ifs=EFI.initfs
|
local ifs=EFI.initfs
|
||||||
local disks=EFI.disks
|
local disks=EFI.disks
|
||||||
|
|||||||
@@ -499,7 +499,7 @@ local function checkperms(meta, mode)
|
|||||||
local bitmap = {
|
local bitmap = {
|
||||||
r = {owner = 5, group = 3, everyone = 1},
|
r = {owner = 5, group = 3, everyone = 1},
|
||||||
w = {owner = 4, group = 2, everyone = 0},
|
w = {owner = 4, group = 2, everyone = 0},
|
||||||
a = {owner = 4, group = 2, everyone = 0},
|
a = {owner = 4, group = 2, everyone = 0}
|
||||||
}
|
}
|
||||||
local m = bitmap[mode]
|
local m = bitmap[mode]
|
||||||
if not m then error("EINVAL") end
|
if not m then error("EINVAL") end
|
||||||
@@ -544,7 +544,6 @@ local function newFileObj(handle, mode, path, meta, ftype)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function vfs.newfd(fdobj)
|
function vfs.newfd(fdobj)
|
||||||
checkSystemLimit(); total = total + 1
|
|
||||||
local fd = allocFD(kernel.currentTask)
|
local fd = allocFD(kernel.currentTask)
|
||||||
kernel.currentTask.fd[fd] = fdobj
|
kernel.currentTask.fd[fd] = fdobj
|
||||||
return fd
|
return fd
|
||||||
@@ -595,6 +594,21 @@ function vfs.open(path, mode)
|
|||||||
local fd = allocFD(task)
|
local fd = allocFD(task)
|
||||||
local disk, diskPath = resolvePath(path)
|
local disk, diskPath = resolvePath(path)
|
||||||
if not disk then error("NODISK") end
|
if not disk then error("NODISK") end
|
||||||
|
if (mode=="w" or mode=="a") and disk:isReadOnly() then error("ERDONLY") end
|
||||||
|
|
||||||
|
if kernel.unixSockets[normalizePath(path)] then
|
||||||
|
local meta = kernel.unixSockets[normalizePath(path)].meta
|
||||||
|
if kernel.uid~=0 or kernel.uid~=meta.owner then
|
||||||
|
local groups = (task and task.groups) or kernel.groups or {}
|
||||||
|
local access=false
|
||||||
|
for _, gid in ipairs(groups) do
|
||||||
|
if gid == meta.group then access=true end
|
||||||
|
end
|
||||||
|
if not access then error("EACCES") end
|
||||||
|
end
|
||||||
|
task[fd]=kernel.unixSockets[normalizePath(path)]
|
||||||
|
return fd
|
||||||
|
end
|
||||||
|
|
||||||
local meta = getFileMeta(path)
|
local meta = getFileMeta(path)
|
||||||
local isNew = (mode == "w" or mode == "a") and not disk:fileExists(diskPath)
|
local isNew = (mode == "w" or mode == "a") and not disk:fileExists(diskPath)
|
||||||
@@ -696,10 +710,18 @@ function vfs.sendfile(outfd, infd, count)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function vfs.stat(path)
|
function vfs.stat(path)
|
||||||
|
local attrs
|
||||||
|
local meta
|
||||||
|
if meta.etype == 0x02 then
|
||||||
|
attrs = { size=0, modified=0, created=0 }
|
||||||
|
else
|
||||||
local disk, diskPath = resolvePath(path)
|
local disk, diskPath = resolvePath(path)
|
||||||
local meta = getFileMeta(path)
|
meta = getFileMeta(path)
|
||||||
local ok, attrs = pcall(disk.attributes, disk, diskPath)
|
local ok
|
||||||
|
ok, attrs = pcall(disk.attributes, disk, diskPath)
|
||||||
if not ok then attrs = { size=0, modified=0, created=0 } end
|
if not ok then attrs = { size=0, modified=0, created=0 } end
|
||||||
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
size = attrs.size,
|
size = attrs.size,
|
||||||
modified = attrs.modified,
|
modified = attrs.modified,
|
||||||
@@ -714,15 +736,15 @@ end
|
|||||||
|
|
||||||
function vfs.lstat(path)
|
function vfs.lstat(path)
|
||||||
local meta = getFileMeta(path, true)
|
local meta = getFileMeta(path, true)
|
||||||
|
|
||||||
local attrs
|
local attrs
|
||||||
if meta.etype == 0x01 then
|
if meta.etype == 0x01 or meta.etype == 0x02 then
|
||||||
attrs = { size=0, modified=0, created=0 }
|
attrs = { size=0, modified=0, created=0 }
|
||||||
else
|
else
|
||||||
local disk, diskPath = resolvePath(path, true)
|
local disk, diskPath = resolvePath(path, true)
|
||||||
local ok, a = pcall(disk.attributes, disk, diskPath)
|
local ok, a = pcall(disk.attributes, disk, diskPath)
|
||||||
attrs = ok and a or { size=0, modified=0, created=0 }
|
attrs = ok and a or { size=0, modified=0, created=0 }
|
||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
size = attrs.size,
|
size = attrs.size,
|
||||||
modified = attrs.modified,
|
modified = attrs.modified,
|
||||||
@@ -739,8 +761,15 @@ end
|
|||||||
function vfs.fstat(fd)
|
function vfs.fstat(fd)
|
||||||
local file = kernel.currentTask.fd[fd]
|
local file = kernel.currentTask.fd[fd]
|
||||||
if not file then error("EBADF") end
|
if not file then error("EBADF") end
|
||||||
local disk, diskPath = resolvePath(file.path)
|
local attrs
|
||||||
local attrs = disk:attributes(diskPath)
|
if file.meta.etype == 0x02 then
|
||||||
|
attrs = { size=0, modified=0, created=0 }
|
||||||
|
else
|
||||||
|
local disk, diskPath = resolvePath(file.path, true)
|
||||||
|
local ok, a = pcall(disk.attributes, disk, diskPath)
|
||||||
|
attrs = ok and a or { size=0, modified=0, created=0 }
|
||||||
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
size = attrs.size,
|
size = attrs.size,
|
||||||
modified = attrs.modified,
|
modified = attrs.modified,
|
||||||
@@ -769,6 +798,14 @@ function vfs.listdir(path)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
for k,v in pairs(kernel.unixSockets) do
|
||||||
|
local p=normalizePath(path)
|
||||||
|
if k:match("^(.*)/[^/]+$")==p then
|
||||||
|
seen[v.name]=true
|
||||||
|
table.insert(out, v.name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local mp
|
local mp
|
||||||
if diskPath == "/" then
|
if diskPath == "/" then
|
||||||
mp = ".meta"
|
mp = ".meta"
|
||||||
@@ -797,6 +834,7 @@ function vfs.mkdir(path)
|
|||||||
local parentMeta = getFileMeta(parent)
|
local parentMeta = getFileMeta(parent)
|
||||||
checkperms(parentMeta, "w")
|
checkperms(parentMeta, "w")
|
||||||
local disk, diskPath = resolvePath(path)
|
local disk, diskPath = resolvePath(path)
|
||||||
|
if disk:isReadOnly() then error("ERDONLY") end
|
||||||
disk:makeDirectory(diskPath)
|
disk:makeDirectory(diskPath)
|
||||||
local task = kernel.currentTask
|
local task = kernel.currentTask
|
||||||
local euid = (task and (task.euid or task.uid)) or kernel.uid
|
local euid = (task and (task.euid or task.uid)) or kernel.uid
|
||||||
@@ -818,8 +856,13 @@ function vfs.remove(path)
|
|||||||
|
|
||||||
local meta = getFileMeta(path, true)
|
local meta = getFileMeta(path, true)
|
||||||
|
|
||||||
if kernel.unixSockets and kernel.unixSockets[path] then
|
if kernel.unixSockets and kernel.unixSockets[normalizePath(path)] then
|
||||||
kernel.unixSockets[path] = nil
|
if kernel.uid ~= 0 then
|
||||||
|
if kernel.unixSockets[normalizePath(path)].meta.owner~=kernel.uid then
|
||||||
|
error("EACCES")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
kernel.unixSockets[normalizePath(path)] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
if meta.etype == 0x01 then
|
if meta.etype == 0x01 then
|
||||||
@@ -828,6 +871,7 @@ function vfs.remove(path)
|
|||||||
if parent == "" then parent = "/" end
|
if parent == "" then parent = "/" end
|
||||||
local name = norm:match("[^/]+$")
|
local name = norm:match("[^/]+$")
|
||||||
local disk, parentDiskPath = resolveMount(parent)
|
local disk, parentDiskPath = resolveMount(parent)
|
||||||
|
if disk:isReadOnly() then error("ERDONLY") end
|
||||||
local mp
|
local mp
|
||||||
if parentDiskPath == "/" then mp = ".meta"
|
if parentDiskPath == "/" then mp = ".meta"
|
||||||
else mp = parentDiskPath:gsub("^/+", "") .. "/.meta" end
|
else mp = parentDiskPath:gsub("^/+", "") .. "/.meta" end
|
||||||
@@ -844,6 +888,7 @@ function vfs.remove(path)
|
|||||||
if f2.close then f2.close() end
|
if f2.close then f2.close() end
|
||||||
else
|
else
|
||||||
local disk, diskPath = resolvePath(path)
|
local disk, diskPath = resolvePath(path)
|
||||||
|
if disk:isReadOnly() then error("ERDONLY") end
|
||||||
disk:remove(diskPath)
|
disk:remove(diskPath)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -852,6 +897,8 @@ function vfs.symlink(target, linkPath)
|
|||||||
if type(target) ~= "string" or type(linkPath) ~= "string" then error("EINVAL") end
|
if type(target) ~= "string" or type(linkPath) ~= "string" then error("EINVAL") end
|
||||||
local norm = normalizePath(linkPath)
|
local norm = normalizePath(linkPath)
|
||||||
local parent = norm:match("^(.*)/[^/]+$") or "/"
|
local parent = norm:match("^(.*)/[^/]+$") or "/"
|
||||||
|
local disk = resolveMount(linkPath)
|
||||||
|
if disk:isReadOnly() then error("ERDONLY") end
|
||||||
if parent == "" then parent = "/" end
|
if parent == "" then parent = "/" end
|
||||||
local name = norm:match("[^/]+$")
|
local name = norm:match("[^/]+$")
|
||||||
if not name then error("EINVAL") end
|
if not name then error("EINVAL") end
|
||||||
@@ -881,7 +928,13 @@ function vfs.readlink(path)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function vfs.access(path, mode)
|
function vfs.access(path, mode)
|
||||||
local meta = getFileMeta(path)
|
local meta
|
||||||
|
if kernel.unixSockets[normalizePath(path)] then
|
||||||
|
meta = kernel.unixSockets[normalizePath(path)].meta
|
||||||
|
else
|
||||||
|
meta = getFileMeta(path)
|
||||||
|
end
|
||||||
|
|
||||||
for i = 1, #mode do
|
for i = 1, #mode do
|
||||||
checkperms(meta, mode:sub(i,i))
|
checkperms(meta, mode:sub(i,i))
|
||||||
end
|
end
|
||||||
@@ -892,6 +945,8 @@ local function updateMeta(path, fn, noFollow)
|
|||||||
local real = namei(path, noFollow)
|
local real = namei(path, noFollow)
|
||||||
local norm = real
|
local norm = real
|
||||||
local parent = norm:match("^(.*)/[^/]+$") or "/"
|
local parent = norm:match("^(.*)/[^/]+$") or "/"
|
||||||
|
local disk = resolveMount(path)
|
||||||
|
if disk:isReadOnly() then error("ERDONLY") end
|
||||||
if parent == "" then parent = "/" end
|
if parent == "" then parent = "/" end
|
||||||
local name = norm:match("[^/]+$")
|
local name = norm:match("[^/]+$")
|
||||||
if not name then error("EINVAL") end
|
if not name then error("EINVAL") end
|
||||||
@@ -918,6 +973,9 @@ local function updateMeta(path, fn, noFollow)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function vfs.chmod(path, perms)
|
function vfs.chmod(path, perms)
|
||||||
|
if kernel.unixSockets[normalizePath(path)] then error("EINVAL") end
|
||||||
|
local disk = resolveMount(path)
|
||||||
|
if disk:isReadOnly() then error("ERDONLY") end
|
||||||
local meta = getFileMeta(path)
|
local meta = getFileMeta(path)
|
||||||
local euid = (kernel.currentTask and (kernel.currentTask.euid or kernel.currentTask.uid)) or kernel.uid
|
local euid = (kernel.currentTask and (kernel.currentTask.euid or kernel.currentTask.uid)) or kernel.uid
|
||||||
if euid ~= 0 and euid ~= meta.owner then error("EACCES") end
|
if euid ~= 0 and euid ~= meta.owner then error("EACCES") end
|
||||||
@@ -927,10 +985,14 @@ end
|
|||||||
function vfs.fchmod(fd, perms)
|
function vfs.fchmod(fd, perms)
|
||||||
local file = kernel.currentTask.fd[fd]
|
local file = kernel.currentTask.fd[fd]
|
||||||
if not file then error("EBADF") end
|
if not file then error("EBADF") end
|
||||||
|
if file.etype==0x02 then error("EINVAL") end
|
||||||
vfs.chmod(file.path, perms)
|
vfs.chmod(file.path, perms)
|
||||||
end
|
end
|
||||||
|
|
||||||
function vfs.chown(path, uid, gid)
|
function vfs.chown(path, uid, gid)
|
||||||
|
if kernel.unixSockets[normalizePath(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
|
local _euid = (kernel.currentTask and (kernel.currentTask.euid or kernel.currentTask.uid)) or kernel.uid
|
||||||
if _euid ~= 0 then error("EPERM") end
|
if _euid ~= 0 then error("EPERM") end
|
||||||
updateMeta(path, function(e) e.owner = uid; e.group = gid end)
|
updateMeta(path, function(e) e.owner = uid; e.group = gid end)
|
||||||
@@ -939,10 +1001,12 @@ end
|
|||||||
function vfs.fchown(fd, uid, gid)
|
function vfs.fchown(fd, uid, gid)
|
||||||
local file = kernel.currentTask.fd[fd]
|
local file = kernel.currentTask.fd[fd]
|
||||||
if not file then error("EBADF") end
|
if not file then error("EBADF") end
|
||||||
|
if file.etype==0x02 then error("EINVAL") end
|
||||||
vfs.chown(file.path, uid, gid)
|
vfs.chown(file.path, uid, gid)
|
||||||
end
|
end
|
||||||
|
|
||||||
function vfs.exists(path)
|
function vfs.exists(path)
|
||||||
|
if kernel.unixSockets[normalizePath(path)] then return true end
|
||||||
local meta = getFileMeta(path, true)
|
local meta = getFileMeta(path, true)
|
||||||
if meta.etype == 0x01 then return true end
|
if meta.etype == 0x01 then return true end
|
||||||
local ok, disk, diskPath = pcall(resolvePath, path)
|
local ok, disk, diskPath = pcall(resolvePath, path)
|
||||||
@@ -957,6 +1021,9 @@ end
|
|||||||
function vfs.type(path)
|
function vfs.type(path)
|
||||||
local meta = getFileMeta(path, true)
|
local meta = getFileMeta(path, true)
|
||||||
if meta.etype == 0x01 then return "symlink" end
|
if meta.etype == 0x01 then return "symlink" end
|
||||||
|
if kernel.unixSockets[normalizePath(path)] then
|
||||||
|
return "socket"
|
||||||
|
end
|
||||||
local ok, disk, diskPath = pcall(resolvePath, path)
|
local ok, disk, diskPath = pcall(resolvePath, path)
|
||||||
if not ok then return nil end
|
if not ok then return nil end
|
||||||
return disk:type(diskPath)
|
return disk:type(diskPath)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ local data = {}
|
|||||||
|
|
||||||
proxy.address = "procfs0000"
|
proxy.address = "procfs0000"
|
||||||
proxy.isvirt = true
|
proxy.isvirt = true
|
||||||
proxy.isReadOnly = function() return false end
|
proxy.isReadOnly = function() return true end
|
||||||
proxy.spaceUsed = function() return 0 end
|
proxy.spaceUsed = function() return 0 end
|
||||||
proxy.spaceTotal = function() return 0 end
|
proxy.spaceTotal = function() return 0 end
|
||||||
proxy.makeDirectory = function() error("EACCES") end
|
proxy.makeDirectory = function() error("EACCES") end
|
||||||
|
|||||||
@@ -12,13 +12,24 @@ function signal.sigsend(pid, sig)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function signal.sigcatch(handler)
|
function signal.sigcatch(handler)
|
||||||
kernel.currentTask.sigh=handler
|
local task=kernel.currentTask
|
||||||
if not kernel.currentTask.sigq then kernel.currentTask.sigq={} end
|
task.sigh=handler
|
||||||
|
if not task.sigq then task.sigq={} end
|
||||||
|
local handle={
|
||||||
|
error="",
|
||||||
|
active=true
|
||||||
|
}
|
||||||
|
if task.sigd then task.sigd.active=false; end
|
||||||
|
task.sigd=handle
|
||||||
|
return handle
|
||||||
end
|
end
|
||||||
|
|
||||||
function signal.sigignore()
|
function signal.sigignore()
|
||||||
kernel.currentTask.sigh=nil
|
local task=kernel.currentTask
|
||||||
kernel.currentTask.sigq=nil
|
task.sigh=nil
|
||||||
|
task.sigq=nil
|
||||||
|
if task.sigd then task.sigd.active=false end
|
||||||
|
task.sigd=nil
|
||||||
end
|
end
|
||||||
|
|
||||||
local s=kernel.syscalls
|
local s=kernel.syscalls
|
||||||
|
|||||||
@@ -17,7 +17,42 @@
|
|||||||
|
|
||||||
local kernel=...
|
local kernel=...
|
||||||
local socket={}
|
local socket={}
|
||||||
|
socket.handlers={}
|
||||||
kernel.socket=socket
|
kernel.socket=socket
|
||||||
|
|
||||||
|
function socket.registerProtocal(protocal, handler)
|
||||||
|
socket.handlers[protocal] = handler
|
||||||
|
end
|
||||||
|
|
||||||
|
function socket.socket()
|
||||||
|
local P=kernel.vfs.P
|
||||||
|
local data=kernel.newFifo()
|
||||||
|
local isClosed=false
|
||||||
|
kernel.vfs.newfd({
|
||||||
|
handle={
|
||||||
|
read=function() if isClosed then error("ECCON") end return data.read() end,
|
||||||
|
write=function() if isClosed then error("ECCON") end return data.write() end,
|
||||||
|
close=function() isClosed = true end
|
||||||
|
},
|
||||||
|
type="socket",
|
||||||
|
refcount=1,
|
||||||
|
|
||||||
|
meta={
|
||||||
|
owner=kernel.currentTask.uid,
|
||||||
|
group=kernel.currentTask.uid,
|
||||||
|
etype=2,
|
||||||
|
perms=P.OWNER_R+P.OWNER_W+P.GROUP_R+P.GROUP_W
|
||||||
|
},
|
||||||
|
isvirt=true
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
function socket.connect(fd, address)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function socket.listen(fd, backlog)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
kernel.log("Loaded socket module")
|
kernel.log("Loaded socket module")
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
--:Minify:--
|
||||||
|
local kernel=...
|
||||||
|
kernel.unixSockets={}
|
||||||
@@ -156,7 +156,6 @@ end
|
|||||||
function sys.sleep(s)
|
function sys.sleep(s)
|
||||||
kernel.currentTask.status = "S"
|
kernel.currentTask.status = "S"
|
||||||
kernel.currentTask.sleep = kernel.EFI:getEpochMs() + s * 1000
|
kernel.currentTask.sleep = kernel.EFI:getEpochMs() + s * 1000
|
||||||
coroutine.yield()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function sys.getTask(pid)
|
function sys.getTask(pid)
|
||||||
@@ -343,40 +342,42 @@ function kernel.main()
|
|||||||
local taskTimes = {}
|
local taskTimes = {}
|
||||||
|
|
||||||
for pid, task in pairs(tasks) do
|
for pid, task in pairs(tasks) do
|
||||||
|
kernel.currentTask = task
|
||||||
|
kernel.uid = task.euid or task.uid
|
||||||
|
kernel.process = task.name
|
||||||
|
|
||||||
if task.status == "S" and kernel.EFI:getEpochMs() >= task.sleep then
|
if task.status == "S" and kernel.EFI:getEpochMs() >= task.sleep then
|
||||||
task.status = "R"
|
task.status = "R"
|
||||||
task.sleep = 0
|
task.sleep = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
if task.status == "R" then
|
if task.status == "D" then
|
||||||
kernel.currentTask = task
|
if task.ksh then
|
||||||
|
coroutine.resume(task.ksh)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
kernel.uid = task.euid or task.uid
|
if task.status == "R" then
|
||||||
kernel.process = task.name
|
|
||||||
N = N + 1
|
N = N + 1
|
||||||
|
|
||||||
task.timeSlice = math.min(Tmax, math.max(Tmin, B / (N ^ alpha)))
|
task.timeSlice = math.min(Tmax, math.max(Tmin, B / (N ^ alpha)))
|
||||||
|
|
||||||
if task.sigq and #task.sigq ~= 0 and task.sigh then
|
if task.sigq and #task.sigq ~= 0 and task.sigh then
|
||||||
local coro = coroutine.create(task.sigh)
|
local coro = coroutine.create(task.sigh)
|
||||||
local sigret = { coroutine.resume(coro, table.remove(task.sigq, 1)) }
|
local status,err=coroutine.resumeWithTimeout(coro, 100, table.remove(task.sigq, 1))
|
||||||
while coroutine.status(coro) ~= "dead" do
|
if status=="error" then
|
||||||
if sigret[1] == false then break end
|
task.sigd.error=err
|
||||||
if sigret[2] == "syscall" then
|
task.sigd.active=false
|
||||||
local scname = sigret[3]
|
task.sigh=nil
|
||||||
local sysret
|
task.sigq=nil
|
||||||
if kernel.syscalls[scname] then
|
task.sigd=nil
|
||||||
sysret = { xpcall(kernel.syscalls[scname], debug.traceback, table.unpack(sigret, 4)) }
|
elseif status=="success" then
|
||||||
else
|
if err=="syscall" then
|
||||||
sysret = { false, "Unknown syscall: " .. tostring(scname) }
|
task.sigd.error="Cannot execute syscalls from signals"
|
||||||
end
|
task.sigd.active=false
|
||||||
if not sysret[1] then
|
task.sigh=nil
|
||||||
sigret = { coroutine.resume(coro, false, sysret[2]) }
|
task.sigq=nil
|
||||||
else
|
task.sigd=nil
|
||||||
sigret = { coroutine.resume(coro, true, table.unpack(sysret, 2)) }
|
|
||||||
end
|
|
||||||
else
|
|
||||||
sigret = { coroutine.resume(coro) }
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -386,10 +387,14 @@ function kernel.main()
|
|||||||
local ret
|
local ret
|
||||||
|
|
||||||
if kernel.config.preempt then
|
if kernel.config.preempt then
|
||||||
|
if not task.debugger then
|
||||||
ret = { resumeWithTimeout(task.coro, task.timeSlice, table.unpack(task.syscallReturn)) }
|
ret = { resumeWithTimeout(task.coro, task.timeSlice, table.unpack(task.syscallReturn)) }
|
||||||
else
|
else
|
||||||
ret = { coroutine.resume(task.coro, table.unpack(task.syscallReturn)) }
|
ret = { coroutine.resume(task.coro, table.unpack(task.syscallReturn)) }
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
ret = { coroutine.resume(task.coro, table.unpack(task.syscallReturn)) }
|
||||||
|
end
|
||||||
|
|
||||||
local elapsed = kernel.EFI:getEpochMs() - startTime
|
local elapsed = kernel.EFI:getEpochMs() - startTime
|
||||||
task.lastTime = elapsed
|
task.lastTime = elapsed
|
||||||
|
|||||||
+11
-3
@@ -110,10 +110,12 @@ if cloptions.l then
|
|||||||
local stat = syscall.lstat and syscall.lstat(fullPath) or syscall.stat(fullPath)
|
local stat = syscall.lstat and syscall.lstat(fullPath) or syscall.stat(fullPath)
|
||||||
local isDir = fs.isDir(fullPath)
|
local isDir = fs.isDir(fullPath)
|
||||||
local isSym = stat and stat.etype == 0x01
|
local isSym = stat and stat.etype == 0x01
|
||||||
|
local isSock = stat and stat.etype == 0x02
|
||||||
|
|
||||||
local typeChar
|
local typeChar
|
||||||
if isSym then typeChar = "l"
|
if isSym then typeChar = "l"
|
||||||
elseif isDir then typeChar = "d"
|
elseif isDir then typeChar = "d"
|
||||||
|
elseif isSock then typeChar = "s"
|
||||||
else typeChar = "-" end
|
else typeChar = "-" end
|
||||||
|
|
||||||
local pstr
|
local pstr
|
||||||
@@ -136,14 +138,14 @@ if cloptions.l then
|
|||||||
printInline(tostring(mtime) .. " ")
|
printInline(tostring(mtime) .. " ")
|
||||||
|
|
||||||
if isSym then
|
if isSym then
|
||||||
syscall.devctl(1, "sfgc", 0xFF00FF)
|
syscall.devctl(1, "sfgc", 0x00FFFF)
|
||||||
printInline(v)
|
printInline(v)
|
||||||
syscall.devctl(1, "sfgc", 0xFFFFFF)
|
syscall.devctl(1, "sfgc", 0xFFFFFF)
|
||||||
local ok, target = pcall(syscall.readlink, fullPath)
|
local ok, target = pcall(syscall.readlink, fullPath)
|
||||||
if ok then
|
if ok then
|
||||||
printInline(" -> ")
|
printInline(" -> ")
|
||||||
local targetExists = pcall(syscall.stat, fullPath)
|
local targetExists = pcall(syscall.stat, fullPath)
|
||||||
syscall.devctl(1, "sfgc", targetExists and 0xFF00FF or 0xFF0000)
|
syscall.devctl(1, "sfgc", targetExists and 0x00FFFF or 0xFF0000)
|
||||||
printInline(target)
|
printInline(target)
|
||||||
syscall.devctl(1, "sfgc", 0xFFFFFF)
|
syscall.devctl(1, "sfgc", 0xFFFFFF)
|
||||||
end
|
end
|
||||||
@@ -151,6 +153,10 @@ if cloptions.l then
|
|||||||
syscall.devctl(1, "sfgc", 0x6D00FF)
|
syscall.devctl(1, "sfgc", 0x6D00FF)
|
||||||
printInline(v)
|
printInline(v)
|
||||||
syscall.devctl(1, "sfgc", 0xFFFFFF)
|
syscall.devctl(1, "sfgc", 0xFFFFFF)
|
||||||
|
elseif isSock then
|
||||||
|
syscall.devctl(1, "sfgc", 0xFF00FF)
|
||||||
|
printInline(v)
|
||||||
|
syscall.devctl(1, "sfgc", 0xFFFFFF)
|
||||||
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 0x00FF00 or 0xFFFFFF)
|
syscall.devctl(1, "sfgc", isExec and 0x00FF00 or 0xFFFFFF)
|
||||||
@@ -175,9 +181,11 @@ for i, v in ipairs(list) do
|
|||||||
local isSym = stat and stat.etype == 0x01
|
local isSym = stat and stat.etype == 0x01
|
||||||
|
|
||||||
if isSym then
|
if isSym then
|
||||||
syscall.devctl(1, "sfgc", 0xFF00FF)
|
syscall.devctl(1, "sfgc", 0x00FFFF)
|
||||||
elseif isDir then
|
elseif isDir then
|
||||||
syscall.devctl(1, "sfgc", 0x6D00FF)
|
syscall.devctl(1, "sfgc", 0x6D00FF)
|
||||||
|
elseif isSock then
|
||||||
|
syscall.devctl(1, "sfgc", 0xFF00FF)
|
||||||
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 0x00FF00 or 0xFFFFFF)
|
syscall.devctl(1, "sfgc", isExec and 0x00FF00 or 0xFFFFFF)
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[
|
||||||
|
""
|
||||||
|
]
|
||||||
@@ -11,6 +11,8 @@ Targets:
|
|||||||
build-mini-test
|
build-mini-test
|
||||||
build-micro-test
|
build-micro-test
|
||||||
clean
|
clean
|
||||||
|
prod
|
||||||
|
prod-mini
|
||||||
|
|
||||||
Arch flags:
|
Arch flags:
|
||||||
--arch cct
|
--arch cct
|
||||||
@@ -32,6 +34,7 @@ PROJECT_ROOT = Path(__file__).resolve().parent
|
|||||||
SRC_ROOT = PROJECT_ROOT / "Src"
|
SRC_ROOT = PROJECT_ROOT / "Src"
|
||||||
TEST_ROOT = PROJECT_ROOT / "Test"
|
TEST_ROOT = PROJECT_ROOT / "Test"
|
||||||
BUILD_ROOT = PROJECT_ROOT / "Build"
|
BUILD_ROOT = PROJECT_ROOT / "Build"
|
||||||
|
PROD_ROOT = PROJECT_ROOT / "prod"
|
||||||
|
|
||||||
ARCH_BOOT_DIR = {
|
ARCH_BOOT_DIR = {
|
||||||
"cct": Path("boot") / "cct",
|
"cct": Path("boot") / "cct",
|
||||||
@@ -46,6 +49,13 @@ def clean():
|
|||||||
else:
|
else:
|
||||||
print("Nothing to clean.")
|
print("Nothing to clean.")
|
||||||
|
|
||||||
|
def cleanprod():
|
||||||
|
if PROD_ROOT.exists():
|
||||||
|
print(f"Removing {PROD_ROOT} ...")
|
||||||
|
shutil.rmtree(PROD_ROOT)
|
||||||
|
else:
|
||||||
|
print("Nothing to clean.")
|
||||||
|
|
||||||
|
|
||||||
def has_minify_header(path: Path) -> bool:
|
def has_minify_header(path: Path) -> bool:
|
||||||
try:
|
try:
|
||||||
@@ -74,7 +84,7 @@ def compress_lz4(data: bytes) -> bytes:
|
|||||||
return lz4.frame.compress(data)
|
return lz4.frame.compress(data)
|
||||||
|
|
||||||
|
|
||||||
def process_root(src_root: Path, out_root: Path, minify: bool, micro: bool, arch:Union[str, None]):
|
def process_root(src_root: Path, out_root: Path, minify: bool, micro: bool, arch:Union[str, None], prod:bool):
|
||||||
print(f"Building from {src_root}")
|
print(f"Building from {src_root}")
|
||||||
print(f"Output to {out_root}")
|
print(f"Output to {out_root}")
|
||||||
print()
|
print()
|
||||||
@@ -85,6 +95,7 @@ def process_root(src_root: Path, out_root: Path, minify: bool, micro: bool, arch
|
|||||||
|
|
||||||
if pkg_dir.name[:18] == "Hyperion-firmware-":
|
if pkg_dir.name[:18] == "Hyperion-firmware-":
|
||||||
if pkg_dir.name != f"Hyperion-firmware-{arch}":
|
if pkg_dir.name != f"Hyperion-firmware-{arch}":
|
||||||
|
if prod != True:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
print(f"== Package: {pkg_dir.name} ==")
|
print(f"== Package: {pkg_dir.name} ==")
|
||||||
@@ -99,6 +110,9 @@ def process_root(src_root: Path, out_root: Path, minify: bool, micro: bool, arch
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
dst = out_root / rel
|
dst = out_root / rel
|
||||||
|
if prod:
|
||||||
|
dst = out_root / pkg_dir.name / rel
|
||||||
|
|
||||||
dst.parent.mkdir(parents=True, exist_ok=True)
|
dst.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
print(f" Processing: {src.relative_to(src_root)}")
|
print(f" Processing: {src.relative_to(src_root)}")
|
||||||
@@ -132,13 +146,19 @@ def install_bootloader(arch: str, release: bool):
|
|||||||
shutil.copy2(eeprom, BUILD_ROOT / eeprom_dst_name)
|
shutil.copy2(eeprom, BUILD_ROOT / eeprom_dst_name)
|
||||||
|
|
||||||
|
|
||||||
def run_build(minify: bool, micro: bool, include_test: bool, arch: Union[str, None], release: bool):
|
def run_build(minify: bool, micro: bool, include_test: bool, arch: Union[str, None], release: bool, prod: bool):
|
||||||
clean()
|
clean()
|
||||||
BUILD_ROOT.mkdir()
|
BUILD_ROOT.mkdir()
|
||||||
|
if prod:
|
||||||
|
cleanprod()
|
||||||
|
PROD_ROOT.mkdir()
|
||||||
|
|
||||||
out_root = BUILD_ROOT / "$" if arch else BUILD_ROOT
|
out_root = BUILD_ROOT / "$" if arch else BUILD_ROOT
|
||||||
|
|
||||||
process_root(SRC_ROOT, out_root, minify, micro, arch)
|
process_root(SRC_ROOT, out_root, minify, micro, arch, False)
|
||||||
|
if prod:
|
||||||
|
process_root(SRC_ROOT, PROD_ROOT, minify, micro, arch, True)
|
||||||
|
|
||||||
if include_test:
|
if include_test:
|
||||||
process_root(TEST_ROOT, out_root, minify, micro)
|
process_root(TEST_ROOT, out_root, minify, micro)
|
||||||
|
|
||||||
@@ -200,9 +220,9 @@ def inject_makeusers(users, arch):
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(description="HyperionOS build script")
|
parser = argparse.ArgumentParser(description="HyperionOS build script")
|
||||||
parser.add_argument("target", choices=["build", "build-mini", "build-micro", "build-test", "build-mini-test", "build-micro-test", "clean"])
|
parser.add_argument("target", choices=["build", "build-mini", "build-micro", "build-test", "build-mini-test", "build-micro-test", "clean", "prod", "prod-mini"])
|
||||||
parser.add_argument("--arch", choices=["cct", "oc"], default=None,
|
parser.add_argument("--arch", choices=["cct", "oc"], default=None,
|
||||||
help="Target architecture (cct or oc)")
|
help="Target architecture")
|
||||||
parser.add_argument("--release", dest="release", action="store_true", default=True,
|
parser.add_argument("--release", dest="release", action="store_true", default=True,
|
||||||
help="Release build: eeprom placed as startup.lua (default)")
|
help="Release build: eeprom placed as startup.lua (default)")
|
||||||
parser.add_argument("--dev", dest="release", action="store_false",
|
parser.add_argument("--dev", dest="release", action="store_false",
|
||||||
@@ -226,14 +246,15 @@ def main():
|
|||||||
clean()
|
clean()
|
||||||
return
|
return
|
||||||
|
|
||||||
minify = "mini" in args.target or "micro" in args.target
|
prod = "prod" in args.target
|
||||||
|
minify = "mini" in args.target or "micro" in args.target or "prod" in args.target
|
||||||
micro = "micro" in args.target
|
micro = "micro" in args.target
|
||||||
include_test = "test" in args.target
|
include_test = "test" in args.target
|
||||||
|
|
||||||
if micro:
|
if micro:
|
||||||
import lz4.block
|
import lz4.block
|
||||||
|
|
||||||
run_build(minify=minify, micro=micro, include_test=include_test, arch=args.arch, release=args.release)
|
run_build(minify=minify, micro=micro, include_test=include_test, arch=args.arch, release=args.release, prod=prod)
|
||||||
|
|
||||||
if args.makeuser:
|
if args.makeuser:
|
||||||
print("Injecting first-boot user setup ...")
|
print("Injecting first-boot user setup ...")
|
||||||
|
|||||||
@@ -1,20 +1,42 @@
|
|||||||
term.clear()
|
term.clear()
|
||||||
|
term.setTextColor(colors.white)
|
||||||
term.setCursorPos(1,1)
|
term.setCursorPos(1,1)
|
||||||
print("HyperionOS CCT Installer //")
|
print("HyperionOS CCT Installer //")
|
||||||
local w,h = term.getSize()
|
local w,h = term.getSize()
|
||||||
local install,releasename=function()end,""
|
local exitall,releasename,packagelist=false,"",{}
|
||||||
local exitall=false
|
|
||||||
|
|
||||||
local function download(url)
|
local function printc(...)
|
||||||
local data,err=http.get(url)
|
local args={...}
|
||||||
if not data then error(err) end
|
for i=1, #args do
|
||||||
local func,err=load(data.readAll(),"@download","t",_ENV)
|
if type(args[i]) == "number" then
|
||||||
if not func then error(err) end
|
term.setTextColor(args[i])
|
||||||
return func()
|
else
|
||||||
|
term.write(args[i])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
print("")
|
||||||
end
|
end
|
||||||
|
|
||||||
print("Installing JSON...")
|
local function download(url)
|
||||||
local json = download("https://git.astronand.dev/Hyperion/HyperionOS/raw/branch/main/misc/cct/installdata/json")
|
printc(colors.gray, "[ ", colors.green, " FETCH ", colors.gray, " ] ", colors.white, url)
|
||||||
|
local data,err=http.get(url)
|
||||||
|
if not data then error(err) end
|
||||||
|
local text=data.readAll()
|
||||||
|
data.close()
|
||||||
|
return text
|
||||||
|
end
|
||||||
|
|
||||||
|
local function writeFile(path, data)
|
||||||
|
printc(colors.gray, "[ ", colors.green, "WRITING", colors.gray, " ] ", colors.white, path)
|
||||||
|
local file=fs.open(path, "w")
|
||||||
|
file.write(data)
|
||||||
|
file.close()
|
||||||
|
end
|
||||||
|
|
||||||
|
print("Installing JSON to /hyinstall/json...")
|
||||||
|
writeFile("/hyinstall/json",download("https://git.astronand.dev/Hyperion/HyperionOS/raw/branch/main/misc/json"))
|
||||||
|
print("Loading JSON...")
|
||||||
|
local json=loadfile("/hyinstall/json")()
|
||||||
|
|
||||||
local function printTitle()
|
local function printTitle()
|
||||||
term.clear()
|
term.clear()
|
||||||
@@ -108,25 +130,16 @@ local function makePage(start, num)
|
|||||||
desc=release.body,
|
desc=release.body,
|
||||||
color=release.prerelease and colors.orange or colors.white,
|
color=release.prerelease and colors.orange or colors.white,
|
||||||
func=function()
|
func=function()
|
||||||
local data, err=http.get("https://git.astronand.dev/Hyperion/HyperionOS/raw/tag/"..release.tag_name.."/misc/cct/installcct.lua")
|
local data=download("https://git.astronand.dev/Hyperion/HyperionOS/raw/tag/"..release.tag_name.."/Src/install.json")
|
||||||
releasename=release.tag_name
|
|
||||||
if not data then
|
if not data then
|
||||||
term.clear()
|
term.clear()
|
||||||
term.setCursorPos(1,1)
|
term.setCursorPos(1,1)
|
||||||
print("Unable to install "..release.tag_name..":\n"..err)
|
print("Unable to find package list for ver "..release.tag_name..":\n"..err)
|
||||||
sleep(3)
|
sleep(3)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local func, err = load(data.readAll(), "@Installer","t",_ENV)
|
releasename=release.tag_name
|
||||||
data.close()
|
packagelist=json.decode(data)
|
||||||
if not func then
|
|
||||||
term.clear()
|
|
||||||
term.setCursorPos(1,1)
|
|
||||||
print("Unable to load Installer "..release.tag_name..":\n"..err)
|
|
||||||
sleep(3)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
install=func
|
|
||||||
exitall=true
|
exitall=true
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
@@ -160,15 +173,10 @@ for i=5, 1, -1 do
|
|||||||
end
|
end
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
local function printc(text, c)
|
|
||||||
term.setTextColor(c)
|
|
||||||
print(text)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function delDir(dir)
|
local function delDir(dir)
|
||||||
printc("ls "..dir, colors.green)
|
printc(colors.gray, "[ ", colors.green, " LSDIR ", colors.gray, " ] ", colors.white, dir)
|
||||||
local list=fs.list(dir)
|
local list=fs.list(dir)
|
||||||
printc("rm -rf "..dir, colors.red)
|
printc(colors.gray, "[ ", colors.red, " DELET ", colors.gray, " ] ", colors.white, dir)
|
||||||
for i=1, #list do
|
for i=1, #list do
|
||||||
if fs.isDir(dir..list[i]) then
|
if fs.isDir(dir..list[i]) then
|
||||||
if dir..list[i] ~= "/rom" then
|
if dir..list[i] ~= "/rom" then
|
||||||
@@ -177,14 +185,46 @@ local function delDir(dir)
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
fs.delete(dir..list[i])
|
fs.delete(dir..list[i])
|
||||||
printc("rm "..dir..list[i], colors.orange)
|
printc(colors.gray, "[ ", colors.red, " DELET ", colors.gray, " ] ", colors.white, dir..list[i])
|
||||||
end
|
end
|
||||||
sleep(.01)
|
sleep(.1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
delDir("/")
|
delDir("/")
|
||||||
term.clear()
|
|
||||||
term.setCursorPos(1,1)
|
print("")
|
||||||
term.setTextColor(colors.white)
|
printc(colors.cyan, " \\\\Installing//")
|
||||||
install(releasename)
|
print("")
|
||||||
|
printc(colors.white, "Getting package list...")
|
||||||
|
local list=json.decode()
|
||||||
|
|
||||||
|
local function installdir(path, dir, pkg)
|
||||||
|
local data=json.decode(download("https://git.astronand.dev/api/v1/repos/Hyperion/HyperionOS/contents/prod/"..pkg..dir.."?ref="..releasename))
|
||||||
|
if not data then error("Uh Oh: JSON decode error...") end
|
||||||
|
for i=1, #data do
|
||||||
|
local entry=data[i]
|
||||||
|
if entry.type == "dir" then
|
||||||
|
installdir(path, dir..entry.name.."/", pkg)
|
||||||
|
elseif entry.type == "file" then
|
||||||
|
writeFile(path..dir..entry.name, download(entry.download_url))
|
||||||
|
else
|
||||||
|
error("Uh Oh: unknown entrytype "..entry.path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function installpkg(pkg)
|
||||||
|
installdir("/$", "/", pkg)
|
||||||
|
end
|
||||||
|
|
||||||
|
for i=1, #packagelist do
|
||||||
|
installpkg(packagelist[i])
|
||||||
|
end
|
||||||
|
|
||||||
|
installpkg("Hyperion-firmware-cct")
|
||||||
|
fs.copy("/$/boot/cct/eeprom", "/startup.lua")
|
||||||
|
|
||||||
|
printc(colors.white, "Rebooting...")
|
||||||
|
sleep(1)
|
||||||
|
os.reboot()
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
local release=...
|
|
||||||
term.clear()
|
|
||||||
term.setCursorPos(1,1)
|
|
||||||
print("Hello, World!")
|
|
||||||
print("Installing tar but bad...")
|
|
||||||
shell.run("wget https://git.astronand.dev/Hyperion/HyperionOS/raw/tag/"..release.."/misc/cct/installdata/tarbad /tar.lua")
|
|
||||||
print("Installing HyperionOS...")
|
|
||||||
print("Installing precompiled tar")
|
|
||||||
shell.run("wget https://git.astronand.dev/Hyperion/HyperionOS/raw/tag/"..release.."/misc/cct/installdata/Build.tar /Build.tar")
|
|
||||||
shell.run("tar Build.tar /")
|
|
||||||
sleep(1)
|
|
||||||
print("Removing tar but bad...")
|
|
||||||
shell.run("rm /tar.lua")
|
|
||||||
shell.run("rm $")
|
|
||||||
shell.run("rm Build.tar")
|
|
||||||
shell.run("cp Build $")
|
|
||||||
shell.run("rm Build")
|
|
||||||
fs.copy("/$/boot/cct/eeprom","/startup.lua")
|
|
||||||
print("Installing...")
|
|
||||||
sleep(1)
|
|
||||||
dofile("startup.lua")
|
|
||||||
Binary file not shown.
@@ -1,157 +0,0 @@
|
|||||||
|
|
||||||
local function octal_to_number(str)
|
|
||||||
str = str:gsub("%z", ""):match("^%s*(.-)%s*$")
|
|
||||||
return tonumber(str, 8) or 0
|
|
||||||
end
|
|
||||||
|
|
||||||
local function dedupe_path(path)
|
|
||||||
|
|
||||||
local parts = {}
|
|
||||||
for p in path:gmatch("[^/]+") do table.insert(parts, p) end
|
|
||||||
|
|
||||||
for prefix_len = 1, math.floor(#parts / 2) do
|
|
||||||
local ok = true
|
|
||||||
for i = 1, prefix_len do
|
|
||||||
if parts[i] ~= parts[i + prefix_len] then
|
|
||||||
ok = false
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if ok then
|
|
||||||
local cleaned = {}
|
|
||||||
for i = 1, #parts - prefix_len do
|
|
||||||
cleaned[#cleaned + 1] = parts[i + prefix_len]
|
|
||||||
end
|
|
||||||
return table.concat(cleaned, "/")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return path
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local function make_dirs(root, path)
|
|
||||||
local cur = root
|
|
||||||
for part in path:gmatch("([^/]+)/") do
|
|
||||||
if not cur[part] then
|
|
||||||
cur[part] = { __type = "dir", __entries = {} }
|
|
||||||
end
|
|
||||||
cur = cur[part].__entries
|
|
||||||
end
|
|
||||||
return cur
|
|
||||||
end
|
|
||||||
|
|
||||||
local function flatten(node, prefix)
|
|
||||||
local out = {}
|
|
||||||
prefix = prefix or ""
|
|
||||||
|
|
||||||
for name, obj in pairs(node) do
|
|
||||||
local full = prefix .. name
|
|
||||||
if obj.__type == "file" then
|
|
||||||
out[#out+1] = {
|
|
||||||
name = full,
|
|
||||||
type = "file",
|
|
||||||
contents = obj.__contents
|
|
||||||
}
|
|
||||||
elseif obj.__type == "dir" then
|
|
||||||
out[#out+1] = {
|
|
||||||
name = full .. "/",
|
|
||||||
type = "dir",
|
|
||||||
contents = flatten(obj.__entries, full .. "/")
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return out
|
|
||||||
end
|
|
||||||
|
|
||||||
local function unpack_tar(tarstr)
|
|
||||||
local i = 1
|
|
||||||
local len = #tarstr
|
|
||||||
local root = {}
|
|
||||||
|
|
||||||
while i + 512 <= len do
|
|
||||||
local header = tarstr:sub(i, i + 511)
|
|
||||||
|
|
||||||
if header:match("^\0+$") then break end
|
|
||||||
|
|
||||||
local name_raw = header:sub(1, 100):gsub("%z.*", "")
|
|
||||||
local prefix_raw = header:sub(346, 500):gsub("%z.*", "")
|
|
||||||
|
|
||||||
local name
|
|
||||||
if prefix_raw ~= "" then
|
|
||||||
name = prefix_raw .. "/" .. name_raw
|
|
||||||
else
|
|
||||||
name = name_raw
|
|
||||||
end
|
|
||||||
|
|
||||||
name = name:gsub("^%./", ""):gsub("/+", "/")
|
|
||||||
|
|
||||||
name = dedupe_path(name)
|
|
||||||
|
|
||||||
local size = octal_to_number(header:sub(125,136))
|
|
||||||
local typeflag = header:sub(157,157)
|
|
||||||
|
|
||||||
i = i + 512
|
|
||||||
|
|
||||||
local contents = tarstr:sub(i, i + size - 1)
|
|
||||||
local pad = (512 - (size % 512)) % 512
|
|
||||||
i = i + size + pad
|
|
||||||
|
|
||||||
if name == "" then goto continue end
|
|
||||||
|
|
||||||
local is_dir = typeflag == "5" or name:sub(-1) == "/"
|
|
||||||
|
|
||||||
local clean_name = name:gsub("/$", "")
|
|
||||||
if clean_name == "" then goto continue end
|
|
||||||
|
|
||||||
local parent_path = clean_name:match("(.+)/")
|
|
||||||
local fname = clean_name:match("([^/]+)$")
|
|
||||||
if not fname then goto continue end
|
|
||||||
|
|
||||||
local parent = root
|
|
||||||
if parent_path then
|
|
||||||
parent = make_dirs(root, parent_path .. "/")
|
|
||||||
end
|
|
||||||
|
|
||||||
if is_dir then
|
|
||||||
parent[fname] = parent[fname] or { __type = "dir", __entries = {} }
|
|
||||||
else
|
|
||||||
parent[fname] = { __type = "file", __contents = contents }
|
|
||||||
end
|
|
||||||
|
|
||||||
::continue::
|
|
||||||
end
|
|
||||||
|
|
||||||
return flatten(root)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function write_directory(prefix, items)
|
|
||||||
for _, v in ipairs(items) do
|
|
||||||
if v.type == "dir" then
|
|
||||||
fs.makeDir(prefix..v.name)
|
|
||||||
write_directory(prefix, v.contents)
|
|
||||||
elseif v.type == "file" then
|
|
||||||
local file = fs.open(prefix..v.name, "w")
|
|
||||||
file.write(v.contents)
|
|
||||||
file.close()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local in_tar = ({...})[1]
|
|
||||||
local out_dir = ({...})[2]
|
|
||||||
|
|
||||||
if not in_tar or not out_dir then
|
|
||||||
print("Usage: unpack_tar <tarfile> <output_dir>")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local f = fs.open(in_tar, "r")
|
|
||||||
local tarstr = f.readAll()
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
local list = unpack_tar(tarstr)
|
|
||||||
write_directory(out_dir, list)
|
|
||||||
|
|
||||||
print("TAR extracted into: " .. out_dir)
|
|
||||||
File renamed without changes.
@@ -0,0 +1 @@
|
|||||||
|
return{white=0xFFFFFF,red=0xFF0000,green=0x00FF00,blue=0x0000FF,cyan=0x00FFFF,yellow=0xFFFF00,purple=0xFF00FF,black=0x000000,gray=0x888888,lightgrey=0xBBBBBB,darkgrey=0x444444,orange=0xFF8800,mint=0x00FF88,brown=0xa52a2a,chocolate=0xd2691e}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a={}function a.open(b,c)local d=syscall.open(b,c)local e={close=function()return syscall.close(d)end,flush=function()syscall.fsync(d)end}if c=="r"then e.read=function(f)local g=syscall.read(d,f)return g end;e.readAll=function(h)local i={}while true do local j=syscall.read(d,h or 65536)if j==nil or#j==0 then break end;table.insert(i,j)end;return table.concat(i)end;e.readLine=function(h)local k={}local l=""local m=h or 65536;local n=false;while true do local o=l:find("\n")if o then local p=l:sub(1,o-1)l=l:sub(o+1)return p end;if n then if l~=""then local q=l;l=""return q else return nil end end;local j=syscall.read(d,m)if not j or j==""then n=true else l=l..j end end end elseif c=="w"then e.write=function(g)return syscall.write(d,g)end elseif c=="a"then e.write=function(g)return syscall.write(d,g)end else error("Invalid mode '"..c.."'",2)end;return e end;function a.readAllText(b)local r=a.open(b,"r")if not r then return false end;local s=r.readAll()r.close()return s end;function a.writeAllText(b,g)local r=a.open(b,"w")r.write(g)r.close()end;function a.appendAllText(b,g)local r=a.open(b,"a")if not r then return false end;r.write(g)r.close()end;function a.mkdir(b)return syscall.mkdir(b)end;function a.remove(b)return syscall.remove(b)end;function a.list(b)return syscall.listdir(b)end;function a.type(b)return syscall.type(b)end;function a.stat(b)return syscall.stat(b)end;function a.exists(b)return syscall.exists(b)end;function a.getcwd()return syscall.getcwd()end;function a.chdir(b)return syscall.chdir(b)end;function a.isDir(b)return syscall.type(b)=="directory"end;return a
|
||||||
File renamed without changes.
@@ -0,0 +1,6 @@
|
|||||||
|
local io = {}
|
||||||
|
local fs = require("fs")
|
||||||
|
|
||||||
|
function io.open(path, mode)
|
||||||
|
return fs.open(path, mode)
|
||||||
|
end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a={...}local b=a[1]local c=components:getFirst("gpu")local d=nil;local e,f=0,0;local g,h=128,25;if c then d=c:newBuffer(g,h)for i,j in components:list()do if i=="screen"then c:assignBuffer(d,j)end end end;local function k(l)e,f=d:pasteText(e,f,"SCROLL_SPILL_CLEAR",l)f=f+1;e=0;if f>=h then f=h-1;d:newline()end end;local function m(n)c:freeAllBuffers()d=c:newBuffer(g,h)for i,j in components:list()do if i=="screen"then c:assignBuffer(d,j)end end;term.setBackgroundColor(0x1)term.setTextColor(0x4)term.clear()term.setCursorPos(1,1)term.write("A critical error occurred while loading the system:")term.setCursorPos(1,3)k(n)while true do end end;local o,n=xpcall(function()local p={}local q={coroutine=true,debug=true,_VERSION=true,assert=true,collectgarbage=true,error=true,gcinfo=true,getmetatable=true,ipairs=true,__inext=true,load=true,math=true,next=true,pairs=true,pcall=true,rawequal=true,rawget=true,rawlen=true,rawset=true,select=true,setmetatable=true,string=true,table=true,tonumber=true,tostring=true,type=true,xpcall=true,_G=true}local debug=debug;for r,j in pairs(_G)do if not q[r]or q[r]==nil then p[r]=j;_G[r]=nil end end;local function s(t)local u=t:read()local v={u or""}local w=1;local x=false;local function y()return table.concat(v)end;local function z(A)v={A}end;local function B()t.write(y())end;local t={}function t:read(C)assert(not x,"file is closed")local A=y()local D=#A;if not C then local E=A:sub(w)w=D+1;return E end;local E=A:sub(w,w+C-1)w=w+#E;return E end;function t:write(F)assert(not x,"file is closed")local A=y()local G=A:sub(1,w-1)local H=A:sub(w+#F)z(G..F..H)w=w+#F;return true end;function t:seek(I,J)assert(not x,"file is closed")local A=y()local D=#A;I=I or"cur"J=J or 0;if I=="set"then w=J+1 elseif I=="cur"then w=w+J elseif I=="end"then w=D+J+1 else error("invalid whence")end;if w<1 then w=1 end;if w>D+1 then w=D+1 end;return w-1 end;function t:close()assert(not x,"file is closed")B()x=true end;function t:flush()assert(not x,"file is closed")B()end;return t end;local function K(L)local t=b:open(L,"r")if not t then m("Could not open file: "..L)end;local y=t:read()return y end;local M=load(K("/boot/kernel.lua"),"@Kernel")local N=load(K("/boot/ac/initdisks"),"@Init_disks")(p)local O=load(K("/boot/initfs"),"@InitFs")()if not M then m("Could not load kernel.")end;if not N then m("Could not load initdisks.")end;if not O then m("Could not load initfs.")end;local P=p.components:getFirst("computer")local Q=p.components:getFirst("uefi")local R={time=function()return p.os.epoch("utc")end,clock=function()return p.os.clock()*1000 end,shutdown=p.os.shutdown,reboot=p.os.reboot,getMachineEvent=function()return P:getMachineEvent()end,getEEPROM=function()return Q.data end,setEEPROM=function(S,l)Q.data=l end}local T={[0x1]=1,[0x2]=2,[0x4]=3,[0x8]=4,[0x10]=5,[0x20]=6,[0x40]=7,[0x80]=8,[0x100]=9,[0x200]=10,[0x400]=11,[0x800]=12,[0x1000]=13,[0x2000]=14,[0x4000]=15,[0x8000]=16}local U={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000}p.term.setBackgroundColor(0x8000)p.term.setTextColor(0x1000)p.term.clear()p.term.setCursorPos(1,1)local V=coroutine.create(function()local o,n=xpcall(M,debug.traceback,p,N,"cct","/sbin/init",{print=function(S,l)k(l.."\n")end,printInline=function(S,l)k(l)end,clear=function()p.term.clear()p.term.setCursorPos(1,1)end,setCursorPos=function(S,W,X)p.term.setCursorPos(W,X)end,getCursorPos=function()return p.term.getCursorPos()end,getSize=function()return p.term.getSize()end,setBackgroundColor=function(S,Y)p.term.setBackgroundColor(U[Y])end,setTextColor=function(S,Y)p.term.setTextColor(U[Y])end,getBackgroundColor=function()return T[p.term.getBackgroundColor()]end,getTextColor=function()return T[p.term.getTextColor()]end},R,O,"$")if not o then m(n)end end)function coroutine.resumeWithTimeout(Z,_,...)local a0=R.time()debug.sethook(Z,function()if R.time()>a0+_ then return coroutine.yield("timeout")end end,"",1000)local a1={coroutine.resume(Z,...)}if a1[1]and a1[2]=="timeout"then return"timeout"elseif a1[1]==false then return"error",a1[2]else debug.sethook(Z)return"success",table.unpack(a1,2)end end;k("Loaded in "..tostring(p.os.clock()).." seconds.\n")while true do local a2,n=coroutine.resumeWithTimeout(V,50)p.os.queueEvent("NoSleep")local a3=false;while not a3 do local a4={coroutine.yield()}if a4[1]=="key"then queueEvent("keyPressed",1,a4[2])if acekeys[a4[2]]then queueEvent("keyTyped",1,acekeys[a4[2]])end elseif a4[1]=="char"then queueEvent("keyTyped",1,a4[2])elseif a4[1]=="key_up"then queueEvent("keyReleased",1,a4[2])elseif a4[1]=="disk"then queueEvent("componentAdded","disk")elseif a4[1]=="disk_eject"then queueEvent("componentRemoved","disk")elseif a4[1]=="modem_message"then queueEvent("modem_message",table.unpack(a4,2))elseif a4[1]=="rednet_message"then queueEvent("rednet_message",table.unpack(a4,2))elseif a4[1]=="http_success"then queueEvent("http_success",table.unpack(a4,2))elseif a4[1]=="http_failure"then queueEvent("http_Line truncated
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=({...})[1]or"/$"local term=term;local os=os;local function b(c)local d,e=term.getCursorPos()local f,g=term.getSize()for h=1,#c do local i=c:sub(h,h)if i=="\n"then e=e+1;d=1 elseif i=="\t"then local j=4;local k=j-(d-1)%j;term.write(string.rep(" ",k))d=d+k elseif i=="\b"then if d>1 then d=d-1;term.setCursorPos(d,e)term.write(" ")term.setCursorPos(d,e)end else if d<=f and e<=g then term.setCursorPos(d,e)term.write(i)d=d+1 end end;if d>f then d=1;e=e+1 end;if e-1>=g then term.scroll(1)e=g;term.setCursorPos(d,e)end end;term.setCursorPos(d,e)end;local function l(m)term.setBackgroundColor(0x1)term.setTextColor(0x4)term.clear()term.setCursorPos(1,1)term.write("A critical error occurred while loading the system:")term.setCursorPos(1,3)b(m)while true do end end;term.setCursorBlink(false)local n,m=xpcall(function()local o={BOOT_DRIVE_PATH=a}local p={coroutine=true,debug=true,_VERSION=true,assert=true,collectgarbage=true,error=true,gcinfo=true,getmetatable=true,ipairs=true,__inext=true,load=true,math=true,next=true,pairs=true,pcall=true,rawequal=true,rawget=true,rawlen=true,rawset=true,select=true,setmetatable=true,string=true,table=true,tonumber=true,tostring=true,type=true,xpcall=true,_G=true}local debug=debug;for h,q in pairs(_G)do if not p[h]or p[h]==nil then o[h]=q;_G[h]=nil end end;local r={[o.keys.enter]="\n",[o.keys.tab]="\t",[o.keys.backspace]="\b",[o.keys.up]="\17",[o.keys.down]="\18",[o.keys.left]="\19",[o.keys.right]="\20"}function sleep(s)local t=o.os.clock()+s;while t>o.os.clock()do end end;o.term.setPaletteColor(0x1,0xFFFFFF)o.term.setPaletteColor(0x2,0xFF0000)o.term.setPaletteColor(0x4,0x00FF00)o.term.setPaletteColor(0x8,0x0000FF)o.term.setPaletteColor(0x10,0x00FFFF)o.term.setPaletteColor(0x20,0xFF00FF)o.term.setPaletteColor(0x40,0xFFFF00)o.term.setPaletteColor(0x80,0xFF6D00)o.term.setPaletteColor(0x100,0x6DFF55)o.term.setPaletteColor(0x200,0x24FFFF)o.term.setPaletteColor(0x400,0x924900)o.term.setPaletteColor(0x800,0x6D6D55)o.term.setPaletteColor(0x1000,0xDBDBAA)o.term.setPaletteColor(0x2000,0x6D00FF)o.term.setPaletteColor(0x4000,0xB6FF00)o.term.setPaletteColor(0x8000,0x000000)local function u(v)local w=o.fs.open(v,"r")if not w then l("Could not open file: "..v)end;local x=w.readAll()w.close()return x end;local y=load(u(a.."/boot/kernel.lua"),"@Kernel")local z=load(u(a.."/boot/cct/initdisks"),"@Init_disks")(o)local A=load(u(a.."/boot/initfs"),"@InitFs")()if not y then l("Could not load kernel.")end;if not z then l("Could not load initdisks.")end;if not A then l("Could not load initfs.")end;if not o.fs.exists("/nvram.dat")then local w=o.fs.open("/nvram.dat","w")w.write("Hello, World!")w.close()end;local B;if o.fs.exists("/startup.lua")then B="/startup.lua"elseif o.fs.exists("/eeprom")then B="/eeprom"end;local C={}local function D(E,...)table.insert(C,{E,...})end;local F={[0x000000]=0x0001,[0xFFFFFF]=0x0002,[0xFF0000]=0x0004,[0x00FF00]=0x0008,[0x0000FF]=0x0010,[0x00FFFF]=0x0020,[0xFF00FF]=0x0040,[0xFFFF00]=0x0080,[0xFF6D00]=0x0100,[0x6DFF55]=0x0200,[0x24FFFF]=0x0400,[0x924900]=0x0800,[0x6D6D55]=0x1000,[0xDBDBAA]=0x2000,[0x6D00FF]=0x4000,[0xB6FF00]=0x8000}local G,H=0x6D6D55,0x000000;local I,J,K,L={},{},{},0;local function M(N,O)local P=nil;local Q=math.huge;for R,S in pairs(N)do local T=math.abs(R-O)if T<Q then Q=T;P=R end end;return P end;local function U(V)L=L+1;if L%1024==0 then J={}I={}end;if L%8192==0 then K={}end;if K[V]~=nil then return K[V]end;if J[V]~=nil then I[V]=I[V]+1;if I[V]>=16 then K[V]=J[V]J[V]=nil;I[V]=nil;return K[V]end;return J[V]end;local W=M(F,V)if not W then return nil end;local X=F[W]J[V]=X;I[V]=1;return X end;local Y={getEpochMs=function()return o.os.epoch("utc")end,getUptime=function()return o.os.clock()*1000 end,date=function()return o.os.date("!%Y-%m-%dT%H:%M:%SZ",o.os.epoch("utc")/1000)end,getMachineEvent=function()if#C>0 then return table.unpack(table.remove(C,1))else return nil end end,getEEPROM=function()return u(B)end,setEEPROM=function(S,c)local g=o.fs.open(B,"w")g.write(c)g.close()end,initfs=A,disks=z,screenCtl={print=function(S,c)b(c.."\n")end,printInline=function(S,c)b(c)end,clear=function()o.term.clear()o.term.setCursorPos(1,1)end,setCursorPos=function(S,d,e)o.term.setCursorPos(d,e)end,getCursorPos=function()return o.term.getCursorPos()end,getSize=function()return o.term.getSize()end,setBackgroundColor=function(S,Z)o.term.setBackgroundColor(U(Z))end,setTextColor=function(S,Z)o.term.setTextColor(U(Z))end,getBackgroundColor=function()return H end,getTextColor=function()return G end,enable=function()end,disable=function()end},architecture="cct",getNvram=function()return u("/nvram.dat")end,setNvram=function(S,c)local g=o.fs.open("/nvram.dat","w")g.write(c)g.close()end,firmware=o,reboot=false}o.term.setBackgroundColor(0x8000)o.term.setTextColor(0x1000)o.term.clear()o.term.setCursorPos(1,1)local _=coroutine.create(function()local n,m=xpcall(y,debug.traceback,Y)if not n and not Y.reboot then l(m)end;if m then o.os.reboot()else o.os.shutdown()end end)function coroutinLine truncated
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=({...})[1]or"/$"local b={...}local c={keys=true,bit32=true,bit=true,ccemux=true,config=true,coroutine=true,debug=true,fs=true,http=true,mounter=true,os=true,periphemu=true,peripheral=true,redstone=true,rs=true,term=true,utf8=true,_HOST=true,_CC_DEFAULT_SETTINGS=true,_CC_DISABLE_LUA51_FEATURES=true,_VERSION=true,assert=true,collectgarbage=true,error=true,gcinfo=true,getfenv=true,getmetatable=true,ipairs=true,__inext=true,load=true,loadstring=true,math=true,newproxy=true,next=true,pairs=true,pcall=true,rawequal=true,rawget=true,rawlen=true,rawset=true,select=true,setfenv=true,setmetatable=true,string=true,table=true,tonumber=true,tostring=true,type=true,unpack=true,xpcall=true,turtle=true,pocket=true,commands=true,_G=true}local d={}for e in pairs(_G)do if not c[e]then table.insert(d,e)end end;for f,e in ipairs(d)do _G[e]=nil end;local g=_G.term.native()for f,h in ipairs{"nativePaletteColor","nativePaletteColour","screenshot"}do g[h]=_G.term[h]end;_G.term=g;if _G.http then _G.http.checkURL=_G.http.checkURLAsync;_G.http.websocket=_G.http.websocketAsync end;if _G.commands then _G.commands=_G.commands.native end;if _G.turtle then _G.turtle.native,_G.turtle.craft=nil end;local i={os={"version","pullEventRaw","pullEvent","run","loadAPI","unloadAPI","sleep"},http=_G.http and{"get","post","put","delete","patch","options","head","trace","listen","checkURLAsync","websocketAsync"},fs={"complete","isDriveRoot"}}for e,j in pairs(i)do for f,k in ipairs(j)do _G[e][k]=nil end end;local l=error;_G.error=function()end;_G.term.redirect=function()end;function _G.term.native()_G.term.native=nil;_G.term.redirect=nil;_G.error=l;term.setBackgroundColor(32768)term.setTextColor(1)term.setCursorPos(1,1)term.setCursorBlink(true)term.clear()local m=fs.open(a.."/boot/cct/boot.lua","r")if m==nil then term.setCursorBlink(false)term.setTextColor(16384)term.write("Could not find /boot/cct/boot.lua. UnBIOS cannot continue.")term.setCursorPos(1,2)term.write("Press any key to continue")coroutine.yield("key")os.shutdown()end;local n,o=loadstring(m.readAll(),"@bootloader")m.close()if n==nil then term.setCursorBlink(false)term.setTextColor(16384)term.write("Could not load /boot/cc/boot.lua. UnBIOS cannot continue.")term.setCursorPos(1,2)term.write(o)term.setCursorPos(1,3)term.write("Press any key to continue")coroutine.yield("key")os.shutdown()end;setfenv(n,_G)local p=os.shutdown;os.shutdown=function()os.shutdown=p;return n(a)end end;if debug then local function q(r,s,t,u)local v,w,x=1,debug.getupvalue(r[s],u)while w~=t and w~=nil do w,x=debug.getupvalue(r[s],v)v=v+1 end;r[s]=x or r[s]end;q(_G,"loadstring","nativeloadstring",1)q(_G,"load","nativeload",5)if http then q(http,"request","nativeHTTPRequest",3)end;q(os,"shutdown","nativeShutdown",1)q(os,"reboot","nativeReboot",1)if turtle then q(turtle,"equipLeft","v",1)q(turtle,"equipRight","v",1)end;do local v,w,x=1,debug.getupvalue(peripheral.isPresent,2)while w~="native"and w~=nil do w,x=debug.getupvalue(peripheral.isPresent,v)v=v+1 end;_G.peripheral=x or peripheral end end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=({...})[1]local b=a.BOOT_DRIVE_PATH;local c=a.fs;local d=a.peripheral;local e={}local f={"top","bottom","left","right","front","back"}function e.getNames()local g={}for h=1,#f do local i=f[h]if d.isPresent(i)then table.insert(g,i)if d.hasType(i,"peripheral_hub")then local j=d.call(i,"getNamesRemote")for k,l in ipairs(j)do table.insert(g,l)end end end end;return g end;function e.isPresent(l)if d.isPresent(l)then return true end;for h=1,#f do local i=f[h]if d.hasType(i,"peripheral_hub")and d.call(i,"isPresentRemote",l)then return true end end;return false end;function e.getType(e)if type(e)=="string"then if d.isPresent(e)then return d.getType(e)end;for h=1,#f do local i=f[h]if d.hasType(i,"peripheral_hub")and d.call(i,"isPresentRemote",e)then return d.call(i,"getTypeRemote",e)end end;return nil else local m=getmetatable(e)if not m or m.__name~="peripheral"or type(m.types)~="table"then error("bad argument #1 (table is not a peripheral)",2)end;return table.unpack(m.types)end end;function e.hasType(e,n)if type(e)=="string"then if d.isPresent(e)then return d.hasType(e,n)end;for h=1,#f do local i=f[h]if d.hasType(i,"peripheral_hub")and d.call(i,"isPresentRemote",e)then return d.call(i,"hasTypeRemote",e,n)end end;return nil else local m=getmetatable(e)if not m or m.__name~="peripheral"or type(m.types)~="table"then error("bad argument #1 (table is not a peripheral)",2)end;return m.types[n]~=nil end end;function e.getMethods(l)if d.isPresent(l)then return d.getMethods(l)end;for h=1,#f do local i=f[h]if d.hasType(i,"peripheral_hub")and d.call(i,"isPresentRemote",l)then return d.call(i,"getMethodsRemote",l)end end;return nil end;function e.getName(e)local m=getmetatable(e)if not m or m.__name~="peripheral"or type(m.name)~="string"then error("bad argument #1 (table is not a peripheral)",2)end;return m.name end;function e.call(l,o,...)if d.isPresent(l)then return d.call(l,o,...)end;for h=1,#f do local i=f[h]if d.hasType(i,"peripheral_hub")and d.call(i,"isPresentRemote",l)then return d.call(i,"callRemote",l,o,...)end end;return nil end;function e.wrap(l)local p=e.getMethods(l)if not p then return nil end;local q={e.getType(l)}for r=1,#q do q[q[r]]=true end;local s=setmetatable({},{__name="peripheral",name=l,type=q[1],types=q})for k,o in ipairs(p)do s[o]=function(...)return e.call(l,o,...)end end;return s end;function e.find(t,u)local g={}for k,l in ipairs(e.getNames())do if e.hasType(l,t)then local v=e.wrap(l)if u==nil or u(l,v)then table.insert(g,v)end end end;return table.unpack(g)end;local w={}local x={}local function y(z)if not z or z==""then return"/"end;return c.combine("/",z)end;local function A(B,C,D,E)C=y(C)local F={address=B,isReadOnly=function()return D end}function F:spaceUsed()return c.getCapacity(C)-c.getFreeSpace(C)end;function F:spaceTotal()return c.getCapacity(C)end;function F:list(z)local G=c.combine(C,z)if not c.exists(G)or not c.isDir(G)then return nil,"not directory"end;return c.list(G)end;function F:fileExists(z)local G=c.combine(C,z)return c.exists(G)and not c.isDir(G)end;function F:directoryExists(z)local G=c.combine(C,z)return c.exists(G)and c.isDir(G)end;function F:type(z)local G=c.combine(C,z)if not c.exists(G)then return nil elseif c.isDir(G)then return"directory"else return"file"end end;function F:makeDirectory(z)local G=c.combine(C,z)c.makeDir(G)return true end;function F:remove(z)local G=c.combine(C,z)if c.exists(G)then c.delete(G)end;return true end;function F:setLabel(H)E.setLabel(H)end;function F:getLabel(H)return E.getLabel()end;function F:attributes(z)local G=c.combine(C,z)return c.attributes(G)end;function F:open(z,I)local G=c.combine(C,z)return c.open(G,I)end;return F end;x["$"]=A("$",b,false,{setLabel=function(H)local J=c.open("/.label","w")J.write(H)J.close()end,getLabel=function()local J=c.open("/.label","r")if not J then return"$"end;local H=J.readAll()J.close()return H end})x["rom"]=A("rom","/rom",true,{setLabel=function(H)error("Device is read-only")end,getLabel=function()return"cctrom"end})local function K()w={}for k,F in ipairs({e.find("drive")})do if F.isDiskPresent()then w[tostring(F.getDiskID())]=A("cctdisk"..tostring(F.getDiskID()),F.getMountPath(),false,c)end end end;local function L()K()local M={}for B,N in pairs(x)do M[B]=N end;for B,N in pairs(w)do M[B]=N end;return pairs(M)end;return{refresh=K,list=L}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b=a.apis;local c=b.peripheral;local d={"top","bottom","left","right","front","back"}local e={}function e.getNames()local f={}for g=1,#d do local h=d[g]if c.isPresent(h)then table.insert(f,h)if c.hasType(h,"peripheral_hub")then local i=c.call(h,"getNamesRemote")for j,k in ipairs(i)do table.insert(f,k)end end end end;return f end;function e.isPresent(k)if c.isPresent(k)then return true end;for g=1,#d do local h=d[g]if c.hasType(h,"peripheral_hub")and c.call(h,"isPresentRemote",k)then return true end end;return false end;function e.getType(e)if type(e)=="string"then if c.isPresent(e)then return c.getType(e)end;for g=1,#d do local h=d[g]if c.hasType(h,"peripheral_hub")and c.call(h,"isPresentRemote",e)then return c.call(h,"getTypeRemote",e)end end;return nil else local l=getmetatable(e)if not l or l.__name~="peripheral"or type(l.types)~="table"then error("bad argument #1 (table is not a peripheral)",2)end;return table.unpack(l.types)end end;function e.hasType(e,m)if type(e)=="string"then if c.isPresent(e)then return c.hasType(e,m)end;for g=1,#d do local h=d[g]if c.hasType(h,"peripheral_hub")and c.call(h,"isPresentRemote",e)then return c.call(h,"hasTypeRemote",e,m)end end;return nil else local l=getmetatable(e)if not l or l.__name~="peripheral"or type(l.types)~="table"then error("bad argument #1 (table is not a peripheral)",2)end;return l.types[m]~=nil end end;function e.getMethods(k)if c.isPresent(k)then return c.getMethods(k)end;for g=1,#d do local h=d[g]if c.hasType(h,"peripheral_hub")and c.call(h,"isPresentRemote",k)then return c.call(h,"getMethodsRemote",k)end end;return nil end;function e.getName(e)local l=getmetatable(e)if not l or l.__name~="peripheral"or type(l.name)~="string"then error("bad argument #1 (table is not a peripheral)",2)end;return l.name end;function e.call(k,n,...)if c.isPresent(k)then return c.call(k,n,...)end;for g=1,#d do local h=d[g]if c.hasType(h,"peripheral_hub")and c.call(h,"isPresentRemote",k)then return c.call(h,"callRemote",k,n,...)end end;return nil end;function e.wrap(k)local o=e.getMethods(k)if not o then return nil end;local p={e.getType(k)}for q=1,#p do p[p[q]]=true end;local r=setmetatable({},{__name="peripheral",name=k,type=p[1],types=p})for j,n in ipairs(o)do r[n]=function(...)return e.call(k,n,...)end end;return r end;function e.find(s,t)local f={}for j,k in ipairs(e.getNames())do if e.hasType(k,s)then local u=e.wrap(k)if t==nil or t(k,u)then table.insert(f,u)end end end;return table.unpack(f)end;local v={[0x1]=1,[0x2]=2,[0x4]=3,[0x8]=4,[0x10]=5,[0x20]=6,[0x40]=7,[0x80]=8,[0x100]=9,[0x200]=10,[0x400]=11,[0x800]=12,[0x1000]=13,[0x2000]=14,[0x4000]=15,[0x8000]=16}local w={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000}local function x(y,z)local A,B=z.getCursorPos()local C,D=z.getSize()for q=1,#y do local E=y:sub(q,q)if E=="\n"then B=B+1;A=1 elseif E=="\t"then local F=4;local G=F-(A-1)%F;z.write(string.rep(" ",G))A=A+G elseif E=="\b"then if A>1 then A=A-1;z.setCursorPos(A,B)z.write(" ")z.setCursorPos(A,B)end else if A<=C and B<=D then z.setCursorPos(A,B)z.write(E)A=A+1 end end;if A>C then A=1;B=B+1 end;if B-1>=D then z.scroll(1)B=D;z.setCursorPos(A,B)end end;z.setCursorPos(A,B)end;a.devfs.data.tty={}local H,I=false,false;local function J(K)if K then return"T"else return"F"end end;local function L(M,N,O)a.devfs.data["tty"][N]=function(P,Q)if P=="type"then return"character device"elseif P=="open"then local D={read=function(R)local S=""for q=1,R or 1 do local T={O()}if T[1]then S=S..T[1]end end;if S==""then S=nil end;return S end,write=function(U)x(U,M)end,size=function()local V={M.getSize()}return table.concat(V,";")end,clear=function()M.clear()M.setCursorPos(1,1)end,gpos=function()local V={M.getCursorPos()}return table.concat(V,";")end,spos=function(A,B)return M.setCursorPos(A,B)end,sfgc=function(E)return M.setTextColor(w[E])end,sbgc=function(E)return M.setBackgroundColor(w[E])end,gfgc=function()return v[M.getTextColor()]end,gbgc=function()return v[M.getBackgroundColor()]end,gctrl=function()return J(H)..";"..J(I)end}if Q=="rw"then return D elseif Q=="r"then D["write"]=nil;return D elseif Q=="w"then D["read"]=nil;return D end end end end;local W=a.newFifo()a.processes.cctmond=function()local X=false;while true do local T={a.EFI:getMachineEvent()}if T[1]then local Y=T[1]local Z=T[3]local _={[b.keys.a]=1,[b.keys.b]=2,[b.keys.c]=3,[b.keys.d]=4,[b.keys.e]=5,[b.keys.f]=6,[b.keys.g]=7,[b.keys.h]=8,[b.keys.i]=9,[b.keys.j]=10,[b.keys.k]=11,[b.keys.l]=12,[b.keys.m]=13,[b.keys.n]=14,[b.keys.o]=15,[b.keys.p]=16,[b.keys.q]=17,[b.keys.r]=18,[b.keys.s]=19,[b.keys.t]=20,[b.keys.u]=21,[b.keys.v]=22,[b.keys.w]=23,[b.keys.x]=24,[b.keys.y]=25,[b.keys.z]=26}if Y=="keyPressed"then if Z==b.keys.leftCtrl or Z==b.keys.rightCtrl then H=true elseif Z==b.keys.leftAlt or Z==b.keys.rightAlt then I=true end;if H then local a0=_[Z]if a0 then if a0==3 then for j,a1 in ipairs(syscall.getTasks())do syscall.sigsend(a1,1)end elseLine truncated
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=({...})[1]or"/$"local term=term;local os=os;local function b(c)local d,e=term.getCursorPos()local f,g=term.getSize()for h=1,#c do local i=c:sub(h,h)if i=="\n"then e=e+1;d=1 elseif i=="\t"then local j=4;local k=j-(d-1)%j;term.write(string.rep(" ",k))d=d+k elseif i=="\b"then if d>1 then d=d-1;term.setCursorPos(d,e)term.write(" ")term.setCursorPos(d,e)end else if d<=f and e<=g then term.setCursorPos(d,e)term.write(i)d=d+1 end end;if d>f then d=1;e=e+1 end;if e-1>=g then term.scroll(1)e=g;term.setCursorPos(d,e)end end;term.setCursorPos(d,e)end;local function l(m)term.setBackgroundColor(0x1)term.setTextColor(0x4)term.clear()term.setCursorPos(1,1)term.write("A critical error occurred while loading the system:")term.setCursorPos(1,3)b(m)while true do end end;term.setCursorBlink(false)local n,m=xpcall(function()local o={BOOT_DRIVE_PATH=a}local p={coroutine=true,debug=true,_VERSION=true,assert=true,collectgarbage=true,error=true,gcinfo=true,getmetatable=true,ipairs=true,__inext=true,load=true,math=true,next=true,pairs=true,pcall=true,rawequal=true,rawget=true,rawlen=true,rawset=true,select=true,setmetatable=true,string=true,table=true,tonumber=true,tostring=true,type=true,xpcall=true,_G=true}local debug=debug;for h,q in pairs(_G)do if not p[h]or p[h]==nil then o[h]=q;_G[h]=nil end end;local r={[o.keys.enter]="\n",[o.keys.tab]="\t",[o.keys.backspace]="\b",[o.keys.up]="\17",[o.keys.down]="\18",[o.keys.left]="\19",[o.keys.right]="\20"}function sleep(s)local t=o.os.clock()+s;while t>o.os.clock()do end end;o.term.setPaletteColor(0x1,0xFFFFFF)o.term.setPaletteColor(0x2,0xFF0000)o.term.setPaletteColor(0x4,0x00FF00)o.term.setPaletteColor(0x8,0x0000FF)o.term.setPaletteColor(0x10,0x00FFFF)o.term.setPaletteColor(0x20,0xFF00FF)o.term.setPaletteColor(0x40,0xFFFF00)o.term.setPaletteColor(0x80,0xFF6D00)o.term.setPaletteColor(0x100,0x6DFF55)o.term.setPaletteColor(0x200,0x24FFFF)o.term.setPaletteColor(0x400,0x924900)o.term.setPaletteColor(0x800,0x6D6D55)o.term.setPaletteColor(0x1000,0xDBDBAA)o.term.setPaletteColor(0x2000,0x6D00FF)o.term.setPaletteColor(0x4000,0xB6FF00)o.term.setPaletteColor(0x8000,0x000000)local function u(v)local w=o.fs.open(v,"r")if not w then l("Could not open file: "..v)end;local x=w.readAll()w.close()return x end;local y=load(u(a.."/boot/kernel.lua"),"@Kernel")local z=load(u(a.."/boot/cct/initdisks"),"@Init_disks")(o)local A=load(u(a.."/boot/initfs"),"@InitFs")()if not y then l("Could not load kernel.")end;if not z then l("Could not load initdisks.")end;if not A then l("Could not load initfs.")end;if not o.fs.exists("/nvram.dat")then local w=o.fs.open("/nvram.dat","w")w.write("Hello, World!")w.close()end;local B;if o.fs.exists("/startup.lua")then B="/startup.lua"elseif o.fs.exists("/eeprom")then B="/eeprom"end;local C={}local function D(E,...)table.insert(C,{E,...})end;local F={[0x000000]=0x0001,[0xFFFFFF]=0x0002,[0xFF0000]=0x0004,[0x00FF00]=0x0008,[0x0000FF]=0x0010,[0x00FFFF]=0x0020,[0xFF00FF]=0x0040,[0xFFFF00]=0x0080,[0xFF6D00]=0x0100,[0x6DFF55]=0x0200,[0x24FFFF]=0x0400,[0x924900]=0x0800,[0x6D6D55]=0x1000,[0xDBDBAA]=0x2000,[0x6D00FF]=0x4000,[0xB6FF00]=0x8000}local G,H=0x6D6D55,0x000000;local I,J,K,L={},{},{},0;local function M(N,O)local P=nil;local Q=math.huge;for R,S in pairs(N)do if R==O then return R end;local T=math.abs(R-O)if T<Q then Q=T;P=R end end;return P end;local function U(V)L=L+1;if L%1024==0 then J={}I={}end;if L%8192==0 then K={}end;if K[V]~=nil then return K[V]end;if J[V]~=nil then I[V]=I[V]+1;if I[V]>=16 then K[V]=J[V]J[V]=nil;I[V]=nil;return K[V]end;return J[V]end;local W=M(F,V)if not W then return nil end;local X=F[W]J[V]=X;I[V]=1;return X end;local Y={o.peripheral.find("monitor")}for h=1,#Y do Y[h].setTextScale(.5)Y[h].clear()Y[h].setCursorPos(1,1)Y[h].write("Initializing...")end;local Z={getEpochMs=function()return o.os.epoch("utc")end,getUptime=function()return o.os.clock()*1000 end,date=function()return o.os.date("!%Y-%m-%dT%H:%M:%SZ",o.os.epoch("utc")/1000)end,getMachineEvent=function()if#C>0 then return table.unpack(table.remove(C,1))else return nil end end,getEEPROM=function()return u(B)end,setEEPROM=function(S,c)local g=o.fs.open(B,"w")g.write(c)g.close()end,initfs=A,disks=z,screenCtl={print=function(S,c)b(c.."\n")end,printInline=function(S,c)b(c)end,clear=function()o.term.clear()o.term.setCursorPos(1,1)end,setCursorPos=function(S,d,e)o.term.setCursorPos(d,e)end,getCursorPos=function()return o.term.getCursorPos()end,getSize=function()return o.term.getSize()end,setBackgroundColor=function(S,_)o.term.setBackgroundColor(U(_))end,setTextColor=function(S,_)o.term.setTextColor(U(_))end,getBackgroundColor=function()return H end,getTextColor=function()return G end,enable=function()end,disable=function()end},architecture="cct",getNvram=function()return u("/nvram.dat")end,setNvram=function(S,c)local g=o.fs.open("/nvram.dat","w")g.write(c)g.close()end,firmware=o,reboot=false,beep=function()end}o.term.setBackgroundColor(0x8000)o.term.setTextColor(0x1000)o.term.clear()o.term.setCursorPoLine truncated
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=({...})[1]or"/$"local b={...}local c={keys=true,bit32=true,bit=true,ccemux=true,config=true,coroutine=true,debug=true,fs=true,http=true,mounter=true,os=true,periphemu=true,peripheral=true,redstone=true,rs=true,term=true,utf8=true,_HOST=true,_CC_DEFAULT_SETTINGS=true,_CC_DISABLE_LUA51_FEATURES=true,_VERSION=true,assert=true,collectgarbage=true,error=true,gcinfo=true,getfenv=true,getmetatable=true,ipairs=true,__inext=true,load=true,loadstring=true,math=true,newproxy=true,next=true,pairs=true,pcall=true,rawequal=true,rawget=true,rawlen=true,rawset=true,select=true,setfenv=true,setmetatable=true,string=true,table=true,tonumber=true,tostring=true,type=true,unpack=true,xpcall=true,turtle=true,pocket=true,commands=true,_G=true}local d={}for e in pairs(_G)do if not c[e]then table.insert(d,e)end end;for f,e in ipairs(d)do _G[e]=nil end;local g=_G.term.native()for f,h in ipairs{"nativePaletteColor","nativePaletteColour","screenshot"}do g[h]=_G.term[h]end;_G.term=g;if _G.http then _G.http.checkURL=_G.http.checkURLAsync;_G.http.websocket=_G.http.websocketAsync end;if _G.commands then _G.commands=_G.commands.native end;if _G.turtle then _G.turtle.native,_G.turtle.craft=nil end;local i={os={"version","pullEventRaw","pullEvent","run","loadAPI","unloadAPI","sleep"},http=_G.http and{"get","post","put","delete","patch","options","head","trace","listen","checkURLAsync","websocketAsync"},fs={"complete","isDriveRoot"}}for e,j in pairs(i)do for f,k in ipairs(j)do _G[e][k]=nil end end;local l=error;_G.error=function()end;_G.term.redirect=function()end;function _G.term.native()_G.term.native=nil;_G.term.redirect=nil;_G.error=l;term.setBackgroundColor(32768)term.setTextColor(1)term.setCursorPos(1,1)term.setCursorBlink(true)term.clear()local m=fs.open(a.."/boot/cct/boot.lua","r")if m==nil then term.setCursorBlink(false)term.setTextColor(16384)term.write("Could not find /boot/cct/boot.lua. UnBIOS cannot continue.")term.setCursorPos(1,2)term.write("Press any key to continue")coroutine.yield("key")os.shutdown()end;local n,o=loadstring(m.readAll(),"@bootloader")m.close()if n==nil then term.setCursorBlink(false)term.setTextColor(16384)term.write("Could not load /boot/cc/boot.lua. UnBIOS cannot continue.")term.setCursorPos(1,2)term.write(o)term.setCursorPos(1,3)term.write("Press any key to continue")coroutine.yield("key")os.shutdown()end;setfenv(n,_G)local p=os.shutdown;os.shutdown=function()os.shutdown=p;return n(a)end end;if debug then local function q(r,s,t,u)local v,w,x=1,debug.getupvalue(r[s],u)while w~=t and w~=nil do w,x=debug.getupvalue(r[s],v)v=v+1 end;r[s]=x or r[s]end;q(_G,"loadstring","nativeloadstring",1)q(_G,"load","nativeload",5)if http then q(http,"request","nativeHTTPRequest",3)end;q(os,"shutdown","nativeShutdown",1)q(os,"reboot","nativeReboot",1)if turtle then q(turtle,"equipLeft","v",1)q(turtle,"equipRight","v",1)end;do local v,w,x=1,debug.getupvalue(peripheral.isPresent,2)while w~="native"and w~=nil do w,x=debug.getupvalue(peripheral.isPresent,v)v=v+1 end;_G.peripheral=x or peripheral end end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=({...})[1]local b=a.BOOT_DRIVE_PATH;local c=a.fs;local d=a.peripheral;local e={}local f={"top","bottom","left","right","front","back"}function e.getNames()local g={}for h=1,#f do local i=f[h]if d.isPresent(i)then table.insert(g,i)if d.hasType(i,"peripheral_hub")then local j=d.call(i,"getNamesRemote")for k,l in ipairs(j)do table.insert(g,l)end end end end;return g end;function e.isPresent(l)if d.isPresent(l)then return true end;for h=1,#f do local i=f[h]if d.hasType(i,"peripheral_hub")and d.call(i,"isPresentRemote",l)then return true end end;return false end;function e.getType(e)if type(e)=="string"then if d.isPresent(e)then return d.getType(e)end;for h=1,#f do local i=f[h]if d.hasType(i,"peripheral_hub")and d.call(i,"isPresentRemote",e)then return d.call(i,"getTypeRemote",e)end end;return nil else local m=getmetatable(e)if not m or m.__name~="peripheral"or type(m.types)~="table"then error("bad argument #1 (table is not a peripheral)",2)end;return table.unpack(m.types)end end;function e.hasType(e,n)if type(e)=="string"then if d.isPresent(e)then return d.hasType(e,n)end;for h=1,#f do local i=f[h]if d.hasType(i,"peripheral_hub")and d.call(i,"isPresentRemote",e)then return d.call(i,"hasTypeRemote",e,n)end end;return nil else local m=getmetatable(e)if not m or m.__name~="peripheral"or type(m.types)~="table"then error("bad argument #1 (table is not a peripheral)",2)end;return m.types[n]~=nil end end;function e.getMethods(l)if d.isPresent(l)then return d.getMethods(l)end;for h=1,#f do local i=f[h]if d.hasType(i,"peripheral_hub")and d.call(i,"isPresentRemote",l)then return d.call(i,"getMethodsRemote",l)end end;return nil end;function e.getName(e)local m=getmetatable(e)if not m or m.__name~="peripheral"or type(m.name)~="string"then error("bad argument #1 (table is not a peripheral)",2)end;return m.name end;function e.call(l,o,...)if d.isPresent(l)then return d.call(l,o,...)end;for h=1,#f do local i=f[h]if d.hasType(i,"peripheral_hub")and d.call(i,"isPresentRemote",l)then return d.call(i,"callRemote",l,o,...)end end;return nil end;function e.wrap(l)local p=e.getMethods(l)if not p then return nil end;local q={e.getType(l)}for r=1,#q do q[q[r]]=true end;local s=setmetatable({},{__name="peripheral",name=l,type=q[1],types=q})for k,o in ipairs(p)do s[o]=function(...)return e.call(l,o,...)end end;return s end;function e.find(t,u)local g={}for k,l in ipairs(e.getNames())do if e.hasType(l,t)then local v=e.wrap(l)if u==nil or u(l,v)then table.insert(g,v)end end end;return table.unpack(g)end;local w={}local x={}local function y(z)if not z or z==""then return"/"end;return c.combine("/",z)end;local function A(B,C,D,E)C=y(C)local F={address=B,isReadOnly=function()return D end}function F:spaceUsed()return c.getCapacity(C)-c.getFreeSpace(C)end;function F:spaceTotal()return c.getCapacity(C)end;function F:list(z)local G=c.combine(C,z)if not c.exists(G)or not c.isDir(G)then return nil,"not directory"end;return c.list(G)end;function F:fileExists(z)local G=c.combine(C,z)return c.exists(G)and not c.isDir(G)end;function F:directoryExists(z)local G=c.combine(C,z)return c.exists(G)and c.isDir(G)end;function F:type(z)local G=c.combine(C,z)if not c.exists(G)then return nil elseif c.isDir(G)then return"directory"else return"file"end end;function F:makeDirectory(z)local G=c.combine(C,z)c.makeDir(G)return true end;function F:remove(z)local G=c.combine(C,z)if c.exists(G)then c.delete(G)end;return true end;function F:setLabel(H)E.setLabel(H)end;function F:getLabel(H)return E.getLabel()end;function F:attributes(z)local G=c.combine(C,z)return c.attributes(G)end;function F:open(z,I)local G=c.combine(C,z)return c.open(G,I)end;return F end;x["$"]=A("$",b,false,{setLabel=function(H)local J=c.open("/.label","w")J.write(H)J.close()end,getLabel=function()local J=c.open("/.label","r")if not J then return"$"end;local H=J.readAll()J.close()return H end})x["rom"]=A("rom","/rom",true,{setLabel=function(H)error("Device is read-only")end,getLabel=function()return"cctrom"end})local function K()w={}for k,F in ipairs({e.find("drive")})do if F.isDiskPresent()then w[tostring(F.getDiskID())]=A("cctdisk"..tostring(F.getDiskID()),F.getMountPath(),false,c)end end end;local function L()K()local M={}for B,N in pairs(x)do M[B]=N end;for B,N in pairs(w)do M[B]=N end;return pairs(M)end;return{refresh=K,list=L}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...a.cct={}a.cct.peripheral={}local b=a.cct.peripheral;local c=a.apis;local d=c.peripheral;local e={"top","bottom","left","right","front","back"}function b.getNames()local f={}for g=1,#e do local h=e[g]if d.isPresent(h)then table.insert(f,h)if d.hasType(h,"peripheral_hub")then local i=d.call(h,"getNamesRemote")for j,k in ipairs(i)do table.insert(f,k)end end end end;return f end;function b.isPresent(k)if d.isPresent(k)then return true end;for g=1,#e do local h=e[g]if d.hasType(h,"peripheral_hub")and d.call(h,"isPresentRemote",k)then return true end end;return false end;function b.getType(b)if type(b)=="string"then if d.isPresent(b)then return d.getType(b)end;for g=1,#e do local h=e[g]if d.hasType(h,"peripheral_hub")and d.call(h,"isPresentRemote",b)then return d.call(h,"getTypeRemote",b)end end;return nil else local l=getmetatable(b)if not l or l.__name~="peripheral"or type(l.types)~="table"then error("bad argument #1 (table is not a peripheral)",2)end;return table.unpack(l.types)end end;function b.hasType(b,m)if type(b)=="string"then if d.isPresent(b)then return d.hasType(b,m)end;for g=1,#e do local h=e[g]if d.hasType(h,"peripheral_hub")and d.call(h,"isPresentRemote",b)then return d.call(h,"hasTypeRemote",b,m)end end;return nil else local l=getmetatable(b)if not l or l.__name~="peripheral"or type(l.types)~="table"then error("bad argument #1 (table is not a peripheral)",2)end;return l.types[m]~=nil end end;function b.getMethods(k)if d.isPresent(k)then return d.getMethods(k)end;for g=1,#e do local h=e[g]if d.hasType(h,"peripheral_hub")and d.call(h,"isPresentRemote",k)then return d.call(h,"getMethodsRemote",k)end end;return nil end;function b.getName(b)local l=getmetatable(b)if not l or l.__name~="peripheral"or type(l.name)~="string"then error("bad argument #1 (table is not a peripheral)",2)end;return l.name end;function b.call(k,n,...)if d.isPresent(k)then return d.call(k,n,...)end;for g=1,#e do local h=e[g]if d.hasType(h,"peripheral_hub")and d.call(h,"isPresentRemote",k)then return d.call(h,"callRemote",k,n,...)end end;return nil end;function b.wrap(k)local o=b.getMethods(k)if not o then return nil end;local p={b.getType(k)}for q=1,#p do p[p[q]]=true end;local r=setmetatable({},{__name="peripheral",name=k,type=p[1],types=p})for j,n in ipairs(o)do r[n]=function(...)return b.call(k,n,...)end end;return r end;function b.find(s,t)local f={}for j,k in ipairs(b.getNames())do if b.hasType(k,s)then local u=b.wrap(k)if t==nil or t(k,u)then table.insert(f,u)end end end;return table.unpack(f)end
|
||||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b=a.cct.peripheral;local c={[0xFFFFFF]=0x0001,[0xFF0000]=0x0002,[0x00FF00]=0x0004,[0x0000FF]=0x0008,[0x00FFFF]=0x0010,[0xFF00FF]=0x0020,[0xFFFF00]=0x0040,[0xFF6D00]=0x0080,[0x6DFF55]=0x0100,[0x24FFFF]=0x0200,[0x924900]=0x0400,[0x6D6D55]=0x0800,[0xDBDBAA]=0x1000,[0x6D00FF]=0x2000,[0xB6FF00]=0x4000,[0x000000]=0x8000}local d={0xFFFFFF,0xFF0000,0x00FF00,0x0000FF,0x00FFFF,0xFF00FF,0xFFFF00,0xFF6D00,0x6DFF55,0x24FFFF,0x924900,0x6D6D55,0xDBDBAA,0x6D00FF,0xB6FF00,0x000000}local e,f=0x6D6D55,0x000000;local g,h,i,j={},{},{},0;local function k(l,m)local n=nil;local o=math.huge;for p,q in pairs(l)do if p==m then return p end;local r=math.abs(p-m)if r<o then o=r;n=p end end;return n end;local function s(t)j=j+1;if j%1024==0 then h={}g={}end;if j%8192==0 then i={}end;if i[t]~=nil then return i[t]end;if h[t]~=nil then g[t]=g[t]+1;if g[t]>=16 then i[t]=h[t]h[t]=nil;g[t]=nil;return i[t]end;return h[t]end;local u=k(c,t)if not u then return nil end;local v=c[u]h[t]=v;g[t]=1;return v end;local function w(x,y)local z,A=y.getCursorPos()local B,C=y.getSize()for D=1,#x do local E=x:sub(D,D)if E=="\n"then A=A+1;z=1 elseif E=="\t"then local F=4;local G=F-(z-1)%F;y.write(string.rep(" ",G))z=z+G elseif E=="\b"then if z>1 then z=z-1;y.setCursorPos(z,A)y.write(" ")y.setCursorPos(z,A)end else if z<=B and A<=C then y.setCursorPos(z,A)y.write(E)z=z+1 end end;if z>B then z=1;A=A+1 end;if A-1>=C then y.scroll(1)A=C;y.setCursorPos(z,A)end end;y.setCursorPos(z,A)end;a.devfs.data.tty={}a.cct.ctrl,a.cct.alt=false,false;local function H(I)if I then return"T"else return"F"end end;local function J(K,L,M)K.setPaletteColor(0x1,0xFFFFFF)K.setPaletteColor(0x2,0xFF0000)K.setPaletteColor(0x4,0x00FF00)K.setPaletteColor(0x8,0x0000FF)K.setPaletteColor(0x10,0x00FFFF)K.setPaletteColor(0x20,0xFF00FF)K.setPaletteColor(0x40,0xFFFF00)K.setPaletteColor(0x80,0xFF6D00)K.setPaletteColor(0x100,0x6DFF55)K.setPaletteColor(0x200,0x24FFFF)K.setPaletteColor(0x400,0x924900)K.setPaletteColor(0x800,0x6D6D55)K.setPaletteColor(0x1000,0xDBDBAA)K.setPaletteColor(0x2000,0x6D00FF)K.setPaletteColor(0x4000,0xB6FF00)K.setPaletteColor(0x8000,0x000000)a.devfs.data["tty"][L]=function(N,O)if N=="type"then return"Terminal"elseif N=="open"then local C={read=function(P)local Q=""for D=1,P or 1 do local R={M()}if R[1]then Q=Q..R[1]end end;if Q==""then Q=nil end;return Q end,write=function(S)w(S,K)end,size=function()local T={K.getSize()}return table.concat(T,";")end,clear=function()K.clear()K.setCursorPos(1,1)end,gpos=function()local T={K.getCursorPos()}return table.concat(T,";")end,spos=function(z,A)return K.setCursorPos(z,A)end,sfgc=function(E)e=E;return K.setTextColor(s(E))end,sbgc=function(E)f=E;return K.setBackgroundColor(s(E))end,gfgc=function()return e end,gbgc=function()return f end,gctrl=function()return H(a.cct.ctrl)..";"..H(a.cct.alt)end,gplt=function()return d end}if O=="rw"then return C elseif O=="r"then C["write"]=nil;return C elseif O=="w"then C["read"]=nil;return C end end end end;local U=a.newFifo()a.cct.fifo=U;J(a.apis.term,"1",U.pop)for D,V in ipairs({b.find("monitor")})do V.setTextScale(.5)V.write("Initializing...")J(V,tostring(D+1),function()end)end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b=a.apis.keys;a.processes.cctdeamon=function()local c=false;while true do local d={a.EFI:getMachineEvent()}if d[1]then local e=d[1]local f=d[3]local g={[b.a]=1,[b.b]=2,[b.c]=3,[b.d]=4,[b.e]=5,[b.f]=6,[b.g]=7,[b.h]=8,[b.i]=9,[b.j]=10,[b.k]=11,[b.l]=12,[b.m]=13,[b.n]=14,[b.o]=15,[b.p]=16,[b.q]=17,[b.r]=18,[b.s]=19,[b.t]=20,[b.u]=21,[b.v]=22,[b.w]=23,[b.x]=24,[b.y]=25,[b.z]=26}if e=="keyPressed"then if f==b.leftCtrl or f==b.rightCtrl then a.cct.ctrl=true elseif f==b.leftAlt or f==b.rightAlt then a.cct.alt=true end;if a.cct.ctrl then local h=g[f]if h then if h==3 then for i,j in ipairs(syscall.getTasks())do syscall.sigsend(j,1)end else a.cct.fifo.push(string.char(h))end end else local k={[b.up]="[A",[b.down]="[B",[b.right]="[C",[b.left]="[D",[b.home]="[H",[b["end"]]="[F",[b.pageUp]="[5~",[b.pageDown]="[6~",[b.delete]="[3~"}local l=k[f]if l then a.cct.fifo.push(l)end end elseif e=="keyReleased"then if f==b.leftCtrl or f==b.rightCtrl then a.cct.ctrl=false elseif f==b.leftAlt or f==b.rightAlt then a.cct.alt=false end elseif e=="keyTyped"then if f then a.cct.fifo.push(f)end elseif e=="http_success"then a.cct.httpqueue[d[2]]=nil;a.cct.httpresponse[d[2]]=d[3]elseif e=="http_failure"then a.cct.httpqueue[d[2]]=nil;a.cct.httperror[d[2]]=d[3]end;c=false else c=true end;if c then sleep(0.05)end end end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b=a.apis.rs;local c={top=1,bottom=2,left=3,right=4,front=5,back=6}local function d(e)return function(f,g)if f=="w"then if type(g)~="boolean"then error("data: expected bool")end;b.setOutput(e,g)elseif f=="wa"then if type(g)~="number"then error("data: expected bool")end;b.setAnalogOutput(e,g)elseif f=="r"then return b.getInput(e)elseif f=="ra"then return b.getAnalogInput(e)end end end;for e,h in pairs(c)do local i=d(e)a.gpio[e]=i;a.gpio[h]=i end
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
local lua = {
|
||||||
|
coroutine = true,
|
||||||
|
debug = true,
|
||||||
|
_HOST = true,
|
||||||
|
_VERSION = true,
|
||||||
|
assert = true,
|
||||||
|
collectgarbage = true,
|
||||||
|
error = true,
|
||||||
|
gcinfo = true,
|
||||||
|
getfenv = true,
|
||||||
|
getmetatable = true,
|
||||||
|
ipairs = true,
|
||||||
|
__inext = true,
|
||||||
|
load = true,
|
||||||
|
math = true,
|
||||||
|
next = true,
|
||||||
|
pairs = true,
|
||||||
|
pcall = true,
|
||||||
|
rawequal = true,
|
||||||
|
rawget = true,
|
||||||
|
rawlen = true,
|
||||||
|
rawset = true,
|
||||||
|
select = true,
|
||||||
|
setfenv = true,
|
||||||
|
setmetatable = true,
|
||||||
|
string = true,
|
||||||
|
table = true,
|
||||||
|
tonumber = true,
|
||||||
|
tostring = true,
|
||||||
|
type = true,
|
||||||
|
xpcall = true,
|
||||||
|
_G=true
|
||||||
|
}
|
||||||
|
|
||||||
|
local apis={}
|
||||||
|
for i,v in pairs(_G) do
|
||||||
|
if not lua[i] or lua[i]==nil then
|
||||||
|
apis[i]=v
|
||||||
|
_G[i]=nil
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
checkArg=nil
|
||||||
|
local oldcomputer=computer
|
||||||
|
_G.computer=nil
|
||||||
|
local os=os
|
||||||
|
_G.os=nil
|
||||||
|
|
||||||
|
function component.wrap(address)
|
||||||
|
local methods=oldcomponent.methods(address)
|
||||||
|
local object={}
|
||||||
|
for _,method in ipairs(methods) do
|
||||||
|
object[method]=function(_,...)
|
||||||
|
return oldcomponent.invoke(address,method,...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return object
|
||||||
|
end
|
||||||
|
|
||||||
|
local
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local fs={}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
U $;/
|
||||||
|
U devfs0000;/dev/
|
||||||
|
U tmpfs0000;/tmp/
|
||||||
|
U procfs0000;/proc/
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
-- :Minify:--
|
||||||
|
local fs = {}
|
||||||
|
local disks = {}
|
||||||
|
local mounts = {}
|
||||||
|
|
||||||
|
local function resolve(path)
|
||||||
|
local mountPoint = "/"
|
||||||
|
for mount, disk in pairs(mounts) do
|
||||||
|
if path:sub(1, #mount) == mount then
|
||||||
|
if not mountPoint or #mount > #mountPoint then
|
||||||
|
mountPoint = mount
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local newPath = path:sub(#mountPoint + 1)
|
||||||
|
return disks[mounts[mountPoint]], newPath
|
||||||
|
end
|
||||||
|
|
||||||
|
function fs.update(initdisks)
|
||||||
|
disks = {}
|
||||||
|
for k, v in initdisks.list() do disks[k] = v end
|
||||||
|
end
|
||||||
|
|
||||||
|
function fs.exists(path)
|
||||||
|
local disk, newPath = resolve(path)
|
||||||
|
return disk:directoryExists(newPath) or disk:fileExists(newPath)
|
||||||
|
end
|
||||||
|
|
||||||
|
function fs.isFile(path)
|
||||||
|
local disk, newPath = resolve(path)
|
||||||
|
return disk:fileExists(newPath)
|
||||||
|
end
|
||||||
|
|
||||||
|
function fs.isDir(path)
|
||||||
|
local disk, newPath = resolve(path)
|
||||||
|
return disk:directoryExists(newPath)
|
||||||
|
end
|
||||||
|
|
||||||
|
function fs.list(path)
|
||||||
|
local disk, newPath = resolve(path)
|
||||||
|
return disk:list(newPath)
|
||||||
|
end
|
||||||
|
|
||||||
|
function fs.makeDir(path)
|
||||||
|
local disk, newPath = resolve(path)
|
||||||
|
return disk:makeDirectory(newPath)
|
||||||
|
end
|
||||||
|
|
||||||
|
function fs.remove(path)
|
||||||
|
local disk, newPath = resolve(path)
|
||||||
|
return disk:remove(newPath)
|
||||||
|
end
|
||||||
|
|
||||||
|
function fs.readAllText(path)
|
||||||
|
local disk, newPath = resolve(path)
|
||||||
|
local handle = disk:open(newPath, "r")
|
||||||
|
if not handle then return nil end
|
||||||
|
local content = handle.readAll()
|
||||||
|
handle.close()
|
||||||
|
return content
|
||||||
|
end
|
||||||
|
|
||||||
|
function fs.writeAllText(path, text)
|
||||||
|
local disk, newPath = resolve(path)
|
||||||
|
local handle = disk:open(newPath, "w")
|
||||||
|
handle.write(text)
|
||||||
|
handle.close()
|
||||||
|
end
|
||||||
|
|
||||||
|
function fs.appendAllText(path, text)
|
||||||
|
local disk, newPath = resolve(path)
|
||||||
|
local handle = disk:open(newPath, "a")
|
||||||
|
handle.write(text)
|
||||||
|
handle.close()
|
||||||
|
end
|
||||||
|
|
||||||
|
function fs.load(path) return load(fs.readAllText(path), path) end
|
||||||
|
|
||||||
|
function fs.mount(disk, mountPoint)
|
||||||
|
if not disks[disk] then return end
|
||||||
|
mounts[mountPoint] = disk
|
||||||
|
end
|
||||||
|
|
||||||
|
return fs
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...a.beep(440,500)local b=a.screenCtl;local c=a.initfs;local d=a.disks;local e=a.architecture;local f={}f.LOG_Text=""f.version="HyperionOS V1.2.4"f.process="Kernel"f.users={[0]="root",[1]="User"}f.hostname="hyperion"f.groups={}f.uid=0;f.gid=0;f.status="start"f.key={}f.cache={}f.cache.preload={}f._G=_G;f.sleep=sleep;_G.sleep=nil;local g=false;function f.log(h,i,j)j=j or 0x6D6D6D;f.LOG_Text=f.LOG_Text..tostring(a:date()).." "..f.users[f.uid].." "..f.process.."["..tostring(i or"INFO").."]: "..h.."\n"if f.status=="start"then b:setTextColor(j)b:print(tostring(a:date()).." "..f.users[f.uid].." "..f.process.."["..tostring(i or"INFO").."]: "..h)elseif f.status=="term"then f.standbyTask=f.currentTask;f.currentTask=f.kernelTask;local k=f.vfs.open("/dev/console","w")f.vfs.devctl(k,"sfgc",j)f.vfs.write(k,tostring(a:date()).." "..f.users[f.uid].." "..f.process.."["..tostring(i or"INFO").."]: "..h.."\n")f.vfs.close(k)f.currentTask=f.standbyTask end end;function f.PANIC(h)if f.status~="Panic"then f.log("PANIC: "..h,"PANIC",0xFF0000)pcall(f["saveLog"])f.status="Panic"f.reason=h;b:enable()b:setTextColor(0xFF0000)b:setBackgroundColor(0x000000)b:clear()b:setCursorPos(1,1)b:print(f.LOG_Text)b:print("KERNEL PANIC!\n"..h.."\nSystem halted.")b:print("Press any key to continue...")f.exitMain=true end;while true do local l={a:getMachineEvent()}if l[1]=="keyPressed"then break end end;a.reboot=true;error("KERNEL PANIC")end;f.panic=f.PANIC;if g then b:setTextColor(0xFFFFFF)b:setBackgroundColor(0x0000FF)b:clear()local m,n=b:getSize()b:setCursorPos(3,5)b:print(":(")b:setCursorPos(3,7)b:print("Your PC ran into a problem and needs to restart. We're just collecting some error")b:setCursorPos(3,8)b:print("info, and then we'll restart for you.\n")b:setCursorPos(3,n-5)b:print("Stop code: average windows experience")b:setCursorPos(1,n)b:print("Press any key to continue... jk reboot it yourself lazy")while true do end end;f.log("Kernel loaded.")f.log("Mounting init disks...")d.refresh()c.update(d)f.disks={}for o,p in d.list()do f.disks[p.address]=p end;c.mount("$","/")local q=c.readAllText("/boot/fstab")local r=function(s,t,u)assert(#t==1,"only delim len 1 supported for now")u=(u or 0)-1;local v={}local w=""for x=1,#s do local j=string.sub(s,x,x)if#v~=u and j==t then table.insert(v,w)w=""else w=w..j end end;table.insert(v,w)return v end;if not c.isFile("/boot/boot.cfg")then f.log("First boot detected writing boot.cfg","INFO",0x00FF00)c.writeAllText("/boot/boot.cfg",c.readAllText("/boot/safeboot.cfg"))f.firstBoot=true end;local y,z=load(c.readAllText("/boot/boot.cfg"),"@boot.cfg")if not y then f.PANIC("Failed to load /boot/boot.cfg: "..tostring(z))end;local A,B=pcall(y)if not A then f.PANIC("Error in /boot/boot.cfg: "..tostring(B))end;f.config=B;local C=false;for x,p in ipairs(r(q,"\n"))do if p:sub(1,1)=="U"then local D=""for x=3,#p do if p:sub(x,x)==";"then if x==3 then f.log("Invalid fstab line... Skipping.","WARN",0xFF8800)C=true;break end;D=p:sub(3,x-1)end end;if not C then local E=p:sub(#D+4)c.mount(D,E)else C=false end end end;f.log("Disks initialized")function f.saveLog()if f.status=="running"then local k=f.vfs.open("/var/log/syslog.log","w")f.vfs.write(k,f.LOG_Text)f.vfs.close(k)else c.writeAllText("/var/log/syslog.log",f.LOG_Text)end end;function f.newFifo()local F={}F.push=function(G)table.insert(F,G)end;F.pop=function()return table.remove(F,1)end;return F end;function f.newUUID()local H="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"local I=""for x=1,#H do local j=H:sub(x,x)if j=="x"then I=I..string.format("%x",math.random(0,15))elseif j=="y"then I=I..string.format("%x",math.random(8,11))else I=I..j end end;return I end;f.syscalls={}local J={[0]={}}for x=0,100 do J[x]={}end;f.log("Gathering modules")for o,x in ipairs(c.list("/lib/modules"))do local K=c.list("/lib/modules/"..x)if not K then f.log("WARNING: could not list /lib/modules/"..x.." (skipping)","WARN",0xFF8800)else for o,p in ipairs(K)do local L=tonumber(p:sub(1,2))if L then J[L+1][#J[L+1]+1]="/lib/modules/"..x.."/"..p end end end end;f.ifs=c;f.apis=a.firmware;f.EFI=a;f.arch=e;f.initdisks=d;f.screen=b;f.processes={}f.fstab=q;f.kernelTask={name="kernel",status="R",pid=0,tgid=0,uid=0,fd={},exit="",sleep=0,ivs=0,vs=0,children={},syscallReturn={},cwd="/",timeSlice=0,lastTime=0,totalTime=0,numRuns=0}f.currentTask=f.kernelTask;function f.shutdown()f.exitMain=true;f.status="shutdown"end;function f.reboot()f.exitMain=true;f.status="reboot"end;f.syscalls["time"]=function()return f.EFI:getEpochMs()end;f.syscalls["date"]=function()return f.EFI:date()end;f.syscalls["log"]=f.log;f.syscalls["getUptime"]=function()return f.EFI:getUptime()end;f.syscalls["getUsername"]=function(M)return f.users[M or f.uid]end;f.syscalls["getHostname"]=function()return f.hostname end;f.syscalls["getHost"]=function()return f.apis._HOST end;f.syscalls["version"]=function()return f.version end;f.syscalls["setHostname"]=function(N)if f.uid~=0 then error("Permission denied")end;f.hostname=N end;f.syscalls["arch"]=fuLine truncated
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
-- DO NOT EDIT THIS FILE IF YOU DO NOT KNOW WHAT YOU ARE DOING!
|
||||||
|
-- DOING SO MAY RENDER YOUR SYSTEM UNBOOTABLE!
|
||||||
|
|
||||||
|
-- This file is auto-generated during the build process.
|
||||||
|
-- DEFAULT BOOT CONFIGURATION FILE
|
||||||
|
return {
|
||||||
|
initPath = "/sbin/init",
|
||||||
|
maxOpenFiles = 128,
|
||||||
|
maxFilesPerTask = 16,
|
||||||
|
preempt=true,
|
||||||
|
logTaskExit=true
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
0:0:root:/root:/bin/hysh
|
||||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
|||||||
|
local a=...a.allowGlobalOverwrites=true;function string.hasSuffix(b,c)return string.sub(b,#c+1)==c end;function string.hasPrefix(b,d)return string.sub(b,1,#d)==d end;function string.getSuffix(b,d)return string.sub(b,#d+1)end;function string.getPrefix(b,c)return string.sub(b,1,#c)end;function string.join(b,...)return table.concat(table.pack(b,...))end;function string.delim(b,...)return table.concat(table.pack(...),b)end;function string.split(b,e,f)assert(#e==1,"only delim len 1 supported for now")if not b then return false end;f=(f or 0)-1;local g={}local h=""for i=1,#b do local j=string.sub(b,i,i)if#g~=f and j==e then table.insert(g,h)h=""else h=h..j end end;table.insert(g,h)return g end;function table.deepcopy(k,l)l=l or{}if type(k)~='table'then return k elseif l[k]then return l[k]end;local m={}l[k]=m;for n,o in next,k,nil do local p=table.deepcopy(n,l)local q=table.deepcopy(o,l)m[p]=q end;return m end;function table.hasKey(r,s)for i,o in pairs(r)do if i==s then return o end end;return false end;function table.hasVal(r,s)for i,o in pairs(r)do if o==s then return i end end;return false end;local function t(u,v)v=v or{}if v[u]then return'"[Circular Reference]"'end;v[u]=true;local w="{"local x=true;for i,o in pairs(u)do if not x then w=w..","end;x=false;if type(i)=="string"then w=w.."[\""..i.."\"]="elseif type(i)=="number"then w=w.."["..tostring(i).."]="end;if type(o)=="table"then w=w..t(o,v)elseif type(o)=="string"then w=w.."[=["..o.."]=]"elseif type(o)=="number"or type(o)=="boolean"then w=w..tostring(o)elseif type(o)=="function"then w=w.."\""..tostring(o).."\""elseif type(o)=="thread"then w=w.."\""..tostring(o).."\""else error("serialization of type \""..type(o).."\" is not supported")end end;v[u]=nil;w=w.."}"return w end;local y=type;local z=getmetatable;function type(A,B)if B then return y(A)end;if y(A)~="table"then return y(A)else if y(z(A))=="table"then local C=z(A)if C.__type then return C.__type end else return"table"end end end;function getmetatable(A)if y(A)~="table"then return end;if y(z(A))=="table"then if z(A).__isuserdata then if y(z(A).__usermeta)=="function"then return z(A).__usermeta()else return z(A).__usermeta end else return z(A)end else return z(A)end end;function isEqualToAny(D,...)local E={...}for i=0,#E do if D==E[i]then return true end end;return false end;function isEqualToAll(D,...)local E={...}for i=0,#E do if D~=E[i]then return false end end;return true end;function table.keys(F)local D={}for G in pairs(F)do table.insert(D,G)end;return D end;function table.values(F)local D={}for H,G in pairs(F)do table.insert(D,G)end;return D end;function table.indexOf(F,I)for i,o in ipairs(F)do if o==I then return i end end;return-1 end;function table.merge(...)local E={...}local J={}local K={}for H,F in ipairs(E)do for i,o in pairs(F)do J[i]=o end;for i,o in ipairs(F)do K[#K+1]=o end end;for i,o in ipairs(K)do J[i]=o end;return J end;function string.replace(L,M,N)local O={}local i=1;local G=#L;local P=#M;while i<=G do local Q=true;if i+P-1<=G then for R=1,P do if L:sub(i+R-1,i+R-1)~=M:sub(R,R)then Q=false;break end end else Q=false end;if Q then table.insert(O,N)i=i+P else table.insert(O,L:sub(i,i))i=i+1 end end;return table.concat(O)end;function toHex(S)return string.format("%X",S)end;local function T()local U={}return setmetatable(U,{__index=function(self,V)local W=rawget(self,V)if W~=nil then return W end;return function(...)local X=table.pack(coroutine.yield("syscall",V,...))if X[1]then return table.unpack(X,2,X.n)else error(X[2],2)end end end,__newindex=function(self,n,o)rawset(self,n,o)end,__metatable=false})end;syscall=T()_makeSyscallProxy=T;table.serialize=t
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b={}a.vfs=b;b.mounts={["$"]="/"}b.disks=a.disks;local c=0x02;local function d(e,f)return math.floor(e/2^f)%2==1 end;local function g(h)if not h or h==""then return{}end;local i={}local j=1;local k=0;local l=h:byte(1)if l==0x02 or l==0x01 then k=l;j=2 end;while j<=#h do if j>#h then break end;local m=h:byte(j)j=j+1;if m==0 or j+m-1>#h then break end;local n=h:sub(j,j+m-1)j=j+m;local o,p,q,r,s;if k==0x02 then if j+6>#h then break end;o=h:byte(j)j=j+1;p=h:byte(j)+h:byte(j+1)*256;j=j+2;q=h:byte(j)+h:byte(j+1)*256;j=j+2;r=h:byte(j)+h:byte(j+1)*256;j=j+2 elseif k==0x01 then if j+4>#h then break end;o=h:byte(j)j=j+1;p=h:byte(j)j=j+1;q=h:byte(j)j=j+1;r=h:byte(j)+h:byte(j+1)*256;j=j+2 else if j+2>#h then break end;o=0x00;p=h:byte(j)j=j+1;q=h:byte(j)j=j+1;r=h:byte(j)j=j+1 end;if j>#h then break end;local t=h:byte(j)j=j+1;s=""if t>0 then s=h:sub(j,j+t-1)j=j+t end;i[n]={etype=o,owner=p,group=q,perms=r,cmeta=s}end;return i end;local function u(v)local w=string.char(c)for n,x in pairs(v)do local y=x.perms%256;local z=math.floor(x.perms/256)%256;local A=(x.owner or 0)%256;local B=math.floor((x.owner or 0)/256)%256;local C=(x.group or 0)%256;local D=math.floor((x.group or 0)/256)%256;w=w..string.char(#n)..n..string.char(x.etype or 0x00)..string.char(A,B,C,D,y,z)..string.char(#x.cmeta)..x.cmeta end;return w end;local E="^[A-Za-z0-9_.+%-%@%(%)%[%]]+$"local function F(G)local H=G:sub(1,1)=="/"local I={}for J in(G.."/"):gmatch("([^/]*)/")do table.insert(I,J)end;return H,I end;local function K(J)local L=J:lower()if not L:match(E)then error("EINVAL: illegal characters in path component: "..J,3)end;if L==".meta"then error("EINVAL: reserved path component: .meta",3)end end;function b.splitPath(G)local M=string.split(G,"/")while table.indexOf(M,"")~=-1 do table.remove(M,table.indexOf(M,""))end;return M end;local function N(O)local P,Q=nil,nil;for R,S in pairs(b.mounts)do local T=S~="/"and S:sub(-1)=="/"and S:sub(1,-2)or S;if O==T or T=="/"and O:sub(1,1)=="/"or O:sub(1,#T+1)==T.."/"then if not P or#T>#P then P=T;Q=R end end end;if not Q then error("ENODEV")end;local U=O:sub(#P+1)if U==""then U="/"end;return b.disks[Q],U end;b._parseMetafile=g;local function V(W,X,Y)if Y==".meta"then error("EACCES: Cannot open metafile")end;local S;if X=="/"then S=".meta"else local j=X:gsub("^/+","")S=j.."/.meta"end;local Z,_=pcall(function()return W:open(S,"r")end)if not Z or not _ then return nil end;local h=_.read(65535)if _.close then _.close()end;if h and#h>0 and h:byte(1)~=c then local a0=u(g(h))local a1,a2=pcall(function()return W:open(S,"w")end)if a1 and a2 then a2.write(a0)if a2.close then a2.close()end end;h=a0 end;local a3=g(h)return a3[Y]end;local a4=16;local function a5(G,a6,a7)a7=a7 or 0;if a7>a4 then error("ELOOP")end;local a8=a.currentTask;local a9=a8 and(a8.euid or a8.uid)or a.uid;local aa=a8 and a8.groups or a.groups or{}local ab=a8 and a8.root or"/"local ac=a8 and a8.cwd or"/"if ab~="/"and ab:sub(-1)=="/"then ab=ab:sub(1,-2)end;local function ad(ae)if a9==0 then return true end;if not ae then return true end;local af=ae.perms;if a9==ae.owner and d(af,9)then return true end;if ae.group then for ag,ah in ipairs(aa)do if ah==ae.group and d(af,8)then return true end end end;return d(af,7)end;local H,I=F(G)local ai={}if H then ai={}else for aj in ac:gmatch("[^/]+")do table.insert(ai,aj)end end;local ak=1;while ak<=#I do local J=I[ak]ak=ak+1;J=J:match("^%s*(.-)%s*$")if J==""or J=="."then elseif J==".."then local al="/"..table.concat(ai,"/")local am={}if ab~="/"then for aj in ab:gmatch("[^/]+")do table.insert(am,aj)end end;if#ai<=#am then ai={}for ag,aj in ipairs(am)do table.insert(ai,aj)end else local an=ai[#ai]local ao="/"..table.concat(ai,"/",1,#ai-1)if ao=="/"then ao="/"end;local ap,aq,ar=pcall(N,ao==""and"/"or ao)if ap and aq then local ae=V(aq,ar,an)if ae then if ae.etype~=0x00 then error("ENOTDIR: not a directory: "..al)end;if not ad(ae)then error("EACCES: permission denied traversing "..al)end else local as,at,au=pcall(N,al)if as and at then local av=at:type(au)if av~=nil and av~="directory"then error("ENOTDIR: not a directory: "..al)end end end end;table.remove(ai)end else K(J)local aw=J:lower()local ax="/"..table.concat(ai,"/")local ap,aq,ar=pcall(N,ax=="/"and"/"or ax)local ae=nil;if ap and aq then ae=V(aq,ar,aw)end;local ay=ak>#I;if ae and ae.etype==0x01 then if ay and a6 then table.insert(ai,aw)else a7=a7+1;if a7>a4 then error("ELOOP")end;local az=ae.cmeta;if not az or az==""then error("ENOENT: empty symlink target")end;local aA,aB=F(az)if aA then ai={}if ab~="/"then for aj in ab:gmatch("[^/]+")do table.insert(ai,aj)end end end;local aC={}for aD=1,ak-2 do table.insert(aC,I[aD])end;local aE=#aC+1;for ag,aF in ipairs(aB)do table.insert(aC,aF)end;for aD=ak,#I do table.insert(aC,I[aD])end;I=aC;ak=aE end else table.insert(ai,aw)if not ay then local aG="/"..table.concat(ai,"/")local as,at,au=pcall(N,aG)if as and at then local av=at:type(au)if av~=nil and av~="directory"then error("ENOTDIR: not a directory: "..aG)enLine truncated
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b={}a.searchpaths={"/lib/?.lua","/lib/?","/usr/lib/?.lua","/usr/lib/?","/usr/local/lib/?.lua","/usr/local/lib/?","?.lua","?"}function require(c,...)if b[c]then return b[c]end;local d=c:gsub("%.","/")local e={}for f,g in ipairs(a.searchpaths)do local h=string.replace(g,"?",d)if h:sub(1,1)~="/"then h=a.currentTask.cwd..h end;if a.vfs.exists(h)then if a.vfs.type(h)=="directory"then h=h.."/init"end;if a.vfs.exists(h)then local i=a.vfs.open(h,"r")local j=a.vfs.read(i,1024*1024*4)a.vfs.close(i)return assert(load(j,h,"t",a._U))(...)else table.insert(e,h)end else table.insert(e,h)end end;error("Module not found: "..c.." (searched paths: "..table.concat(e,", ")..")")end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b={}local c={}b.address="devfs0000"b.isvirt=true;b.isReadOnly=function()return false end;b.spaceUsed=function()return 0 end;b.spaceTotal=function()return 0 end;b.makeDirectory=function()error("EACCES")end;b.remove=function()error("EACCES")end;b.setLabel=function()error("EACCES")end;b.getLabel=function()return"devfs"end;b.attributes=function(d)return{size=0,modified=0,created=0}end;function b:open(d,e)local f=a.vfs.splitPath(d)local g=c;for h=1,#f-1 do local i=g[f[h]]if type(i)~="table"then error("ENFILE")end;g=i end;if type(g[f[#f]])=="function"then return g[f[#f]]("open",e)end;error("ENFILE")end;function b:type(d,e)local f=a.vfs.splitPath(d)local g=c;if#f==0 then return"directory"end;for h=1,#f-1 do local i=g[f[h]]if type(i)~="table"then error("ENFILE")end;g=i end;if type(g[f[#f]])=="function"then return g[f[#f]]("type",e)end;if type(g[f[#f]])=="table"then return"directory"end;error(type(g[f[#f]]))end;function b:list(d)local f=a.vfs.splitPath(d)local g=c;if#f==0 then return table.keys(c)end;for h=1,#f-1 do local i=g[f[h]]if type(i)~="table"then error("ENOENT")end;g=i end;if type(g[f[#f]])=="table"then return table.keys(g[f[#f]])end;error("ENOENT")end;function b:fileExists(d)local j=pcall(function()return self:type(d)end)return j end;function c.random(k,e)if k=="type"then return"character device"elseif k=="open"then if e=="r"then return{read=function(l)local m=""for h=1,l or 1 do m=m..string.char(math.random(0,255))end;return m end}elseif e=="w"or e=="a"then return{write=function()end}else error("EACCES")end end end;function c.null(k,e)if k=="type"then return"character device"elseif k=="open"then if e=="r"then return{read=function(l)end}elseif e=="w"or e=="a"then return{write=function()end}else error("EACCES")end end end;function c.zero(k,e)if k=="type"then return"character device"elseif k=="open"then if e=="r"then return{read=function(l)local m=""for h=1,l or 1 do m=m..string.char(0)end;return m end}elseif e=="w"or e=="a"then return{write=function()end}else error("EACCES")end end end;if a.EFI:getEEPROM()then function c.eeprom(k,e)if k=="type"then return"character device"elseif k=="open"then if e=="r"then local n,o=1,a.EFI:getEEPROM()return{read=function(l)n=n+l;return o:sub(n-l,n)end}elseif e=="w"then if a.uid~=0 then error("EACCES")end;local p=true;return{write=function(c)if p then a.EFI:setEEPROM(c)else a.EFI:setEEPROM(a.EFI:getEEPROM()..c)end end}elseif e=="a"then if a.uid~=0 then error("EACCES")end;return{write=function(c)a.EFI:setEEPROM(a.EFI:getEEPROM()..c)end}else error("EACCES")end end end end;if a.EFI:getNvram()then function c.nvram(k,e)if k=="type"then return"character device"elseif k=="open"then if e=="r"then local n,q=1,a.EFI:getNvram()return{read=function(l)n=n+l;return q:sub(n-l,n)end}elseif e=="w"then if a.uid~=0 then error("EACCES")end;local p=true;return{write=function(c)if p then a.EFI:setNvram(c)else a.EFI:setNvram(a.EFI:getNvram()..c)end end}elseif e=="a"then if a.uid~=0 then error("EACCES")end;return{write=function(c)a.EFI:setNvram(a.EFI:getNvram()..c)end}else error("EACCES")end end end end;c["disk"]={}a.devfs={}a.devfs.data=c;a.devfs.proxy=b;a.disks["devfs0000"]=b
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b={}local c={}b.address="procfs0000"b.isvirt=true;b.isReadOnly=function()return true end;b.spaceUsed=function()return 0 end;b.spaceTotal=function()return 0 end;b.makeDirectory=function()error("EACCES")end;b.remove=function()error("EACCES")end;b.setLabel=function()error("EACCES")end;b.getLabel=function()return"procfs"end;b.attributes=function(d)return{size=0,modified=0,created=0}end;local function e(f,g)g=g or{}local h=g.uid or 0;local i=g.gid or 0;local j=g.perms or 0x3F;local k={}table.insert(k,string.char(0x02))for d,l in pairs(f)do local m=d;local n=#m;if n>255 then error("Filename too long (>255 bytes): "..m)end;local o=0x00;local p=""if l and l~=""then o=0x01;p=l end;local q=#p;if q>255 then error("cmeta too long (>255 bytes) for "..m)end;table.insert(k,string.char(n))table.insert(k,m)table.insert(k,string.char(o))table.insert(k,string.char(h%256,math.floor(h/256)%256))table.insert(k,string.char(i%256,math.floor(i/256)%256))table.insert(k,string.char(j%256,math.floor(j/256)%256))table.insert(k,string.char(q))if q>0 then table.insert(k,p)end end;return table.concat(k)end;local function r(s,t)return function(u,v)if u=="type"then return"character device"elseif u=="open"then if v=="r"then return{read=s}elseif v=="w"then return{write=t}end end end end;local function w(x)local y=tostring(x)local z=1;return r(function(A)z=z+A;return y:sub(z-A,z)end,function()error("EACCES")end)end;local function B(C)local D,E,F={},{},{}if C.fd[0]then D["0"]=C.fd[0].path end;for G,H in ipairs(C.fd)do D[tostring(G)]=tostring(H.path)end;for G,H in ipairs(C.siblings)do E[tostring(H.pid)]="/proc/"..tostring(H.pid)end;for G,H in ipairs(C.children)do F[tostring(H.pid)]="/proc/"..tostring(H.pid)end;return{[".meta"]=w(e({cwd=C.cwd,parent="/proc/"..tostring(C.parent.pid)})),uid=w(C.uid),comm=w(C.name),fd={[".meta"]=w(e(D))},siblings={[".meta"]=w(e(E))},children={[".meta"]=w(e(F))}}end;function b:open(d,v)local I=a.vfs.splitPath(d)local J=c;if tonumber(I[1])then local C=a.tasks[tostring(I[1])]local J=B(C)for G=2,#I-1 do local y=J[I[G]]if type(y)~="table"then error("ENFILE")end;J=y end;if type(J[I[#I]])=="function"then return J[I[#I]]("open",v)end elseif tostring(I[1])=="self"then local C=a.currentTask;local J=B(C)for G=2,#I-1 do local y=J[I[G]]if type(y)~="table"then error("ENFILE")end;J=y end;if type(J[I[#I]])=="function"then return J[I[#I]]("open",v)end else for G=1,#I-1 do local y=J[I[G]]if type(y)~="table"then error("ENFILE")end;J=y end;if type(J[I[#I]])=="function"then return J[I[#I]]("open",v)end end;error("ENFILE")end;function b:type(d,v)local I=a.vfs.splitPath(d)local J=c;if#I==0 then return"directory"end;if tonumber(I[1])then local C=a.tasks[I[1]]if#I==1 then return"directory"end;local J=B(C)for G=2,#I-1 do local y=J[I[G]]if type(y)~="table"then error("ENFILE")end;J=y end;if type(J[I[#I]])=="function"then return J[I[#I]]("type",v)end;if type(J[I[#I]])=="table"then return"directory"end elseif tostring(I[1])=="self"then local C=a.currentTask;if#I==1 then return"directory"end;local J=B(C)for G=2,#I-1 do local y=J[I[G]]if type(y)~="table"then error("ENFILE")end;J=y end;if type(J[I[#I]])=="function"then return J[I[#I]]("type",v)end;if type(J[I[#I]])=="table"then return"directory"end else for G=1,#I-1 do local y=J[I[G]]if type(y)~="table"then error("ENFILE")end;J=y end;if type(J[I[#I]])=="function"then return J[I[#I]]("type",v)end;if type(J[I[#I]])=="table"then return"directory"end end;error("ENOENT")end;function b:list(d)local I=a.vfs.splitPath(d)local J=c;if#I==0 then return table.merge(table.keys(c),table.keys(a.tasks),{"self"})end;if tonumber(I[1])then local C=a.tasks[I[1]]local J=B(C)if#I==1 then return table.keys(J)end;for G=2,#I-1 do local y=J[I[G]]if type(y)~="table"then error("ENOENT")end;J=y end;if type(J[I[#I]])=="table"then return table.keys(J[I[#I]])end elseif tostring(I[1])=="self"then local C=a.currentTask;local J=B(C)if#I==1 then return table.keys(J)end;for G=2,#I-1 do local y=J[I[G]]if type(y)~="table"then error("ENOENT")end;J=y end;if type(J[I[#I]])=="table"then return table.keys(J[I[#I]])end else for G=1,#I-1 do local y=J[I[G]]if type(y)~="table"then error("ENOENT")end;J=y end;if type(J[I[#I]])=="table"then return table.keys(J[I[#I]])end end;error("ENOENT")end;function b:fileExists(d)local K=pcall(function()return self:type(d)end)return K end;c.uptime=r(function()return tostring(a.EFI:getUptime())end,function()error("EACCES")end)a.procfs={}a.procfs.data=c;a.procfs.proxy=b;a.disks["procfs0000"]=b
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b={}local c={}b.address="tmpfs0000"b.isvirt=true;b.isReadOnly=function()return false end;b.spaceUsed=function()return 0 end;b.spaceTotal=function()return 0 end;b.makeDirectory=function(d,e)local f=a.vfs.splitPath(e)local g=c;for h=1,#f do if not g[f[h]]then g[f[h]]={}elseif type(g[f[h]])~="table"then error("ENOTDIR")end;g=g[f[h]]end end;b.remove=function(d,e)local f=a.vfs.splitPath(e)local g=c;for h=1,#f-1 do g=g[f[h]]if not g then error("ENOENT")end end;g[f[#f]]=nil end;b.setLabel=function(d,i)end;b.getLabel=function()return"tmpfs"end;b.attributes=function(d,e)local f=a.vfs.splitPath(e)local g=c;for h=1,#f do g=g[f[h]]if not g then error("ENOENT")end end;return{size=type(g)=="string"and#g or 0,modified=0,created=0}end;function b:open(e,j)local f=a.vfs.splitPath(e)local g=c;for h=1,#f-1 do if not g[f[h]]then if j=="w"then g[f[h]]={}else error("ENOENT")end elseif type(g[f[h]])~="table"then error("ENOTDIR")end;g=g[f[h]]end;local k=f[#f]if j=="r"then if type(g[k])~="string"then error("ENOENT")end;local l=g[k]local m=1;return{read=function(n)n=n or#l;local o=l:sub(m,m+n-1)m=m+#o;return o end,close=function()end}elseif j=="w"then g[k]=""local p={}return{write=function(q)p[#p+1]=q end,close=function()g[k]=table.concat(p)end}elseif j=="a"then if type(g[k])~="string"then g[k]=""end;return{write=function(q)g[k]=g[k]..q end,close=function()end}else error("EACCES")end end;function b:type(e)local f=a.vfs.splitPath(e)local g=c;if#f==0 then return"directory"end;for h=1,#f do g=g[f[h]]if not g then return false end end;if type(g)=="table"then return"directory"end;if type(g)=="string"then return"file"end end;function b:list(e)local f=a.vfs.splitPath(e)local g=c;for h=1,#f do g=g[f[h]]if not g then error("ENOENT")end end;if type(g)~="table"then error("ENOTDIR")end;local r={}for s,d in pairs(g)do table.insert(r,s)end;return r end;function b:fileExists(e)local t=self:type(e)return t=="file"or t=="directory"end;a.disks["tmpfs0000"]=b
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b=nil;local function c()if b==nil then local d,e=pcall(require,"store.deflate")b=d and e or false end;return b or nil end;local function f(g)g=math.floor(g)%4294967296;return string.char(g%256,math.floor(g/256)%256,math.floor(g/65536)%256,math.floor(g/16777216)%256)end;local function h(i,j)local k,l,m,n=i:byte(j,j+3)return(k or 0)+(l or 0)*256+(m or 0)*65536+(n or 0)*16777216 end;local o="BHFS"local p="\001"local q=1;local r="\001"local s="\002"local t="\003"local u="\255"local v={}do local k="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"for j=1,#k do v[k:sub(j,j)]=j-1 end end;local function w(i)i=i:gsub("[^A-Za-z0-9+/=]","")local x,j={},1;while j<=#i do local y=v[i:sub(j,j)]or 0;local z=v[i:sub(j+1,j+1)]or 0;local A=v[i:sub(j+2,j+2)]or 0;local B=v[i:sub(j+3,j+3)]or 0;local g=y*262144+z*4096+A*64+B;x[#x+1]=string.char(math.floor(g/65536)%256)if i:sub(j+2,j+2)~="="then x[#x+1]=string.char(math.floor(g/256)%256)end;if i:sub(j+3,j+3)~="="then x[#x+1]=string.char(g%256)end;j=j+4 end;return table.concat(x)end;local C={}local D=0;local function E(F,G)local H={address=F,isvirt=false}H.isReadOnly=function()return false end;H.spaceUsed=function()return 0 end;H.spaceTotal=function()return 0 end;H.setLabel=function()end;H.getLabel=function()return F end;local function I()local J,K="/","$"for L,M in pairs(a.vfs.mounts)do if G==M or M=="/"and G:sub(1,1)=="/"or G:sub(1,#M+1)==M.."/"then if#M>#J then J=M;K=L end end end;return a.vfs.disks[K],G:sub(#J+1)end;local function N(O)local P,Q=I()local l=(Q==""or Q=="/")and""or Q:gsub("^/+","")local R=O:gsub("^/+","")local m=(l==""and"/"..R or"/"..l.."/"..R):gsub("//+","/")local S=m:sub(2)if S==""then S="/"end;return P,S end;function H:open(O,T)local U,S=N(O)return U:open(S,T)end;function H:type(O)local U,S=N(O)return U:type(S)end;function H:list(O)local U,S=N(O)return U:list(S)end;function H:fileExists(O)local U,S=N(O)return U:fileExists(S)end;function H:attributes(O)local U,S=N(O)return U:attributes(S)end;function H:makeDirectory(O)local U,S=N(O)return U:makeDirectory(S)end;function H:remove(O)local U,S=N(O)return U:remove(S)end;return H end;local function V(F,W)local X={kind="dir",children={}}local function Y(O,Z)local _={}for R in O:gmatch("[^/]+")do _[#_+1]=R end;local a0=X;for j=1,#_ do local a1=_[j]if not a0.children then if not Z then return nil end;a0.children={}end;if not a0.children[a1]then if not Z then return nil end;a0.children[a1]={kind="dir",children={}}end;a0=a0.children[a1]end;return a0 end;local function a2(O)local a3=O:match("^(.*)/[^/]+$")or""if a3~=""then local g=Y(a3,true)if not g.children then g.children={}end end end;if W:sub(1,4)==o then local a4=9;while a4<=#W do local a5=W:sub(a4,a4)a4=a4+1;if a5==u then break end;local a6=h(W,a4)a4=a4+4;local a7=h(W,a4)a4=a4+4;local a8=h(W,a4)a4=a4+4;local O=W:sub(a4,a4+a6-1)a4=a4+a6;local a9=W:sub(a4,a4+a8-1)a4=a4+a8;local aa=a9;if a8<a7 then local ab=c()if ab then aa=ab.decompress(a9)or a9 end end;if a5==s then if O~=""and O~="/"then a2(O)local g=Y(O,true)g.kind="dir"g.children=g.children or{}end elseif a5==r then a2(O)local g=Y(O,true)g.kind="file"g.data=aa;g.size=#aa;g.children=nil elseif a5==t then a2(O)local g=Y(O,true)g.kind="link"g.target=aa;g.children=nil end end else for ac in(W.."\n"):gmatch("([^\n]*)\n")do if ac=="END"then break elseif ac:sub(1,4)=="DIR "then local R=ac:sub(5):match("^%s*(.-)%s*$")if R and R~=""and R~="/"then a2(R)local g=Y(R,true)g.kind="dir"g.children=g.children or{}end elseif ac:sub(1,5)=="FILE "then local R,ad,ae=ac:sub(6):match("^(%S+)%s+(%d+)%s*(.-)%s*$")if R then a2(R)local aa=(tonumber(ad)or 0)>0 and w(ae)or""local g=Y(R,true)g.kind="file"g.data=aa;g.size=#aa;g.children=nil end elseif ac:sub(1,5)=="LINK "then local R,af=ac:sub(6):match("^(%S+)%s+(.+)$")if R then a2(R)local g=Y(R,true)g.kind="link"g.target=af;g.children=nil end end end end;local H={address=F,isvirt=false}H.isReadOnly=function()return false end;H.spaceTotal=function()return 1024*1024*64 end;H.spaceUsed=function()local ag=0;local function ah(g)if g.kind=="file"then ag=ag+(g.size or 0)elseif g.kind=="dir"then for ai,m in pairs(g.children or{})do ah(m)end end end;ah(X)return ag end;H.setLabel=function()end;H.getLabel=function()return F end;local function aj(O)return O:gsub("^/+",""):gsub("/+$","")end;function H:type(O)local R=aj(O)if R==""then return"directory"end;local g=Y(R)if not g then return nil end;if g.kind=="dir"then return"directory"end;return"file"end;function H:fileExists(O)local R=aj(O)if R==""then return true end;return Y(R)~=nil end;function H:list(O)local R=aj(O)local a0=R==""and X or Y(R)if not a0 or a0.kind~="dir"then return{}end;local ak={}for a1 in pairs(a0.children or{})do ak[#ak+1]=a1 end;return ak end;function H:attributes(O)local R=aj(O)local a0=R==""and X or Y(R)if not a0 then return nil end;return{size=a0.kind=="file"and(a0.size or 0)or 0,isDir=a0.kind=="dir",isReadOnly=false,created=0,modified=0}end;function H:open(O,T)local R=aj(O)local a0=Y(R)if T=="r"thenLine truncated
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local function b(c)local d,e=1,#c;while d<=e and(c:sub(d,d)==" "or c:sub(d,d)=="\t")do d=d+1 end;while e>=d and(c:sub(e,e)==" "or c:sub(e,e)=="\t"or c:sub(e,e)=="\n"or c:sub(e,e)=="\r")do e=e-1 end;if d>e then return""end;return c:sub(d,e)end;for f,g in ipairs(string.split(a.fstab,"\n"))do g=b(g)if g~=""and g:sub(1,1)=="U"then local h;for i=3,#g do if g:sub(i,i)==";"then h=i;break end end;if not h or h==3 then a.log("Invalid fstab line: "..g.." ... Skipping.","WARN",0xFF8800)else local j=g:sub(3,h-1)local k=b(g:sub(h+1))a.log("Mounted "..j.." to "..k)if j~="$"then a.vfs.mount(k,j)end end end end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b={}a.signal=b;function b.sigsend(c,d)if d<0 or d>256 then error("EINVAL")end;local e=a.tasks[tostring(c)]if not e then error("ENOENT")end;if not e.sigq then return end;e.sigq[#e.sigq+1]=d end;function b.sigcatch(f)local e=a.currentTask;e.sigh=f;if not e.sigq then e.sigq={}end;local g={error="",active=true}if e.sigd then e.sigd.active=false end;e.sigd=g;return g end;function b.sigignore()local e=a.currentTask;e.sigh=nil;e.sigq=nil;if e.sigd then e.sigd.active=false end;e.sigd=nil end;local h=a.syscalls;h["sigsend"]=b.sigsend;h["sigcatch"]=b.sigcatch;h["sigignore"]=b.sigignore
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b={}b.handlers={}a.socket=b;function b.registerProtocal(c,d)b.handlers[c]=d end;function b.socket()local e=a.vfs.P;local f=a.newFifo()local g=false;a.vfs.newfd({handle={read=function()if not g then error("ECCON")end;return f.read()end,write=function()if not g then error("ECCON")end;return f.write()end,close=function()g=true end},type="socket",refcount=1,meta={owner=a.currentTask.uid,group=a.currentTask.uid,etype=2,perms=e.OWNER_R+e.OWNER_W+e.GROUP_R+e.GROUP_W},isvirt=true})end;function b.connect(h,i)end;function b.listen(h,j)end;a.log("Loaded socket module")
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...a.unixSockets={}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a={...}local b=a[1]b._G=_G;local function c(d)return setmetatable({},{__index=function(e,f)local g=d[f]if type(g)=="table"then return c(g)end;return g end,__newindex=function(h,i,j)if b.config.allowGlobalOverwrites or b.allowGlobalOverwrites then rawset(d,i,j)return end;error("Attempt to modify global variable '"..i.."'",2)end,__pairs=function(self)local function k(e,f)local l,g=next(d,f)if type(g)=="table"then g=c(g)end;return l,g end;return k,self,nil end,__ipairs=function()local m=0;return function()m=m+1;local g=d[m]if g==nil then return end;if type(g)=="table"then g=c(g)end;return m,g end end,__len=function()return#d end,__metatable=false})end;local n=load;b._U=c(b._G)b._U._G=b._U;b._U.load=function(o,p,q,r)return n(o,p,q,r or b._U)end;function b.freshUserEnv()local s={}s.syscall=_makeSyscallProxy()local t=setmetatable(s,{__index=b._U,__newindex=function(e,i,j)rawset(s,i,j)end,__metatable=false})s._G=t;s.load=function(o,p,q,r)return n(o,p,q,r or t)end;return t end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b={}a.auth=b;local function c(d)local e=a.vfs.open(d,"r")if not e then error("Failed to open file: "..d)end;local f=a.vfs.read(e,1024000)a.vfs.close(e)return f end;local function g(d,f)local e=a.vfs.open(d,"w")if not e then error("Failed to open file for writing: "..d)end;a.vfs.write(e,f)a.vfs.close(e)end;local h;do local i=2^32;local function j(k)return k%i end;local function l(k)k=j(k)local m={}for n=0,31 do local o=k%2;m[n]=o;k=(k-o)/2 end;return m end;local function p(m)local k,q=0,1;for n=0,31 do if m[n]==1 then k=k+q end;q=q*2 end;return j(k)end;local function r(...)local s={...}if#s==0 then return 0 end;local t=l(s[1])for n=2,#s do local o=l(s[n])for u=0,31 do t[u]=(t[u]==1 or o[u]==1)and 1 or 0 end end;return p(t)end;local function v(...)local s={...}if#s==0 then return 0 end;local t=l(s[1])for n=2,#s do local o=l(s[n])for u=0,31 do t[u]=t[u]~=o[u]and 1 or 0 end end;return p(t)end;local function w(k,x)return j(j(k)*2^x)end;local function y(k,x)return math.floor(j(k)/2^x)end;local function z(k,x)return r(y(k,x),w(k,32-x))end;local A={0x6A09E667,0xBB67AE85,0x3C6EF372,0xA54FF53A,0x510E527F,0x9B05688C,0x1F83D9AB,0x5BE0CD19}local B={{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},{14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3},{11,8,12,0,5,2,15,13,10,14,3,6,7,1,9,4},{7,9,3,1,13,12,11,14,2,6,5,10,4,0,15,8},{9,0,5,7,2,4,10,15,14,1,11,12,6,8,3,13},{2,12,6,10,0,11,8,3,4,13,7,5,15,14,1,9},{12,5,1,15,14,13,4,10,0,7,6,3,9,2,8,11},{13,11,7,14,12,1,3,9,5,0,15,4,8,6,2,10},{6,15,14,9,11,3,0,8,12,2,13,7,1,4,10,5},{10,2,8,4,7,6,1,5,15,11,9,14,3,12,13,0}}local function C(D,E,o,F,G,k,H)D[E]=(D[E]+D[o]+k)%i;D[G]=z(v(D[G],D[E]),16)D[F]=(D[F]+D[G])%i;D[o]=z(v(D[o],D[F]),12)D[E]=(D[E]+D[o]+H)%i;D[G]=z(v(D[G],D[E]),8)D[F]=(D[F]+D[G])%i;D[o]=z(v(D[o],D[F]),7)end;local function I(J,K,m,L)local D={}for n=1,8 do D[n]=J[n]end;for n=1,8 do D[n+8]=A[n]end;D[13]=v(D[13],m)if L then D[15]=v(D[15],0xFFFFFFFF)end;local M={}for n=0,15 do local q=n*4+1;M[n]=(K:byte(q)or 0)+(K:byte(q+1)or 0)*0x100+(K:byte(q+2)or 0)*0x10000+(K:byte(q+3)or 0)*0x1000000 end;for N=1,10 do local O=B[N]C(D,1,5,9,13,M[O[1]],M[O[2]])C(D,2,6,10,14,M[O[3]],M[O[4]])C(D,3,7,11,15,M[O[5]],M[O[6]])C(D,4,8,12,16,M[O[7]],M[O[8]])C(D,1,6,11,16,M[O[9]],M[O[10]])C(D,2,7,12,13,M[O[11]],M[O[12]])C(D,3,8,9,14,M[O[13]],M[O[14]])C(D,4,5,10,15,M[O[15]],M[O[16]])end;for n=1,8 do J[n]=v(J[n],D[n],D[n+8])end end;function h(P,Q)Q=Q or""local J={}for n=1,8 do J[n]=A[n]end;local R=32;J[1]=v(J[1],0x01010000+w(#Q,8)+R)local m=0;if#Q>0 then local K=Q..string.rep("\0",64-#Q)m=#Q;I(J,K,m,false)end;for n=1,#P,64 do local K=P:sub(n,n+63)if#K<64 then K=K..string.rep("\0",64-#K)end;m=m+math.min(64,#P-n+1)I(J,K,m,n+64>#P)end;local S=""for n=1,8 do S=S..string.format("%08x",J[n])end;return S end end;if not h then error("Failed to load blake2s")end;if not a.vfs.exists("/etc/pam.d/secret")then a.log("PAM SECRET REGENERATING PLEASE USE ROOT","WARN",0xFF8800)local Q=""for n=1,256 do Q=Q..string.char(math.random(0,255))end;local T=a.vfs.open("/etc/pam.d/secret","w")a.vfs.write(T,Q)a.vfs.close(T)end;local U=c("/etc/pam.d/secret")local function V()return toHex(math.random(0,2^32))end;local function W(X,Y)local Q=U..Y;return h(X,Q)end;local Z=c("/etc/passwd")local _=c("/etc/shadow")local a0=string.split(Z,"\n")local a1=string.split(_,"\n")local a2,a3={},{}for a4,D in ipairs(a0)do local a5=string.split(D,":")if a5[1]and a5[1]~=""then a2[#a2+1]=a5 end end;for a4,D in ipairs(a1)do local a5=string.split(D,":")if a5[1]and a5[1]~=""then a3[#a3+1]=a5 end end;for a4,D in ipairs(a2)do local a6=tonumber(D[1])if a6 then a.users[a6]=D[3]end end;a.passwd=a2;local function a7()local a8={}for a4,D in ipairs(a2)do a8[#a8+1]=table.concat(D,":")end;g("/etc/passwd",table.concat(a8,"\n"))end;local function a9()local a8={}for a4,D in ipairs(a3)do a8[#a8+1]=table.concat(D,":")end;g("/etc/shadow",table.concat(a8,"\n"))end;local function aa(a6)for a4,D in ipairs(a2)do if tonumber(D[1])==a6 then return D end end;return nil end;local function ab(a6)for a4,D in ipairs(a3)do if tonumber(D[1])==a6 then return D end end;return nil end;local function ac(ad)for a4,D in ipairs(a2)do if D[3]==ad then return D end end;return nil end;local function ae()local af=999;for a4,D in ipairs(a2)do local a6=tonumber(D[1])if a6 and a6>=1000 and a6>af then af=a6 end end;return af+1 end;function b.login(a6,X)if type(a6)~="number"or type(X)~="string"then return nil,"Authentication failure"end;local ag=aa(a6)if not ag then W(X,"aaaaaaaaaaaaaaaa")return nil,"Authentication failure"end;local ah=ab(a6)if not ah then W(X,"aaaaaaaaaaaaaaaa")return nil,"Authentication failure"end;local Y=ah[2]local ai=ah[3]local aj=W(X,Y)if aj~=ai then return nil,"Authentication failure"end;a.currentUID=a6;local ak=a.currentTask;if ak then ak.uid=a6;ak.euid=a6;ak.gid=tonumber(ag[2])or a6;ak.egid=tonumber(ag[2])or a6 end;a.log("AUTH: login uid="..tostring(a6).." ("..aa(a6)[3]..")")return true end;function b.setPassword(a6,al)a6=tonumber(a6)if not a6 then return nil,"InvalidLine truncated
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b={}local c={}local d=2;a.exitMain=false;local e=coroutine.resumeWithTimeout;local function f(g,h)return math.floor(g/2^h)%2==1 end;local function i(j)a.vfs.access(j,"rx")local k=a.vfs.open(j,"r")local l=a.vfs.read(k,1024*1024*4)a.vfs.close(k)local m=a.freshUserEnv()local n,o=load(l,"@"..j,"t",m)if not n then error("ENOEXEC: "..tostring(o))end;local p=a.vfs.lstat(j)local q=f(p.perms,6)local r=a.currentTask and a.currentTask.uid or a.uid;local s=q and p.owner or r;return n,s,q end;local function t(n,u,v,w,x,y,z)local A=d;d=d+1;b[tostring(A)]={coro=coroutine.create(function()local B,o=xpcall(n,debug.traceback,table.unpack(w or{}))if a.config.logTaskExit then if not B then a.log("Task "..tostring(A).." exited with err: "..tostring(o),"ERROR",0xFF0000)elseif o then a.log("Task "..tostring(A).." exited with code: "..tostring(o),"DBUG",0x00FFFF)else a.log("Task "..tostring(A).." exited without code","DBUG",0x00FFFF)end end;if type(o)=="number"then b[tostring(A)].exit=o end;if b[tostring(A)].fd then for k,C in pairs(b[tostring(A)].fd)do pcall(a.vfs.close,k)end end;b[tostring(A)].status="Z"end),name=u or"task"..tostring(A),envars=v or(a.currentTask and a.currentTask.envars or{}),args=w or{},status="R",pid=A,tgid=x or(a.currentTask and a.currentTask.tgid or A),uid=y,euid=z,gid=a.currentTask and a.currentTask.gid or 0,groups=a.currentTask and a.currentTask.groups or{},fd={},sleep=0,ivs=0,vs=0,children={},parent=a.currentTask or a.kernelTask,siblings=a.currentTask and a.currentTask.children or a.kernelTask.children,syscallReturn={},cwd=a.currentTask and a.currentTask.cwd or"/",timeSlice=0,lastTime=0,totalTime=0,numRuns=0}table.insert(a.currentTask and a.currentTask.children or a.kernelTask.children,b[tostring(A)])return A end;function c.spawn(n,u,v,w,x)local D=a.currentTask;local y=D and D.uid or a.uid;local z=D and D.euid or y;return t(n,u,v,w,x,y,z)end;function c.execspawn(j,u,v,w,x)local n,s,E=i(j,a._U)local D=a.currentTask;local y=D and D.uid or a.uid;if E then a.log("execspawn: suid exec '"..j.."' caller_uid="..tostring(y).." -> euid="..tostring(s))end;return t(n,u or j,v,w,x,y,s)end;function c.exec(j,w,v)local F=a.currentTask;local n,s,C=i(j,a._U)if F.fd then for k,C in pairs(F.fd)do if k>2 then pcall(a.vfs.close,k)end end end;F.euid=s;F.args=w or{}F.envars=v or F.envars;F.name=j;F.coro=coroutine.create(function()local B,o=xpcall(n,debug.traceback,table.unpack(F.args))if a.config.logTaskExit then if not B then a.log("Task "..tostring(F.pid).." exec '"..j.."' err: "..tostring(o),"ERROR",0xFF0000)else a.log("Task "..tostring(F.pid).." exec '"..j.."' exited: "..tostring(o),"DBUG",0x00FFFF)end end;if type(o)=="number"then b[tostring(F.pid)].exit=o end;if b[tostring(F.pid)].fd then for k,C in pairs(b[tostring(F.pid)].fd)do pcall(a.vfs.close,k)end end;b[tostring(F.pid)].status="Z"end)F.syscallReturn={}coroutine.yield()end;function c.sleep(G)a.currentTask.status="S"a.currentTask.sleep=a.EFI:getEpochMs()+G*1000 end;function c.getTask(H)local F=b[tostring(H)]if not F then return nil end;local I,J={},{}for K,L in ipairs(F.children)do I[K]=L.pid end;for K,L in ipairs(F.siblings)do J[K]=L.pid end;return{name=F.name,status=F.status,pid=F.pid,tgid=F.tgid,username=a.users[F.uid],uid=F.uid,euid=F.euid,exit=F.exit,sleep=F.sleep,ivs=F.ivs,vs=F.vs,children=I,siblings=J,parent=F.parent.pid,cwd=F.cwd,term=F.term}end;function c.collect(H)local I={}for C,L in ipairs(a.currentTask.children)do I[#I+1]=L.pid end;local F=b[tostring(H)]if not F then return false,"Task does not exist"elseif not isEqualToAny(F.pid,table.unpack(I))then return false,"You do not own this task"elseif F.status~="Z"then return false,"Task must exit to collect status"else F.reapTime=0;return true,F.exit end end;function c.kill(H)local F=b[tostring(H)]if not F then return false,"Task does not exist"elseif F.status=="Z"then return false,"Task is already dead"end;local D=a.currentTask;local M=D and(D.euid or D.uid)or a.uid;if M~=0 and F.uid~=(D and D.uid or a.uid)then return false,"EPERM"end;F.status="Z"return true end;function c.stop(H)local F=b[tostring(H)]if not F then return false,"Task does not exist"elseif F.status~="R"then return false,"Cannot stop non-running task"else F.status="T"return true end end;function c.continue(H)local F=b[tostring(H)]if not F then return false,"Task does not exist"elseif F.status~="T"then return false,"Task is not stopped"else F.status="R"return true end end;function c.getpid()return a.currentTask.pid end;function c.getppid()return a.currentTask.parent.pid end;function c.getTasks()local N={}for C,L in pairs(b)do N[#N+1]=L.pid end;return N end;function c.getEnviron(O)return a.currentTask.envars[O]end;function c.setEnviron(O,P)a.currentTask.envars[O]=P end;function c.exit(Q)local F=a.currentTask;if a.config.logTaskExit then if Q then a.log("Task "..tostring(F.pid).." exited with code: "..tostring(Q),"DBUG",0x00FFFF)else a.log("Task "..tostring(F.pid).." exited without code","DBUG",0x00FFFF)end end;b[tostring(F.pid)].sLine truncated
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local debug=debug;a._G.debug={getinfo=debug.getinfo,traceback=debug.traceback}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...local b=a.syscalls;a.gpio={}b["gpio_write"]=function(c,d)if a.gpio[c]then return a.gpio[c]("w",d)end end;b["gpio_writeAnalog"]=function(c,d)if a.gpio[c]then return a.gpio[c]("wa",d)end end;b["gpio_read"]=function(c)if a.gpio[c]then return a.gpio[c]("r")end end;b["gpio_readAnalog"]=function(c)if a.gpio[c]then return a.gpio[c]("ra")end end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...function print(...)local b={...}local c=""for d=1,#b do c=c..tostring(b[d]).."\t"end;c=c:sub(1,-2)syscall.write(1,c.."\n")end;function printf(e,...)local c=string.format(e,...)syscall.write(1,c.."\n")end;function printInline(...)local b={...}local c=""for d=1,#b do c=c..tostring(b[d]).."\t"end;c=c:sub(1,-2)syscall.write(1,c)end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...a.log("Loading init system...")a.log("InitPath: "..a.config.initPath)local b,c=pcall(a.vfs.access,a.config.initPath,"rx")if not b then a.PANIC("Init binary not executable: "..a.config.initPath.." ("..tostring(c)..")")end;local d=a.vfs.open(a.config.initPath,"r")if not d then a.panic("Failed to open "..a.config.initPath)end;local e=a.vfs.read(d,1024*1024*4)if not d then a.panic("Failed to read "..a.config.initPath)end;a.vfs.close(d)local f,g=load(e,"@sysinit","t",a._U)if not f then a.PANIC("Failed to load init system: "..g)end;a.tasks["1"]={coro=coroutine.create(function()local h,g=xpcall(f,debug.traceback,a)if not h then a.panic("Init system crashed: "..tostring(g))else a.panic("Init system exited: "..tostring(g))end end),name="sysinit",status="R",pid=1,tgid=1,uid=0,fd={},envars={},args={},exit="",sleep=0,ivs=0,vs=0,parent=a.kernelTask,siblings=a.kernelTask.children,children={},syscallReturn={},cwd="/",timeSlice=0,lastTime=0,totalTime=0,numRuns=0}a.log("created init task with PID 1")a.log("Initializing init system...")
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...if not a.vfs.exists("/root")then a.vfs.mkdir("/root")end;a.processes.login=function()local b,c=pcall(a.hpv.execspawn,"/bin/login","login")if not b then a.log("Failed to exec /bin/login: "..tostring(c),"ERROR",0xFF0000)end end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...if a.firstBoot then local b=a.vfs.P;local c=a.vfs.PERM;local d=b.OWNER_R+b.OWNER_W+b.GROUP_R+b.WORLD_R;local e=b.OWNER_R+b.OWNER_W+b.OWNER_X+b.GROUP_R+b.GROUP_X+b.WORLD_R+b.WORLD_X;local f=b.OWNER_R+b.OWNER_W+b.GROUP_R;local g=b.OWNER_R+b.OWNER_W;local h=c.RWXRWXRWX;local i=c.SUID_755;local j=0x02;local k=a.disks["$"]local function l(m,n,o,p,q,r)r=r or""local s=q%256;local t=math.floor(q/256)%256;local u=(o or 0)%256;local v=math.floor((o or 0)/256)%256;local w=(p or 0)%256;local x=math.floor((p or 0)/256)%256;return string.char(#m)..m..string.char(n,u,v,w,x,s,t)..string.char(#r)..r end;local y=0x00;local function z(A,B)local C=A;if C:sub(1,1)=="/"then C=C:sub(2)end;local D=C==""and".meta"or C.."/.meta"local E={}local F,G=pcall(function()return k:open(D,"r")end)if F and G then local H=G.read(65535)if G.close then G.close()end;E=a.vfs._parseMetafile and a.vfs._parseMetafile(H)or{}end;for I,J in ipairs(B)do local m=J[1]local n=J[2]or y;local o=J[3]or 0;local p=J[4]or 0;local q=J[5]or e;local r=J[6]or""E[m]={etype=n,owner=o,group=p,perms=q,cmeta=r}end;local K=string.char(j)for m,L in pairs(E)do K=K..l(m,L.etype or y,L.owner or 0,L.group or 0,L.perms or e,L.cmeta or"")end;local M,N=pcall(function()local O=k:open(D,"w")O.write(K)O.close()end)if not M then a.log("permissions: failed to write "..D..": "..tostring(N),"WARN",0xFF8800)end end;a.log("Seeding filesystem permissions...")z("/",{{"bin",y,0,0,e},{"boot",y,0,0,e},{"dev",y,0,0,h},{"etc",y,0,0,e},{"home",y,0,0,e},{"lib",y,0,0,e},{"proc",y,0,0,h},{"root",y,0,0,g},{"sbin",y,0,0,e},{"tmp",y,0,0,h},{"usr",y,0,0,e},{"var",y,0,0,h},{"opt",y,0,0,e}})z("/bin",{{"login",y,0,0,i},{"su",y,0,0,i},{"sudo",y,0,0,i}})z("/etc",{{"passwd",y,0,0,d},{"shadow",y,0,0,g},{"pam.d",y,0,0,g}})z("/etc/pam.d",{{"secret",y,0,0,g}})a.log("Filesystem permissions seeded.")end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...a.allowGlobalOverwrites=false
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a={}local b=2^32;local c=2^31;local function d(e)return e%b end;local function f(e)e=d(e)local g={}for h=0,31 do local i=e%2;g[h]=i;e=(e-i)/2 end;return g end;local function j(g)local e=0;local k=1;for h=0,31 do if g[h]==1 then e=e+k end;k=k*2 end;return d(e)end;function a.band(...)local l={...}if#l==0 then return 0xFFFFFFFF end;local m=f(l[1])for h=2,#l do local i=f(l[h])for n=0,31 do m[n]=m[n]==1 and i[n]==1 and 1 or 0 end end;return j(m)end;function a.bor(...)local l={...}if#l==0 then return 0 end;local m=f(l[1])for h=2,#l do local i=f(l[h])for n=0,31 do m[n]=(m[n]==1 or i[n]==1)and 1 or 0 end end;return j(m)end;function a.bxor(...)local l={...}if#l==0 then return 0 end;local m=f(l[1])for h=2,#l do local i=f(l[h])for n=0,31 do m[n]=m[n]~=i[n]and 1 or 0 end end;return j(m)end;function a.bnot(e)local m=f(e)for h=0,31 do m[h]=m[h]==1 and 0 or 1 end;return j(m)end;function a.lshift(e,o)return d(d(e)*2^o)end;function a.rshift(e,o)return math.floor(d(e)/2^o)end;function a.arshift(e,o)e=d(e)if e>=c then return math.floor((e-b)/2^o)else return math.floor(e/2^o)end end;function a.lrotate(e,o)o=o%32;e=d(e)local p=e*2^o%b;local q=math.floor(e/2^(32-o))return d(p+q)end;function a.rrotate(e,o)o=o%32;e=d(e)local q=math.floor(e/2^o)local p=e*2^(32-o)%b;return d(p+q)end;function a.extract(e,r,s)s=s or 1;return a.band(a.rshift(e,r),2^s-1)end;function a.replace(e,t,r,s)s=s or 1;local u=a.lshift(2^s-1,r)e=a.band(e,a.bnot(u))return a.bor(e,a.lshift(t,r))end;return a
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=require("bit32")local b,c,d=a.band,a.bor,a.bxor;local e,f=a.rshift,a.lshift;local g=2^32;local function h(i,j)return c(e(i,j),f(i,32-j))end;local k={0x6A09E667,0xBB67AE85,0x3C6EF372,0xA54FF53A,0x510E527F,0x9B05688C,0x1F83D9AB,0x5BE0CD19}local l={{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},{14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3},{11,8,12,0,5,2,15,13,10,14,3,6,7,1,9,4},{7,9,3,1,13,12,11,14,2,6,5,10,4,0,15,8},{9,0,5,7,2,4,10,15,14,1,11,12,6,8,3,13},{2,12,6,10,0,11,8,3,4,13,7,5,15,14,1,9},{12,5,1,15,14,13,4,10,0,7,6,3,9,2,8,11},{13,11,7,14,12,1,3,9,5,0,15,4,8,6,2,10},{6,15,14,9,11,3,0,8,12,2,13,7,1,4,10,5},{10,2,8,4,7,6,1,5,15,11,9,14,3,12,13,0}}local function m(n,o,p,q,r,i,s)n[o]=(n[o]+n[p]+i)%g;n[r]=h(d(n[r],n[o]),16)n[q]=(n[q]+n[r])%g;n[p]=h(d(n[p],n[q]),12)n[o]=(n[o]+n[p]+s)%g;n[r]=h(d(n[r],n[o]),8)n[q]=(n[q]+n[r])%g;n[p]=h(d(n[p],n[q]),7)end;local function t(u,v,w,x)local n={}for y=1,8 do n[y]=u[y]end;for y=1,8 do n[y+8]=k[y]end;n[13]=d(n[13],w)if x then n[15]=d(n[15],0xFFFFFFFF)end;local z={}for y=0,15 do local A=y*4+1;z[y]=(v:byte(A)or 0)+(v:byte(A+1)or 0)*0x100+(v:byte(A+2)or 0)*0x10000+(v:byte(A+3)or 0)*0x1000000 end;for B=1,10 do local C=l[B]m(n,1,5,9,13,z[C[1]],z[C[2]])m(n,2,6,10,14,z[C[3]],z[C[4]])m(n,3,7,11,15,z[C[5]],z[C[6]])m(n,4,8,12,16,z[C[7]],z[C[8]])m(n,1,6,11,16,z[C[9]],z[C[10]])m(n,2,7,12,13,z[C[11]],z[C[12]])m(n,3,8,9,14,z[C[13]],z[C[14]])m(n,4,5,10,15,z[C[15]],z[C[16]])end;for y=1,8 do u[y]=d(u[y],n[y],n[y+8])end end;local function D(E,F)F=F or""local u={}for y=1,8 do u[y]=k[y]end;local G=32;u[1]=d(u[1],0x01010000+f(#F,8)+G)local w=0;if#F>0 then local v=F..string.rep("\0",64-#F)w=#F;t(u,v,w,false)end;for y=1,#E,64 do local v=E:sub(y,y+63)if#v<64 then v=v..string.rep("\0",64-#v)end;w=w+math.min(64,#E-y+1)t(u,v,w,y+64>#E)end;local H=""for y=1,8 do H=H..string.format("%08x",u[y])end;return H end;return D
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a;do local b="1.0.0-release"local c="LibDeflate "..b.." Copyright (C) 2018 Haoqian He.".." License GPLv3+: GNU GPL version 3 or later"if LibStub then local d,e="LibDeflate",-1;local f,g=LibStub:GetLibrary(d,true)if f and g and g>=e then return f else a=LibStub:NewLibrary(d,b)end else a={}end;a._VERSION=b;a._COPYRIGHT=c end;local assert=assert;local error=error;local pairs=pairs;local h=string.byte;local i=string.char;local j=string.find;local k=string.gsub;local l=string.sub;local m=table.concat;local n=table.sort;local tostring=tostring;local type=type;local o={}local p={}local q={}local r={}local s={}local t={}local u={}local v={}local w={}local x={3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258}local y={0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}local z={[0]=1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577}local A={[0]=0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}local B={16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}local C;local D;local E;local F;local G;local H;local I;local J;for K=0,255 do p[K]=i(K)end;do local L=1;for K=0,32 do o[K]=L;L=L*2 end end;for K=1,9 do q[K]={}for M=0,o[K+1]-1 do local N=0;local O=M;for P=1,K do N=N-N%2+((N%2==1 or O%2==1)and 1 or 0)O=(O-O%2)/2;N=N*2 end;q[K][M]=(N-N%2)/2 end end;do local Q=18;local R=16;local S=265;local T=1;for U=3,258 do if U<=10 then r[U]=U+254;t[U]=0 elseif U==258 then r[U]=285;t[U]=0 else if U>Q then Q=Q+R;R=R*2;S=S+4;T=T+1 end;local V=U-Q-1+R/2;r[U]=(V-V%(R/8))/(R/8)+S;t[U]=T;s[U]=V%(R/8)end end end;do u[1]=0;u[2]=1;w[1]=0;w[2]=0;local Q=3;local R=4;local W=2;local T=0;for X=3,256 do if X>R then Q=Q*2;R=R*2;W=W+2;T=T+1 end;u[X]=X<=Q and W or W+1;w[X]=T<0 and 0 or T;if R>=8 then v[X]=(X-R/2-1)%(R/4)end end end;local Y,Z,_,a0,a1;if bit~=nil then Y=bit.band;Z=bit.bnot;_=bit.bxor;a0=bit.blshift;a1=bit.blogic_rshift elseif bit32~=nil then Y=bit32.band;Z=bit32.bnot;_=bit32.bxor;a0=bit32.lshift;a1=bit32.rshift else _=function(Q,R)local a2=0;for K=32,0,-1 do local a3=2^K;local a4=false;local a5=false;if Q==0 then a2=a2+R;break end;if R==0 then a2=a2+Q;break end;if Q>=a3 then a4=true;Q=Q-a3 end;if R>=a3 then a5=true;R=R-a3 end;if not(a4 and a5)and(a4 or a5)then a2=a2+a3 end end;return a2 end;a0=function(a6,a7)local a8=a6*2^a7;return a8%2^32 end;a1=function(a6,a9)local a8=a6/2^a9;return math.floor(a8)end;Y=function(Q,R)local aa,S=1,0;while Q>0 and R>0 do local ab,ac=Q%2,R%2;if ab+ac>1 then S=S+aa end;Q,R,aa=(Q-ab)/2,(R-ac)/2,aa*2 end;return S end;Z=function(ad)return bxor(ad,2^(bits or floor(log(ad,2)))-1)end end;local ae=0xEDB88320;local function af(ag)local ah={}local V=setmetatable({},ah)function ah:__index(ai)local aj=ag(ai)V[ai]=aj;return aj end;return V end;local ak=af(function(K)local al=K;for P=1,8 do local R=Y(al,1)al=a1(al,1)if R==1 then al=_(al,ae)end end;return al end)local function am(an,al)al=Z(al or 0)local ao=a1(al,8)local ap=ak[_(al%256,an)]return Z(_(ao,ap))end;local function aq(ar,al)al=al or 0;for K=1,#ar do al=am(ar:byte(K),al)end;return al end;function a:CRC32(ar,al)if type(ar)=='string'then return aq(ar,al)else return am(ar,al)end end;function a:Adler32(as)if type(as)~="string"then error(("Usage: LibDeflate:Adler32(str):".." 'str' - string expected got '%s'."):format(type(as)),2)end;local at=#as;local K=1;local Q=1;local R=0;while K<=at-15 do local au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aI,aJ=h(as,K,K+15)R=(R+16*Q+16*au+15*av+14*aw+13*ax+12*ay+11*az+10*aA+9*aB+8*aC+7*aD+6*aE+5*aF+4*aG+3*aH+2*aI+aJ)%65521;Q=(Q+au+av+aw+ax+ay+az+aA+aB+aC+aD+aE+aF+aG+aH+aI+aJ)%65521;K=K+16 end;while K<=at do local ad=h(as,K,K)Q=(Q+ad)%65521;R=(R+Q)%65521;K=K+1 end;return(R*65536+Q)%4294967296 end;local function aK(aL,aM)return aL%4294967296==aM%4294967296 end;function a:CreateDictionary(as,at,aN)if type(as)~="string"then error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):".." 'str' - string expected got '%s'."):format(type(as)),2)end;if type(at)~="number"then error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):".." 'strlen' - number expected got '%s'."):format(type(at)),2)end;if type(aN)~="number"then error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):".." 'adler32' - number expected got '%s'."):format(type(aN)),2)end;if at~=#as then error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):".." 'strlen' does not match the actual length of 'str'.".." 'strlen': %u, '#str': %u .".." Please check if 'str' is modified unintentionally."):format(at,#as))end;if at==0 then error("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):".." 'str' - Empty string is not allowed.",2)end;if at>32768 then error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):".." 'str' - string longer than 32768 bytes is not allowed.".." Got %d bytes."):format(at),2)end;local aO=self:Adler32(as)if not aK(aN,aO)then error(("Usage: LibDeflate:CreateDictionary(str, strlen, adler32):".Line truncated
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
local deflate=require("LibDeflate")
|
||||||
|
local lib={}
|
||||||
|
lib.compress=function(data)
|
||||||
|
return deflate:CompressDeflate(data)
|
||||||
|
end
|
||||||
|
lib.decompress=function(data)
|
||||||
|
return deflate:DecompressDeflate(data)
|
||||||
|
end
|
||||||
|
return lib
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=syscall.getTask(syscall.getpid()).name;local b={R=false,help=false}local c={}local d=nil;for e,f in ipairs({...})do if f:sub(1,2)=="--"then local g=f:sub(3)if b[g]==nil then print(a..": unrecognized option '"..f.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;b[g]=true elseif f:sub(1,1)=="-"and not f:match("^%-[%+%-]")then local h=true;for i=2,#f do local j=f:sub(i,i)if b[j]~=nil then b[j]=true else h=false;break end end;if not h then d=f end elseif f:sub(1,1)=="+"or f:sub(1,1)=="-"and f:match("^%-[a-zA-Z]")then d=f else table.insert(c,f)end end;if b.help then print("Usage: "..a.." [OPTION]... +-= ATTRS FILE...")print("Change file attributes on a filesystem.")print("")print("Attributes:")print(" i immutable: file cannot be modified, renamed, or deleted")print(" a append-only: file can only be appended to")print("")print("Operators: +attr add, -attr remove")print("Example: "..a.." +i /etc/passwd")print("")print("Options:")print(" -R operate on files and directories recursively")print(" --help display this help and exit")return end;if not d or#c<1 then print(a..": missing operand")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;local k=d:sub(1,1)local l=d:sub(2)if k~="+"and k~="-"then print(a..": invalid operator '"..k.."' (use + or -)")syscall.exit(1)return end;local function m(n)local o=pcall(function()return syscall.stat(n)end)and syscall.stat(n)if o then return o.xattr or""end;return""end;local p="|i"local q="|a"local function r(j)if j=="i"then return p elseif j=="a"then return q else return nil end end;local function s(n)local o=syscall.stat(n)if not o then print(a..": cannot stat '"..n.."': No such file or directory")return false end;if o.etype==0x01 then return true end;if not syscall.setxattr then print(a..": kernel does not expose setxattr syscall; cannot modify attributes")syscall.exit(1)return false end;local t=o.xattr or""for i=1,#l do local j=l:sub(i,i)local u=r(j)if not u then print(a..": unsupported attribute '"..j.."'")syscall.exit(1)return false end;local v=t:find(u,1,true)if k=="+"and not v then t=t..u elseif k=="-"and v then t=t:gsub(u:gsub("|","%%|"),"")end end;local w,x=pcall(syscall.setxattr,n,t)if not w then print(a..": cannot set attributes on '"..n.."': "..tostring(x))return false end;return true end;local function y(n)if not s(n)then return end;if syscall.type(n)=="directory"then local w,z=pcall(syscall.listdir,n)if w then for e,A in ipairs(z)do local B=n;if B:sub(-1)~="/"then B=B.."/"end;y(B..A)end end end end;local C=syscall.getcwd()local function D(E)if E:sub(1,1)~="/"then E=C.."/"..E end;return E end;if not syscall.setxattr then print(a..": kernel does not expose setxattr; attributes cannot be persisted")print(a..": add sys[\"setxattr\"] = vfs.setxattr to 10_vfs.kmod to enable this")syscall.exit(1)return end;local F=0;for i=1,#c do local n=D(c[i])if not syscall.exists(n)then print(a..": cannot access '"..c[i].."': No such file or directory")F=1 elseif b.R then y(n)else if not s(n)then F=1 end end end;syscall.exit(F)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=syscall.getTask(syscall.getpid()).name;local b={R=false,help=false}local c={}for d,e in ipairs({...})do if e:sub(1,2)=="--"then local f=e:sub(3)if b[f]==nil then print(a..": unrecognized option '"..e.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;b[f]=true elseif e:sub(1,1)=="-"then for g=2,#e do local f=e:sub(g,g)if b[f]==nil then print(a..": invalid option '-"..f.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;b[f]=true end else table.insert(c,e)end end;if b.help then print("Usage: "..a.." [OPTION]... GROUP FILE...")print("Change the group of each FILE to GROUP.")print("GROUP may be a group name or numeric ID.")print("")print("Options:")print(" -R operate on files and directories recursively")print(" --help display this help and exit")return end;if#c<2 then print(a..": missing operand")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;local h=c[1]local function i(j)local k=tonumber(j)if k then return k end;local l=syscall.getuidbyname and syscall.getuidbyname(j)if l then local m=syscall.getpasswd(l)if m then return m.gid end end;print(a..": invalid group: '"..j.."'")syscall.exit(1)end;local n=i(h)local function o(p)local q=syscall.stat(p)if not q then print(a..": cannot stat '"..p.."': no such file or directory")return false end;local r,s=pcall(syscall.chown,p,q.owner,n)if not r then local t=tostring(s)if t:find("EPERM")or t:find("EACCES")then t="operation not permitted (must be root)"elseif t:find("ENOENT")then t="no such file or directory"end;print(a..": cannot change group of '"..p.."': "..t)return false end;return true end;local function u(p)if not o(p)then return end;if syscall.type(p)=="directory"then local r,v=pcall(syscall.listdir,p)if r then for d,w in ipairs(v)do local x=p;if x:sub(-1)~="/"then x=x.."/"end;u(x..w)end end end end;local y=syscall.getcwd()local function z(A)if A:sub(1,1)~="/"then A=y.."/"..A end;return A end;local B=0;for g=2,#c do local p=z(c[g])if not syscall.exists(p)then print(a..": cannot access '"..c[g].."': No such file or directory")B=1 elseif b.R then u(p)else if not o(p)then B=1 end end end;syscall.exit(B)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=syscall.getTask(syscall.getpid()).name;local b={R=false,help=false}local c={}for d,e in ipairs({...})do if e:sub(1,2)=="--"then local f=e:sub(3)if b[f]==nil then print(a..": unrecognized option '"..e.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;b[f]=true elseif e:sub(1,1)=="-"then for g=2,#e do local f=e:sub(g,g)if b[f]==nil then print(a..": invalid option '-"..f.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;b[f]=true end else table.insert(c,e)end end;if b.help then print("Usage: "..a.." [OPTION]... MODE FILE...")print("Change the file mode bits of each FILE to MODE.")print("")print("MODE may be octal (e.g. 755) or symbolic (e.g. u+x, go-w, a=r).")print("")print("Octal bit layout (Hyperion):")print(" owner: r=32 w=16 x=512 group: r=8 w=4 x=256")print(" world: r=2 w=1 x=128 suid=64")print(" Common: 644=rw-r--r-- 755=rwxr-xr-x 700=rwx------")print("")print("Symbolic: [ugoa][+-=][rwxs] (comma-separated list)")print("")print("Options:")print(" -R change files and directories recursively")print(" --help display this help and exit")return end;if#c<2 then print(a..": missing operand")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;local h=c[1]local i={OWNER_R=32,OWNER_W=16,OWNER_X=512,GROUP_R=8,GROUP_W=4,GROUP_X=256,WORLD_R=2,WORLD_W=1,WORLD_X=128,SUID=64}local function j(k,l)return math.floor(k/2^l)%2==1 end;local function m(n)local o=tonumber(n,8)if not o then return nil end;local p=0;if j(o,8)then p=p+i.OWNER_R end;if j(o,7)then p=p+i.OWNER_W end;if j(o,6)then p=p+i.OWNER_X end;if j(o,5)then p=p+i.GROUP_R end;if j(o,4)then p=p+i.GROUP_W end;if j(o,3)then p=p+i.GROUP_X end;if j(o,2)then p=p+i.WORLD_R end;if j(o,1)then p=p+i.WORLD_W end;if j(o,0)then p=p+i.WORLD_X end;if j(o,11)then p=p+i.SUID end;return p end;local function q(r,s)local t=s;for u in(r..","):gmatch("([^,]+),")do local v,w=u:match("^([ugoa]*)([+%-=].+)$")if not v then print(a..": invalid mode: '"..u.."'")syscall.exit(1)return nil end;if v==""or v=="a"then v="ugo"end;local x=w:sub(1,1)local y=w:sub(2)local z=0;for g=1,#y do local A=y:sub(g,g)for B=1,#v do local C=v:sub(B,B)if A=="r"then if C=="u"then z=z+i.OWNER_R elseif C=="g"then z=z+i.GROUP_R elseif C=="o"then z=z+i.WORLD_R end elseif A=="w"then if C=="u"then z=z+i.OWNER_W elseif C=="g"then z=z+i.GROUP_W elseif C=="o"then z=z+i.WORLD_W end elseif A=="x"then if C=="u"then z=z+i.OWNER_X elseif C=="g"then z=z+i.GROUP_X elseif C=="o"then z=z+i.WORLD_X end elseif A=="s"then if C=="u"then z=z+i.SUID end end end end;if x=="+"then t=t+z-(t%(z+1)-t%z>0 and 0 or 0)t=t-t%1;local function D(E,F)local p,l=0,1;while E>0 or F>0 do if E%2==1 or F%2==1 then p=p+l end;E=math.floor(E/2)F=math.floor(F/2)l=l*2 end;return p end;t=D(t,z)elseif x=="-"then local function G(E,F)local p,l=0,1;while E>0 and F>0 do if E%2==1 and F%2==1 then p=p+l end;E=math.floor(E/2)F=math.floor(F/2)l=l*2 end;return p end;local function H(E,F)local p,l=0,1;while E>0 or F>0 do if E%2==1~=(F%2==1)then p=p+l end;E=math.floor(E/2)F=math.floor(F/2)l=l*2 end;return p end;t=H(t,G(t,z))elseif x=="="then local I=0;for B=1,#v do local C=v:sub(B,B)if C=="u"then I=I+i.OWNER_R+i.OWNER_W+i.OWNER_X+i.SUID elseif C=="g"then I=I+i.GROUP_R+i.GROUP_W+i.GROUP_X elseif C=="o"then I=I+i.WORLD_R+i.WORLD_W+i.WORLD_X end end;local function H(E,F)local p,l=0,1;while E>0 or F>0 do if E%2==1~=(F%2==1)then p=p+l end;E=math.floor(E/2)F=math.floor(F/2)l=l*2 end;return p end;local function G(E,F)local p,l=0,1;while E>0 and F>0 do if E%2==1 and F%2==1 then p=p+l end;E=math.floor(E/2)F=math.floor(F/2)l=l*2 end;return p end;local function D(E,F)local p,l=0,1;while E>0 or F>0 do if E%2==1 or F%2==1 then p=p+l end;E=math.floor(E/2)F=math.floor(F/2)l=l*2 end;return p end;t=H(t,G(t,I))t=D(t,z)else print(a..": invalid operator in mode: '"..u.."'")syscall.exit(1)return nil end end;return t end;local function J(r,s)if r:match("^[0-7]+$")then local K=m(r)if K then return K end end;return q(r,s)end;local function L(M)local N,O=pcall(syscall.stat,M)local s=0;if N then local n=syscall.stat(M)s=n and n.perms or 0 end;local P=J(h,s)if P==nil then return false end;local Q,R=pcall(syscall.chmod,M,P)if not Q then local S=tostring(R)if S:find("EACCES")or S:find("EPERM")then S="permission denied"elseif S:find("ENOENT")then S="no such file or directory"end;print(a..": cannot change permissions of '"..M.."': "..S)return false end;return true end;local function T(M)if not L(M)then return end;if syscall.type(M)=="directory"then local Q,U=pcall(syscall.listdir,M)if Q then for d,V in ipairs(U)do local W=M;if W:sub(-1)~="/"then W=W.."/"end;T(W..V)end end end end;local X=syscall.getcwd()local function Y(K)if K:sub(1,1)~="/"then K=X.."/"..K end;return K end;local Z=0;for g=2,#c do local M=Y(c[g])if not syscall.exists(M)then print(a..": cannot access '"..c[g].."': No such file or directory")Z=1 elseif b.R then T(M)else if not L(M)then Z=1 end end end;syscall.exit(Z)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=syscall.getTask(syscall.getpid()).name;local b={R=false,help=false}local c={}for d,e in ipairs({...})do if e:sub(1,2)=="--"then local f=e:sub(3)if b[f]==nil then print(a..": unrecognized option '"..e.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;b[f]=true elseif e:sub(1,1)=="-"then for g=2,#e do local f=e:sub(g,g)if b[f]==nil then print(a..": invalid option '-"..f.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;b[f]=true end else table.insert(c,e)end end;if b.help then print("Usage: "..a.." [OPTION]... OWNER[:GROUP] FILE...")print(" "..a.." [OPTION]... :GROUP FILE...")print("Change the owner and/or group of each FILE.")print("OWNER and GROUP may be names or numeric IDs.")print("")print("Options:")print(" -R operate on files and directories recursively")print(" --help display this help and exit")return end;if#c<2 then print(a..": missing operand")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;local h=c[1]local i,j;if h:sub(1,1)==":"then j=h:sub(2)else local k=h:find(":",1,true)if k then i=h:sub(1,k-1)j=h:sub(k+1)if j==""then j=nil end else i=h end end;local function l(m)if not m or m==""then return nil end;local n=tonumber(m)if n then return n end;local o=syscall.getuidbyname and syscall.getuidbyname(m)if o then return o end;print(a..": invalid user: '"..m.."'")syscall.exit(1)end;local function p(m)if not m or m==""then return nil end;local n=tonumber(m)if n then return n end;local o=syscall.getuidbyname and syscall.getuidbyname(m)if o then local q=syscall.getpasswd(o)if q then return q.gid end end;print(a..": invalid group: '"..m.."'")syscall.exit(1)end;local r=l(i)local s=p(j)if r==nil and s==nil then print(a..": no owner or group specified")syscall.exit(1)return end;local function t(u)local v=syscall.stat(u)if not v then print(a..": cannot stat '"..u.."': no such file or directory")return false end;local o=r~=nil and r or v.owner;local w=s~=nil and s or v.group;local x,y=pcall(syscall.chown,u,o,w)if not x then local z=tostring(y)if z:find("EPERM")or z:find("EACCES")then z="operation not permitted (must be root)"elseif z:find("ENOENT")then z="no such file or directory"end;print(a..": cannot change owner of '"..u.."': "..z)return false end;return true end;local function A(u)if not t(u)then return end;if syscall.type(u)=="directory"then local x,B=pcall(syscall.listdir,u)if x then for d,C in ipairs(B)do local D=u;if D:sub(-1)~="/"then D=D.."/"end;A(D..C)end end end end;local E=syscall.getcwd()local function F(G)if G:sub(1,1)~="/"then G=E.."/"..G end;return G end;local H=0;for g=2,#c do local u=F(c[g])if not syscall.exists(u)then print(a..": cannot access '"..c[g].."': No such file or directory")H=1 elseif b.R then A(u)else if not t(u)then H=1 end end end;syscall.exit(H)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=syscall.getTask(syscall.getpid()).name;local b={}local c={help=false}for d,e in ipairs({...})do if e:sub(1,2)=="--"then local f=e:sub(3)if f=="help"then c.help=true else print(a..": unrecognized option '"..e.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end elseif e:sub(1,1)=="-"then print(a..": invalid option '"..e.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return else table.insert(b,e)end end;if c.help then print("Usage: "..a.." NEWROOT [COMMAND [ARG]...]")print("Run COMMAND with root directory set to NEWROOT.")print("If COMMAND is omitted, runs the current user's shell.")print("")print("Requires root (uid 0).")return end;if#b<1 then print(a..": missing operand")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;local g=syscall.geteuid and syscall.geteuid()or syscall.getuid()if g~=0 then print(a..": cannot change root directory: Permission denied")syscall.exit(1)return end;local h=b[1]if h:sub(1,1)~="/"then h=syscall.getcwd().."/"..h end;if not syscall.exists(h)then print(a..": cannot change root directory to '"..b[1].."': No such file or directory")syscall.exit(1)return end;if syscall.type(h)~="directory"then print(a..": '"..b[1].."': Not a directory")syscall.exit(1)return end;local i,j=pcall(syscall.chroot,h)if not i then print(a..": cannot change root directory to '"..b[1].."': "..tostring(j))syscall.exit(1)return end;local k;if#b>=2 then k=b[2]else local l=syscall.getuid()local m=syscall.getpasswd(l)k=m and m.shell or"/bin/hysh"end;local n={}for o=3,#b do table.insert(n,b[o])end;local p,q=pcall(syscall.exec,k,n)if not p then print(a..": failed to run command '"..k.."': "..tostring(q))syscall.exit(127)end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a={{name="cd",usage="cd [dir]",desc="Change working directory. Use '-' to return to previous directory.",flags={}},{name="pwd",usage="pwd",desc="Print current working directory.",flags={}},{name="ls",usage="ls [-alh] [dir]",desc="List directory contents. Coloured by type: dirs=blue, symlinks=cyan, executables=green.",flags={{"-a","Show hidden files (starting with .)"},{"-l","Long format: permissions, owner, group, size, mtime, name"},{"-h","Human-readable file sizes (with -l)"},{"--help","Display help and exit"}}},{name="find",usage="find [path] [-name PAT] [-type f|d|l] [-maxdepth N]",desc="Walk the filesystem tree and print matching paths.",flags={{"-name PAT","Match filename against shell glob (* and ?)"},{"-type f|d|l","Filter by file, directory, or symlink"},{"-maxdepth N","Descend at most N directory levels"},{"-mindepth N","Skip entries shallower than N levels"},{"-empty","Match empty files or empty directories"}}},{name="cp",usage="cp [-rRp] SOURCE... DEST",desc="Copy files or directories.",flags={{"-r,-R","Recurse into directories"},{"-p","Preserve permissions"},{"--help","Display help and exit"}}},{name="mv",usage="mv [-f] SOURCE... DEST",desc="Move or rename files and directories.",flags={{"-f","Do not prompt before overwriting (default)"},{"--help","Display help and exit"}}},{name="rm",usage="rm [-rRf] FILE...",desc="Remove files or directories.",flags={{"-r,-R","Recursively remove directories and their contents"},{"-f","Ignore nonexistent files, never prompt"},{"--help","Display help and exit"}}},{name="touch",usage="touch FILE...",desc="Create an empty file, or no-op if it already exists.",flags={}},{name="mkdir",usage="mkdir <dir>",desc="Create a directory.",flags={}},{name="ln",usage="ln -s [-f] TARGET LINK",desc="Create a symbolic link. Multiple targets can be linked into a directory.",flags={{"-s","Create a symbolic link (required; hard links not supported)"},{"-f","Remove existing destination before creating link"},{"--help","Display help and exit"}}},{name="cat",usage="cat [file...]",desc="Print file(s) to stdout. Reads stdin if no file given.",flags={}},{name="head",usage="head [-n N] [file...]",desc="Print the first N lines of each file (default 10).",flags={{"-n N","Number of lines to print"},{"--help","Display help and exit"}}},{name="tail",usage="tail [-n N] [file...]",desc="Print the last N lines of each file (default 10).",flags={{"-n N","Number of lines to print"},{"--help","Display help and exit"}}},{name="wc",usage="wc [-lwc] [file...]",desc="Count lines, words, and bytes in files.",flags={{"-l","Print line count"},{"-w","Print word count"},{"-c","Print byte count"},{"--help","Display help and exit"}}},{name="grep",usage="grep [-ivnlcrR] PATTERN [file...]",desc="Search for lines matching a Lua pattern.",flags={{"-i","Ignore case"},{"-v","Invert: select non-matching lines"},{"-n","Prefix output with line numbers"},{"-l","Print only filenames that contain a match"},{"-c","Print count of matching lines per file"},{"-r,-R","Recurse into directories"},{"--help","Display help and exit"}}},{name="sed",usage="sed 's/PAT/REPL/' [file...]",desc="Stream editor. Applies substitution commands to each line.",flags={}},{name="sort",usage="sort [-rnu] [file...]",desc="Sort lines of text.",flags={{"-r","Reverse the sort order"},{"-n","Numeric sort"},{"-u","Suppress duplicate lines"},{"--help","Display help and exit"}}},{name="uniq",usage="uniq [-cdui] [input [output]]",desc="Filter adjacent duplicate lines.",flags={{"-c","Prefix each line with its repetition count"},{"-d","Print only lines that appear more than once"},{"-u","Print only lines that appear exactly once"},{"-i","Ignore case when comparing"},{"--help","Display help and exit"}}},{name="tee",usage="tee [-a] [file...]",desc="Copy stdin to stdout and to each FILE simultaneously.",flags={{"-a","Append to files instead of overwriting"},{"--help","Display help and exit"}}},{name="basename",usage="basename STRING [SUFFIX]",desc="Strip directory and optional suffix from a path.",flags={}},{name="dirname",usage="dirname STRING...",desc="Strip the last component from a path.",flags={}},{name="readlink",usage="readlink [-fenq] file...",desc="Print the target of a symbolic link.",flags={{"-f","Canonicalize: follow every symlink component"},{"-e","Like -f but all components must exist"},{"-n","Do not output trailing newline"},{"--help","Display help and exit"}}},{name="stat",usage="stat file...",desc="Display file type, size, owner, group, and permissions.",flags={{"--help","Display help and exit"}}},{name="chmod",usage="chmod [-R] MODE file...",desc="Change file permissions. MODE may be octal (755) or symbolic (u+x).",flags={{"-R","Recurse into directories"},{"--help","Display help and exit"}}},{name="chown",usage="chown [-R] USER[:GROUP] file...",desc="Change file owner and/or group.",flags={{"-R","Recurse into directories"},{"--help","Display help and exit"}}},{name="chgrp",usage="chgrp [-R] GROUP file...",desc="Change file group ownersLine truncated
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=0x00FFFF;local b=0xFFFFFF;local c=0xDBDBDB;local d=0x6D6D6D;local e=0x00FF00;local function f(g)syscall.devctl(1,"sfgc",g)end;local h=syscall.getUsername()or"Unknown"local i=syscall.getHostname()or"Unknown"local j=h.."@"..i;local function k(l)local m=math.floor(l/1000)local n=math.floor(m/60)local o=math.floor(n/60)local p=math.floor(o/24)m=m%60;n=n%60;o=o%24;local q={}if p>0 then q[#q+1]=p.."d"end;if o>0 then q[#q+1]=o.."h"end;if n>0 then q[#q+1]=n.."m"end;q[#q+1]=m.."s"return table.concat(q," ")end;local r=syscall.getHost()or"Unknown"local s=r:match("ComputerCraft ([%d%.]+)")or r;local t={{nil,j},{nil,string.rep("-",#j)},{"OS",syscall.version()or"Unknown"},{"Host",s},{"Arch",syscall.arch()or"Unknown"},{"Uptime",k(syscall.getUptime()or 0)},{"Tasks",tostring(#(syscall.getTasks()or{}))},{"Shell",syscall.getEnviron("SHELL")or"Unknown"},{"Terminal","tty1"},{"UID",tostring(syscall.getuid())},{"Packages","n/a (spm)"}}local u={".. *. .. "," *= +@* +* "," .@#. -@@@= :#@. "," =@@+ *@@@# +@@= "," %@@%: *@@@# -%@@% "," :@@@@+ *@@@# .*@@@@: "," :*@@@%- *@@@# -@@@@*: "," =%@@#. *@@@# .#@@%= "," :=. :*@@= *@@@# =@@+: .=: "," %@#=..*# +@@@# #*..=#@# "," .@@@@+=# .%@%: #=+@@@@. "," .....=# -@= *+...:. "," -*%*-@= - =@-*%*- "," -@*. -@%. :%@- :*@- "," .#@#@* "," -#- "," "}local v=math.max(#u,#t)for w=1,v do local x=u[w]or string.rep(" ",36)f(a)printInline(x)f(c)printInline("| ")local y=t[w]if y then if y[1]==nil and w==1 then f(e)printInline(y[2])elseif y[1]==nil and w==2 then f(d)printInline(y[2])elseif y[1]then f(c)printInline(y[1]..": ")f(b)printInline(y[2])end end;f(b)print("")end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
syscall.open("/dev/tty/1","r")syscall.open("/dev/tty/1","w")syscall.open("/dev/null","w")local a,b=xpcall(function()local c=require("fs")syscall.devctl(1,"clear")syscall.devctl(1,"sfgc",0xFFFFFF)syscall.devctl(1,"spos",1,1)print("HyperionOS hysh Shell")local d=(syscall.getUsername()or"Unknown").."@"..(syscall.getHostname()or"Unknown")local e={}local f=false;syscall.setEnviron("SHELL","hysh")syscall.setEnviron("PATH","/bin/")local g=syscall.getEnviron("HOME")if g and g~=""then local h=pcall(syscall.chdir,g)if not h then syscall.chdir("/")end else syscall.chdir("/")end;local i=""local j={0xFFFFFF,0xFF0000,0x00FF00,0x0000FF,0x00FFFF,0xFF00FF,0xFFFF00,0xFF6D00,0x6DFF55,0x24FFFF,0x924900,0x6D6D55,0xDBDBAA,0x6D00FF,0xB6FF00,0x000000}for k=1,16 do syscall.devctl(1,"sbgc",j[k])printInline(" ")end;print("\n")syscall.sigcatch(function(l)if l==1 then f=true end end)local function m(n)if not n or n==""then return syscall.getcwd()end;if n:sub(1,1)~="/"then n=syscall.getcwd().."/"..n end;local o={}for p in n:gmatch("[^/]+")do if p==".."then if#o>0 then table.remove(o)end elseif p~="."then table.insert(o,p)end end;return"/"..table.concat(o,"/")end;local function q(n)n=n:gsub("/$","")return n:match("([^/]+)$")or n end;local function r(n)n=n:gsub("/$","")local s=n:match("^(.*)/[^/]+$")if not s then return"."end;if s==""then return"/"end;return s end;local function t(u)local v={}while true do local h,w=pcall(syscall.read,u,65536)if not h or not w or w==""then break end;v[#v+1]=w end;return table.concat(v)end;local function x(y)local h,u=pcall(syscall.open,y,"r")if not h then return nil,u end;local z=t(u)pcall(syscall.close,u)return z end;local function A(y,z)local h,u=pcall(syscall.open,y,"w")if not h then return false,u end;pcall(syscall.write,u,z)pcall(syscall.close,u)return true end;local function B(C,D,E)local F={}local G={}E=E or{}local k=1;while k<=#C do local H=C[k]if H=="--"then for I=k+1,#C do G[#G+1]=C[I]end;break elseif H:sub(1,2)=="--"then local J=H:sub(3)if E[J]~=nil then F[J]=true else F["_unknown"]=H end elseif H:sub(1,1)=="-"and#H>1 then for K=2,#H do local L=H:sub(K,K)if D:find(L,1,true)then F[L]=true else F["_unknown"]="-"..L end end else G[#G+1]=H end;k=k+1 end;return F,G end;local function M(N,O)local P=1;while P<=#N do local Q=N:find("\n",P,true)if Q then O(N:sub(P,Q-1))P=Q+1 else O(N:sub(P))break end end end;local function R(N)local S={}M(N,function(T)S[#S+1]=T end)return S end;local function U(V,W)local z,X=x(V)if not z then return false,X end;local h,Y=A(W,z)if not h then return false,Y end;return true end;local function Z(y)local v=syscall.type(y)if v=="directory"then local h,_=pcall(syscall.listdir,y)if h then for a0,a1 in ipairs(_)do Z(y:gsub("/$","").."/"..a1)end end end;if v then pcall(syscall.remove,y)end end;local function a2(V,W)pcall(syscall.mkdir,W)local h,_=pcall(syscall.listdir,V)if not h then return end;for a0,a1 in ipairs(_)do local a3=V:gsub("/$","").."/"..a1;local s=W:gsub("/$","").."/"..a1;local v=syscall.type(a3)if v=="directory"then a2(a3,s)elseif v=="file"then U(a3,s)elseif v=="symlink"then local a4,a5=pcall(syscall.readlink,a3)if a4 then pcall(syscall.remove,s)pcall(syscall.symlink,a5,s)end end end end;local a6={}a6.cd=function(y)local a7=syscall.getcwd()local a8=y or""if a8=="-"then if i==""then print("hysh: cd: no previous directory")return end;print(i)local a9=i;i=a7;syscall.chdir(a9)return end;local aa=m(a8)if aa:sub(-1)~="/"then aa=aa.."/"end;if not c.isDir(aa)then print("hysh: cd: "..a8 ..": No such directory")return end;i=a7;syscall.chdir(aa)end;a6.exit=function(ab)syscall.exit(tonumber(ab)or 0)end;a6.echo=function(...)local G={...}local ac=false;local ad=1;if G[1]=="-n"then ac=true;ad=2 end;local ae=table.concat(G," ",ad)if ac then printInline(ae)else print(ae)end end;a6.pwd=function()print(syscall.getcwd())end;a6["true"]=function()end;a6["false"]=function()end;a6.sleep=function(...)local G={...}if#G==0 then print("sleep: missing operand")return end;local af=0;for a0,ag in ipairs(G)do local ac,ah=ag:match("^([%d%.]+)([smhd]?)$")if not ac then print("sleep: invalid time '"..ag.."'")return end;ac=tonumber(ac)if ah=="m"then ac=ac*60 elseif ah=="h"then ac=ac*3600 elseif ah=="d"then ac=ac*86400 end;af=af+ac end;sleep(af)end;a6.clear=function()syscall.devctl(1,"clear")syscall.devctl(1,"sfgc",0xFFFFFF)syscall.devctl(1,"spos",1,1)end;a6.whoami=function()print(syscall.getUsername()or"unknown")end;a6.hostname=function(...)local G={...}if#G==0 then print(syscall.getHostname()or"unknown")else local h,X=pcall(syscall.setHostname,G[1])if not h then print("hostname: "..tostring(X))end end end;a6.uname=function(...)local F,a0=B({...},"asnrm")local ai=F.a;local o={}local aj={}for ak in string.gmatch(syscall.version(),"%S+")do table.insert(aj,ak)end;if ai or F.s or not F.s and not F.n and not F.r and not F.m then o[#o+1]=aj[1]end;if ai or F.n then o[#o+1]=syscall.getHostname()or"hyperion"end;if ai or F.r then o[#o+1]=aj[2]end;if ai or F.m then o[#o+1]="virtual"end;print(table.concat(o," Line truncated
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a={...}local b;if a[1]then b=syscall.getuid(a[1])if not b then print("id: user '"..a[1].."' does not exist")syscall.exit(1)return end else b=syscall.getuid()end;local c=syscall.getpasswd(b)local d=c and c.username or tostring(b)local e=c and c.gid or b;print(string.format("uid=%d(%s) gid=%d(%s)",b,d,e,d))
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
local args={...}
|
||||||
|
table.insert(args, "-lah")
|
||||||
|
syscall.exec("/bin/ls", args)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=syscall.getTask(syscall.getpid()).name;local b={s=false,f=false,help=false}local c={}for d,e in ipairs({...})do if e:sub(1,2)=="--"then local f=e:sub(3)if b[f]==nil then print(a..": unrecognized option '"..e.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;b[f]=true elseif e:sub(1,1)=="-"then for g=2,#e do local f=e:sub(g,g)if b[f]==nil then print(a..": invalid option '-"..f.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;b[f]=true end else table.insert(c,e)end end;if b.help then print("Usage: "..a.." [OPTION]... TARGET LINK_NAME")print(" "..a.." [OPTION]... TARGET... DIRECTORY")print("Create links between files.")print("")print("Options:")print(" -s make symbolic links instead of hard links")print(" -f remove existing destination files")print(" --help display this help and exit")print("")print("With no -s, hard links are not supported (filesystem limitation).")print("Use -s for symbolic links.")return end;if#c<2 then print(a..": missing operand")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;if not b.s then print(a..": hard links are not supported; use -s for symbolic links")syscall.exit(1)return end;local h=c[#c]local i=syscall.type(h)=="directory"local function j()local k=syscall.getcwd()if k:sub(-1)~="/"then k=k.."/"end;return k end;local function l(m)if m:sub(1,1)~="/"then m=j()..m end;return m end;for g=1,#c-1 do local n=c[g]local o;if i then local p=n:match("[^/]+$")or n;o=l(h)if o:sub(-1)~="/"then o=o.."/"end;o=o..p else o=l(h)end;if b.f and syscall.exists(o)then local q,r=pcall(syscall.remove,o)if not q then print(a..": cannot remove '"..o.."': "..tostring(r))syscall.exit(1)return end end;local q,r=pcall(syscall.symlink,n,o)if not q then print(a..": failed to create symlink '"..o.."' -> '"..n.."': "..tostring(r))syscall.exit(1)return end end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
syscall.open("/dev/tty/1","r")syscall.open("/dev/tty/1","w")syscall.open("/dev/null","w")local a=3;local function b(c)local d=""while true do local e=syscall.read(0)if not e or e==""then elseif e=="\n"then syscall.write(1,"\n")return d elseif e=="\b"then if#d>0 then d=d:sub(1,-2)syscall.write(1,"\b \b")end else d=d..e;syscall.write(1,c or e)end end end;local function f()local g=""local h,i=pcall(function()local j=syscall.open("/etc/shadow","r")g=syscall.read(j,65535)or""syscall.close(j)end)if g:match("%S")then return end;syscall.devctl(1,"clear")syscall.devctl(1,"spos",1,1)syscall.devctl(1,"sfgc",0x00FF00)syscall.write(1,"HyperionOS First Boot Setup\n")syscall.devctl(1,"sfgc",0xFFFFFF)syscall.write(1,"No root password is set. Please create one now.\n\n")while true do syscall.write(1,"New root password: ")local k=b("*")syscall.write(1,"Confirm password: ")local l=b("*")if k~=l then syscall.devctl(1,"sfgc",0xFF0000)syscall.write(1,"Passwords do not match. Try again.\n\n")syscall.devctl(1,"sfgc",0xFFFFFF)elseif#k<6 then syscall.devctl(1,"sfgc",0xFF0000)syscall.write(1,"Password too short (minimum 6 characters).\n\n")syscall.devctl(1,"sfgc",0xFFFFFF)else local m,n=syscall.setpassword(0,k)if m then syscall.devctl(1,"sfgc",0x00FF00)syscall.write(1,"Root password set.\n\n")syscall.devctl(1,"sfgc",0xFFFFFF)sleep(0.5)break else syscall.devctl(1,"sfgc",0xFF0000)syscall.write(1,"Error: "..tostring(n).."\n")syscall.devctl(1,"sfgc",0xFFFFFF)end end end end;local function o(p,q,r,s)local t,u=pcall(syscall.exists,r)if not t or not u then syscall.write(1,"login: shell not found: "..r.."\n")sleep(2)return false end;local v,w=pcall(syscall.access,r,"rx")syscall.setEnviron("HOME",s)syscall.setEnviron("USER",p)syscall.setEnviron("SHELL",r)syscall.setEnviron("PATH","/bin/")local x,y=pcall(syscall.setuid,q)if not x then syscall.write(1,"login: setuid failed: "..tostring(y).."\n")sleep(2)return false end;local z,A=pcall(syscall.chdir,s)if not z then pcall(syscall.chdir,"/")end;local m,n=pcall(syscall.execspawn,r,p..":shell")if not m then syscall.write(1,"login: failed to launch shell: "..tostring(n).."\n")sleep(2)return false end;syscall.exit(0)end;local function B()syscall.devctl(1,"clear")syscall.devctl(1,"sfgc",0xFFFFFF)syscall.devctl(1,"sbgc",0x000000)syscall.devctl(1,"spos",1,1)local C=syscall.getHostname()or"hyperion"syscall.write(1,"HyperionOS\n")syscall.write(1,C.." login\n\n")local D=0;while D<a do syscall.devctl(1,"sfgc",0xFFFFFF)syscall.write(1,"Username: ")local p=b(nil)if p~=""then syscall.write(1,"Password: ")local E=b("*")local q=syscall.getuidbyname(p)local m,n=syscall.login(q,E)if m then local q=syscall.getuid()local F=syscall.getpasswd(q)local r=F and F.shell or"/bin/hysh"local s=F and F.homedir or"/"syscall.devctl(1,"sfgc",0x00FF00)syscall.write(1,"\nWelcome, "..p.."!\n")syscall.devctl(1,"sfgc",0xFFFFFF)sleep(0.3)o(p,q,r,s)return else D=D+1;sleep(1)syscall.devctl(1,"sfgc",0xFF0000)syscall.write(1,"Login incorrect.\n\n")syscall.devctl(1,"sfgc",0xFFFFFF)end end end;syscall.devctl(1,"sfgc",0xFF0000)syscall.write(1,"Maximum login attempts exceeded.\n")syscall.devctl(1,"sfgc",0xFFFFFF)sleep(5)end;f()while true do B()end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=syscall.getTask(syscall.getpid()).name;local b,c={},{x=false,help=false}for d,e in ipairs({...})do if e:sub(1,2)=="--"then local f=e:sub(3)if f=="help"then c.help=true else print(a..": unrecognised option '"..e.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end elseif e:sub(1,1)=="-"then for g=2,#e do local h=e:sub(g,g)if c[h]~=nil then c[h]=true else print(a..": invalid option '-"..h.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end end else table.insert(b,e)end end;if c.help then print("Usage: "..a.." <srcdir> <image.hfs>")print(" "..a.." -x <image.hfs> <destdir>")print("")print("Pack a directory into a portable HFS image file, or extract one.")print("")print(" <srcdir> <image.hfs> recursively pack srcdir into image.hfs")print(" -x <image.hfs> <dest> extract image.hfs into dest (created if needed)")print("")print("HFS images can be mounted with:")print(" mount -o loop /path/to/image.hfs /mnt/point")print("")print("Requires root.")return end;local i=require("fs")if c.x then if#b<2 then print(a..": -x requires <image.hfs> and <destdir>")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;local j=b[1]local k=b[2]if j:sub(1,1)~="/"then j=syscall.getcwd().."/"..j end;if k:sub(1,1)~="/"then k=syscall.getcwd().."/"..k end;local l="/tmp/._loimgcreate_"..tostring(math.random(100000,999999))local m,n=pcall(syscall.losetup,j,true)if not m then print(a..": losetup: "..tostring(n))syscall.exit(1)return end;local o,p=pcall(syscall.mount,l,n)if not o then pcall(syscall.lodetach,n)print(a..": mount: "..tostring(p))syscall.exit(1)return end;if not i.isDir(k)then local q,r=pcall(syscall.mkdir,k)if not q then pcall(syscall.umount,l)pcall(syscall.lodetach,n)print(a..": mkdir '"..b[2].."': "..tostring(r))syscall.exit(1)return end end;local s=0;local function t(u,v)local w=i.list(u)if not w then return end;for d,x in ipairs(w)do local y=u:gsub("/$","").."/"..x;local z=v:gsub("/$","").."/"..x;if i.isDir(y)then pcall(syscall.mkdir,z)t(y,z)else local A,B=pcall(syscall.open,y,"r")if A then local o,C=pcall(syscall.open,z,"w")if o then local q,D=pcall(syscall.read,B,65536*16)if q and D then pcall(syscall.write,C,D)end;pcall(syscall.close,C)s=s+1 end;pcall(syscall.close,B)end end end end;t(l,k)pcall(syscall.umount,l)pcall(syscall.lodetach,n)syscall.devctl(1,"sfgc",0x00FFFF)print(a..": extracted "..s.." file(s) to "..k)syscall.devctl(1,"sfgc",0xFFFFFF)return end;if#b<2 then print(a..": missing operands — need <srcdir> and <image.hfs>")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;local E=b[1]local j=b[2]if E:sub(1,1)~="/"then E=syscall.getcwd().."/"..E end;if j:sub(1,1)~="/"then j=syscall.getcwd().."/"..j end;if not i.isDir(E)then print(a..": '"..b[1].."': not a directory")syscall.exit(1)return end;local A,F=pcall(syscall.loimgcreate,E)if not A then local G=tostring(F)if G:find("EPERM")then G="Permission denied"elseif G:find("ENOTDIR")then G="'"..b[1].."': not a directory"end;print(a..": "..G)syscall.exit(1)return end;local o,H=pcall(syscall.loimgwrite,F,j)if not o then print(a..": write '"..b[2].."': "..tostring(H))syscall.exit(1)return end;local I=0;for d in F:gmatch("\n")do I=I+1 end;local J=#F;syscall.devctl(1,"sfgc",0x00FFFF)print(a..": image written to "..j)syscall.devctl(1,"sfgc",0x6D00FF)print(string.format(" %d records, %d bytes",I-1,J))syscall.devctl(1,"sfgc",0xFFFFFF)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=syscall.getTask(syscall.getpid()).name;local b,c={},{d=false,l=false,i=false,help=false}for d,e in ipairs({...})do if e:sub(1,2)=="--"then local f=e:sub(3)if f=="help"then c.help=true else print(a..": unrecognised option '"..e.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end elseif e:sub(1,1)=="-"then for g=2,#e do local h=e:sub(g,g)if c[h]~=nil then c[h]=true else print(a..": invalid option '-"..h.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end end else table.insert(b,e)end end;if c.help then print("Usage: "..a.." <path>")print(" "..a.." -i <path>")print(" "..a.." -d <id>")print(" "..a.." -l")print("")print("Manage loop devices.")print("")print(" <path> attach a directory (bind) or .hfs image file")print(" -i <path> force image mode for the given file")print(" -d <id> detach loop device by id (must be unmounted first)")print(" -l list all currently attached loop devices")print("")print("Requires root. Loop device ids look like loop0, loop1, …")return end;if c.l then local i,j=pcall(syscall.lolist)if not i then print(a..": "..tostring(j))syscall.exit(1)return end;local k=false;local l={}for m in pairs(j)do l[#l+1]=m end;table.sort(l)for d,m in ipairs(l)do k=true;local n=j[m]local o=type(n)=="table"and n.mode or"bind"local p=type(n)=="table"and n.path or tostring(n)local q=o=="image"and 0x00FFFF or 0x0000FF;syscall.devctl(1,"sfgc",0x00FF00)printInline(string.format("%-10s",m))syscall.devctl(1,"sfgc",q)printInline(string.format("%-7s","["..o.."]"))syscall.devctl(1,"sfgc",0xFFFFFF)print(" "..p)end;if not k then syscall.devctl(1,"sfgc",0x6D00FF)print(a..": no loop devices attached")syscall.devctl(1,"sfgc",0xFFFFFF)end;return end;if c.d then if#b<1 then print(a..": -d requires a loop device id")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;local m=b[1]local i,r=pcall(syscall.lodetach,m)if not i then local s=tostring(r)if s:find("EPERM")then s="Permission denied"elseif s:find("ENXIO")then s="no such loop device '"..m.."'"elseif s:find("EBUSY")then s="device '"..m.."' is still mounted, unmount first"end;print(a..": "..s)syscall.exit(1)return end;syscall.devctl(1,"sfgc",0x00FFFF)print(a..": detached "..m)syscall.devctl(1,"sfgc",0xFFFFFF)return end;if#b<1 then print(a..": missing path operand")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;local p=b[1]if p:sub(1,1)~="/"then p=syscall.getcwd().."/"..p end;local t=syscall.type and syscall.type(p)if not(t=="file"or t=="directory")then print(a..": '"..b[1].."': no such file or directory")syscall.exit(1)return end;local i,u=pcall(syscall.losetup,p,c.i or nil)if not i then local s=tostring(u)if s:find("EPERM")then s="Permission denied"elseif s:find("ENOENT")then s="'"..b[1].."': no such file"elseif s:find("EINVAL")then s="'"..b[1].."': not a directory or .hfs image"elseif s:find("EIO")then s="'"..b[1].."': I/O error reading image"end;print(a..": "..s)syscall.exit(1)return end;print(u)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a={a=false,h=false,l=false,help=false}local b={...}local c={}local d=syscall.getTask(syscall.getpid()).name;for e,f in pairs(b)do if f:sub(1,2)=="--"then local g=f:sub(3)if a[g]==nil then print(d..": unrecognized option '"..f.."'.")print("try '"..d.." --help' for more information.")return end;a[g]=true elseif f:sub(1,1)=="-"then for h=2,#f do local g=f:sub(h,h)if a[g]==nil then print(d..": invalid option '-"..g.."'.")print("try '"..d.." --help' for more information.")return end;a[g]=true end else table.insert(c,f)end end;if a.help then print("Usage: "..d.." [OPTION]... [DIR]")print("List all entries in the specified DIRectory, or cwd if not specified.")print("")print("Options:")print(" -a do not ignore entries starting with .")print(" -h with -l, print sizes in human readable format")print(" -l use a long listing format")print(" --help display this help and exit")return end;local i=require("fs")local j=c[1]or""if j:sub(1,1)~="/"then j=syscall.getcwd().."/"..j end;if j:sub(-1)~="/"then j=j.."/"end;if not i.isDir(j)then print(d..": cannot access '"..(c[1]or j).."': no such directory")return end;local function k(l,m)local function n(o)return math.floor(l/2^o)%2==1 end;local p;if m==0x01 then p="l"elseif m==nil then p="-"else p="-"end;local q=n(5)and"r"or"-"local r=n(4)and"w"or"-"local s=n(9)and(n(6)and"s"or"x")or(n(6)and"S"or"-")local t=n(3)and"r"or"-"local u=n(2)and"w"or"-"local v=n(8)and"x"or"-"local w=n(1)and"r"or"-"local x=n(0)and"w"or"-"local y=n(7)and"x"or"-"return p..q..r..s..t..u..v..w..x..y end;local z={"K","M","G","T"}local function A(B)local C=0;while B>=1024 and C<#z do B=B/1024;C=C+1 end;if C==0 then return tostring(B).."B"end;if B<10 then return string.format("%.1f%s",B,z[C])end;return math.floor(B)..z[C]end;local D=syscall.devctl(1,"size")local E=tonumber(D:match("^(%d+)"))or 80;local F=i.list(j)if not a.a then for h=#F,1,-1 do if F[h]:sub(1,1)=="."then table.remove(F,h)end end end;table.sort(F)if#F==0 then return end;if a.l then for e,f in ipairs(F)do local G=j..f;local H=syscall.lstat and syscall.lstat(G)or syscall.stat(G)local I=i.isDir(G)local J=H and H.etype==0x01;local isSock=H and H.etype==0x02;local K;if J then K="l"elseif I then K="d"elseif isSock then K="s"else K="-"end;local L;if H and H.perms then L=k(H.perms,H.etype)else L=K.."---------"end;local B=H and H.size or 0;local M=a.h and A(B)or tostring(B)local N=H and H.modified and math.floor(H.modified/1000)or 0;local O=H and tostring(H.owner)or"0"local P=H and tostring(H.group)or"0"printInline(L.." "..O.." "..P.." ")printInline(string.format("%6s",M).." ")printInline(tostring(N).." ")if J then syscall.devctl(1,"sfgc",0x00FFFF)printInline(f)syscall.devctl(1,"sfgc",0xFFFFFF)local Q,R=pcall(syscall.readlink,G)if Q then printInline(" -> ")local S=pcall(syscall.stat,G)syscall.devctl(1,"sfgc",S and 0x00FFFF or 0xFF0000)printInline(R)syscall.devctl(1,"sfgc",0xFFFFFF)end elseif I then syscall.devctl(1,"sfgc",0x6D00FF)printInline(f)syscall.devctl(1,"sfgc",0xFFFFFF)elseif isSock then syscall.devctl(1,"sfgc",0xFF00FF)printInline(f)syscall.devctl(1,"sfgc",0xFFFFFF)else local T=H and H.perms and math.floor(H.perms/2^9)%2==1;syscall.devctl(1,"sfgc",T and 0x00FF00 or 0xFFFFFF)printInline(f)syscall.devctl(1,"sfgc",0xFFFFFF)end;print("")end;return end;local U=0;for e,f in ipairs(F)do if#f+2>U then U=#f+2 end end;local V=math.max(1,math.floor(E/U))for h,f in ipairs(F)do local G=j..f;local I=i.isDir(G)local H=syscall.lstat and syscall.lstat(G)or syscall.stat(G)local J=H and H.etype==0x01;if J then syscall.devctl(1,"sfgc",0x00FFFF)elseif I then syscall.devctl(1,"sfgc",0x6D00FF)elseif isSock then syscall.devctl(1,"sfgc",0xFF00FF)else local T=H and H.perms and math.floor(H.perms/2^9)%2==1;syscall.devctl(1,"sfgc",T and 0x00FF00 or 0xFFFFFF)end;printInline(f)syscall.devctl(1,"sfgc",0xFFFFFF)printInline((" "):rep(U-#f))if h%V==0 then print("")end end;if#F%V~=0 then print("")end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=syscall.listusers()if not a or#a==0 then print("No users found.")return end;syscall.devctl(1,"sfgc",0xDBDBDB)print(string.format("%-6s %-6s %-16s %-20s %s","UID","GID","Username","Home","Shell"))print(string.rep("-",65))syscall.devctl(1,"sfgc",0xFFFFFF)for b,c in ipairs(a)do local d=c.locked and" [locked]"or""if c.locked then syscall.devctl(1,"sfgc",0xFF0000)end;print(string.format("%-6d %-6d %-16s %-20s %s%s",c.uid,c.gid,c.username,c.homedir,c.shell,d))if c.locked then syscall.devctl(1,"sfgc",0xFFFFFF)end end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=syscall.getTask(syscall.getpid()).name;local b,c={},{help=false,o=nil}local d=1;local e={...}while d<=#e do local f=e[d]if f:sub(1,2)=="--"then local g=f:sub(3)if g=="help"then c.help=true else print(a..": unrecognised option '"..f.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end elseif f=="-o"then d=d+1;c.o=e[d]elseif f:sub(1,1)=="-"then local h=f:sub(2)if h:sub(1,1)=="o"then if#h>1 then c.o=h:sub(2)else d=d+1;c.o=e[d]end else print(a..": invalid option '"..f.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end else table.insert(b,f)end;d=d+1 end;if c.help then print("Usage: "..a)print(" "..a.." <id> <mountpoint>")print(" "..a.." -o loop <source> <mountpoint>")print("")print("Mount a loop device or filesystem.")print("")print(" (no args) list all active mount points")print(" <id> <mountpoint> mount an already-attached loop device")print(" -o loop <src> <dest> attach src as loop device and mount at dest")print(" src can be a directory (bind) or .hfs image")print("")print("Requires root for all operations except listing.")return end;if#b==0 and not c.o then local i,j=pcall(syscall.mounts or function()error("ENOSYS")end)local k={}local l,m=pcall(syscall.lolist)if l then for n,o in pairs(m)do local p=type(o)=="table"and o.path or tostring(o)local q=type(o)=="table"and o.mode or"bind"k[n]={path=p,mode=q}end end;if next(k)==nil then syscall.devctl(1,"sfgc",0xFF00FF)print("(no loop devices attached)")syscall.devctl(1,"sfgc",0xFFFFFF)return end;for n,o in pairs(k)do local r=o.mode=="image"and 0x00FFFF or 0x0000FF;syscall.devctl(1,"sfgc",r)printInline(o.mode.." "..n)syscall.devctl(1,"sfgc",0xFFFFFF)print(" on "..o.path)end;return end;if c.o and c.o:lower()=="loop"then if#b<2 then print(a..": -o loop requires <source> and <mountpoint>")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;local s=b[1]local t=b[2]if s:sub(1,1)~="/"then s=syscall.getcwd().."/"..s end;if t:sub(1,1)~="/"then t=syscall.getcwd().."/"..t end;local i,u=pcall(syscall.losetup,s)if not i then local v=tostring(u)if v:find("EPERM")then v="Permission denied"elseif v:find("EINVAL")then v="'"..b[1].."': not a directory or .hfs image"elseif v:find("EIO")then v="'"..b[1].."': I/O error reading image"end;print(a..": losetup: "..v)syscall.exit(1)return end;local w,x=pcall(syscall.mount,t,u)if not w then pcall(syscall.lodetach,u)local v=tostring(x)if v:find("EPERM")then v="Permission denied"elseif v:find("EBUSY")then v="'"..t.."' is already a mount point"elseif v:find("ENODEV")then v="loop device not found (internal error)"end;print(a..": mount: "..v)syscall.exit(1)return end;syscall.devctl(1,"sfgc",0x00FFFF)print(a..": "..u.." mounted at "..t)syscall.devctl(1,"sfgc",0xFFFFFF)return end;if#b==2 then local u=b[1]local t=b[2]if t:sub(1,1)~="/"then t=syscall.getcwd().."/"..t end;local i,y=pcall(syscall.mount,t,u)if not i then local v=tostring(y)if v:find("EPERM")then v="Permission denied"elseif v:find("ENODEV")then v="'"..u.."': no such device - use losetup first"elseif v:find("EBUSY")then v="'"..t.."' is already a mount point"elseif v:find("EINVAL")then v="invalid arguments"end;print(a..": "..v)syscall.exit(1)return end;syscall.devctl(1,"sfgc",0x00FFFF)print(a..": "..u.." mounted at "..t)syscall.devctl(1,"sfgc",0xFFFFFF)return end;print(a..": wrong number of arguments")print("try '"..a.." --help' for more information.")syscall.exit(1)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a={...}local b=a[1]local c=syscall.getuid()local d;if b then d=syscall.getuid()if not d then print("passwd: user '"..b.."' does not exist")syscall.exit(1)return end;if c~=0 and d~=c then print("passwd: permission denied")syscall.exit(1)return end else d=c;b=syscall.getUsername(c)or tostring(c)end;if c~=0 then printInline("Current password: ")local e=""while true do local f=syscall.read(0)if not f or f==""then elseif f=="\n"then syscall.write(1,"\n")break elseif f=="\b"then if#e>0 then e=e:sub(1,-2)syscall.write(1,"\b \b")end else e=e..f;syscall.write(1,"*")end end;local g,h=syscall.login(d,e)if not g then sleep(1)print("passwd: authentication failure")syscall.exit(1)return end end;printInline("New password: ")local i=""while true do local f=syscall.read(0)if not f or f==""then elseif f=="\n"then syscall.write(1,"\n")break elseif f=="\b"then if#i>0 then i=i:sub(1,-2)syscall.write(1,"\b \b")end else i=i..f;syscall.write(1,"*")end end;printInline("Confirm password: ")local j=""while true do local f=syscall.read(0)if not f or f==""then elseif f=="\n"then syscall.write(1,"\n")break elseif f=="\b"then if#j>0 then j=j:sub(1,-2)syscall.write(1,"\b \b")end else j=j..f;syscall.write(1,"*")end end;if i~=j then print("passwd: passwords do not match")syscall.exit(1)return end;local g,h=syscall.setpassword(d,i)if not g then print("passwd: "..tostring(h))syscall.exit(1)return end;print("passwd: password updated for '"..b.."'")
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
for a,b in ipairs(syscall.getTasks())do local c=syscall.getTask(b)print(c.pid,c.username,c.name,c.status)end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=syscall.getTask(syscall.getpid()).name;local b={n=false,f=false,e=false,help=false}local c={}for d,e in ipairs({...})do if e:sub(1,2)=="--"then local f=e:sub(3)if b[f]==nil then print(a..": unrecognized option '"..e.."'")syscall.exit(1)return end;b[f]=true elseif e:sub(1,1)=="-"then for g=2,#e do local f=e:sub(g,g)if b[f]==nil then print(a..": invalid option '-"..f.."'")syscall.exit(1)return end;b[f]=true end else table.insert(c,e)end end;if b.help then print("Usage: "..a.." [OPTION]... FILE...")print("Print the resolved target of symbolic links.")print("")print("Options:")print(" -f canonicalize: follow every symlink; last component need not exist")print(" -e like -f but all components must exist")print(" -n do not output trailing newline")print(" --help display this help and exit")return end;if#c==0 then print(a..": missing operand")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;local function h(i)if i:sub(1,1)~="/"then local j=syscall.getcwd()if j:sub(-1)~="/"then j=j.."/"end;i=j..i end;return i end;local k=false;for d,l in ipairs(c)do l=h(l)if b.f or b.e then local m,n=pcall(syscall.stat,l)if not m then if b.e then print(a..": "..l..": "..tostring(n))k=true else if not b.n then print(l)else printInline(l)end end else if not b.n then print(l)else printInline(l)end end else local m,o=pcall(syscall.readlink,l)if not m then print(a..": "..l..": "..tostring(o))k=true else if not b.n then print(o)else printInline(o)end end end end;if k then syscall.exit(1)end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=({...})[1]local b=syscall.getuid()if syscall.geteuid()~=0 then syscall.exec("/bin/su",{...})end;local c;if a then c=syscall.getuidbyname(a)else c=0 end;if not c then print("su: user '"..a.."' does not exist")syscall.exit(1)return end;if b~=0 then printInline("Password: ")local d=""while true do local e=syscall.read(0)if not e or e==""then elseif e=="\n"then syscall.write(1,"\n")break elseif e=="\b"then if#d>0 then d=d:sub(1,-2)syscall.write(1,"\b \b")end else d=d..e;syscall.write(1,"*")end end;local f,g=syscall.login(c,d)if not f then sleep(1)print("su: Authentication failure")syscall.exit(1)return end else syscall.setuid(c)end;local h=syscall.getpasswd(c)local i=h and h.shell or"/bin/hysh"local j=h and h.homedir or"/"local k=h and h.username or"Unknown"local l,m=pcall(syscall.chdir,j)if not l then j="/"syscall.chdir(j)end;syscall.setEnviron("HOME",j)syscall.setEnviron("USER",k)syscall.setEnviron("SHELL",i)local f,g=pcall(syscall.exec,i)if not f then print("su: cannot exec shell '"..i.."': "..tostring(g))syscall.exit(1)end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=require("fs")local b={...}local c="root"local d=1;if b[d]=="-u"then d=d+1;local e=b[d]or"root"local f=tonumber(e)if f then local g=syscall.getpasswd(f)c=g and g.username or e else c=e end;d=d+1 end;local h=b[d]if not h or h==""then print("usage: sudo [-u user] <command> [args...]")syscall.exit(1)return end;local i={}for j=d+1,#b do i[#i+1]=b[j]end;local k=syscall.getuid()local l=syscall.getUsername(k)or tostring(k)local m=syscall.getuidbyname(c)if not m then print("sudo: user '"..c.."' does not exist")syscall.exit(1)return end;if k~=0 then printInline("[sudo] password for root: ")local n=""while true do local o=syscall.read(0)if not o or o==""then elseif o=="\n"then syscall.write(1,"\n")break elseif o=="\b"then if#n>0 then n=n:sub(1,-2)syscall.write(1,"\b \b")end else n=n..o;syscall.write(1,"*")end end;local p,q=syscall.login(0,n)if not p then sleep(1)print("sudo: Authentication failure")syscall.exit(1)return end;if m~=k then syscall.setuid(m)end else if m~=k then syscall.setuid(m)end end;local r=""if h:find("/")then if a.exists(h)then r=h end else local s=string.split(syscall.getEnviron("PATH")or"/bin/",":")for t,u in ipairs(s)do local v=u..h;if a.exists(v)then r=v;break end end end;if r==""then print("sudo: command not found: "..h)syscall.exit(1)return end;local w=a.readAllText(r)local x,y=load(w,"@"..r)if not x then print("sudo: cannot load "..h..": "..tostring(y))syscall.exit(1)return end;local g=syscall.getpasswd(m)if g and g.homedir then syscall.setEnviron("HOME",g.homedir)end;syscall.setEnviron("USER",c)local p,q=xpcall(x,debug.traceback,table.unpack(i))if not p then print("sudo: "..h..": "..tostring(q))syscall.exit(1)end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=...a=a or"/dev/tty/1"local b=syscall.sysdump()local c=syscall.open(a,"w")for d=1,#b do syscall.write(c,b[d].."\n")end;syscall.write(c,"Total # of syscalls: "..tostring(#b))syscall.close(c)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a=syscall.getTask(syscall.getpid()).name;local b,c={},{l=false,["no-detach"]=false,help=false}for d,e in ipairs({...})do if e:sub(1,2)=="--"then local f=e:sub(3)if c[f]~=nil then c[f]=true else print(a..": unrecognised option '"..e.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end elseif e:sub(1,1)=="-"then for g=2,#e do local h=e:sub(g,g)if c[h]~=nil then c[h]=true else print(a..": invalid option '-"..h.."'")print("try '"..a.." --help' for more information.")syscall.exit(1)return end end else table.insert(b,e)end end;if c.help then print("Usage: "..a.." <mountpoint>")print(" "..a.." --no-detach <mountpoint>")print(" "..a.." -l <loopid>")print("")print("Unmount a filesystem mounted at <mountpoint>.")print("")print(" <mountpoint> unmount and auto-detach any loop device")print(" --no-detach unmount but keep the loop device attached")print(" -l <loopid> forcibly detach a loop device (no unmount)")print("")print("Requires root.")return end;if c.l then if#b<1 then print(a..": -l requires a loop device id")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;local i=b[1]local j,k=pcall(syscall.lodetach,i)if not j then local l=tostring(k)if l:find("EPERM")then l="Permission denied"elseif l:find("ENXIO")then l="no such loop device '"..i.."'"elseif l:find("EBUSY")then l="'"..i.."' is still mounted - unmount first or omit -l"end;print(a..": "..l)syscall.exit(1)return end;syscall.devctl(1,"sfgc",0x00FFFF)print(a..": detached "..i)syscall.devctl(1,"sfgc",0xFFFFFF)return end;if#b<1 then print(a..": missing mount point operand")print("try '"..a.." --help' for more information.")syscall.exit(1)return end;local m=b[1]if m:sub(1,1)~="/"then m=syscall.getcwd().."/"..m end;local n=nil;if not c["no-detach"]then local o,p=pcall(syscall.lolist)if o then n={}for i in pairs(p)do n[#n+1]=i end end end;local j,k=pcall(syscall.umount,m)if not j then local l=tostring(k)if l:find("EPERM")then l="Permission denied"elseif l:find("EINVAL")then l="'"..b[1].."' is not a mount point"elseif l:find("EBUSY")then l="'"..b[1].."' is busy - close open files first"end;print(a..": "..l)syscall.exit(1)return end;syscall.devctl(1,"sfgc",0x00FFFF)print(a..": unmounted "..m)syscall.devctl(1,"sfgc",0xFFFFFF)if n then for d,i in ipairs(n)do local q=pcall(syscall.lodetach,i)if q then syscall.devctl(1,"sfgc",0xFF00FF)print(a..": auto-detached "..i)syscall.devctl(1,"sfgc",0xFFFFFF)end end end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a={...}local b=1;local c={createHome=true}while b<=#a do local d=a[b]if d=="-p"then b=b+1;c.password=a[b]elseif d=="-g"then b=b+1;c.gid=tonumber(a[b])elseif d=="-d"then b=b+1;c.homedir=a[b]elseif d=="-s"then b=b+1;c.shell=a[b]elseif d=="-M"then c.createHome=false elseif d:sub(1,1)~="-"then c.username=d else print("useradd: unknown option: "..d)return end;b=b+1 end;if not c.username then print("Usage: useradd [-p password] [-g gid] [-d homedir] [-s shell] [-M] <username>")syscall.exit(1)return end;local e=c.password;if not e then printInline("New password: ")e=""while true do local f=syscall.read(0)if not f or f==""then elseif f=="\n"then syscall.write(1,"\n")break elseif f=="\b"then if#e>0 then e=e:sub(1,-2)syscall.write(1,"\b \b")end else e=e..f;syscall.write(1,"*")end end;printInline("Confirm password: ")local g=""while true do local f=syscall.read(0)if not f or f==""then elseif f=="\n"then syscall.write(1,"\n")break elseif f=="\b"then if#g>0 then g=g:sub(1,-2)syscall.write(1,"\b \b")end else g=g..f;syscall.write(1,"*")end end;if e~=g then print("useradd: passwords do not match")syscall.exit(1)return end end;local h,i=syscall.newuser(c.username,e,c.gid,c.homedir,c.shell or"/bin/hysh")if not h then print("useradd: "..tostring(i))syscall.exit(1)return end;if c.createHome then local j=c.homedir or"/home/"..c.username;local k,l=pcall(syscall.mkdir,j)if not k then print("useradd: warning: could not create home "..j..": "..tostring(l))end end;print("useradd: created user '"..c.username.."' with uid="..tostring(h))
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a={...}local b=false;local c=nil;for d,e in ipairs(a)do if e=="-r"then b=true elseif e:sub(1,1)~="-"then c=e else print("userdel: unknown option: "..e)syscall.exit(1)return end end;if not c then print("Usage: userdel [-r] <username>")syscall.exit(1)return end;local f=syscall.getuid(c)if not f then print("userdel: user '"..c.."' does not exist")syscall.exit(1)return end;local g=syscall.getpasswd(f)local h,i=syscall.deleteuser(f)if not h then print("userdel: "..tostring(i))syscall.exit(1)return end;if b and g and g.homedir then local j=require("fs")local k,l=pcall(function()local function m(n)for d,o in ipairs(j.list(n)or{})do local p=n.."/"..o;if j.isDir(p)then m(p)else syscall.remove(p)end end;syscall.remove(n)end;if j.exists(g.homedir)then m(g.homedir)end end)if not k then print("userdel: warning: could not remove home: "..tostring(l))end end;print("userdel: deleted user '"..c.."'")
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a={...}local b=1;local c={}while b<=#a do local d=a[b]if d=="-l"then b=b+1;c.newname=a[b]elseif d=="-p"then b=b+1;c.password=a[b]elseif d=="-g"then b=b+1;c.gid=tonumber(a[b])elseif d=="-d"then b=b+1;c.homedir=a[b]elseif d=="-s"then b=b+1;c.shell=a[b]elseif d=="-L"then c.lock=true elseif d=="-U"then c.unlock=true elseif d:sub(1,1)~="-"then c.username=d else print("usermod: unknown option: "..d)syscall.exit(1)return end;b=b+1 end;if not c.username then print("Usage: usermod [-l newname] [-p password] [-g gid] [-d homedir] [-s shell] [-L] [-U] <username>")syscall.exit(1)return end;if c.lock and c.unlock then print("usermod: -L and -U are mutually exclusive")syscall.exit(1)return end;local e=syscall.getuid(c.username)if not e then print("usermod: user '"..c.username.."' does not exist")syscall.exit(1)return end;local function f(g,...)local h,i=g(...)if not h then print("usermod: "..tostring(i))syscall.exit(1)end end;if c.newname then f(syscall.setusername,e,c.newname)end;if c.password then f(syscall.setpassword,e,c.password)end;if c.gid then f(syscall.setgid,e,c.gid)end;if c.homedir then f(syscall.sethomedir,e,c.homedir)end;if c.shell then f(syscall.setshell,e,c.shell)end;if c.lock then f(syscall.lockuser,e)end;if c.unlock then f(syscall.unlockuser,e)end;print("usermod: updated user '"..c.username.."'")
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a={...}while true do if#a==0 then print("y")else print(table.concat(a," "))end end
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
local a={}function a.parse(b)local c={}local d=nil;for e in b:gmatch("[^\r\n]+")do e=e:match("^%s*(.-)%s*$")if e~=""and not e:match("^[;#]")then local f=e:match("^%[(.-)%]$")if f then d=f;c[d]=c[d]or{}else local g,h=e:match("^(.-)=(.*)$")if g then g=g:match("^%s*(.-)%s*$")h=h:match("^%s*(.-)%s*$")if d then c[d][g]=h else c[g]=h end end end end end;return c end;return a
|
||||||
Loaded 100 of 107 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user