From 3cc1459769341781a021607f4924d720b300940d Mon Sep 17 00:00:00 2001 From: spsf Date: Sat, 21 Feb 2026 12:49:57 -0600 Subject: [PATCH 1/3] New build system + hysh functionality --- Build.tar | Bin 154624 -> 0 bytes Build.zip | Bin 75704 -> 0 bytes Makefile | 20 ++ README.md | 6 + Src/Hyperion-bash/bin/bash | 295 --------------------- Src/Hyperion-bash/bin/bashex | 94 ------- Src/Hyperion-bash/bin/login | 33 +-- Src/Hyperion-bash/bin/startup/runShell.lua | 4 - Src/Hyperion-bash/bin/su | 19 +- Src/Hyperion-core/bin/login | 0 Src/Hyperion-core/bin/su | 0 Src/Hyperion-core/bin/sudo | 0 Src/Hyperion-kernel/etc/passwd | 2 +- build.py | 154 +++++++++++ building.md | 68 +++++ scripts/build.ps1 | 44 --- scripts/build.sh | 42 --- scripts/buildMini.ps1 | 57 ---- scripts/buildMini.sh | 50 ---- scripts/buildMiniTest.ps1 | 108 -------- scripts/buildMiniTest.sh | 55 ---- scripts/buildTest.ps1 | 83 ------ scripts/buildTest.sh | 69 ----- 23 files changed, 269 insertions(+), 934 deletions(-) delete mode 100644 Build.tar delete mode 100644 Build.zip create mode 100644 Makefile delete mode 100644 Src/Hyperion-bash/bin/bash delete mode 100644 Src/Hyperion-bash/bin/bashex delete mode 100644 Src/Hyperion-bash/bin/startup/runShell.lua delete mode 100644 Src/Hyperion-core/bin/login delete mode 100644 Src/Hyperion-core/bin/su delete mode 100644 Src/Hyperion-core/bin/sudo create mode 100644 build.py create mode 100644 building.md delete mode 100644 scripts/build.ps1 delete mode 100644 scripts/build.sh delete mode 100644 scripts/buildMini.ps1 delete mode 100644 scripts/buildMini.sh delete mode 100644 scripts/buildMiniTest.ps1 delete mode 100644 scripts/buildMiniTest.sh delete mode 100644 scripts/buildTest.ps1 delete mode 100644 scripts/buildTest.sh diff --git a/Build.tar b/Build.tar deleted file mode 100644 index c23a5b0f1ef5d3817db92f7352e4d45da3cdafe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154624 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 E0I1)hl>h($ diff --git a/Build.zip b/Build.zip deleted file mode 100644 index d1c319af83c2c3072701dae0bc79f8f64a5da9e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75704 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

)SG%j_{)J)2ZtF*m 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 0 then table.remove(parts) end - elseif part ~= "." and part ~= "" then - table.insert(parts, part) - end - end - local normDir = "/" .. table.concat(parts, "/") - if normDir:sub(#normDir, #normDir) ~= "/" then normDir = normDir .. "/" end - - if not fs.isDir(normDir) then - print("bash-cd: "..dirIn..": No such directory.") - return - end - oldWD = cwd - syscall.chdir(normDir) -end - - -local function getUserInput() - syscall.devctl(1,"sfgc",3) - printInline(userhost) - syscall.devctl(1,"sfgc",1) - printInline(":") - syscall.devctl(1,"sfgc",10) - printInline(syscall.getcwd()) - syscall.devctl(1,"sfgc",1) - printInline("$ ") - local curOffsetStr = syscall.devctl(1, "gpos") - local curOffsetX = tonumber(curOffsetStr:sub(1, curOffsetStr:find(";")-1)) - local curOffsetY = tonumber(curOffsetStr:sub(curOffsetStr:find(";")+1)) - - local input = "" - local blinkState = false - local cursorPos = 1 - local history = 0 - - while true do - local key=syscall.read(0) - if key then - if key == "\19" then --TODO: REPLACE WITH LEFT ARROW - if cursorPos > 1 then - cursorPos = cursorPos - 1 - end - elseif key == "\20" then --TODO: REPLACE WITH RIGHT ARROW - if cursorPos <= #input then - cursorPos = cursorPos + 1 - end - elseif key == "\17" then --TODO: REPLACE WITH UP ARROW - if history < #commandHistory then - syscall.devctl(1,"spos",curOffsetX,curOffsetY) - printInline((" "):rep(#input + 1)) - history = history + 1 - input = commandHistory[#commandHistory - history + 1] - cursorPos = #input + 1 - end - elseif key == "\18" then --TODO: REPLACE WITH DOWN ARROW - if history > 1 then - syscall.devctl(1,"spos",curOffsetX,curOffsetY) - printInline((" "):rep(#input + 1)) - history = history - 1 - input = commandHistory[#commandHistory - history + 1] - cursorPos = #input + 1 - elseif history == 1 then - syscall.devctl(1,"spos",curOffsetX,curOffsetY) - printInline((" "):rep(#input + 1)) - history = 0 - input = "" - cursorPos = 1 - end - elseif key == "\b" then - if cursorPos > 1 then - syscall.devctl(1,"spos",curOffsetX,curOffsetY) - printInline((" "):rep(#input + 1)) - input = string.sub(input, 1, cursorPos-2)..string.sub(input, cursorPos) - cursorPos = cursorPos - 1 - end - elseif key == "\n" then - syscall.devctl(1,"spos",curOffsetX,curOffsetY) - print(input.." ") - return input - else - input = string.sub(input, 1, cursorPos-1)..key..string.sub(input, cursorPos) - cursorPos = cursorPos + 1 - end - local screenSizeStr = syscall.devctl(1, "size") - local sizeX = tonumber(screenSizeStr:sub(1, screenSizeStr:find(";")-1)) - local sizeY = tonumber(screenSizeStr:sub(screenSizeStr:find(";")+1)) - local totalChars = sizeX * sizeY - local eocCharNum = ((curOffsetY - 1) * sizeX) + curOffsetX + #input - if eocCharNum >= totalChars then - syscall.devctl(1,"spos",sizeX,sizeY) - printInline(" ") - curOffsetY = curOffsetY - 1 - end - end - syscall.devctl(1,"spos",curOffsetX,curOffsetY) - printInline(string.sub(input, 1, cursorPos-1)) - if blinkState then - syscall.devctl(1,"sfgc",16) - syscall.devctl(1,"sbgc",1) - end - if cursorPos > #input then - printInline(" ") - else - printInline(string.sub(input, cursorPos, cursorPos)) - end - syscall.devctl(1,"sfgc",1) - syscall.devctl(1,"sbgc",16) - printInline(string.sub(input, cursorPos+1)) - if cursorPos <= #input then - printInline(" ") - end - local curBlink = ((math.floor(syscall.getUptime() / 500) % 2) == 0) - if curBlink ~= blinkState then - blinkState = curBlink - end - end -end - -local function runCommand(command) - do - local func = load("return " .. command, "@equation", "t", {}) - if func then - local success, result = pcall(func) - if success and type(result) == "number" then - print(result) - return - end - end - end - - terminate = false - local args = string.split(command, " ") - if builtinCmds[args[1]] then - local success, msg = pcall(builtinCmds[args[1]], table.unpack(args, 2)) - if not success then - local errSL = string.sub(msg, string.find(msg, "]") + 2) - syscall.devctl(1,"sfgc",2) - printInline(args[1]..": Program runtime error on line ") - print(string.sub(errSL, 1, string.find(errSL, ":") - 1)) - syscall.devctl(1,"sfgc",1) - print(string.sub(errSL, string.find(errSL, ":") + 1)) - end - return - end - - local cmdPath = "" - if string.find(args[1], "/") then - if fs.exists(args[1]) then - cmdPath = args[1] - end - else - local paths = string.split(syscall.getEnviron("PATH"), ":") - for _, path in pairs(paths) do - if fs.exists(path..args[1]) then - cmdPath = path..args[1] - break - end - end - end - - if cmdPath == "" then - print(args[1]..": Command not found") - return - end - - local progName = string.sub(cmdPath, #cmdPath - string.find(string.reverse(cmdPath), "/") + 2) - - local text = fs.readAllText(cmdPath) - local program, err = load(text, progName) - if not program then - local errSL = string.sub(err, string.find(err, ":") + 1) - syscall.devctl(1,"sfgc",2) - printInline(progName..": Program load error on line ") - print(string.sub(errSL, 1, string.find(errSL, ":") - 1)) - syscall.devctl(1,"sfgc",1) - print(string.sub(errSL, string.find(errSL, ":") + 1)) - return - end - - local proc = syscall.spawn(function(...) - syscall.open("/dev/tty/TTY1","r") - syscall.open("/dev/tty/TTY1","w") - syscall.open("/dev/null","w") - local success, msg = pcall(program, ...) - if not success then - local errSL = string.sub(msg, string.find(msg, ":") + 1) - syscall.devctl(1,"sfgc",2) - printInline(progName..": Program runtime error on line ") - print(string.sub(errSL, 1, string.find(errSL, ":") - 1)) - syscall.devctl(1,"sfgc",1) - print(string.sub(errSL, string.find(errSL, ":") + 1)) - end - end, progName, nil, {table.unpack(args, 2)}) - - while true do - local exited, code = syscall.collect(proc) - if exited then - if code then - print("\nTask exited with code:\n"..tostring(code)) - end - return - end - if terminate then - local success, err = syscall.kill(proc) - if success then - syscall.devctl(1,"sbgc",16) - syscall.devctl(1,"sfgc",2) - print("\nProgram Terminated.") - syscall.devctl(1,"sfgc",1) - end - terminate = false - break - end - sleep(0.05) - end -end - -while true do - local command = getUserInput() - if command ~= "" then - if command ~= commandHistory[#commandHistory] then - table.insert(commandHistory, command) - end - runCommand(command) - end -end - - ---ERROR HANDLING -end, debug.traceback) - -if not success then - syscall.log("Error running shell: "..errorMsg, "ERROR") - syscall.devctl(1,"sfgc",2) - syscall.devctl(1,"sbgc",16) - print() - print("Error running shell: ") - print(errorMsg) -end \ No newline at end of file diff --git a/Src/Hyperion-bash/bin/bashex b/Src/Hyperion-bash/bin/bashex deleted file mode 100644 index 54be23d..0000000 --- a/Src/Hyperion-bash/bin/bashex +++ /dev/null @@ -1,94 +0,0 @@ ---:Minify:-- -syscall.open("/dev/tty/TTY1","r") -syscall.open("/dev/tty/TTY1","w") -syscall.open("/dev/null","r") -syscall.devctl(1,"clear") -syscall.devctl(1,"sfgc",1) -syscall.devctl(1,"spos",1,1) -print("HyperionOS Bash Shell") -local str="" -local stopInput=false -local proc=0 -local fs=require("sys.fs") -local timeout=false -syscall.setEnviron("SHELL","simpleshell") -printInline("> ") -syscall.sigcatch(function(sig) - if sig==1 then - syscall.kill(proc) - print("Terminated") - printInline("> ") - stopInput=false - end -end) - -while true do - if not stopInput then - local input=syscall.read(0) - if input then - if input=="\b" then - if #str>0 then - str=str:sub(1,#str-1) - printInline("\b") - end - elseif input=="\n" then - print("") - stopInput=true - if str == "" then - printInline("> ") - stopInput=false - else - local path=nil - local split=string.split(str, " ") - if fs.exists("/bin/"..split[1]) then - path="/bin/"..split[1] - elseif fs.exists("/bin/"..split[1]..".lua") then - path="/bin/"..split[1]..".lua" - end - if not path then - print("Program not found") - printInline("> ") - stopInput=false - else - local text = fs.readAllText(path) - local program, err = load(text, path) - if not program then - print(err) - printInline("> ") - end - proc = syscall.spawn(function(...) - syscall.open("/dev/tty/TTY1","r") - syscall.open("/dev/tty/TTY1","w") - syscall.open("/dev/null","w") - program(...) - end, path, nil, {table.unpack(split, 2)}) - end - str="" - end - else - str=str..input - printInline(input) - end - timeout=false - else - timeout=true - end - else - local exited, code = syscall.collect(proc) - if exited then - if code then - print("\nTask exited with code:\n"..tostring(code)) - end - printInline("> ") - stopInput=false - end - timeout=true - end - if timeout then - if stopInput then - sleep(.5) - else - sleep(.05) - end - end -end \ No newline at end of file diff --git a/Src/Hyperion-bash/bin/login b/Src/Hyperion-bash/bin/login index 2f4d4a9..9f65a52 100644 --- a/Src/Hyperion-bash/bin/login +++ b/Src/Hyperion-bash/bin/login @@ -1,7 +1,7 @@ --:Minify:-- -syscall.open("/dev/tty/TTY1","r") --stdin (fd 0) -syscall.open("/dev/tty/TTY1","w") --stdout (fd 1) -syscall.open("/dev/null","w") --stderr (fd 2) +syscall.open("/dev/tty/TTY1", "r") --stdin (fd 0) +syscall.open("/dev/tty/TTY1", "w") --stdout (fd 1) +syscall.open("/dev/null", "w") --stderr (fd 2) local fs = require("sys.fs") @@ -78,21 +78,18 @@ local function spawnShell(username, uid, shell, homedir) return false end - -- Spawn a wrapper that loads and runs the shell, reporting any error back - -- via exit code channel so we can display it local errFifo = {} local proc = syscall.spawn(function() syscall.setuid(uid) syscall.chdir(homedir) - syscall.setEnviron("HOME", homedir) - syscall.setEnviron("USER", username) + syscall.setEnviron("HOME", homedir) + syscall.setEnviron("USER", username) syscall.setEnviron("SHELL", shell) - syscall.setEnviron("PATH", "/bin/") + syscall.setEnviron("PATH", "/bin/") local shellFn, loadErr = load(shellText, "@" .. shell) if not shellFn then - -- Report load error via log and a recognizable exit code syscall.log("login: shell load error: " .. tostring(loadErr), "ERROR") syscall.exit(-1) return @@ -103,21 +100,7 @@ local function spawnShell(username, uid, shell, homedir) syscall.log("login: shell runtime error: " .. tostring(runErr), "ERROR") end end, username .. ":shell") - - while true do - local exited, code = syscall.collect(proc) - if exited then - if code then - syscall.devctl(1, "sfgc", 2) - syscall.write(1, "\nShell exited with code: " .. tostring(code) .. "\n") - syscall.write(1, "(Check /var/log/syslog.log for details)\n") - syscall.devctl(1, "sfgc", 1) - sleep(2) - end - return true - end - sleep(0.1) - end + syscall.exit(0) end local function doLogin() @@ -145,7 +128,7 @@ local function doLogin() if ok then local uid = syscall.auth_getuid(username) local pwent = uid and syscall.auth_getpasswd(uid) - local shell = (pwent and pwent.shell) or "/bin/hysh" + local shell = (pwent and pwent.shell) or "/bin/hysh" local homedir = (pwent and pwent.homedir) or "/" syscall.devctl(1, "sfgc", 3) diff --git a/Src/Hyperion-bash/bin/startup/runShell.lua b/Src/Hyperion-bash/bin/startup/runShell.lua deleted file mode 100644 index 67ea5f4..0000000 --- a/Src/Hyperion-bash/bin/startup/runShell.lua +++ /dev/null @@ -1,4 +0,0 @@ -local fs = require("sys.fs") -local bashStr = fs.readAllText("/bin/bash") -local bashFun = load(bashStr) -syscall.spawn(bashFun, "bash") \ No newline at end of file diff --git a/Src/Hyperion-bash/bin/su b/Src/Hyperion-bash/bin/su index 1517c62..6908414 100644 --- a/Src/Hyperion-bash/bin/su +++ b/Src/Hyperion-bash/bin/su @@ -1,7 +1,7 @@ --:Minify:-- local fs = require("sys.fs") -local targetUser = ({...})[1] or "root" +local targetUser = ({ ... })[1] or "root" local currentUid = syscall.getuid() local currentUser = syscall.getUsername(currentUid) or tostring(currentUid) @@ -26,7 +26,9 @@ else syscall.write(1, "\n") break elseif ch == "\b" then - if #pw > 0 then pw = pw:sub(1, -2); syscall.write(1, "\b \b") end + if #pw > 0 then + pw = pw:sub(1, -2); syscall.write(1, "\b \b") + end else pw = pw .. ch syscall.write(1, "*") @@ -46,13 +48,13 @@ if currentUid == 0 then syscall.setuid(targetUid) end -local pwent = syscall.auth_getpasswd(targetUid) -local shell = (pwent and pwent.shell) or "/bin/hysh" +local pwent = syscall.auth_getpasswd(targetUid) +local shell = (pwent and pwent.shell) or "/bin/hysh" local homedir = (pwent and pwent.homedir) or "/" syscall.chdir(homedir) -syscall.setEnviron("HOME", homedir) -syscall.setEnviron("USER", targetUser) +syscall.setEnviron("HOME", homedir) +syscall.setEnviron("USER", targetUser) syscall.setEnviron("SHELL", shell) local shellText = fs.readAllText(shell) @@ -63,10 +65,13 @@ if not shellText then end local shellFn, loadErr = load(shellText, "@" .. shell) + if not shellFn then print("su: cannot load shell: " .. tostring(loadErr)) syscall.exit(1) return end -shellFn() +syscall.kill(syscall.getppid()) +syscall.spawn(shellFn, targetUser .. ":" .. shell, syscall.getEnviron()) +syscall.exit(0) diff --git a/Src/Hyperion-core/bin/login b/Src/Hyperion-core/bin/login deleted file mode 100644 index e69de29..0000000 diff --git a/Src/Hyperion-core/bin/su b/Src/Hyperion-core/bin/su deleted file mode 100644 index e69de29..0000000 diff --git a/Src/Hyperion-core/bin/sudo b/Src/Hyperion-core/bin/sudo deleted file mode 100644 index e69de29..0000000 diff --git a/Src/Hyperion-kernel/etc/passwd b/Src/Hyperion-kernel/etc/passwd index 2d4ba4c..434ccc5 100644 --- a/Src/Hyperion-kernel/etc/passwd +++ b/Src/Hyperion-kernel/etc/passwd @@ -1 +1 @@ -0:0:root:/root:/bin/bash \ No newline at end of file +0:0:root:/root:/bin/hysh \ No newline at end of file diff --git a/build.py b/build.py new file mode 100644 index 0000000..e865e70 --- /dev/null +++ b/build.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python3 +""" +Usage: + python build.py [--arch cct|oc] [--release|--dev] + +Targets: + build + build-mini + build-test + build-mini-test + clean + +Arch flags: + --arch cct + --arch oc + +Release flags: + --release + --dev +""" + +import sys +import shutil +import argparse +import subprocess +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parent +SRC_ROOT = PROJECT_ROOT / "Src" +TEST_ROOT = PROJECT_ROOT / "Test" +BUILD_ROOT = PROJECT_ROOT / "Build" + +ARCH_BOOT_DIR = { + "cct": Path("boot") / "cct", + "oc": Path("boot") / "oc", +} + + +def clean(): + if BUILD_ROOT.exists(): + print(f"Removing {BUILD_ROOT} ...") + shutil.rmtree(BUILD_ROOT) + else: + print("Nothing to clean.") + + +def process_root(src_root: Path, out_root: Path, minify: bool): + print(f"Building from {src_root}") + print(f"Output to {out_root}") + print() + + for pkg_dir in sorted(src_root.iterdir()): + if not pkg_dir.is_dir(): + continue + + print(f"== Package: {pkg_dir.name} ==") + + for src in sorted(pkg_dir.rglob("*")): + if not src.is_file(): + continue + + rel = src.relative_to(pkg_dir) + dst = out_root / rel + dst.parent.mkdir(parents=True, exist_ok=True) + + print(f" Processing: {src.relative_to(src_root)}") + + if minify and has_minify_header(src): + print(" > Minifying") + result = subprocess.run( + ["luamin", "-f", str(src)], + capture_output=True, text=True + ) + if result.returncode != 0: + print(f" ! luamin failed: {result.stderr.strip()}", file=sys.stderr) + sys.exit(1) + dst.write_text(result.stdout, encoding="utf-8") + else: + print(" > Copying") + shutil.copy2(src, dst) + + print() + + +def install_bootloader(arch: str, release: bool): + boot_dir = BUILD_ROOT / "$" / ARCH_BOOT_DIR[arch] + boot_lua = boot_dir / "boot.lua" + eeprom = boot_dir / "eeprom" + + for src in (boot_lua, eeprom): + if not src.exists(): + print(f" ! Bootloader file not found: {src}", file=sys.stderr) + sys.exit(1) + + print(f" Installing: boot.lua -> Build/boot.lua") + shutil.copy2(boot_lua, BUILD_ROOT / "boot.lua") + + eeprom_dst_name = "startup.lua" if release else "eeprom" + print(f" Installing: eeprom -> Build/{eeprom_dst_name}") + shutil.copy2(eeprom, BUILD_ROOT / eeprom_dst_name) + + +def has_minify_header(path: Path) -> bool: + try: + with path.open("r", encoding="utf-8", errors="ignore") as f: + for _ in range(3): + if "--:Minify:--" in f.readline(): + return True + except OSError: + pass + return False + + +def run_build(minify: bool, include_test: bool, arch: str | None, release: bool): + clean() + BUILD_ROOT.mkdir() + + out_root = BUILD_ROOT / "$" if arch else BUILD_ROOT + + process_root(SRC_ROOT, out_root, minify) + if include_test: + process_root(TEST_ROOT, out_root, minify) + + if arch: + print("Installing bootloader files ...") + install_bootloader(arch, release) + print() + + +def main(): + parser = argparse.ArgumentParser(description="HyperionOS build script") + parser.add_argument("target", choices=["build", "build-mini", "build-test", "build-mini-test", "clean"]) + parser.add_argument("--arch", choices=["cct", "oc"], default=None, + help="Target architecture (cct or oc)") + parser.add_argument("--release", dest="release", action="store_true", default=True, + help="Release build: eeprom placed as startup.lua (default)") + parser.add_argument("--dev", dest="release", action="store_false", + help="Dev build: boot.lua and eeprom copied unchanged") + + args = parser.parse_args() + + if args.target == "clean": + clean() + return + + minify = "mini" in args.target + include_test = "test" in args.target + + run_build(minify=minify, include_test=include_test, arch=args.arch, release=args.release) + print("Build complete.") + + +if __name__ == "__main__": + main() diff --git a/building.md b/building.md new file mode 100644 index 0000000..7219892 --- /dev/null +++ b/building.md @@ -0,0 +1,68 @@ +## Building + +### Linux / `make`-compatible systems + +Run: + +```bash +make build +``` + +Optional variables: + +* **`ARCH=`** + + * `cct` Build using the cct bootloader + * `oc` Build using the oc bootloader + +* **`DEV=1`** + + * Builds in development mode + * Bootloader does not start automatically on system startup + +If `DEV` is not specified: + +* Default is release mode +* Bootloader starts automatically on system startup + +**Examples** + +```bash +make build ARCH=cct +make build ARCH=oc DEV=1 +``` + +--- + +### Windows / Any system with Python 3.7+ + +Run: + +```bash +python build.py build +``` + +Optional arguments: + +* **`--arch {cct|oc}`** + Select bootloader + + * `cct` Use the cct bootloader + * `oc` Use the oc bootloader + +* **`--dev`** + + * Development mode + * Bootloader does not start automatically + +* **`--release`** (default) + + * Release mode + * Bootloader starts automatically + +**Examples** + +```bash +python build.py build --arch cct +python build.py build --arch oc --dev +``` diff --git a/scripts/build.ps1 b/scripts/build.ps1 deleted file mode 100644 index c2b45c8..0000000 --- a/scripts/build.ps1 +++ /dev/null @@ -1,44 +0,0 @@ -$testRoot = Join-Path $PSScriptRoot "..\src" -$buildRoot = Join-Path $PSScriptRoot "..\Build" - -$testRoot = Resolve-Path $testRoot - -# Clean Build folder -if (Test-Path $buildRoot) { - Remove-Item -LiteralPath $buildRoot -Recurse -Force -ErrorAction SilentlyContinue -} - -New-Item -ItemType Directory -Path $buildRoot | Out-Null - -Write-Host "Building from $testRoot" -Write-Host "Output to $buildRoot" -Write-Host "" - -# Each top-level folder in test/ -Get-ChildItem -Path $testRoot -Directory | ForEach-Object { - - $folderRoot = $_.FullName - Write-Host "== Package: $($_.Name) ==" - - # Walk files inside this folder - Get-ChildItem -Path $folderRoot -File -Recurse | ForEach-Object { - - $src = $_.FullName - $rel = $src.Substring($folderRoot.Length).TrimStart("\") - $dst = Join-Path $buildRoot $rel - $dstDir = Split-Path $dst - - if (-not (Test-Path $dstDir)) { - New-Item -ItemType Directory -Path $dstDir -Force | Out-Null - } - - Write-Host "Processing: $rel" - Write-Host " > Copying" - Copy-Item -LiteralPath $src -Destination $dst -Force - - } - - Write-Host "" -} - -Write-Host "Build complete." diff --git a/scripts/build.sh b/scripts/build.sh deleted file mode 100644 index 51c66cd..0000000 --- a/scripts/build.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env bash -set -e - -SCRIPT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -TEST_ROOT="$(realpath "$SCRIPT_ROOT/../src")" -BUILD_ROOT="$SCRIPT_ROOT/../Build" - -if [[ -d "$BUILD_ROOT" ]]; then - rm -rf "$BUILD_ROOT" -fi -mkdir -p "$BUILD_ROOT" - -echo "Building from $TEST_ROOT" -echo "Output to $BUILD_ROOT" -echo "" - -for folder in "$TEST_ROOT"/*/; do - [[ -d "$folder" ]] || continue - - folder_root="$folder" - package_name="$(basename "$folder_root")" - echo "== Package: $package_name ==" - - find "$folder_root" -type f | while IFS= read -r src; do - rel="${src#$folder_root}" - dst="$BUILD_ROOT/$rel" - dst_dir="$(dirname "$dst")" - - if [[ ! -d "$dst_dir" ]]; then - mkdir -p "$dst_dir" - fi - - echo "Processing: $rel" - echo " > Copying" - cp -f "$src" "$dst" - done - - echo "" -done - -echo "Build complete." diff --git a/scripts/buildMini.ps1 b/scripts/buildMini.ps1 deleted file mode 100644 index 7e96e7d..0000000 --- a/scripts/buildMini.ps1 +++ /dev/null @@ -1,57 +0,0 @@ -$testRoot = Join-Path $PSScriptRoot "..\src" -$buildRoot = Join-Path $PSScriptRoot "..\Build" - -$testRoot = Resolve-Path $testRoot - -# Clean Build folder -if (Test-Path $buildRoot) { - Remove-Item -LiteralPath $buildRoot -Recurse -Force -ErrorAction SilentlyContinue -} - -New-Item -ItemType Directory -Path $buildRoot | Out-Null - -Write-Host "Building from $testRoot" -Write-Host "Output to $buildRoot" -Write-Host "" - -# Each top-level folder in test/ -Get-ChildItem -Path $testRoot -Directory | ForEach-Object { - - $folderRoot = $_.FullName - Write-Host "== Package: $($_.Name) ==" - - # Walk files inside this folder - Get-ChildItem -Path $folderRoot -File -Recurse | ForEach-Object { - - $src = $_.FullName - $rel = $src.Substring($folderRoot.Length).TrimStart("\") - $dst = Join-Path $buildRoot $rel - $dstDir = Split-Path $dst - - if (-not (Test-Path $dstDir)) { - New-Item -ItemType Directory -Path $dstDir -Force | Out-Null - } - - Write-Host "Processing: $rel" - - # Read first 3 lines - $header = Get-Content $src -TotalCount 3 -ErrorAction SilentlyContinue - - if ($header -match "--:Minify:--") { - Write-Host " > Minifying" - $content = luamin -f "$src" - - # UTF8 encoding without BOM because it breaks lua - $utf8NoBOM = New-Object System.Text.UTF8Encoding($false) - [System.IO.File]::WriteAllText($dst, $content, $utf8NoBOM) - } - else { - Write-Host " > Copying" - Copy-Item -LiteralPath $src -Destination $dst -Force - } - } - - Write-Host "" -} - -Write-Host "Build complete." diff --git a/scripts/buildMini.sh b/scripts/buildMini.sh deleted file mode 100644 index 37e40b3..0000000 --- a/scripts/buildMini.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env bash -set -e - -SCRIPT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -TEST_ROOT="$(realpath "$SCRIPT_ROOT/../src")" -BUILD_ROOT="$SCRIPT_ROOT/../Build" - -if [[ -d "$BUILD_ROOT" ]]; then - rm -rf "$BUILD_ROOT" -fi -mkdir -p "$BUILD_ROOT" - -echo "Building from $TEST_ROOT" -echo "Output to $BUILD_ROOT" -echo "" - -for folder in "$TEST_ROOT"/*/; do - [[ -d "$folder" ]] || continue - - folder_root="$folder" - package_name="$(basename "$folder_root")" - echo "== Package: $package_name ==" - - find "$folder_root" -type f | while IFS= read -r src; do - rel="${src#$folder_root}" - dst="$BUILD_ROOT/$rel" - dst_dir="$(dirname "$dst")" - - if [[ ! -d "$dst_dir" ]]; then - mkdir -p "$dst_dir" - fi - - echo "Processing: $rel" - - header="$(head -n 3 "$src" 2>/dev/null || true)" - - if echo "$header" | grep -q -- "--:Minify:--"; then - echo " > Minifying" - luamin -f "$src" > "$dst" - else - echo " > Copying" - cp -f "$src" "$dst" - fi - done - - echo "" -done - -echo "Build complete." diff --git a/scripts/buildMiniTest.ps1 b/scripts/buildMiniTest.ps1 deleted file mode 100644 index 61b7929..0000000 --- a/scripts/buildMiniTest.ps1 +++ /dev/null @@ -1,108 +0,0 @@ -$testRoot = Join-Path $PSScriptRoot "..\src" -$buildRoot = Join-Path $PSScriptRoot "..\Build" - -$testRoot = Resolve-Path $testRoot - -# Clean Build folder -if (Test-Path $buildRoot) { - Remove-Item -LiteralPath $buildRoot -Recurse -Force -ErrorAction SilentlyContinue -} - -New-Item -ItemType Directory -Path $buildRoot | Out-Null - -Write-Host "Building from $testRoot" -Write-Host "Output to $buildRoot" -Write-Host "" - -# Each top-level folder in test/ -Get-ChildItem -Path $testRoot -Directory | ForEach-Object { - - $folderRoot = $_.FullName - Write-Host "== Package: $($_.Name) ==" - - # Walk files inside this folder - Get-ChildItem -Path $folderRoot -File -Recurse | ForEach-Object { - - $src = $_.FullName - $rel = $src.Substring($folderRoot.Length).TrimStart("\") - $dst = Join-Path $buildRoot $rel - $dstDir = Split-Path $dst - - if (-not (Test-Path $dstDir)) { - New-Item -ItemType Directory -Path $dstDir -Force | Out-Null - } - - Write-Host "Processing: $rel" - - # Read first 3 lines - $header = Get-Content $src -TotalCount 3 -ErrorAction SilentlyContinue - - if ($header -match "--:Minify:--") { - Write-Host " > Minifying" - $content = luamin -f "$src" - - # UTF8 encoding without BOM because it breaks lua - $utf8NoBOM = New-Object System.Text.UTF8Encoding($false) - [System.IO.File]::WriteAllText($dst, $content, $utf8NoBOM) - } - else { - Write-Host " > Copying" - Copy-Item -LiteralPath $src -Destination $dst -Force - } - } - - Write-Host "" -} - -Write-Host "Build complete." - -$testRoot = Join-Path $PSScriptRoot "..\test" -$buildRoot = Join-Path $PSScriptRoot "..\Build" - -$testRoot = Resolve-Path $testRoot - -Write-Host "Building from $testRoot" -Write-Host "Output to $buildRoot" -Write-Host "" - -# Each top-level folder in test/ -Get-ChildItem -Path $testRoot -Directory | ForEach-Object { - - $folderRoot = $_.FullName - Write-Host "== Package: $($_.Name) ==" - - # Walk files inside this folder - Get-ChildItem -Path $folderRoot -File -Recurse | ForEach-Object { - - $src = $_.FullName - $rel = $src.Substring($folderRoot.Length).TrimStart("\") - $dst = Join-Path $buildRoot $rel - $dstDir = Split-Path $dst - - if (-not (Test-Path $dstDir)) { - New-Item -ItemType Directory -Path $dstDir -Force | Out-Null - } - - Write-Host "Processing: $rel" - - # Read first 3 lines - $header = Get-Content $src -TotalCount 3 -ErrorAction SilentlyContinue - - if ($header -match "--:Minify:--") { - Write-Host " > Minifying" - $content = luamin -f "$src" - - # UTF8 encoding without BOM because it breaks lua - $utf8NoBOM = New-Object System.Text.UTF8Encoding($false) - [System.IO.File]::WriteAllText($dst, $content, $utf8NoBOM) - } - else { - Write-Host " > Copying" - Copy-Item -LiteralPath $src -Destination $dst -Force - } - } - - Write-Host "" -} - -Write-Host "Build complete." diff --git a/scripts/buildMiniTest.sh b/scripts/buildMiniTest.sh deleted file mode 100644 index 4033d97..0000000 --- a/scripts/buildMiniTest.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env bash -set -e - -SCRIPT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -build_from_root() { - local TEST_ROOT - TEST_ROOT="$(realpath "$1")" - local BUILD_ROOT="$SCRIPT_ROOT/../Build" - - if [[ -d "$BUILD_ROOT" ]]; then - rm -rf "$BUILD_ROOT" - fi - mkdir -p "$BUILD_ROOT" - - echo "Building from $TEST_ROOT" - echo "Output to $BUILD_ROOT" - echo "" - - for folder in "$TEST_ROOT"/*/; do - [[ -d "$folder" ]] || continue - - local package_name - package_name="$(basename "$folder")" - echo "== Package: $package_name ==" - - find "$folder" -type f | while IFS= read -r src; do - rel="${src#$folder}" - dst="$BUILD_ROOT/$rel" - dst_dir="$(dirname "$dst")" - - mkdir -p "$dst_dir" - - echo "Processing: $rel" - - header="$(head -n 3 "$src" 2>/dev/null || true)" - - if echo "$header" | grep -q -- "--:Minify:--"; then - echo " > Minifying" - luamin -f "$src" > "$dst" - else - echo " > Copying" - cp -f "$src" "$dst" - fi - done - - echo "" - done - - echo "Build complete." -} - -build_from_root "$SCRIPT_ROOT/../src" - -build_from_root "$SCRIPT_ROOT/../test" diff --git a/scripts/buildTest.ps1 b/scripts/buildTest.ps1 deleted file mode 100644 index 21dd6f4..0000000 --- a/scripts/buildTest.ps1 +++ /dev/null @@ -1,83 +0,0 @@ -$testRoot = Join-Path $PSScriptRoot "..\src" -$buildRoot = Join-Path $PSScriptRoot "..\Build" - -$testRoot = Resolve-Path $testRoot - -# Clean Build folder -if (Test-Path $buildRoot) { - Remove-Item -LiteralPath $buildRoot -Recurse -Force -ErrorAction SilentlyContinue -} - -New-Item -ItemType Directory -Path $buildRoot | Out-Null - -Write-Host "Building from $testRoot" -Write-Host "Output to $buildRoot" -Write-Host "" - -# Each top-level folder in test/ -Get-ChildItem -Path $testRoot -Directory | ForEach-Object { - - $folderRoot = $_.FullName - Write-Host "== Package: $($_.Name) ==" - - # Walk files inside this folder - Get-ChildItem -Path $folderRoot -File -Recurse | ForEach-Object { - - $src = $_.FullName - $rel = $src.Substring($folderRoot.Length).TrimStart("\") - $dst = Join-Path $buildRoot $rel - $dstDir = Split-Path $dst - - if (-not (Test-Path $dstDir)) { - New-Item -ItemType Directory -Path $dstDir -Force | Out-Null - } - - Write-Host "Processing: $rel" - Write-Host " > Copying" - Copy-Item -LiteralPath $src -Destination $dst -Force - - } - - Write-Host "" -} - -Write-Host "Build complete." - - -$testRoot = Join-Path $PSScriptRoot "..\test" -$buildRoot = Join-Path $PSScriptRoot "..\Build" - -$testRoot = Resolve-Path $testRoot - -Write-Host "Building from $testRoot" -Write-Host "Output to $buildRoot" -Write-Host "" - -# Each top-level folder in test/ -Get-ChildItem -Path $testRoot -Directory | ForEach-Object { - - $folderRoot = $_.FullName - Write-Host "== Package: $($_.Name) ==" - - # Walk files inside this folder - Get-ChildItem -Path $folderRoot -File -Recurse | ForEach-Object { - - $src = $_.FullName - $rel = $src.Substring($folderRoot.Length).TrimStart("\") - $dst = Join-Path $buildRoot $rel - $dstDir = Split-Path $dst - - if (-not (Test-Path $dstDir)) { - New-Item -ItemType Directory -Path $dstDir -Force | Out-Null - } - - Write-Host "Processing: $rel" - - Write-Host " > Copying" - Copy-Item -LiteralPath $src -Destination $dst -Force - } - - Write-Host "" -} - -Write-Host "Build complete." diff --git a/scripts/buildTest.sh b/scripts/buildTest.sh deleted file mode 100644 index c79351c..0000000 --- a/scripts/buildTest.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env bash -set -e - -SCRIPT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -TEST_ROOT="$(realpath "$SCRIPT_ROOT/../src")" -BUILD_ROOT="$(realpath "$SCRIPT_ROOT/../Build" 2>/dev/null || echo "$SCRIPT_ROOT/../Build")" - -if [[ -d "$BUILD_ROOT" ]]; then - rm -rf "$BUILD_ROOT" -fi -mkdir -p "$BUILD_ROOT" - -echo "Building from $TEST_ROOT" -echo "Output to $BUILD_ROOT" -echo "" - -for folder in "$TEST_ROOT"/*/; do - [[ -d "$folder" ]] || continue - - package_name="$(basename "$folder")" - echo "== Package: $package_name ==" - - find "$folder" -type f | while read -r src; do - rel="${src#$folder}" - dst="$BUILD_ROOT/$rel" - dst_dir="$(dirname "$dst")" - - mkdir -p "$dst_dir" - - echo "Processing: $rel" - echo " > Copying" - cp -f "$src" "$dst" - done - - echo "" -done - -echo "Build complete." - -TEST_ROOT="$(realpath "$SCRIPT_ROOT/../test")" -BUILD_ROOT="$(realpath "$SCRIPT_ROOT/../Build" 2>/dev/null || echo "$SCRIPT_ROOT/../Build")" - -echo "Building from $TEST_ROOT" -echo "Output to $BUILD_ROOT" -echo "" - -for folder in "$TEST_ROOT"/*/; do - [[ -d "$folder" ]] || continue - - package_name="$(basename "$folder")" - echo "== Package: $package_name ==" - - find "$folder" -type f | while read -r src; do - rel="${src#$folder}" - dst="$BUILD_ROOT/$rel" - dst_dir="$(dirname "$dst")" - - mkdir -p "$dst_dir" - - echo "Processing: $rel" - echo " > Copying" - cp -f "$src" "$dst" - done - - echo "" -done - -echo "Build complete." From 5bd16b8fd4557d4f827de3ff81e21e6e9f0c7de5 Mon Sep 17 00:00:00 2001 From: spsf Date: Sat, 21 Feb 2026 14:07:35 -0500 Subject: [PATCH 2/3] su kill error handling --- Src/Hyperion-bash/bin/su | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Src/Hyperion-bash/bin/su b/Src/Hyperion-bash/bin/su index 6908414..70d0044 100644 --- a/Src/Hyperion-bash/bin/su +++ b/Src/Hyperion-bash/bin/su @@ -1,6 +1,5 @@ --:Minify:-- local fs = require("sys.fs") - local targetUser = ({ ... })[1] or "root" local currentUid = syscall.getuid() @@ -72,6 +71,10 @@ if not shellFn then return end -syscall.kill(syscall.getppid()) -syscall.spawn(shellFn, targetUser .. ":" .. shell, syscall.getEnviron()) -syscall.exit(0) +local success, err = syscall.kill(syscall.getppid()) +if success then + syscall.spawn(shellFn, targetUser .. ":" .. shell, syscall.getEnviron()) + syscall.exit(0) +else + print("su: "..err) +end \ No newline at end of file From 93c3bab263faafe5c72374ab6a96a9a9572a5d49 Mon Sep 17 00:00:00 2001 From: spsf Date: Sat, 21 Feb 2026 14:09:12 -0500 Subject: [PATCH 3/3] allow hypervisor to kill non-owned processes --- .../lib/modules/Hyperion/45_hypervisor.kmod | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Src/Hyperion-kernel/lib/modules/Hyperion/45_hypervisor.kmod b/Src/Hyperion-kernel/lib/modules/Hyperion/45_hypervisor.kmod index a976753..e78f8ff 100644 --- a/Src/Hyperion-kernel/lib/modules/Hyperion/45_hypervisor.kmod +++ b/Src/Hyperion-kernel/lib/modules/Hyperion/45_hypervisor.kmod @@ -129,9 +129,6 @@ function sys.kill(pid) if not tasks[tostring(pid)] then return false, "Task does not exist" - elseif not isEqualToAny(tasks[tostring(pid)].pid, table.unpack(children)) and kernel.uid ~= 0 then - return false, "You do not own this task" - elseif tasks[tostring(pid)].status == "Z" then return false, "Task is already dead" @@ -148,9 +145,6 @@ function sys.stop(pid) if not tasks[tostring(pid)] then return false, "Task does not exist" - elseif not isEqualToAny(tasks[tostring(pid)].pid, table.unpack(children)) and kernel.uid ~= 0 then - return false, "You do not own this task" - elseif tasks[tostring(pid)].status ~= "R" then return false, "Cannot stop non running task" @@ -166,9 +160,6 @@ function sys.continue(pid) if not tasks[tostring(pid)] then return false, "Task does not exist" - elseif not isEqualToAny(tasks[tostring(pid)].pid, table.unpack(children)) and kernel.uid ~= 0 then - return false, "You do not own this task" - elseif tasks[tostring(pid)].status ~= "T" then return false, "Task is not stopped"