From 2df878f3e8aaa9fd61eac834509a46b6717183ae Mon Sep 17 00:00:00 2001 From: XeonSquared Date: Wed, 7 Jun 2023 00:16:26 +1000 Subject: [PATCH] standalone executable support. again. --- lib/shell.lua | 29 +++++++++++++++++------------ lib/shutil.lua | 42 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 13 deletions(-) diff --git a/lib/shell.lua b/lib/shell.lua index 538cce8..fa444fe 100644 --- a/lib/shell.lua +++ b/lib/shell.lua @@ -21,24 +21,29 @@ end function shell.interactive() local shenv = setmetatable({}, {__index=shindex}) local run = true + os.setenv("PATH",{"/boot/exec","/pkg/exec"}) function shenv.quit() run = false end while run do io.write(string.format("\27[32m%s:%s>\27[0m ",os.getenv("HOSTNAME") or "localhost",(os.getenv("PWD") or _VERSION))) - local input = io.read() - if input:sub(1,1) == "=" then - input = "return "..input:sub(2) - end - local f, r = load(input, "shell", "t", shenv) - if not f then - print("\27[31m"..r) + local w,input = pcall(io.read) + if not w then + print("\27[31m^C") else - local rt = {pcall(f)} - local rs = table.remove(rt,1) - if not rs then io.write("\27[31m") end - for k,v in pairs(rt) do - print(formatValue(v)) + if input:sub(1,1) == "=" then + input = "return "..input:sub(2) + end + local f, r = load(input, "shell", "t", shenv) + if not f then + print("\27[31m"..r) + else + local rt = {pcall(f)} + local rs = table.remove(rt,1) + if not rs then io.write("\27[31m") end + for k,v in pairs(rt) do + print(formatValue(v)) + end end end end diff --git a/lib/shutil.lua b/lib/shutil.lua index 1ee2a6c..1e185b4 100644 --- a/lib/shutil.lua +++ b/lib/shutil.lua @@ -119,9 +119,49 @@ function shutil.free() -- Displays used and free memory. print(string.format("%5s %5s %5s",wrapUnits(computer.totalMemory()),wrapUnits(computer.totalMemory()-computer.freeMemory()),wrapUnits(computer.freeMemory()))) end +local function pread(self,len) + syslog(tostring(self)) + syslog(tostring(len)) + io.input(self.input) + local b = io.read(len) + io.input(self) + if b:match("\3") then + error("terminated") + end + return b +end + +function shutil.which(name) + local fpath + for _,dir in ipairs(os.getenv("PATH")) do + fpath = fpath or fs.exists(string.format("%s/%s.lua",dir,name)) and string.format("%s/%s.lua",dir,name) or fs.exists(string.format("%s/%s",dir,name)) and string.format("%s/%s",dir,name) + end + return fpath +end + shutil.cd = os.chdir shutil.mkdir = fs.makeDirectory shutil.cp = fs.copy shutil.rm = fs.remove -return shutil +return setmetatable({}, {__index = function(t,k) + if shutil[k] then + return shutil[k] + end + local path = shutil.which(k) + if path then + local fn, e = loadfile(path) + if not fn then error(string.format("\n - %s",e)) end + return function() + local pid = os.spawn(fn,path) + local ret = {require("event").pull("process_finished",pid)} + if not ret[3] then + error(string.format("\n - %s",ret[4])) + end + for i = 1, 3 do + table.remove(ret,1) + end + return table.unpack(ret) + end + end +end})