From 337ecbb1f2422799a668eb060b9ad31e6974f613 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 13 Oct 2016 18:15:20 +0200 Subject: [PATCH 1/2] Update Plan9k --- .../opencomputers/loot/plan9k/bin/arp.lua | 25 - .../opencomputers/loot/plan9k/bin/cat.lua | 2 +- .../opencomputers/loot/plan9k/bin/dd.lua | 2 +- .../opencomputers/loot/plan9k/bin/edit.lua | 15 +- .../opencomputers/loot/plan9k/bin/find.lua | 132 +++++ .../opencomputers/loot/plan9k/bin/getty.lua | 42 +- .../loot/plan9k/bin/ifconfig.lua | 41 -- .../opencomputers/loot/plan9k/bin/init.lua | 21 +- .../opencomputers/loot/plan9k/bin/lua.lua | 6 +- .../opencomputers/loot/plan9k/bin/mount.lua | 10 +- .../opencomputers/loot/plan9k/bin/ping.lua | 107 ---- .../opencomputers/loot/plan9k/bin/readkey.lua | 14 +- .../opencomputers/loot/plan9k/bin/route.lua | 44 -- .../opencomputers/loot/plan9k/bin/sh.lua | 35 +- .../loot/plan9k/boot/kernel/pipes | 2 +- .../opencomputers/loot/plan9k/etc/rc.cfg | 1 + .../opencomputers/loot/plan9k/lib/colors.lua | 30 ++ .../loot/plan9k/lib/internet.lua | 8 + .../loot/plan9k/lib/modules/base/01_util.lua | 20 + .../loot/plan9k/lib/modules/base/05_vfs.lua | 6 + .../loot/plan9k/lib/modules/base/10_sysfs.lua | 112 ++++ .../loot/plan9k/lib/modules/base/11_block.lua | 29 ++ .../loot/plan9k/lib/modules/base/12_mount.lua | 23 + .../plan9k/lib/modules/base/15_userspace.lua | 8 +- .../plan9k/lib/modules/base/16_partition.lua | 60 +++ .../plan9k/lib/modules/base/17_chatbox.lua | 52 +- .../loot/plan9k/lib/modules/base/17_data.lua | 34 +- .../loot/plan9k/lib/modules/base/17_drive.lua | 119 ++--- .../loot/plan9k/lib/modules/base/17_gpt.lua | 30 ++ .../loot/plan9k/lib/modules/base/17_io.lua | 38 +- .../plan9k/lib/modules/base/17_network.lua | 483 ------------------ .../loot/plan9k/lib/modules/base/17_nfc.lua | 58 +-- .../loot/plan9k/lib/modules/base/17_tape.lua | 102 ++-- .../plan9k/lib/modules/base/19_libnetwork.lua | 279 ---------- .../plan9k/lib/modules/base/20_threading.lua | 181 ++++--- .../plan9k/lib/modules/base/21_threadUtil.lua | 10 + .../loot/plan9k/lib/modules/base/21_timer.lua | 6 +- .../plan9k/lib/modules/network/loopback.lua | 26 - .../loot/plan9k/lib/modules/network/modem.lua | 94 ---- .../plan9k/lib/modules/network/tunnel.lua | 72 --- .../opencomputers/loot/plan9k/lib/sides.lua | 62 +++ .../opencomputers/loot/plan9k/lib/term.lua | 16 +- .../opencomputers/loot/plan9k/usr/bin/go.lua | 47 ++ .../opencomputers/loot/plan9k/usr/bin/mpt.lua | 14 +- .../opencomputers/loot/plan9k/usr/bin/nc.lua | 64 --- .../loot/plan9k/usr/lib/robot.lua | 281 ++++++++++ .../loot/plan9k/var/lib/mpt/config.db | 2 +- .../loot/plan9k/var/lib/mpt/mpt.db | 2 +- 48 files changed, 1261 insertions(+), 1606 deletions(-) delete mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/bin/arp.lua create mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/bin/find.lua delete mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/bin/ifconfig.lua delete mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/bin/ping.lua delete mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/bin/route.lua create mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/etc/rc.cfg create mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/lib/colors.lua create mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/10_sysfs.lua create mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/11_block.lua create mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/12_mount.lua create mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/16_partition.lua create mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_gpt.lua delete mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_network.lua delete mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/19_libnetwork.lua delete mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/network/loopback.lua delete mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/network/modem.lua delete mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/network/tunnel.lua create mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/lib/sides.lua create mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/go.lua delete mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/nc.lua create mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/usr/lib/robot.lua diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/arp.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/arp.lua deleted file mode 100644 index 9857df60d..000000000 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/arp.lua +++ /dev/null @@ -1,25 +0,0 @@ -local network = require "network" - -local function fillText(text, n) - for k = 1, n - #text do - text = text .. " " - end - return text -end - -local maxlen = {8, 5} - -for interface in pairs(network.info.getInfo().interfaces) do - maxlen[2] = maxlen[2] < #interface+1 and #interface+1 or maxlen[2] - for _, host in ipairs(network.info.getArpTable(interface)) do - maxlen[1] = maxlen[1] < #host+1 and #host+1 or maxlen[1] - end -end - -print(fillText("Address", maxlen[1])..fillText("Iface", maxlen[2])) - -for interface in pairs(network.info.getInfo().interfaces) do - for _, host in ipairs(network.info.getArpTable(interface)) do - print(fillText(host, maxlen[1])..fillText(interface, maxlen[2])) - end -end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/cat.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/cat.lua index d1fd62ba5..0a8f2bff0 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/cat.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/bin/cat.lua @@ -20,6 +20,6 @@ else end until not line file:close() - io.write("\n") + io.stderr:write("\n") end end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/dd.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/dd.lua index afcf298c0..e46510b7e 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/dd.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/bin/dd.lua @@ -4,7 +4,7 @@ local filesystem = require "filesystem" local args = {...} local options = {} options.count = math.huge -options.bs = 1 +options.bs = 128 options["if"] = "-" options.of = "-" diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/edit.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/edit.lua index c1943cd7c..069a4b5fd 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/edit.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/bin/edit.lua @@ -37,8 +37,8 @@ io.write("\x1b[999;999H\x1b6n\x1b2J\x1b[30m\x1b[47m\x1bKEdit: " .. file .. "| F1 local code = read("\x1b", "R") local h, w = code:match("\x1b%[(%d+);(%d+)R") -local edith = h - 1 -local editw = w +local edith = tonumber(h) - 1 +local editw = tonumber(w) local x, y = 1, 1 local atline = 1 @@ -54,10 +54,11 @@ function setcur() io.write("\x1b[" .. (y - atline + 2) .. ";" .. (x) .. "H") end +local iw = io.write local function render(startline, nlines) --io.write("\x1b["..(startline - atline + 1)..";1H") for n = 1, nlines do - io.write("\x1b["..(startline - atline + n + 1)..";1H\x1b[K" .. unicode.sub(lines[n + startline - 1] or "", 1, editw)) + iw("\x1b["..(startline - atline + n + 1)..";1H\x1b[K" .. unicode.sub(lines[n + startline - 1] or "", 1, editw)) end setcur() end @@ -72,7 +73,7 @@ local charHandler local code = "" codeHandler = function(char) if char == "[" then code = code .. char - elseif char == "0" then code = code .. char + elseif char == "O" then code = code .. char elseif char == "3" then code = code .. char elseif code == "[" and char == "A" then charHandler = baseHandler @@ -128,10 +129,10 @@ codeHandler = function(char) end x = x - 1 setcur() - elseif code == "[0" and char == "P" or char == "R" then + elseif (code == "O" and (char == "P" or char == "R")) or (code == "[[" and (char == "A" or char == "C")) then run = false - io.write("\x1b[2J") - if char == "P" then + iw("\x1b[2J") + if char == "P" or char == "A" then local out = io.open(file, "w") local text = "" for _, line in ipairs(lines) do diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/find.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/find.lua new file mode 100644 index 000000000..a15bb14a7 --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/plan9k/bin/find.lua @@ -0,0 +1,132 @@ +local shell = require("shell") +local fs = require("filesystem") +local text = require("text") + +local USAGE = +[===[Usage: find [path] [--type=[dfs]] [--[i]name=EXPR] + --path if not specified, path is assumed to be current working directory + --type returns results of a given type, d:directory, f:file, and s:symlinks + --name specify the file name pattern. Use quote to include *. iname is + case insensitive + --help display this help and exit]===] + +local args, options = shell.parse(...) + +if (not args or not options) or options.help then + print(USAGE) + if not options.help then + return 1 + else + return -- nil return, meaning no error + end +end + +if #args > 1 then + io.stderr:write(USAGE..'\n') + return 1 +end + +local path = #args == 1 and args[1] or "." + +local bDirs = true +local bFiles = true +local bSyms = true + +local fileNamePattern = "" +local bCaseSensitive = true + +if options.iname and options.name then + io.stderr:write("find cannot define both iname and name\n") + return 1 +end + +if options.type then + bDirs = false + bFiles = false + bSyms = false + + if options.type == "f" then + bFiles = true + elseif options.type == "d" then + bDirs = true + elseif options.type == "s" then + bSyms = true + else + io.stderr:write(string.format("find: Unknown argument to type: %s\n", options.type)) + io.stderr:write(USAGE..'\n') + return 1 + end +end + +if options.iname or options.name then + bCaseSensitive = options.iname ~= nil + fileNamePattern = options.iname or options.name + + if type(fileNamePattern) ~= "string" then + io.stderr:write('find: missing argument to `name\'\n') + return 1 + end + + if not bCaseSensitive then + fileNamePattern = fileNamePattern:lower() + end + + -- prefix any * with . for gnu find glob matching + fileNamePattern = text.escapeMagic(fileNamePattern) + fileNamePattern = fileNamePattern:gsub("%%%*", ".*") +end + +local function isValidType(spath) + if not fs.exists(spath) then + return false + end + + if fileNamePattern:len() > 0 then + local fileName = spath:gsub('.*/','') + + if fileName:len() == 0 then + return false + end + + local caseFileName = fileName + + if not bCaseSensitive then + caseFileName = caseFileName:lower() + end + + local s, e = caseFileName:find(fileNamePattern) + if not s or not e then + return false + end + + if s ~= 1 or e ~= caseFileName:len() then + return false + end + end + + if fs.isDirectory(spath) then + return bDirs + elseif fs.isLink(spath) then + return bSyms + else + return bFiles + end +end + +local function visit(rpath) + local spath = shell.resolve(rpath) + + if isValidType(spath) then + local result = rpath:gsub('/+$','') + print(result) + end + + if fs.isDirectory(spath) then + local list_result = fs.list(spath) + for list_item in list_result do + visit(rpath:gsub('/+$', '') .. '/' .. list_item) + end + end +end + +visit(path) diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/getty.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/getty.lua index f298d3c8e..8802ed78d 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/getty.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/bin/getty.lua @@ -49,7 +49,7 @@ local function unblink() end local function reblink() - if not blinkState then + if not blinkState and blink then blinkState = not blinkState local char, fg, bg = component.invoke(gpu, "get", x, y) preblinkbg = blinkState and bg or preblinkbg @@ -184,6 +184,15 @@ mcommands["49"] = function()component.invoke(gpu, "setBackground", 0x000000)end local lcommands = {} lcommands["4"] = function()end --Reset to replacement mode +lcommands["?25"] = function() + blink = false +end + +local hcommands = {} + +hcommands["?25"] = function() + blink = true +end local ncommands = {} @@ -277,6 +286,20 @@ control["l"] = function(char) end end +control["h"] = function(char) + commandList[#commandList + 1] = commandBuf + if not commandList[1] or commandList[1] == "" then + commandList[1] = "0" + end + for _, command in ipairs(commandList) do + if not hcommands[command] then + pipes.log("Unknown escape code: " .. tostring(command)) + break + end + hcommands[command]() + end +end + control["n"] = function(char) commandList[#commandList + 1] = commandBuf if not commandList[1] or commandList[1] == "" then @@ -333,6 +356,23 @@ control["!"] = function(char) --Disable end end +-- \x1b9[Row];[Col];[Height];[Width];[Dest Row];[Dest Col]c -- copy +control["c"] = function(char) + if commandMode == "9" then + commandList[#commandList + 1] = commandBuf + if #commandList == 6 then + component.invoke(gpu, + "copy", + tonumber(commandList[2]), + tonumber(commandList[1]), + tonumber(commandList[4]), + tonumber(commandList[3]), + tonumber(commandList[6]), + tonumber(commandList[5])) + end + end +end + control["r"] = function(char) --Set scroll region commandList[#commandList + 1] = commandBuf local nt, nb = tonumber(commandList[1]) or 1, tonumber(commandList[2]) or h diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/ifconfig.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/ifconfig.lua deleted file mode 100644 index 42a9f4862..000000000 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/ifconfig.lua +++ /dev/null @@ -1,41 +0,0 @@ -local network = require "network" -local computer = require "computer" -local args = {...} - -local function formatSize(size) - size = tonumber(size) or size - if type(size) ~= "number" then - return tostring(size) - end - local sizes = {"", "K", "M", "G"} - local unit = 1 - local power = 1024 - while size > power and unit < #sizes do - unit = unit + 1 - size = size / power - end - return math.floor(size * 10) / 10 .. sizes[unit] -end - -local function align(txt)return txt .. (" "):sub(#txt+1)end - -if #args < 1 then - print("Network interfaces:") - local info = network.info.getInfo() - for node, info in pairs(info.interfaces)do - print(align(node).."Link encap:"..info.linkName) - print(" HWaddr "..info.selfAddr) - if node == "lo" then print(" HWaddr "..computer.address()) end - local pktIn, pktOut, bytesIn, bytesOut = network.info.getInterfaceInfo(node) - print(" RX packets:"..tostring(pktIn)) - print(" TX packets:"..tostring(pktOut)) - print(" RX bytes: ".. tostring(bytesIn) .. " (" ..formatSize(bytesIn).. ") TX bytes: " ..tostring(bytesOut) .. " (".. formatSize(bytesOut) .. ")") - end -elseif args[1] == "bind" and args[2] then - print("Address attached") - network.ip.bind(args[2]) -else - print("Usage:") - print(" ifconfig - view network summary") - print(" ifconfig bind [addr] - 'attach' addnitional address to computer") -end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/init.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/init.lua index 2162153eb..fe1a00c29 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/init.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/bin/init.lua @@ -1,6 +1,6 @@ --Plan9k userspace init for pipes kernel ---TODO: pcall all + emergency shell(or do it higher, in pipes) +--TODO: pcall all + emergency shell(or do it lower, in pipes) local pipes = require("pipes") local filesystem = require("filesystem") @@ -52,6 +52,8 @@ end local sin, sout +local services_ran = false + local free_gpus = {} local free_screens = {} local used_gpus = {} @@ -69,7 +71,9 @@ local function runtty(gpu, screen) local getty = os.spawnp("/bin/getty.lua", mi, mo, nil, gpu, screen) local readkey = os.spawnp("/bin/readkey.lua", nil, mo, mo, screen, interruptHandler) - if not sout then + if not services_ran then + services_ran = true + sin = si sout = so @@ -113,7 +117,7 @@ if not sout then io.output(sout) end -pcall(services) +--pcall(services) local kout = io.popen(function() if filesystem.exists("/kern.log") then @@ -143,7 +147,6 @@ for address, ctype in component.list() do end computer.pushSignal("init") -os.sleep(0) local signal = {} local on_component_add = {} @@ -244,6 +247,16 @@ function signal.component_removed(_, addr, ctype, ...) end end +function signal.init() + if not services_ran then + services_ran = true + + pcall(services) + end +end + +os.sleep(0) + while true do local sig = {computer.pullSignal()} if signal[sig[1]] then diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/lua.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/lua.lua index aeac2e24a..de4292b30 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/lua.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/bin/lua.lua @@ -106,7 +106,7 @@ if #args == 0 or options.i then --component.gpu.setForeground(0xFFFF00) term.write("Enter a statement and hit enter to evaluate it.\n") term.write("Prefix an expression with '=' to show its value.\n") - term.write("Press Ctrl+C to exit the interpreter.\n") + term.write("Type os.exit() to exit the interpreter.\n") --component.gpu.setForeground(0xFFFFFF) while term.isAvailable() do @@ -117,8 +117,8 @@ if #args == 0 or options.i then if command == nil then -- eof return end - while #history > 10 do - table.remove(history, 1) + while #history > 20 do + history[#history] = nil end local code, reason if string.sub(command, 1, 1) == "=" then diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/mount.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/mount.lua index 6f7c1f870..8e580109f 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/mount.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/bin/mount.lua @@ -10,7 +10,7 @@ if #args == 0 then end return end -if #args < 2 then +--[[if #args < 2 then io.write("Usage: mount [label|address path]\n") io.write("Note that the address may be abbreviated.") return @@ -26,3 +26,11 @@ local result, reason = fs.mount(table.unpack(args)) if not result then io.stderr:write(reason) end +]] + +local h = fs.open("/sys/mount") +local r, err = h:write(table.concat(args, " ")) +h:close() +if err then + print("Error: " .. tostring(err)) +end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/ping.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/ping.lua deleted file mode 100644 index 57b7a7b65..000000000 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/ping.lua +++ /dev/null @@ -1,107 +0,0 @@ -local network = require "network" -local event = require "event" -local computer = require "computer" -local shell = require "shell" - -local args, options = shell.parse(...) - -if #args < 1 or options.h or options.help then - print("Usage: ping: [addr]") - print(" --c= --count=[ping count] Amount of pings to send(default 6)") - print(" --s= --size=[data size] Payload size(default 56 bytes)") - print(" --i= --interval=[seconds] Ping interval(default 1s)") - --print(" -d --duplicates Check for duplicate messages") - print(" --t= --droptime=[seconds] Amount of time after which ping is") - print(" Considered to be lost[default 8s]") - print(" -v --verbose Output more details") - return -end - -local len = tonumber(options.s) or tonumber(options.size) or 56 - -local function round(n,r) return math.floor(n*(10^r))/(10^r) end - -local function verbose(...) - if options.v or options.verbose then - print(...) - end -end - -local function generatePayload() - local payload = "" - for i = 1, len do - local ch = string.char(math.random(0, 255)) - ch = ch == ":" and "_" or ch --Ping matcher derps hard when it finds ':' in payload - payload = payload .. ch - end - return payload -end - - -print("PING "..args[1].." with "..tostring(len) .." bytes of data") - -local stats = { - transmitted = 0, - received = 0, - malformed = 0 -} - -local function doSleep() - - local deadline = computer.uptime() + (tonumber(options.i) or tonumber(options.interval) or 1) - repeat - computer.pullSignal(deadline - computer.uptime()) - until computer.uptime() >= deadline -end - -local function doPing() - - local payload = generatePayload() - local icmp_seq = network.icmp.ping(args[1], payload) - stats.transmitted = stats.transmitted + 1 - verbose(tostring(len).." bytes to "..args[1]..": icmp_seq="..tostring(icmp_seq)) - local start = computer.uptime() - - local deadline = start + (tonumber(options.t) or tonumber(options.droptime) or 8) - local e, replier, id, inpayload - repeat - e, replier, id, inpayload = event.pull(deadline - computer.uptime(), "ping_reply") - until computer.uptime() >= deadline or (e == "ping_reply" and id == icmp_seq) - - if computer.uptime() >= deadline and e ~= "ping_reply" then - verbose(tostring(len).." bytes lost: icmp_seq="..tostring(icmp_seq)) - elseif inpayload == payload then - stats.received = stats.received + 1 - print(tostring(len).." bytes from "..args[1]..": icmp_seq="..tostring(icmp_seq).." time="..tostring(round(computer.uptime()-start,2)).." s") - else - stats.malformed = stats.malformed + 1 - verbose(tostring(#inpayload).." bytes malformed: icmp_seq="..tostring(icmp_seq).." time="..tostring(round(computer.uptime()-start,2)).." s") - end -end - -local begin = computer.uptime() - -local function outputStats() - print("--- "..args[1].." ping statistics ---") - print(tostring(stats.transmitted) .. " packets transmitted, " - ..tostring(stats.received) .. " received, " - ..tostring(100 - math.floor((stats.received / stats.transmitted) * 100)) .. "% packet loss, time " .. tostring(round(computer.uptime()-begin,2))) -end - -local state, reason = pcall(function() - local c = 0 - repeat - doPing() - doSleep() - c = c + 1 - until c == 0 or (tonumber(options.c) and c >= tonumber(options.c)) - or (tonumber(options.count) and c >= tonumber(options.count)) - or ((not tonumber(options.c)) and (not tonumber(options.count)) and c >= 8) -end) - -if not state then - verbose("Stopped by: "..tostring(reason)) -end - -outputStats() - diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/readkey.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/readkey.lua index 8a2b40dfd..089efce24 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/readkey.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/bin/readkey.lua @@ -170,17 +170,17 @@ function on.key_down(_, source, ascii, keycode, user) elseif keycode == 205 then io.stdout:write("\x1b[C") elseif keycode == 203 then io.stdout:write("\x1b[D") - elseif keycode == keyboard.keys.f1 then io.stdout:write("\x1b[0P") - elseif keycode == keyboard.keys.f2 then io.stdout:write("\x1b[0Q") - elseif keycode == keyboard.keys.f3 then io.stdout:write("\x1b[0R") - elseif keycode == keyboard.keys.f4 then io.stdout:write("\x1b[0S") + elseif keycode == keyboard.keys.f1 then io.stdout:write("\x1bOP") + elseif keycode == keyboard.keys.f2 then io.stdout:write("\x1bOQ") + elseif keycode == keyboard.keys.f3 then io.stdout:write("\x1bOR") + elseif keycode == keyboard.keys.f4 then io.stdout:write("\x1bOS") elseif keycode == keyboard.keys.delete then io.stdout:write("\x1b[3~") - elseif keycode == keyboard.keys.insert then io.stdout:write("\x1b[2~") + --elseif keycode == keyboard.keys.insert then io.stdout:write("\x1b[2~") elseif keycode == keyboard.keys.pageUp then io.stdout:write("\x1b[5~") elseif keycode == keyboard.keys.pageDown then io.stdout:write("\x1b[6~") - elseif keycode == keyboard.keys.home then io.stdout:write("\x1b0H") - elseif keycode == keyboard.keys["end"] then io.stdout:write("\x1b0F") + elseif keycode == keyboard.keys.home then io.stdout:write("\x1bOH") + elseif keycode == keyboard.keys["end"] then io.stdout:write("\x1bOF") elseif keycode == keyboard.keys.tab then io.stdout:write("\t") --TODO: rest fX keys end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/route.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/route.lua deleted file mode 100644 index 1a35e3954..000000000 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/route.lua +++ /dev/null @@ -1,44 +0,0 @@ -local network = require "network" - -local function fillText(text, n) - for k = 1, n - #text do - text = text .. " " - end - return text -end - -local function normLine(data) - local res = "" - for c in data:gmatch(".") do - if c == "\n" or c == "\r" then c = "\x1b[31m.\x1b[39m" end - res = res .. (c:match("[%g%s]") or "\x1b[31m.\x1b[39m") - end - return res -end - -print("MCNET routing table") -local routes = network.info.getRoutes() -local maxlen = {12, 8, 6, 4, 5} - -for host, route in pairs(routes) do - maxlen[1] = maxlen[1] < #normLine(host)+1 and #normLine(host)+1 or maxlen[1] - maxlen[2] = maxlen[2] < #route.router+1 and #route.router+1 or maxlen[2] - maxlen[3] = maxlen[3] < #route.interface+1 and #route.interface+1 or maxlen[3] - maxlen[4] = maxlen[4] < #tostring(route.age)+1 and #tostring(route.age)+1 or maxlen[4] - maxlen[5] = maxlen[5] < #tostring(route.dist)+1 and #tostring(route.dist)+1 or maxlen[5] -end - -print(fillText("Destination", maxlen[1]).. - fillText("Gateway", maxlen[2]).. - fillText("Iface", maxlen[3]).. - fillText("Age", maxlen[4]).. - fillText("Dist", maxlen[5])) - -for host, route in pairs(routes) do - print(fillText(normLine(host), maxlen[1]).. - fillText(route.router, maxlen[2]).. - fillText(route.interface, maxlen[3]).. - fillText(tostring(route.age), maxlen[4]).. - fillText(tostring(route.dist), maxlen[5])) -end - diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/sh.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/sh.lua index 8a245c296..a36c481e5 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/sh.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/bin/sh.lua @@ -4,6 +4,8 @@ local text = require("text") local shell = require("shell") local fs = require("filesystem") +local arg, opt = shell.parse(...) + local alias = {} local builtin = {} @@ -19,6 +21,7 @@ local function parse(tokens) local nextin = "-" local nextout = "-" + local nexterr = nil local arg = {} local skip = false @@ -51,15 +54,20 @@ local function parse(tokens) if not tokens[k + 1]:match("[%w%._%-/~]+") then error("Syntax error") end nextout = tokens[k + 1] skip = true + elseif token == "2>" then + if not tokens[k + 1]:match("[%w%._%-/~]+") then error("Syntax error") end + nexterr = tokens[k + 1] + skip = true elseif token == ">>" then if not tokens[k + 1]:match("[%w%._%-/~]+") then error("Syntax error") end nextout = tokens[k + 1] skip = true print("APPEND MODE IS NOT IMPLEMENTED") elseif token == "&" then - res[#res + 1] = {arg = arg, stdin = nextin, stdout = nextout, nowait = true} + res[#res + 1] = {arg = arg, stdin = nextin, stdout = nextout, stderr = nexterr, nowait = true} nextout = "-" nextin = "-" + nexterr = nil arg = {} end else @@ -68,7 +76,7 @@ local function parse(tokens) end if #arg > 0 then - res[#res + 1] = {arg = arg, stdin = nextin, stdout = nextout} + res[#res + 1] = {arg = arg, stdin = nextin, stdout = nextout, stderr = nexterr} end return res, pipes @@ -118,9 +126,10 @@ local function execute(cmd) for n, program in pairs(programs) do local sin = type(program.stdin) == "number" and pipes[program.stdin][1] or program.stdin == "-" and io.input() or io.open(program.stdin, "r") local sout = type(program.stdout) == "number" and pipes[program.stdout][2] or program.stdout == "-" and io.output() or io.open(program.stdout, "w") + local serr = program.stderr and (program.stderr == "-" and io.output() or io.open(program.stderr, "w")) or io.stderr processes[n] = { - pid = os.spawnp(program.arg[1], sin, sout, io.stderr, table.unpack(program.arg, 2)), + pid = os.spawnp(program.arg[1], sin, sout, serr, table.unpack(program.arg, 2)), stdin = sin, stdout = sout } @@ -149,6 +158,17 @@ local function expand(value) return result end +local function script(file) + for line in io.lines(file) do + if line:sub(1,1) ~= "#" then + if opt.x then + print("> " .. line) + end + execute(text.trim(line)) + end + end +end + ------------------- -- Builtins @@ -310,10 +330,13 @@ builtin.alias("....", "cd", "../../..") ------------------- -- Main loop +if arg[1] and fs.exists(arg[1]) then + script(arg[1]) + return +end + if fs.exists("~/.shrc") then - for line in io.lines("~/.shrc") do - execute(line) - end + script(arg[1]) end while run do diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/boot/kernel/pipes b/src/main/resources/assets/opencomputers/loot/plan9k/boot/kernel/pipes index d9522217a..cd978e5c3 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/boot/kernel/pipes +++ b/src/main/resources/assets/opencomputers/loot/plan9k/boot/kernel/pipes @@ -97,7 +97,7 @@ local panicPull = kernel._K.computer.pullSignal function kernel.panic() kernel._println("--------------------------------------------------------") pcall(function() - for s in string.gmatch(debug.traceback(), "[^\r\n]+") do + for s in string.gmatch(tostring(debug.traceback()), "[^\r\n]+") do kernel._println(s) end end) diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/etc/rc.cfg b/src/main/resources/assets/opencomputers/loot/plan9k/etc/rc.cfg new file mode 100644 index 000000000..b7ddd2e35 --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/plan9k/etc/rc.cfg @@ -0,0 +1 @@ +enabled = {} diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/colors.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/colors.lua new file mode 100644 index 000000000..b2d8837ea --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/colors.lua @@ -0,0 +1,30 @@ +local colors = { + [0] = "white", + [1] = "orange", + [2] = "magenta", + [3] = "lightblue", + [4] = "yellow", + [5] = "lime", + [6] = "pink", + [7] = "gray", + [8] = "silver", + [9] = "cyan", + [10] = "purple", + [11] = "blue", + [12] = "brown", + [13] = "green", + [14] = "red", + [15] = "black" +} + +do + local keys = {} + for k in pairs(colors) do + table.insert(keys, k) + end + for _, k in pairs(keys) do + colors[colors[k]] = k + end +end + +return colors diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/internet.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/internet.lua index 00fbf644c..886ff6f4e 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/internet.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/internet.lua @@ -98,7 +98,15 @@ function internet.socket(address, port) end local stream = {inet = inet, socket = socket} + + -- stream:close does a syscall, which yields, and that's not possible in + -- the __gc metamethod. So we start a timer to do the yield/cleanup. + local function cleanup(self) + if not self.socket then return end + pcall(self.socket.close) + end local metatable = {__index = socketStream, + __gc = cleanup, __metatable = "socketstream"} return setmetatable(stream, metatable) end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/01_util.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/01_util.lua index 1cdcacc79..c182f16aa 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/01_util.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/01_util.lua @@ -24,6 +24,14 @@ function split(str, pat) return t end +function cloneTab(t) + local n = {} + for k, v in pairs(t) do + n[k] = v + end + return n +end + -------- function getAllocator() @@ -47,6 +55,14 @@ end -------- +function randomString(c) + local s = "" + for i = 1, c do + s = s .. string.char(math.random(0, 255)) + end + return s +end + function uuidBin(uuid) local undashed = uuid:gsub("-","") local high = tonumber(undashed:sub(1,16), 16) @@ -58,6 +74,10 @@ function binUUID(uuid) local raw = toHex(uuid) return raw:sub(1, 8) .. "-" .. raw:sub(9, 12) .. "-" .. raw:sub(13, 16) .. "-" .. raw:sub(17, 20) .. "-" .. raw:sub(21) end + +function shortUUID() + return toHex(randomString(2)):upper() +end -------- diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/05_vfs.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/05_vfs.lua index 14fff5628..67c6b72ac 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/05_vfs.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/05_vfs.lua @@ -528,7 +528,13 @@ function filesystem.open(path, mode) end local stream = {fs = node.fs, handle = handle} + + local function cleanup(self) + if not self.handle then return end + pcall(self.fs.close, self.handle) + end local metatable = {__index = fileStream, + __gc = cleanup, __metatable = "filestream"} return setmetatable(stream, metatable) end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/10_sysfs.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/10_sysfs.lua new file mode 100644 index 000000000..8fda0259d --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/10_sysfs.lua @@ -0,0 +1,112 @@ +proxy = {} +data = {} + +proxy.address = "sysfs0000" +proxy.spaceUsed = function() return 0 end +proxy.spaceTotal = function() return 0 end +proxy.makeDirectory = function() error("Permission Denied") end +proxy.isReadOnly = function() return true end +proxy.rename = function() error("Permission Denied") end +proxy.remove = function() error("Permission Denied") end +proxy.setLabel = function() error("Permission Denied") end +proxy.size = function(path) + local seg = kernel.modules.vfs.segments(path) + local file = data + for _, d in pairs(seg) do + file = file[d] + end + return file.size and file.size() or 0 +end +proxy.getLabel = function() return "sysfs" end + +local allocator, handles = kernel.modules.util.getAllocator() + +proxy.exists = function(path) + local seg = kernel.modules.vfs.segments(path) + local file = data + for _, d in pairs(seg) do + if not file[d] then + return false + end + file = file[d] + end + return file and true or false +end +proxy.open = function(path) + local seg = kernel.modules.vfs.segments(path) + local file = data + for _, d in pairs(seg) do + if not file[d] then + return nil, "File not found" + end + file = file[d] + end + local hnd = allocator:get() + hnd.file = file + if hnd.file.open then + hnd.file.open(hnd) + end + return hnd.id +end +proxy.read = function(h, ...) + return handles[h].file.read(handles[h], ...) +end +proxy.close = function(h) + if handles[h].file.close then + handles[h].file.close(handles[h]) + end + allocator:unset(handles[h]) +end +proxy.write = function(h, ...) + return handles[h].file.write(handles[h], ...) +end +proxy.seek = function(h, ...) + return handles[h].file.seek(handles[h], ...) +end +proxy.isDirectory = function(path) + local seg = kernel.modules.vfs.segments(path) + local dir = data + for _, d in pairs(seg) do + dir = dir[d] + end + if dir.__type then + return false + end + return true +end +proxy.list = function(path) + local seg = kernel.modules.vfs.segments(path) + local dir = data + for _, d in pairs(seg) do + dir = dir[d] + end + if dir.__type then + error("File is not a directory") + end + local list = {} + for f, node in pairs(dir) do + list[#list + 1] = f .. (node.__type and "" or "/") + end + return list +end + +----- + +function roFile(data) + return { + __type = "f", + read = function(h) + if h.read then + return nil + end + h.read = true + return (type(data) == "function") and data() or tostring(data) + end + } +end + +data.net = {} + +function start() + kernel.modules.vfs.mount(proxy, "/sys") +end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/11_block.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/11_block.lua new file mode 100644 index 000000000..d10916844 --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/11_block.lua @@ -0,0 +1,29 @@ +local devices = {} +local dfs = kernel.modules.devfs.data +scanners = {} + +function register(uuid, name, device, scan) + if devices[uuid] then + return + end + + if dfs[name] then + return + end + + devices[uuid] = {name = name} + dfs[name] = device + + if scan then + for k, v in pairs(scanners) do + v(device, uuid, name) + end + end +end + +function unregister(uuid) + if not devices[uuid] then + return + end + dfs[devices[uuid].name] = nil +end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/12_mount.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/12_mount.lua new file mode 100644 index 000000000..3126f4cd5 --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/12_mount.lua @@ -0,0 +1,23 @@ +filesystems = {} + +kernel.modules.sysfs.data.mount = { + __type = "f", + write = function(h, data) + local args = kernel.modules.util.split(data, "%s") + kernel.io.println("Mount " .. table.concat(args, ",")) + if #args < 3 then + return nil, "Invalid argument count" + end + if not filesystems[args[1]] then + return nil, "Invalid filesystem" + end + + local proxy, err = filesystems[args[1]](table.unpack(args, 2, #args - 1)) + if not proxy then + kernel.io.println("Error mounting " .. tostring(args[1]) .. ": " .. tostring(err)) + return nil, err + end + + return kernel.modules.vfs.mount(proxy, args[#args]) + end +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/15_userspace.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/15_userspace.lua index 37246e14e..494841d93 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/15_userspace.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/15_userspace.lua @@ -19,7 +19,8 @@ kernel.userspace.computer.getBootAddress = kernel._K.computer.getBootAddress kernel.userspace.computer.shutdown = kernel.modules.gc.shutdown kernel.userspace.computer.pullSignal = function(timeout) - return coroutine.yield("signal", timeout) + kernel.modules.threading.currentThread.deadline = computer.uptime() + (timeout or math.huge) + return coroutine.yield("signal") end kernel.userspace.computer.hasSignal = function(sigType) @@ -79,11 +80,12 @@ end function kernel.userspace.os.exit() kernel.modules.threading.kill(kernel.modules.threading.currentThread.pid) - coroutine.yield("yield", 0) + coroutine.yield("yield") end function kernel.userspace.os.sleep(time) - coroutine.yield("yield", computer.uptime() + (time or 0)) + kernel.modules.threading.currentThread.deadline = computer.uptime() + (time or 0) + coroutine.yield("yield") end function kernel.userspace.os.getenv(name) diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/16_partition.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/16_partition.lua new file mode 100644 index 000000000..7681c7df6 --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/16_partition.lua @@ -0,0 +1,60 @@ +function buildDevice(parent, first, size) + kernel.io.println("Partition from "..first) + return { + __type = "f", + open = function(hnd) + hnd.pos = 0 + hnd.h = {} + parent.open(hnd.h) + parent.seek(hnd.h, "set", first) + end, + size = function() + return size + end, + write = function(h, data) + parent.seek(h.h, "set", first + h.pos) + parent.write(h.h, data:sub(1, math.min(#data, size - h.pos))) + + h.pos = h.pos + #data + + return not (h.pos >= size) + end, + read = function(h, len) + len = math.ceil(len) + if h.pos >= size then + return + end + + -- 0 1 2 3 4 5 6 7 8 + -- - - - x x x - - - + + parent.seek(h.h, "set", first + h.pos) + local data = parent.read(h.h, math.min(len, size - h.pos)) + + h.pos = h.pos + len + return data + end, + seek = function(h, whence, offset) + offset = offset or 0 + if whence == "end" then + h.pos = math.min(size, math.max(0, size - offset)) + return h.pos + elseif whence == "set" then + h.pos = math.min(size, math.max(0, offset)) + return h.pos + elseif whence == "cur" then + h.pos = math.min(size, math.max(0, h.pos + offset)) + return h.pos + else + error("Invalid whence") + end + return math.floor(h.pos) + end, + close = function(h) + if parent.close then + + end + end + } +end + diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_chatbox.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_chatbox.lua index b0f74a192..0647aa7d6 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_chatbox.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_chatbox.lua @@ -1,47 +1,31 @@ -chatboxes = {} +local block = kernel.modules.block -local function buildDevfs() - for file in pairs(kernel.modules.devfs.data) do - if file:match("^chatbox") then - kernel.modules.devfs.data[file] = nil - end - end - for k, chatbox in ipairs(chatboxes) do - kernel.modules.devfs.data["chatbox" .. chatbox:sub(1,4):upper()] = { - __type = "f", - open = function(hnd, mode) - if mode == "r" then error("Invalid mode") end - hnd.chatbox = chatbox - end, - size = function() - return 2048 - end, - write = function(h, data) - component.invoke(chatbox, "say", data) - return true - end, - } - end +local function buildDevice() + return { + __type = "f", + open = function(hnd, mode) + if mode == "r" then error("Invalid mode") end + hnd.chatbox = chatbox + end, + size = function() + return 2048 + end, + write = function(h, data) + component.invoke(chatbox, "say", data) + return true + end, + } end local function onComponentAdded(_, address, componentType) if componentType == "chat_box" then - chatboxes[#chatboxes + 1] = address - buildDevfs() + block.register(address, "chatbox" .. address:sub(1,4):upper(), buildDevice(address)) end end local function onComponentRemoved(_, address, componentType) if componentType == "chat_box" then - local t - for i, chatbox in ipairs(chatboxes) do - if chatbox == address then - t = i - break - end - end - table.remove(chatboxes, t) - buildDevfs() + block.unregister(address) end end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_data.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_data.lua index 4676746f4..c1e25d463 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_data.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_data.lua @@ -1,47 +1,25 @@ -cards = {} +local block = kernel.modules.block - -local function buildDevfs() - for file in pairs(kernel.modules.devfs.data) do - if file == "urandom" then - kernel.modules.devfs.data[file] = nil - end - end - - kernel.modules.devfs.data["urandom"] = { +local function buildDevice(addr) + return { __type = "f", read = function(h, len) - return component.invoke(cards[1], "random", len) + return component.invoke(addr, "random", len) end } end local function onComponentAdded(_, address, componentType) if componentType == "data" then - cards[#cards + 1] = address - buildDevfs() + block.register(address, "urandom", buildDevice(address)) end end local function onComponentRemoved(_, address, componentType) if componentType == "data" then - local t - for i, card in ipairs(cards) do - if card == address then - t = i - break - end - end - table.remove(cards, t) - buildDevfs() + block.unregister(address) end end ---function start() - --for card, t in component.list("data") do - -- onComponentAdded(_, card, t) - --end ---end - kernel.modules.keventd.listen("component_added", onComponentAdded) kernel.modules.keventd.listen("component_removed", onComponentRemoved) diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_drive.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_drive.lua index 24cb3ae64..234ffd04f 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_drive.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_drive.lua @@ -1,6 +1,6 @@ -drives = {} +local block = kernel.modules.block -function writeSectors(drive, data, at) +local function writeSectors(drive, data, at) local sectorSize = component.invoke(drive, "getSectorSize") repeat local atSector = math.floor((at - 1) / sectorSize) + 1 @@ -16,21 +16,21 @@ function writeSectors(drive, data, at) local toWrite = before .. data:sub(1, writable) .. after data = data:sub(writable + 1) - kernel.io.println("Wd: " .. atSector .. "/" .. #toWrite .. ": "..inSectorStart.." [ " .. writable .. " ] "..(inSectorStart + writable) .. " #old="..#old) + --kernel.io.println("Wd: " .. atSector .. "/" .. #toWrite .. ": "..inSectorStart.." [ " .. writable .. " ] "..(inSectorStart + writable) .. " #old="..#old) component.invoke(drive, "writeSector", atSector, toWrite) at = at + writable until #data < 1 end -function readSectors(drive, at, len) +local function readSectors(drive, at, len) local data = "" local sectorSize = component.invoke(drive, "getSectorSize") repeat local atSector = math.floor(at / sectorSize) + 1 sector = component.invoke(drive, "readSector", atSector) - kernel.io.println("Rsect " .. atSector .. ": " .. tostring((at - 1) % sectorSize + 1) .. " -> " .. tostring(math.min((at - 1) % sectorSize + len - #data, sectorSize))) + --kernel.io.println("Rsect " .. atSector .. ": " .. tostring((at - 1) % sectorSize + 1) .. " -> " .. tostring(math.min((at - 1) % sectorSize + len - #data, sectorSize))) local read = sector:sub((at - 1) % sectorSize + 1, math.min((at - 1) % sectorSize + len - #data, sectorSize)) data = data .. read @@ -39,79 +39,64 @@ function readSectors(drive, at, len) return data end -local function buildDevfs() - for file in pairs(kernel.modules.devfs.data) do - if file:match("^sd") then - kernel.modules.devfs.data[file] = nil - end - end - for k, drive in ipairs(drives) do - kernel.modules.devfs.data["sd" .. drive:sub(1, 4):upper()] = { - __type = "f", - open = function(hnd) - --component.invoke(drive, "seek", -math.huge) - hnd.drive = drive - hnd.pos = 1 - --kernel.io.println("Od: " .. hnd.pos .. "/" .. component.invoke(drive, "getCapacity")) - end, - size = function() - return component.invoke(drive, "getCapacity") - end, - write = function(h, data) - - writeSectors(drive, data, h.pos) - --kernel.io.println("Wd: " .. h.pos .. "(+" .. #data .. ")/" .. component.invoke(drive, "getCapacity")) - h.pos = h.pos + #data - return not (h.pos >= component.invoke(drive, "getCapacity")) - --TODO: do this correctly - end, - read = function(h, len) - len = math.ceil(len) - kernel.io.println("Rd " .. tostring(len) .. ": " .. h.pos .. "/" .. component.invoke(drive, "getCapacity")) - if h.pos >= component.invoke(drive, "getCapacity") then - return - end - local data = readSectors(drive, h.pos, len) - h.pos = h.pos + len - return data - end, - seek = function(h, whence, offset) - offset = offset or 0 - if whence == "end" then - h.pos = math.min(component.invoke(drive, "getCapacity"), math.max(1, component.invoke(drive, "getCapacity") - offset)) - return h.pos - 1 - elseif whence == "set" then - h.pos = math.min(component.invoke(drive, "getCapacity"), math.max(1, 1 + offset)) - return h.pos - 1 - else - h.pos = math.min(component.invoke(drive, "getCapacity"), math.max(1, h.pos + offset)) - return h.pos - 1 - end - return math.floor(h.pos) +local function buildDevice(drive) + return { + __type = "f", + open = function(hnd) + --component.invoke(drive, "seek", -math.huge) + hnd.drive = drive + hnd.pos = 1 + --kernel.io.println("Od: " .. hnd.pos .. "/" .. component.invoke(drive, "getCapacity")) + end, + size = function() + return component.invoke(drive, "getCapacity") + end, + write = function(h, data) + + writeSectors(drive, data, h.pos) + --kernel.io.println("Wd: " .. h.pos .. "(+" .. #data .. ")/" .. component.invoke(drive, "getCapacity")) + h.pos = h.pos + #data + return not (h.pos >= component.invoke(drive, "getCapacity")) + --TODO: do this correctly + end, + read = function(h, len) + len = math.ceil(len) + --kernel.io.println("Rd " .. tostring(len) .. ": " .. h.pos .. "/" .. component.invoke(drive, "getCapacity")) + if h.pos >= component.invoke(drive, "getCapacity") then + return end - } - end + local data = readSectors(drive, h.pos, len) + h.pos = h.pos + len + return data + end, + seek = function(h, whence, offset) + offset = offset or 0 + if whence == "end" then + h.pos = math.min(component.invoke(drive, "getCapacity"), math.max(1, component.invoke(drive, "getCapacity") - offset + 1)) + return h.pos - 1 + elseif whence == "set" then + h.pos = math.min(component.invoke(drive, "getCapacity"), math.max(1, 1 + offset)) + return h.pos - 1 + else + h.pos = math.min(component.invoke(drive, "getCapacity"), math.max(1, h.pos + offset)) + return h.pos - 1 + end + return math.floor(h.pos) + end + } end local function onComponentAdded(_, address, componentType) if componentType == "drive" then - drives[#drives + 1] = address - buildDevfs() + block.register(address, "sd" .. address:sub(1,4):upper(), buildDevice(address), true) end end local function onComponentRemoved(_, address, componentType) if componentType == "drive" then - local t - for i, drive in ipairs(drives) do - if drive == address then - t = i - break - end - end - table.remove(drives, t) - buildDevfs() + block.unregister(address) end end + kernel.modules.keventd.listen("component_added", onComponentAdded) kernel.modules.keventd.listen("component_removed", onComponentRemoved) diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_gpt.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_gpt.lua new file mode 100644 index 000000000..5ee7b4a90 --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_gpt.lua @@ -0,0 +1,30 @@ +local block = kernel.modules.block +local util = kernel.modules.util + +local lba = 512 + +local function scan(device, duuid, dname) + local h = {} + device.open(h) + device.seek(h, "set", 1 * lba) + local head = device.read(h, 92) + local sig, rev, hsize, crc, clb, blb, fusablelba, lusablelba, + uuid, arraystart, partitions, entrysz, partcrc = string.unpack("\60c8c4I4I4xxxxI8I8I8I8c16I8I4I4I4", head) + if sig ~= "EFI PART" or rev ~= "\0\0\1\0" then + return + end + for i = 1, partitions do + device.seek(h, "set", arraystart * lba + (i - 1) * entrysz) + local entry = device.read(h, entrysz) + local ptype, puuid, pstart, pend, attr, name = string.unpack("\60c16c16I8I8I8c72", entry) + if ptype ~= ("\0"):rep(16) then + local size = (pend - pstart + 1) * 512 + block.register(util.binUUID(puuid), dname .. "p" .. (i - 1), kernel.modules.partition.buildDevice(device, pstart * lba, size)) + end + end + if device.close then + device.close(h) + end +end + +kernel.modules.block.scanners.gpt = scan \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_io.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_io.lua index 050a4c8ae..99e6f3f71 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_io.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_io.lua @@ -1,5 +1,5 @@ local io = {} - +local threading ------------------------------------------------------------------------------- local function buffWrap(b) @@ -37,9 +37,9 @@ function io.input(file) elseif not io.type(file) then error("bad argument #1 (string or file expected, got " .. type(file) .. ")", 2) end - kernel.modules.threading.currentThread.io_input = file + threading.currentThread.io_input = file end - return kernel.modules.threading.currentThread.io_input + return threading.currentThread.io_input end function io.lines(filename, ...) @@ -95,10 +95,10 @@ function io.popen(prog, mode, ...) if mode == "w" then local newin, sink = kernel.modules.buffer.pipe() - local thread = kernel.modules.threading.spawn(prog, 0, name, _, _, ...) --TODO: child mode somehow + local thread = threading.spawn(prog, 0, name, _, _, ...) --TODO: child mode somehow - thread.io_output = kernel.modules.threading.currentThread.io_output - thread.io_error = kernel.modules.threading.currentThread.io_error + thread.io_output = threading.currentThread.io_output + thread.io_error = threading.currentThread.io_error thread.io_input = newin sink.thread = thread.pid @@ -106,10 +106,10 @@ function io.popen(prog, mode, ...) elseif mode == "r" or mode == nil then local out, newout = kernel.modules.buffer.pipe() - local thread = kernel.modules.threading.spawn(prog, 0, name, _, _, ...) --TODO: child mode somehow + local thread = threading.spawn(prog, 0, name, _, _, ...) --TODO: child mode somehow thread.io_output = newout - thread.io_error = kernel.modules.threading.currentThread.io_error - thread.io_input = kernel.modules.threading.currentThread.io_input + thread.io_error = threading.currentThread.io_error + thread.io_input = threading.currentThread.io_input out.thread = thread.pid return out @@ -117,9 +117,9 @@ function io.popen(prog, mode, ...) local newin, sink = kernel.modules.buffer.pipe() local out, newout = kernel.modules.buffer.pipe() - local thread = kernel.modules.threading.spawn(prog, 0, name, _, _, ...) --TODO: child mode somehow + local thread = threading.spawn(prog, 0, name, _, _, ...) --TODO: child mode somehow thread.io_output = newout - thread.io_error = kernel.modules.threading.currentThread.io_error + thread.io_error = threading.currentThread.io_error thread.io_input = newin sink.thread = thread.pid @@ -127,11 +127,11 @@ function io.popen(prog, mode, ...) return sink, out elseif mode == "" then - local thread = kernel.modules.threading.spawn(prog, 0, name, _, _, ...) --TODO: child mode somehow + local thread = threading.spawn(prog, 0, name, _, _, ...) --TODO: child mode somehow - thread.io_output = kernel.modules.threading.currentThread.io_output - thread.io_error = kernel.modules.threading.currentThread.io_error - thread.io_input = kernel.modules.threading.currentThread.io_input + thread.io_output = threading.currentThread.io_output + thread.io_error = threading.currentThread.io_error + thread.io_input = threading.currentThread.io_input return thread.pid end @@ -153,9 +153,9 @@ function io.output(file) elseif not io.type(file) then error("bad argument #1 (string or file expected, got " .. type(file) .. ")", 2) end - kernel.modules.threading.currentThread.io_output = file + threading.currentThread.io_output = file end - return kernel.modules.threading.currentThread.io_output + return threading.currentThread.io_output end function io.read(...) @@ -198,3 +198,7 @@ setmetatable(io, {__index = function(_, k) end}) _G.io = io + +function start() + threading = kernel.modules.threading +end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_network.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_network.lua deleted file mode 100644 index bad955997..000000000 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_network.lua +++ /dev/null @@ -1,483 +0,0 @@ ---local network = require "network" - -local cfg = { - routereq_retry = 20, --Seconds betwen route seek retries - routereq_drop = 115, --Seconds to stop seeking route - routereq_relayage = 3, --Timeout added to each request re-sent - route_relayage = 3, --Age added to each route sent - route_exp = 300/2, --Remove route after being not used for this time - route_recheck = 320/2, --Recheck each route after this amount of time - route_age_max = 660, -- Max age of route - ttl = 32 --Time to live -} -kernel.modules.procfs.data.sys.net = cfg - -local _rawSend -local isAccessible -local getNodes ---local getInterfaceInfo -local startNetwork -local resetRouting - -local dataHandler --Layer 2 data handler - -accessibleHosts = {} -nodes = {} - ------------------------- ---Layer 1 - -local initated = false - -function start() - if initated then return end - initated = true - - --local filesystem = require "filesystem" - - local drivers = {} - - for file in kernel.modules.vfs.list("/lib/modules/network") do - - --print("Loading driver:", file) - local ld, reason = kernel.userspace.loadfile("/lib/modules/network/"..file, nil, _G) - if not ld then - kernel.io.println("Network driver loading failed: " .. tostring(reason)) - end - drivers[file] = {driver = ld()} - - local eventHandler = {}--EVENT HANDLERS FOR DRIVER EVENTS - --eventHandler.debug = print - eventHandler.debug = function()end - - function eventHandler.newHost(node, address)--New interface in net node - --print("New host: ",node, address) - accessibleHosts[address] = {driver = drivers[file], node = node} - nodes[node].hosts[address] = address--mark host in node - end - - function eventHandler.newInterface(interface, selfAddr, linkName)--New node - --print("New interface: ",interface, selfaddr) - nodes[interface] = {hosts={}, driver = drivers[file], selfAddr = selfAddr, linkName = linkName} - end - - function eventHandler.delInterface(interface) - nodes[interface] = nil - for addr, host in pairs(accessibleHosts) do - if host.node == interface then - accessibleHosts[addr] = nil - end - end - resetRouting() - end - - function eventHandler.recvData(data, node, origin) - dataHandler(data, node, origin) - end - - function eventHandler.setListener(evt, listener) - return kernel.modules.keventd.listen(evt, function(...) - local args = {...} - local res = {pcall(function()listener(table.unpack(args))end)} - if not res[1] then - kernel.io.println("ERROR IN NET EVENTHANDLER["..file.."]:"..tostring(res[2])) - end - return table.unpack(res,2) - end) - end - - drivers[file].handle = drivers[file].driver.start(eventHandler) - end - - _rawSend = function(addr, node, data) - --print("TrySend:",node,addr,":",data) - if accessibleHosts[addr] then - accessibleHosts[addr].driver.driver.send(accessibleHosts[addr].driver.handle, node, addr, data) - end - end - - isAccessible = function(addr) - if not accessibleHosts[addr] then return end - return accessibleHosts[addr].node, accessibleHosts[addr].driver - end - - getNodes = function() - return nodes - end - - getInterfaceInfo = function(interface) - if nodes[interface] then - return nodes[interface].driver.driver.info(interface) - end - end - - kernel.io.println("Link Control initated") - startNetwork() - kernel.io.println("Network initated") -end - ------------------------- ---Layer 2 - -startNetwork = function() - local rawSend - --local send - - local routeRequests = {} -- Table by dest addressed of tables {type = T[, data=..]}, types: D(own waiting data), R(route request for someone), E(routed data we should be able to route..) - local routes = {} --Table of pairs -> [this or route] / {thisHost=true} / {router = [addr]} - - resetRouting = function() - for k, route in pairs(routes) do - if not route.thisHost then - routes[k] = nil - end - end - end - - routes[computer.address()] = {thisHost=true} - - -----Data out - - local function onRecv(origin, data) - --computer.pushSignal("network_message", origin, data) - kernel.modules.libnetwork.handleData(origin, data) - end - - -----Sending - - local function sendDirectData(addr, data)--D[ttl-byte][data] - return rawSend(addr, string.pack("c1B", "D", cfg.ttl)..data) - end - - local function sendRoutedData(addr, data)--E[ttl-byte][hostlen-byte][dest host][hostlen-byte][origin host]message - local nodes = getNodes() - local msg = string.pack("c1Bs1s1", "E", cfg.ttl, addr, nodes[routes[addr].node].selfAddr) .. data - local node, driver = isAccessible(addr) - _rawSend(node and addr or routes[addr].router, node or routes[addr].node, msg) - end - - local function sendRoutedDataAs(addr, origin, data, ottl)--E[ttl-byte][hostlen-byte][dest host][hostlen-byte][origin host]message - local msg = string.pack("c1Bs1s1", "E", ottl - 1, addr, origin) .. data - local node, driver = isAccessible(addr) - _rawSend(node and addr or routes[addr].router, node or routes[addr].node, msg) - end - - local function sendRouteRequest(addr, age)--R[ttl-byte][Addr len][Requested addr][age] - local request = string.pack(">c1Bs1H", "R", cfg.ttl, addr, math.floor(age)) - local nodes = getNodes() - local sent = {} - for node, n in pairs(nodes) do - for host in pairs(n.hosts)do - if not sent[host]then - sent[host] = true - --_rawSend(host, node, base..toByte(n.selfAddr:len())..n.selfAddr) - _rawSend(host, node, request) - end - end - end - sent = nil - end - - local function sendHostFound(dest, age, addr, dist)--H[ttl-byte][age-short][distance][Found host] - --kernel.io.println("found "..addr.." for "..dest) - if dest ~= "localhost" then - return rawSend(dest, "H"..string.pack(">BHB", cfg.ttl, math.floor(age + cfg.route_relayage), dist)..addr) - end - end - - rawSend = function(addr, data) - local node, driver = isAccessible(addr) - if node then - _rawSend(addr, node, data) - return true - end - return false - end - - send = function(addr, data) - if type(addr) ~= "string" then error("Address must be string!!") end - if not sendDirectData(addr, data) then--Try send directly - if routes[addr] then - if routes[addr].thisHost then - onRecv("localhost", data)--it's this host, use loopback - else - sendRoutedData(addr, data)--We know route, try to send it that way - routes[addr].active = computer.uptime() - end - else - --route is unknown, we have to request it if we haven't done so already - if not routeRequests[addr] then - routeRequests[addr] = {update = computer.uptime(), timeout = computer.uptime()} - routeRequests[addr][#routeRequests[addr]+1] = {type = "D", data = data} - sendRouteRequest(addr, 0) - else - routeRequests[addr].timeout = computer.uptime() - routeRequests[addr][#routeRequests[addr]+1] = {type = "D", data = data} - end - end - end - end - - local function processRouteRequests(host, age, dist) - if routeRequests[host] then - age = age or (computer.uptime() - routeRequests[host].timeout) - for t, request in pairs(routeRequests[host]) do - if type(request) == "table" then - if request.type == "D" then - sendRoutedData(host, request.data) - elseif request.type == "E" then - if request.ttl-1 > 1 then - sendRoutedDataAs(host, request.origin, request.data, request.ttl) - end - elseif request.type == "R" then - sendHostFound(request.host, age, host, dist or 1) - end - end - end - routeRequests[host] = nil - end - end - - local function checkRouteDest(dest, origin, node, data) - local nodes = getNodes() - if dest == nodes[node].selfAddr then - return true - elseif routes[dest] and routes[dest].thisHost then - return true - end - return false - end - - bindAddr = function(addr) - routes[addr] = {thisHost=true, dist = 0} - processRouteRequests(addr, 0, 1) - end - - kernel.modules.keventd.listen("hostname", function(_, name) bindAddr(name)end) - - dataHandler = function(data, node, origin) - if data:sub(1,1) == "D" then --Direct data - onRecv(origin, data:sub(3)) - elseif data:sub(1,1) == "E" then --Routed data - --local ttl = data:byte(2) - --local dest, destlen = readSizeStr(data, 3) - --local orig, origlen = readSizeStr(data, 3+destlen) - local ttl, dest, orig, dstart = string.unpack(">Bs1s1", data, 2) - local dat = data:sub(dstart) - - - if checkRouteDest(dest, orig, node, dat) then - onRecv(orig, dat) - else - local _node, driver = isAccessible(dest) - if _node then --Have direct route - if ttl-1 > 0 then - kernel.io.println("Direct hop orig="..orig.." -> dest="..dest) - sendRoutedDataAs(dest, orig, dat, ttl) - end - else - if routes[dest] then --Have route - if ttl-1 > 0 then - sendRoutedDataAs(dest, orig, dat, ttl) - routes[dest].active = computer.uptime() - end - else --Need to find route - if not routeRequests[dest] then - routeRequests[dest] = {update = computer.uptime(), timeout = computer.uptime()} - end - routeRequests[dest].timeout = computer.uptime() - if not routeRequests[dest] then routeRequests[dest] = {update = computer.uptime(), timeout = computer.uptime()} end - routeRequests[dest][#routeRequests[dest]+1] = {type = "E", origin = orig, ttl = ttl, data = dat} - sendRouteRequest(dest, 0) - end - end - end - elseif data:sub(1,1) == "R" then --Route request - --local dest, l = readSizeStr(data, 3) - local nttl, dest, age = string.unpack(">Bs1H", data, 2) - if age > cfg.routereq_drop then - return - end - if not routeRequests[dest] then - - --check if accessible interface - local nodes = getNodes() - for _node, n in pairs(nodes) do - if _node ~= node then --requested host won't ever be in same node - for host in pairs(n.hosts)do - if host == dest then - --Found it! - sendHostFound(origin, 0, dest, 1) - return - end - end - end - end - - --check if route known - if routes[dest] then - if routes[dest].thisHost then - --sendHostFound(origin, nodes[node].selfAddr) - sendHostFound(origin, 0 , dest, 1) - elseif routes[dest].router ~= origin then--Router might have rebooted and is asking about route - sendHostFound(origin, computer.uptime() - routes[dest].age, dest, routes[dest].dist + 1) - --routes[dest].active = computer.uptime() - end - return - end - - if isAccessible(dest) then - kernel.io.println("Attempt to seek route to direct host(0x1WAT)") - kernel.io.println("seeker " .. origin .. " to " .. dest) - return - end - - routeRequests[dest] = {update = computer.uptime(), timeout = computer.uptime() - age} - routeRequests[dest][#routeRequests[dest]+1] = {type = "R", host = origin} - - --local nttl = data:byte(2)-1 - if nttl > 1 then - local sent = {} - --Bcast request - for _node, n in pairs(nodes) do - if _node ~= node then --We mustn't send it to origin node - for host in pairs(n.hosts) do - if not sent[host] then - sent[host] = true - --resend route request - local msg = string.pack(">c1Bs1H", "R", nttl - 1, dest, age + cfg.routereq_relayage) - _rawSend(host, _node, msg) - end - end - end - end - end - sent = nil - else - if isAccessible(dest) then - kernel.io.println("Attempt to seek route to direct host(0x2WAT)") - kernel.io.println("seeker " .. origin .. " to " .. dest) - return - end - --we've already requested this addr so if we get the route - --we'll respond. TODO: Duplicates? - if computer.uptime() - routeRequests[dest].timeout > age then - routeRequests[dest].timeout = computer.uptime() - age - end - routeRequests[dest][#routeRequests[dest]+1] = {type = "R", host = origin} - end - elseif data:sub(1,1) == "H" then --Host found - local nttl, age, dist, n = string.unpack(">BHB", data, 2) - local host = data:sub(n) - - if not isAccessible(host) then - if not routes[host] then - routes[host] = { - router = origin, - node = node, - age = computer.uptime() - age, - active = computer.uptime(), - dist = dist - } - processRouteRequests(host, age, dist + 1) - else - if (routes[host].dist > dist) or - ((routes[host].age < computer.uptime() - age) and (routes[host].dist >= dist)) then - routes[host] = { - router = origin, - node = node, - age = computer.uptime() - age, - active = routes[host].active, - dist = dist - } - end - end - end - end - end - - --network.core.setCallback("send", send) - --network.core.setCallback("bind", bindAddr) - - --------------- - --Network stats&info - - function getInfo() - local res = {} - - res.interfaces = {} - for k, node in pairs(getNodes())do - res.interfaces[k] = {selfAddr = node.selfAddr, linkName = node.linkName} - end - return res - end - - function getRoutingTable() - local res = {} - local now = computer.uptime() - - for k,v in pairs(routeRequests) do - res[k] = {router = "", interface = "", age = now - v.timeout, dist = 0} - end - - for k,v in pairs(routes) do - if v.router then - res[k] = {router = v.router, interface = v.node, age = now - v.age, dist = v.dist} - elseif v.thisHost then - res[k] = {router = computer.address(), interface = "lo", age = 0, dist = 0} - end - end - return res - end - - function getArpTable(interface) - local res = {} - for k in pairs(nodes[interface].hosts)do - table.insert(res, k) - end - return res - end - - --network.core.setCallback("netstat", getInfo) - --network.core.setCallback("intstat", getInterfaceInfo) - --network.core.setCallback("routetab", getRoutingTable) - --network.core.setCallback("arptab", getArpTable) - - --network.core.lockCore() - - kernel.modules.timer.add(function() - local now = computer.uptime() - --Route request timeouts, re-requests - for host, request in pairs(routeRequests) do - if now - request.update >= cfg.routereq_retry then - if routes[host] then - processRouteRequests(host, now - routes[host].age, routes[host].dist + 1) - else - sendRouteRequest(host, now - request.update) - request.update = computer.uptime() - end - end - if now - request.timeout >= cfg.routereq_drop then - routeRequests[host] = nil - end - end - - --Route timeouts, rechecks, - for host, route in pairs(routes) do - if not route.thisHost then - local age = now - route.age - if age >= cfg.route_recheck then - sendRouteRequest(host, 0) - end - if age >= cfg.route_age_max then - routes[host] = nil - else - if now - route.active >= cfg.route_exp then - routes[host] = nil - end - end - end - end - end, 5) -end - diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_nfc.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_nfc.lua index 109e59fa2..737004cc7 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_nfc.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_nfc.lua @@ -1,50 +1,34 @@ -programmers = {} +local block = kernel.modules.block -local function buildDevfs() - for file in pairs(kernel.modules.devfs.data) do - if file:match("^nfc") then - kernel.modules.devfs.data[file] = nil - end - end - for k, nfc in ipairs(programmers) do - kernel.modules.devfs.data["nfc" .. nfc:sub(1,4):upper()] = { - __type = "f", - open = function(hnd, mode) - if mode == "r" then error("Invalid mode") end - hnd.nfc = nfc - end, - size = function() - return 2048 - end, - write = function(h, data) - if component.invoke(nfc, "isDataWaiting") then - component.invoke(nfc, "clearNFCData") - end - component.invoke(nfc, "writeNFCData", data) - return true - end, - } - end +local function buildDevice(uuid) + return { + __type = "f", + open = function(hnd, mode) + if mode == "r" then error("Invalid mode") end + hnd.nfc = uuid + end, + size = function() + return 2048 + end, + write = function(h, data) + if component.invoke(uuid, "isDataWaiting") then + component.invoke(uuid, "clearNFCData") + end + component.invoke(uuid, "writeNFCData", data) + return true + end, + } end local function onComponentAdded(_, address, componentType) if componentType == "NFCProgrammer" then - programmers[#programmers + 1] = address - buildDevfs() + block.register(address, "nfc" .. address:sub(1,4):upper(), buildDevice(address)) end end local function onComponentRemoved(_, address, componentType) if componentType == "NFCProgrammer" then - local t - for i, nfc in ipairs(programmers) do - if nfc == address then - t = i - break - end - end - table.remove(programmers, t) - buildDevfs() + block.unregister(address) end end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_tape.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_tape.lua index 7d8518b84..f343cc01a 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_tape.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/17_tape.lua @@ -1,78 +1,56 @@ -tapes = {} +local block = kernel.modules.block -local function buildDevfs() - for file in pairs(kernel.modules.devfs.data) do - if file:match("^tape") then - kernel.modules.devfs.data[file] = nil - end - end - for k, tape in ipairs(tapes) do - kernel.modules.devfs.data["tape" .. tape:sub(1,4):upper()] = { - __type = "f", - open = function(hnd) - if not component.invoke(tape, "isReady") then - error("Tape drive is not ready") - end - component.invoke(tape, "seek", -math.huge) - hnd.tape = tape - hnd.pos = 0 - end, - size = function() - return component.invoke(tape, "getSize") - end, - write = function(h, data) - component.invoke(tape, "write", data) - h.pos = h.pos + #data - return not (h.pos >= component.invoke(tape, "getSize")) - --TODO: do this correctly - end, - read = function(h, len) - if h.pos >= component.invoke(tape, "getSize") then - return - end - h.pos = h.pos + len - return component.invoke(tape, "read", len) - end, - seek = function(h, whence, offset) - if whence == "end" then - h.pos = h.pos + component.invoke(tape, "seek", component.invoke(tape, "getSize") - h.pos - (offset or 0)) - elseif whence == "set" then - h.pos = h.pos + component.invoke(tape, "seek", (offset or 0) - h.pos) - else - h.pos = h.pos + component.invoke(tape, "seek", offset or 0) - end - return math.floor(h.pos) +local function buildDevice(tape) + return { + __type = "f", + open = function(hnd) + if not component.invoke(tape, "isReady") then + error("Tape drive is not ready") end - } - end + component.invoke(tape, "seek", -math.huge) + hnd.tape = tape + hnd.pos = 0 + end, + size = function() + return component.invoke(tape, "getSize") + end, + write = function(h, data) + component.invoke(tape, "write", data) + h.pos = h.pos + #data + return not (h.pos >= component.invoke(tape, "getSize")) + --TODO: do this correctly + end, + read = function(h, len) + if h.pos >= component.invoke(tape, "getSize") then + return + end + h.pos = h.pos + len + return component.invoke(tape, "read", len) + end, + seek = function(h, whence, offset) + if whence == "end" then + h.pos = h.pos + component.invoke(tape, "seek", component.invoke(tape, "getSize") - h.pos - (offset or 0)) + elseif whence == "set" then + h.pos = h.pos + component.invoke(tape, "seek", (offset or 0) - h.pos) + else + h.pos = h.pos + component.invoke(tape, "seek", offset or 0) + end + return math.floor(h.pos) + end + } end local function onComponentAdded(_, address, componentType) if componentType == "tape_drive" then - tapes[#tapes + 1] = address - buildDevfs() + block.register(address, "tape" .. address:sub(1,4):upper(), buildDevice(address)) end end local function onComponentRemoved(_, address, componentType) if componentType == "tape_drive" then - local t - for i, tape in ipairs(tapes) do - if tape == address then - t = i - break - end - end - table.remove(tapes, t) - buildDevfs() + block.unregister(address) end end ---function start() --- for tape, t in component.list("tape_drive") do --- onComponentAdded(_, tape, t) --- end ---end - kernel.modules.keventd.listen("component_added", onComponentAdded) kernel.modules.keventd.listen("component_removed", onComponentRemoved) diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/19_libnetwork.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/19_libnetwork.lua deleted file mode 100644 index 49184da7c..000000000 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/19_libnetwork.lua +++ /dev/null @@ -1,279 +0,0 @@ ---local event = require "event" - -local driver - -network = {} -internal = {} - - ------------- ---ICMP - -network.icmp = {} -internal.icmp = {} - -local pingid = 0 -function network.icmp.ping(addr, payload) - pingid = pingid + 1 - driver.send(addr, "IP"..computer.address()..":"..tostring(pingid)..":"..payload) - return pingid -end - -function internal.icmp.handle(origin, data) - if data:sub(2,2) == "P" then - local matcher = data:sub(3):gmatch("[^:]+") - local compid = matcher() - local id = tonumber(matcher()) - local payload = matcher() - if compid == computer.address() then - computer.pushSignal("ping_reply", origin, tonumber(id), payload) - else - driver.send(origin, data) - end - end -end - ------------- ---Datagrams - UDP like protocol - -network.udp = {} -internal.udp = {ports = {}} - -function internal.udp.checkPortRange(port) - if port < 0 or port > 65535 then error("Wrong port!")end -end - -function network.udp.open(port) - if not port then - port = 49151 + math.floor(math.random() * 16384) - --TODO: check allocated port - end - internal.udp.checkPortRange(port) - if kernel.modules.threading.currentThread then - internal.udp.ports[port] = kernel.modules.threading.currentThread.pid - else - internal.udp.ports[port] = true - end - return port -end - -function network.udp.close(port) - internal.udp.checkPortRange(port) - internal.udp.ports[port] = nil -end - -function network.udp.send(addr, port, data) - internal.udp.checkPortRange(port) - driver.send(addr, "D".. string.char(math.floor(port/256))..string.char(port%256)..data) -end - -function internal.udp.handle(origin, data) - local port = data:byte(2)*256 + data:byte(3) - if internal.udp.ports[port] then - computer.pushSignal("datagram", origin, port, data:sub(4)) - end -end - -function internal.udp.cleanProcess(thread) - for port, pid in pairs(internal.udp.ports) do - if pid == thread.pid then - internal.udp.ports[port] = nil - end - end -end - ------------ ---TCP - TCP like protocol - ---O[port,2B][openers channel,2B] --Try open connection ---A[opened channel,2B][openers channel,2B] --Accept connection ---R[openers channel,2B] --Reject connection i.e. closed port ---C[remote channel,2B] --Close connection(user request or adta at closed/wrong channel) ---D[remote channel,2B][data] --Data - -network.tcp = {} -internal.tcp = {ports = {}, channels = {}, freeCh = 1} - -function network.tcp.listen(port) - internal.udp.checkPortRange(port) - if kernel.modules.threading.currentThread then - internal.tcp.ports[port] = kernel.modules.threading.currentThread.pid - else - internal.tcp.ports[port] = true - end -end - -function network.tcp.unlisten(port) - internal.udp.checkPortRange(port) - internal.tcp.ports[port] = nil -end - -function network.tcp.open(addr, port) - if not port then - port = 49151 + math.floor(math.random() * 16384) - --TODO: check allocated port - end - internal.udp.checkPortRange(port) - local ch = internal.tcp.freeCh - if internal.tcp.channels[ch] and internal.tcp.channels[ch].next then - internal.tcp.freeCh = internal.tcp.channels[ch].next - else - internal.tcp.freeCh = #internal.tcp.channels+2 - end - --kernel.io.println("TCP: use ch " .. ch) - internal.tcp.channels[ch] = {open = false, waiting = true, addr = addr, port = port}--mark openning - if kernel.modules.threading.currentThread then - internal.tcp.channels[ch].owner = kernel.modules.threading.currentThread.pid - end - driver.send(addr, "TO".. string.char(math.floor(port/256))..string.char(port%256).. string.char(math.floor(ch/256))..string.char(ch%256)) - return ch -end - -function network.tcp.close(channel) - if internal.tcp.channels[channel] then - if internal.tcp.channels[channel].open or internal.tcp.channels[channel].waiting then - driver.send(internal.tcp.channels[channel].addr, "TC".. string.char(math.floor(internal.tcp.channels[channel].remote/256))..string.char(internal.tcp.channels[channel].remote%256)) - end - internal.tcp.channels[channel] = {next = internal.tcp.freeCh} - internal.tcp.freeCh = channel - --computer.pushSignal("tcp_close", ch, internal.tcp.channels[ch].addr, internal.tcp.channels[ch].port) - end -end - -function network.tcp.send(channel, data) - if internal.tcp.channels[channel] and internal.tcp.channels[channel].open then - driver.send(internal.tcp.channels[channel].addr, "TD".. string.char(math.floor(internal.tcp.channels[channel].remote/256))..string.char(internal.tcp.channels[channel].remote%256)..data) - return true - end - return false -end - -function internal.tcp.handle(origin, data) - if data:sub(2,2) == "O" then - local port = data:byte(3)*256 + data:byte(4) - local rchan = data:byte(5)*256 + data:byte(6) - - if internal.tcp.ports[port] then - local ch = internal.tcp.freeCh - if internal.tcp.channels[ch] and internal.tcp.channels[ch].next then - internal.tcp.freeCh = internal.tcp.channels[ch].next - else - internal.tcp.freeCh = #internal.tcp.channels+2 - end - --kernel.io.println("TCP: use ch " .. ch) - internal.tcp.channels[ch] = {open = true, remote = rchan, addr = origin, port = port} - if type(internal.tcp.ports[port]) == "number" then - internal.tcp.channels[ch].owner = internal.tcp.ports[port] - end - driver.send(origin, "TA".. string.char(math.floor(ch/256))..string.char(ch%256) .. string.char(math.floor(rchan/256)) .. string.char(rchan%256)) - computer.pushSignal("tcp", "connection", ch, internal.tcp.channels[ch].addr, internal.tcp.channels[ch].port, "incoming") - else - driver.send(origin, "TR".. string.char(math.floor(rchan/256))..string.char(rchan%256)) - end - elseif data:sub(2,2) == "R" then - local ch = data:byte(3)*256 + data:byte(4) - if internal.tcp.channels[ch] and internal.tcp.channels[ch].waiting then - computer.pushSignal("tcp" ,"close", ch, internal.tcp.channels[ch].addr, internal.tcp.channels[ch].port) - internal.tcp.channels[ch] = {next = internal.tcp.freeCh} - internal.tcp.freeCh = ch - end - elseif data:sub(2,2) == "A" then - local remote = data:byte(3)*256 + data:byte(4) - local ch = data:byte(3)*256 + data:byte(4) - if internal.tcp.channels[ch] and internal.tcp.channels[ch].waiting then - internal.tcp.channels[ch].waiting = nil - internal.tcp.channels[ch].open = true - internal.tcp.channels[ch].remote = remote - computer.pushSignal("tcp", "connection", ch, internal.tcp.channels[ch].addr, internal.tcp.channels[ch].port) - end - elseif data:sub(2,2) == "C" then - local ch = data:byte(3)*256 + data:byte(4) - if internal.tcp.channels[ch] and internal.tcp.channels[ch].open then - internal.tcp.channels[ch] = {next = internal.tcp.freeCh} - internal.tcp.freeCh = ch - computer.pushSignal("tcp" ,"close", ch, internal.tcp.channels[ch].addr, internal.tcp.channels[ch].port) - end - elseif data:sub(2,2) == "D" then --TODO: check source - local ch = data:byte(3)*256 + data:byte(4) - if internal.tcp.channels[ch] and internal.tcp.channels[ch].open then - computer.pushSignal("tcp", "message", ch, data:sub(5), internal.tcp.channels[ch].addr, internal.tcp.channels[ch].port) - end - end -end - -function internal.tcp.cleanup() - for channel, _ in pairs(internal.tcp.channels) do - if internal.tcp.channels[channel].open or internal.tcp.channels[channel].waiting then - if internal.tcp.channels[channel].open or internal.tcp.channels[channel].waiting then - driver.send(internal.tcp.channels[channel].addr, "TC".. string.char(math.floor(internal.tcp.channels[channel].remote/256))..string.char(internal.tcp.channels[channel].remote%256)) - end - internal.tcp.channels[channel] = {next = internal.tcp.freeCh} - internal.tcp.freeCh = channel - end - end -end - -function internal.tcp.cleanProcess(thread) - for channel, _ in pairs(internal.tcp.channels) do - if internal.tcp.channels[channel].owner == thread.pid then - network.tcp.close(channel) - end - end - for port, pid in pairs(internal.tcp.ports) do - if pid == thread.pid then - internal.tcp.ports[port] = nil - end - end -end - ------------ ---IP - -network.ip = {} - -function network.ip.bind(addr) - driver.bind(addr) -end - ------------- ---Data processing - -function handleData(origin, data) - if data:sub(1,1) == "I" then internal.icmp.handle(origin, data) - elseif data:sub(1,1) == "T" then internal.tcp.handle(origin, data) - elseif data:sub(1,1) == "D" then internal.udp.handle(origin, data) end -end - - ------------- ---Info - -network.info = {} -network.info.getInfo = function(...)return driver.netstat(...) end -network.info.getInterfaceInfo = function(...)return driver.intstat(...) end -network.info.getRoutes = function(...)return driver.routetab(...) end -network.info.getArpTable = function(...)return driver.arptab(...) end - ------------- - -kernel.userspace.package.preload.network = network - -function start() - driver = { - send = kernel.modules.network.send, - bind = kernel.modules.network.bindAddr, - netstat = kernel.modules.network.getInfo, - intstat = kernel.modules.network.getInterfaceInfo, - routetab = kernel.modules.network.getRoutingTable, - arptab = kernel.modules.network.getArpTable, - } - - kernel.modules.gc.onShutdown(function() - internal.tcp.cleanup() - end) - - kernel.modules.gc.onProcessKilled(function(thread) - internal.tcp.cleanProcess(thread) - internal.udp.cleanProcess(thread) - end) -end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/20_threading.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/20_threading.lua index b146b8638..54e498194 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/20_threading.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/20_threading.lua @@ -1,36 +1,39 @@ threads = {} currentThread = nil +eventFilters = {signal = {}} -local threadMode = { - top = 0, - child = 1 -} - -local function getPendingThreads() - local res = {} - for _, thread in ipairs(threads) do - if thread.coro and #thread.eventQueue > 0 then - res[#res + 1] = thread - end - end - return res -end - -local function getResumableThreads(threads_) - local res = {} - for _,thread in ipairs(threads_) do - for n,event in ipairs(thread.eventQueue) do - if event[1] == thread.currentHandler then - table.remove(thread.eventQueue, n) - thread.currentEvent = event - res[#res + 1] = thread - break +function countThreadSignals(thread, signal) + local n = 0 + local first = 0 + for i, sig in ipairs(thread.eventQueue) do + if sig[1] == signal then + n = n + 1 + if first < 1 then + first = i end end end - return res + return n, first end +local deadline = math.huge +local pullSignal = computer.pullSignal +computer.pullSignal = function() + pcall(kernel._println, "Attempted to use non threaded signal pulling") + pcall(kernel._println, debug.traceback()) + kernel.panic() +end + +function eachThread(func) + for _, thread in ipairs(threads) do + if thread.coro then + func(thread) + end + end +end + +-------------- + local firstFree = 1 local nextUid = 1 @@ -77,6 +80,7 @@ function spawn(exec, child, name, isthread, _, ...) end)} return table.unpack(r, 2) end), + deadline = computer.uptime(), sandbox = isthread and currentThread.sandbox or kernel.modules.manageg.newsandbox(), currentHandler = "arg", currentHandlerArg = nil, @@ -116,73 +120,103 @@ function spawn(exec, child, name, isthread, _, ...) return thread end -function countThreadSignals(thread, signal) - local n = 0 - local first = 0 - for i, sig in ipairs(thread.eventQueue) do - if sig[1] == signal then - n = n + 1 - if first < 1 then - first = i - end +--- + +local function getPendingThreads() + local res = {} + for _, thread in ipairs(threads) do + if thread.coro and #thread.eventQueue > 0 then + res[#res + 1] = thread end end - return n, first + return res end -local deadline = math.huge -local pullSignal = computer.pullSignal -computer.pullSignal = function() - pcall(kernel._println, "Attempted to use non threaded signal pulling") - pcall(kernel._println, debug.traceback()) - kernel.panic() +local function getResumableThreads(threads_) + local res = {} + for _,thread in ipairs(threads_) do + thread.currentEvent = nil + for n,event in ipairs(thread.eventQueue) do + if event[1] == thread.currentHandler then + table.remove(thread.eventQueue, n) + thread.currentEvent = event + res[#res + 1] = thread + break + end + end + if not thread.currentEvent and thread.deadline <= computer.uptime() then + thread.currentEvent = {"timeout"} + res[#res + 1] = thread + end + end + return res end - local function processSignals() deadline = math.huge for _, thread in ipairs(threads) do - if (thread.currentHandler == "yield" or thread.currentHandler == "signal") - and deadline > (tonumber(thread.currentHandlerArg) or math.huge) then - deadline = thread.currentHandlerArg or math.huge + if deadline > (thread.deadline or math.huge) then + if not thread.deadline then + kernel.io.println("Nil deadline for " .. thread.name .. " on " .. tostring(thread.currentHandler)) + end + deadline = thread.deadline end end --kernel.io.println("Deadline: "..(deadline - computer.uptime())) local sig = {"signal", pullSignal(deadline - computer.uptime())} + local function filt(f, signal, ...) + if not signal then + return true + end + if type(f[signal]) == "table" then + return filt(f[signal], ...) + end + return (not f[signal]) and true or (function(...) + local s, e = xpcall(f[signal], function(err) + kernel._println("Signal filter error:") + kernel._println(tostring(e)) + kernel._println(debug.traceback()) + kernel.panic("Signal filtering failed") + end, ...) + return s and e + end)(...) + end + if not filt(eventFilters, table.unpack(sig)) then + sig = {} + end + for _, thread in ipairs(threads) do if thread.coro then - local nsig, oldest = countThreadSignals(thread, "signal") - if nsig > thread.maxPendingSignals then --TODO: make it a bit more intelligent - table.remove(thread.eventQueue, oldest) - end - if thread.currentHandler == "yield" then + --[[if thread.currentHandler == "yield" then --kernel.io.println("yield ck: "..tostring((thread.currentHandlerArg or math.huge) - computer.uptime())) if (thread.currentHandlerArg or math.huge) <= computer.uptime() then thread.eventQueue[#thread.eventQueue + 1] = {"yield"} end - end - if thread.cgroups.signal.global then + end]]-- + if thread.cgroups.signal.global and sig[2] then + local nsig, oldest = countThreadSignals(thread, "signal") + if nsig > thread.maxPendingSignals then --TODO: make it a bit more intelligent + table.remove(thread.eventQueue, oldest) + end + thread.eventQueue[#thread.eventQueue + 1] = sig end end end end -function eachThread(func) - for _, thread in ipairs(threads) do - if thread.coro then - func(thread) - end - end -end + + +---- local lastYield = computer.uptime() +yieldTime = 3 function checkTimeout() local uptime = computer.uptime() - if uptime - lastYield > 3 then + if uptime - lastYield > yieldTime then return true end return false @@ -190,27 +224,10 @@ end function start() while true do - -- pending = getPendingThreads() - --local resumable = getResumableThreads(pending) + local pending = getPendingThreads() + local resumable = getResumableThreads(pending) - local pending = {} - for _, thread in ipairs(threads) do - if thread.coro and #thread.eventQueue > 0 then - pending[#pending + 1] = thread - end - end - local resumable = {} - for _,thread in ipairs(pending) do - for n,event in ipairs(thread.eventQueue) do - if event[1] == thread.currentHandler then - table.remove(thread.eventQueue, n) - thread.currentEvent = event - resumable[#resumable + 1] = thread - break - end - end - end lastYield = computer.uptime() while #resumable > 0 do @@ -218,7 +235,8 @@ function start() --kernel.io.println("Resume " .. tostring(thread.name) .. " with " -- .. tostring(type(thread.currentEvent) == "table" and thread.currentEvent[1] or "unknown") -- ..(thread.currentEvent[2] and (", " .. tostring(thread.currentEvent[2])) or "")) - + + thread.deadline = math.huge kernel.modules.manageg.protect(thread.sandbox) currentThread = thread local state, reason, arg = coroutine.resume(thread.coro, table.unpack(thread.currentEvent, 2)) @@ -228,11 +246,12 @@ function start() if not state or coroutine.status(thread.coro) == "dead" then kill(thread.pid) if reason then - kernel.io.println("Thread " .. tostring(thread.name) .. "(" .. tostring(thread.pid) .. ") dead: " + kernel.io.println("Thread " .. tostring(thread.name) .. "(" .. tostring(thread.pid) .. ") died: " .. tostring(reason or "unknown/done") .. ", after " .. tostring(type(thread.currentEvent) == "table" and thread.currentEvent[1] or "unknown")) end else + --kernel.io.println("Yield arg from " .. tostring(thread.name) .. ": " .. tostring(arg)) thread.currentEvent = nil thread.currentHandler = reason thread.currentHandlerArg = arg diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/21_threadUtil.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/21_threadUtil.lua index 149169746..3531536fe 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/21_threadUtil.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/21_threadUtil.lua @@ -43,6 +43,16 @@ function userKill(pid, signal, ...) return true end +function select(timeout, ...) + checkArg(1, timeout, "number") + local funcs = {} + for n, f in ipairs(...) do + checkArg(n + 1, f, "function") + funcs[n] = coroutine.create(f) + end + +end + function setKillHandler(signal, handler) --WAT if not kernel.modules.threading.threads[pid] or not kernel.modules.threading.threads[pid].coro then diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/21_timer.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/21_timer.lua index 2a159166f..10b872069 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/21_timer.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/21_timer.lua @@ -14,7 +14,7 @@ function add(func, time) if deadline > timer.next then deadline = timer.next if thread.currentHandler == "yield" then - thread.currentHandlerArg = deadline + thread.deadline = deadline end end @@ -66,9 +66,9 @@ thread = kernel.modules.threading.spawn(function() end end end - local dl = deadline + thread.deadline = deadline deadline = math.huge - coroutine.yield("yield", dl) + coroutine.yield("yield") end end, 0, "[timer]") diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/network/loopback.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/network/loopback.lua deleted file mode 100644 index 254b151f4..000000000 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/network/loopback.lua +++ /dev/null @@ -1,26 +0,0 @@ -local driver = {} - -local pktIn,pktOut,bytesIn,bytesOut = 0,0,0,0 - -function driver.start(eventHandler) - eventHandler.newInterface("lo", "localhost", "Local Loopback") - eventHandler.newHost("lo", "localhost") - return {send = function(data)eventHandler.recvData(data, "lo", "localhost")end} -end - -function driver.send(handle, interface, destination, data) - if interface == "lo" and destination == "localhost" then - pktIn, pktOut = pktIn+1,pktOut+1 - bytesIn,bytesOut = bytesIn + data:len(), bytesOut + data:len() - handle.send(data) - end -end - -function driver.info(interface) - if interface == "lo" then - return pktIn,pktOut,bytesIn,bytesOut - end - return 0,0,0,0 -end - -return driver diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/network/modem.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/network/modem.lua deleted file mode 100644 index 57e9bb7c4..000000000 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/network/modem.lua +++ /dev/null @@ -1,94 +0,0 @@ ---[[ -Communication on port 1! -Node protocol: -Hello/broadcast(sent by new host in node): \0 (modem addersses are in event) -Hi/direct(sent by hosts to new host): \1 (^) -OHAI/direct(Ack of Hi(\1)) \2 -Host quitting/broadcast \3 (^) -Data/direct \4[data] (origin from event) -]] -local driver = {} - -local nodes = {} -local eventHnd - -local PKT_BEACON = "\32" -local PKT_REGISTER = "\1" -local PKT_REGISTER_ACK = "\2" -local PKT_QUIT = "\3" -local PKT_DATA = "\4" - -function driver.start(eventHandler) - eventHnd = eventHandler - - eventHandler.setListener("modem_message", function(_, interface, origin, port, _, data) - if not nodes[interface] then return end --other kind of modem(possibly tunnel) - - eventHandler.debug("modemmsg["..nodes[interface].name.."]/"..origin..":"..data) - - nodes[interface].pktIn = nodes[interface].pktIn + 1 - nodes[interface].bytesIn = nodes[interface].bytesIn + data:len() - - if data:sub(1,1) == PKT_BEACON then - component.invoke(interface, "send", origin, 1, PKT_REGISTER ) - elseif data:sub(1,1) == PKT_REGISTER then - eventHandler.newHost(nodes[interface].name, origin) - component.invoke(interface, "send", origin, 1, PKT_REGISTER_ACK) - elseif data:sub(1,1) == PKT_REGISTER_ACK then - eventHandler.newHost(nodes[interface].name, origin) - elseif data:sub(1,1) == PKT_QUIT then - eventHandler.delHost(nodes[interface].name, origin) - elseif data:sub(1,1) == PKT_DATA then - eventHandler.recvData(data:sub(2), nodes[interface].name, origin) - end - - end) - - eventHandler.setListener("component_added", function(_, int, ctype) - if ctype ~= "modem" then return end - local name = "eth" .. int:sub(1, 4):upper() - eventHandler.newInterface(name, int, "Ethernet") - - nodes[name] = {modem = int, name = name, pktIn = 0, pktOut = 1, bytesIn = 0, bytesOut = 1} - nodes[int] = nodes[name] - - component.invoke(int, "open", 1) - component.invoke(int, "broadcast", 1, PKT_BEACON) - - eventHandler.newHost(name, int)--register loopback - end) - - eventHandler.setListener("component_removed", function(_, int, ctype) - if ctype ~= "modem" then return end - local name = "eth" .. int:sub(1, 4):upper() - nodes[name] = nil - nodes[int] = nil - eventHnd.delInterface(int) - end) - return {} -end - -function driver.send(handle, interface, destination, data) - if nodes[interface] then - if nodes[interface].modem == destination then - nodes[interface].pktOut = nodes[interface].pktOut + 1 - nodes[interface].bytesOut = nodes[interface].bytesOut + data:len() - nodes[interface].pktIn = nodes[interface].pktIn + 1 - nodes[interface].bytesIn = nodes[interface].bytesIn + data:len() - eventHnd.recvData(data, interface, destination) - else - nodes[interface].pktOut = nodes[interface].pktOut + 1 - nodes[interface].bytesOut = nodes[interface].bytesOut + 1 + data:len() - component.invoke(nodes[interface].modem, "send", destination, 1, PKT_DATA..data) - end - end -end - -function driver.info(interface) - if nodes[interface] then - return nodes[interface].pktIn,nodes[interface].pktOut,nodes[interface].bytesIn,nodes[interface].bytesOut - end - return 0,0,0,0 -end - -return driver \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/network/tunnel.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/network/tunnel.lua deleted file mode 100644 index a6d59401b..000000000 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/network/tunnel.lua +++ /dev/null @@ -1,72 +0,0 @@ ---For protocol info look to at modem driver - -local driver = {} - -local nodes = {} -local eventHnd - -function driver.start(eventHandler) - eventHnd = eventHandler - - eventHandler.setListener("modem_message", function(_, interface, origin, port, _, data) - if not nodes[interface] then return end --other kind of modem(possibly modem) - - eventHandler.debug("modemmsg["..nodes[interface].name.."]/"..origin..":"..data) - - nodes[interface].pktIn = nodes[interface].pktIn + 1 - nodes[interface].bytesIn = nodes[interface].bytesIn + data:len() - - if data:sub(1,1) == "H" then - eventHandler.newHost(nodes[interface].name, origin) - component.invoke(interface, "send", "I") - eventHandler.debug("REPL:",interface,origin) - elseif data:sub(1,1) == "I"then - eventHandler.newHost(nodes[interface].name, origin) - elseif data:sub(1,1) == "Q"then - eventHandler.delHost(nodes[interface].name, origin) - elseif data:sub(1,1) == "D"then - eventHandler.recvData(data:sub(2), nodes[interface].name, origin) - end - - end) - - for int in component.list("tunnel", true)do - eventHandler.newInterface("tun" .. int:sub(1, 4):upper(), int, "Tunnel") - - nodes["tun" .. int:sub(1, 4):upper()] = {modem = int, name = "tun" .. int:sub(1, 4):upper(), pktIn = 0, pktOut = 1, bytesIn = 0, bytesOut = 1} - nodes[int] = nodes["tun" .. int:sub(1, 4):upper()] - - component.invoke(int, "send", "H") - - eventHandler.newHost("tun" .. int:sub(1, 4):upper(), int)--register loopback - end - - --eventHandler.newInterface("lo", "localhost", "Local Loopback") - --eventHandler.newHost("lo", "localhost") - return {} -end - -function driver.send(handle, interface, destination, data) - if nodes[interface] then - if nodes[interface].modem == destination then - nodes[interface].pktOut = nodes[interface].pktOut + 1 - nodes[interface].bytesOut = nodes[interface].bytesOut + data:len() - nodes[interface].pktIn = nodes[interface].pktIn + 1 - nodes[interface].bytesIn = nodes[interface].bytesIn + data:len() - eventHnd.recvData(data, interface, destination) - else - nodes[interface].pktOut = nodes[interface].pktOut + 1 - nodes[interface].bytesOut = nodes[interface].bytesOut + 1 + data:len() - component.invoke(nodes[interface].modem, "send", "D"..data) - end - end -end - -function driver.info(interface) - if nodes[interface] then - return nodes[interface].pktIn,nodes[interface].pktOut,nodes[interface].bytesIn,nodes[interface].bytesOut - end - return 0,0,0,0 -end - -return driver diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/sides.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/sides.lua new file mode 100644 index 000000000..a17d3f66b --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/sides.lua @@ -0,0 +1,62 @@ +local sides = { + [0] = "bottom", + [1] = "top", + [2] = "back", + [3] = "front", + [4] = "right", + [5] = "left", + [6] = "unknown", + + bottom = 0, + top = 1, + back = 2, + front = 3, + right = 4, + left = 5, + unknown = 6, + + down = 0, + up = 1, + north = 2, + south = 3, + west = 4, + east = 5, + + negy = 0, + posy = 1, + negz = 2, + posz = 3, + negx = 4, + posx = 5, + + forward = 3 +} + +local metatable = getmetatable(sides) or {} + +-- sides[0..5] are mapped to itertable[1..6]. +local itertable = { + sides[0], + sides[1], + sides[2], + sides[3], + sides[4], + sides[5] +} + +-- Future-proofing against the possible introduction of additional +-- logical sides (e.g. [7] = "all", [8] = "none", etc.). +function metatable.__len(sides) + return #itertable +end + +-- Allow `sides` to be iterated over like a normal (1-based) array. +function metatable.__ipairs(sides) + return ipairs(itertable) +end + +setmetatable(sides, metatable) + +------------------------------------------------------------------------------- + +return sides diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/term.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/term.lua index b4f0e35c1..dfda3aef4 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/term.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/term.lua @@ -1,3 +1,5 @@ +local component = require "component" + local term = {} term.escape = "\x1b" @@ -278,6 +280,10 @@ function term.getInfo() return gpu, screen end +function term.gpu() + local addr = term.getInfo() + return component.proxy(addr) +end function term.clear() @@ -317,7 +323,15 @@ function term.isAvailable() end function term.setCursorBlink(enabled) + if enabled then + io.write("\x1b[?25h") + else + io.write("\x1b[?25l") + end +end +function term.getCursorBlink(enabled) + return true end function term.read(history, dobreak, hint, pwchar) @@ -436,7 +450,7 @@ function term.read(history, dobreak, hint, pwchar) --x = x io.write("\x1b[K" .. after .. "\x1b[" .. unicode.len(after) .. "D") end - elseif mode == "0" then + elseif mode == "O" then local act = io.read(1) if act == "H" then io.write("\x1b["..(x - 1).."D") diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/go.lua b/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/go.lua new file mode 100644 index 000000000..d8513bbde --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/go.lua @@ -0,0 +1,47 @@ +--[[ go, makes the robot go a specified number of blocks in a certain direction or turn around. +Author: Vexatos +]] +local robot=require("robot") +local shell=require("shell") +local args = shell.parse(...) +if #args<1 then + print("'go' - Makes the robot go in a certain direction") + print("Usage:") + print("'go forward [number]' to make the robot go forward a number of blocks (defaults to 1)") + print("'go back [number]' to make the robot go backwards") + print("'go up [number]' to make the robot go upwards") + print("'go down [number]' to make the robot go downwards") + print("'go left [number]' to make the robot turn left a number of times") + print("'go right [number]' to make the robot turn right a number of times") + return +end +local distance = args[2] or 1 + +if not tonumber(distance) or tonumber(distance) <= 0 then + io.stderr:write(distance..": not a positive number!\n") + return +end + +distance = math.floor(tonumber(distance)) +local action + +if args[1] == "forward" then + action = robot.forward +elseif args[1] == "back" then + action = robot.back +elseif args[1] == "left" then + action = robot.turnLeft +elseif args[1] == "right" then + action = robot.turnRight +elseif args[1] == "up" then + action = robot.up +elseif args[1] == "down" then + action = robot.down +else + io.stderr:write(args[1]..": not a valid direction!\n") + return +end + +for i = 1,distance do + action() +end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/mpt.lua b/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/mpt.lua index 16fc90a1f..07bd2ee31 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/mpt.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/mpt.lua @@ -82,13 +82,13 @@ ocBackend = { --print(" -U, --upgrade") --print(" Upgrade or add package(s) to the system and install the required") --print(" dependencies from sync repositories. Either a URL or file path can be") - --print(" specified. This is a ?remove-then-add? process.") + --print(" specified. This is a “remove-then-add” process.") print(" -y, --update") print(" Update package lists for backends that require such action") print(" -u, --upgrades") print(" Upgrade all packages that are out-of-date on the") print(" local system. Only package versions are used to find outdated packages;") - print(" replacements are not checked here. This is a ?remove-then-add? process.") + print(" replacements are not checked here. This is a “remove-then-add” process.") print(" -f, --force") print(" Force operation, in case of upgrade it redownloads all packages") print(" --root='/some/dir'") @@ -289,7 +289,13 @@ mptFrontend = { end local updateResp = backend.getText(config.frontend.mpt.api.."update", toCheck) if updateResp then - local updateList = load("return "..updateResp)() or {} + local upd, err = load("return "..updateResp) + if not upd then + print("Update error: " .. tostring(err)) + print("Data: " .. tostring(updateResp)) + os.exit(1) + end + local updateList = upd() or {} local res = {} for _, entry in ipairs(updateList) do res[entry.package] = {checksum = entry.checksum} @@ -390,7 +396,7 @@ oppmFrontend = { if packages then for name, package in pairs(packages) do local metadata = { - files = expandOppmFiles(package.files), + files = expandOppmFiles(package.files or {}), dependencies = keys(package.dependencies or {}), repo = repoid, version = package.version diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/nc.lua b/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/nc.lua deleted file mode 100644 index 0cdf67a2c..000000000 --- a/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/nc.lua +++ /dev/null @@ -1,64 +0,0 @@ -local network = require "network" -local event = require "event" - -local args = {...} - -local listen = false -local port = -1 -local addr - -for _,par in ipairs(args) do - if par == "-l" then - listen = true - elseif port < 1 then - local p = tonumber(par) - if p then - port = p - end - else - addr = par - end -end - -if port < 0 then error("Unspecified port")end -if not listen and not addr then error("Unspecified address")end - -local chanel -local function handleTcp() - while true do - while io.input().remaining() ~= 0 do - local data = io.read(math.min(io.input().remaining(), 7000)) - if not data then - - end - network.tcp.send(chanel, data) - end - local e = {event.pull()} - if e[1] then - if e[1] == "tcp" then - if e[2] == "connection" then - if listen and e[5] == port and e[6] == "incoming" then - network.tcp.unlisten(port) - print("connected") - elseif not listen and e[3] == chanel and e[6] ~= "incoming" then - chanel = e[3] - print("connected") - end - elseif e[2] == "close" and e[3] == chanel then - print("Connection closed") - return - elseif e[2] == "message" and e[3] == chanel then - io.write(e[4]) - end - end - end - end -end - -if listen then - network.tcp.listen(port) - handleTcp() -else - chanel = network.tcp.open(addr, port) - handleTcp() -end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/usr/lib/robot.lua b/src/main/resources/assets/opencomputers/loot/plan9k/usr/lib/robot.lua new file mode 100644 index 000000000..a1c86751c --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/plan9k/usr/lib/robot.lua @@ -0,0 +1,281 @@ +local component = require("component") +local sides = require("sides") + +local robot = {} + +------------------------------------------------------------------------------- +-- General + +function robot.name() + return component.robot.name() +end + +function robot.level() + if component.isAvailable("experience") then + return component.experience.level() + else + return 0 + end +end + +function robot.getLightColor() + return component.robot.getLightColor() +end + +function robot.setLightColor(value) + return component.robot.setLightColor(value) +end + +------------------------------------------------------------------------------- +-- World + +function robot.detect() + return component.robot.detect(sides.front) +end + +function robot.detectUp() + return component.robot.detect(sides.up) +end + +function robot.detectDown() + return component.robot.detect(sides.down) +end + +------------------------------------------------------------------------------- +-- Inventory + +function robot.inventorySize() + return component.robot.inventorySize() +end + + +function robot.select(...) + return component.robot.select(...) +end + +function robot.count(...) + return component.robot.count(...) +end + +function robot.space(...) + return component.robot.space(...) +end + +function robot.compareTo(...) + return component.robot.compareTo(...) +end + +function robot.transferTo(...) + return component.robot.transferTo(...) +end + +------------------------------------------------------------------------------- +-- Inventory + World + +function robot.compare() + return component.robot.compare(sides.front) +end + +function robot.compareUp() + return component.robot.compare(sides.up) +end + +function robot.compareDown() + return component.robot.compare(sides.down) +end + +function robot.drop(count) + checkArg(1, count, "nil", "number") + return component.robot.drop(sides.front, count) +end + +function robot.dropUp(count) + checkArg(1, count, "nil", "number") + return component.robot.drop(sides.up, count) +end + +function robot.dropDown(count) + checkArg(1, count, "nil", "number") + return component.robot.drop(sides.down, count) +end + +function robot.place(side, sneaky) + checkArg(1, side, "nil", "number") + return component.robot.place(sides.front, side, sneaky ~= nil and sneaky ~= false) +end + +function robot.placeUp(side, sneaky) + checkArg(1, side, "nil", "number") + return component.robot.place(sides.up, side, sneaky ~= nil and sneaky ~= false) +end + +function robot.placeDown(side, sneaky) + checkArg(1, side, "nil", "number") + return component.robot.place(sides.down, side, sneaky ~= nil and sneaky ~= false) +end + +function robot.suck(count) + checkArg(1, count, "nil", "number") + return component.robot.suck(sides.front, count) +end + +function robot.suckUp(count) + checkArg(1, count, "nil", "number") + return component.robot.suck(sides.up, count) +end + +function robot.suckDown(count) + checkArg(1, count, "nil", "number") + return component.robot.suck(sides.down, count) +end + +------------------------------------------------------------------------------- +-- Tool + +function robot.durability() + return component.robot.durability() +end + + +function robot.swing(side, sneaky) + checkArg(1, side, "nil", "number") + return component.robot.swing(sides.front, side, sneaky ~= nil and sneaky ~= false) +end + +function robot.swingUp(side, sneaky) + checkArg(1, side, "nil", "number") + return component.robot.swing(sides.up, side, sneaky ~= nil and sneaky ~= false) +end + +function robot.swingDown(side, sneaky) + checkArg(1, side, "nil", "number") + return component.robot.swing(sides.down, side, sneaky ~= nil and sneaky ~= false) +end + +function robot.use(side, sneaky, duration) + checkArg(1, side, "nil", "number") + checkArg(3, duration, "nil", "number") + return component.robot.use(sides.front, side, sneaky ~= nil and sneaky ~= false, duration) +end + +function robot.useUp(side, sneaky, duration) + checkArg(1, side, "nil", "number") + checkArg(3, duration, "nil", "number") + return component.robot.use(sides.up, side, sneaky ~= nil and sneaky ~= false, duration) +end + +function robot.useDown(side, sneaky, duration) + checkArg(1, side, "nil", "number") + checkArg(3, duration, "nil", "number") + return component.robot.use(sides.down, side, sneaky ~= nil and sneaky ~= false, duration) +end + +------------------------------------------------------------------------------- +-- Movement + +function robot.forward() + return component.robot.move(sides.front) +end + +function robot.back() + return component.robot.move(sides.back) +end + +function robot.up() + return component.robot.move(sides.up) +end + +function robot.down() + return component.robot.move(sides.down) +end + + +function robot.turnLeft() + return component.robot.turn(false) +end + +function robot.turnRight() + return component.robot.turn(true) +end + +function robot.turnAround() + local turn = math.random() < 0.5 and robot.turnLeft or robot.turnRight + return turn() and turn() +end + +------------------------------------------------------------------------------- +-- Tank + +function robot.tankCount() + return component.robot.tankCount() +end + + +function robot.selectTank(tank) + return component.robot.selectTank(tank) +end + +function robot.tankLevel(...) + return component.robot.tankLevel(...) +end + +function robot.tankSpace(...) + return component.robot.tankSpace(...) +end + +function robot.compareFluidTo(...) + return component.robot.compareFluidTo(...) +end + +function robot.transferFluidTo(...) + return component.robot.transferFluidTo(...) +end + +------------------------------------------------------------------------------- +-- Tank + World + +function robot.compareFluid() + return component.robot.compareFluid(sides.front) +end + +function robot.compareFluidUp() + return component.robot.compareFluid(sides.up) +end + +function robot.compareFluidDown() + return component.robot.compareFluid(sides.down) +end + +function robot.drain(count) + checkArg(1, count, "nil", "number") + return component.robot.drain(sides.front, count) +end + +function robot.drainUp(count) + checkArg(1, count, "nil", "number") + return component.robot.drain(sides.up, count) +end + +function robot.drainDown(count) + checkArg(1, count, "nil", "number") + return component.robot.drain(sides.down, count) +end + +function robot.fill(count) + checkArg(1, count, "nil", "number") + return component.robot.fill(sides.front, count) +end + +function robot.fillUp(count) + checkArg(1, count, "nil", "number") + return component.robot.fill(sides.up, count) +end + +function robot.fillDown(count) + checkArg(1, count, "nil", "number") + return component.robot.fill(sides.down, count) +end + +------------------------------------------------------------------------------- + +return robot diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/config.db b/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/config.db index 1297bda91..3ecc57b30 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/config.db +++ b/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/config.db @@ -1 +1 @@ -{database="/var/lib/mpt/base.db",frontend={mpt={api="http://mpt.magik6k.net/api/"}},cacheDir="/var/lib/mpt/cache/"} \ No newline at end of file +{database="/var/lib/mpt/base.db",cacheDir="/var/lib/mpt/cache/",frontend={mpt={api="http://mpt.magik6k.net/api/"}}} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/mpt.db b/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/mpt.db index 937fb20b1..d56eba16d 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/mpt.db +++ b/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/mpt.db @@ -1 +1 @@ -{installed={["plan9k-drivers"]={frontend="MPT",data={repo="plan9k",dependencies={},files={"/lib/modules/base/17_tape.lua","/lib/modules/base/17_eeprom.lua","/lib/modules/base/17_nfc.lua","/lib/modules/base/17_chatbox.lua","/lib/modules/base/17_data.lua","/lib/modules/base/17_drive.lua"},checksum="-3f839e5e5c38f81bbd03e6a6438ac15f",name="plan9k-drivers"},deps={}},["plan9k-filesystems"]={frontend="MPT",data={repo="plan9k",dependencies={},files={"/lib/msdosfs.lua","/bin/mount.msdos.lua","/usr/bin/mkdosfs.lua"},checksum="-50d8cc1c5928bec760f210185cccfafd",name="plan9k-filesystems"},deps={}},["plan9k-installer"]={frontend="MPT",data={repo="plan9k",dependencies={"plan9k","mpt","plan9k-extra"},files={"/bin/install.lua"},checksum="-31228542b8cc1190aa9d8be7ea4ff56c",name="plan9k-installer"},deps={"plan9k","mpt","plan9k-extra"}},["plan9k-network"]={frontend="MPT",data={repo="plan9k",dependencies={},files={"/lib/internet.lua","/bin/pastebin.lua","/bin/wget.lua","/lib/modules/base/17_network.lua","/lib/modules/base/19_libnetwork.lua","/bin/arp.lua","/bin/ifconfig.lua","/bin/ping.lua","/bin/route.lua","/lib/modules/network/loopback.lua","/lib/modules/network/modem.lua","/usr/bin/nc.lua","/lib/modules/network/tunnel.lua"},checksum="-3310268a428bf449c821cbc8ac140ca5",name="plan9k-network"},deps={}},["plan9k-coreutil"]={frontend="MPT",data={repo="plan9k",dependencies={"plan9k-corelibs","plan9k-fsutil"},files={"/bin/echo.lua","/bin/wc.lua","/bin/ps.lua","/bin/lua.lua","/bin/kill.lua","/bin/reboot.lua","/bin/sleep.lua","/bin/clear.lua","/bin/components.lua","/bin/hostname.lua","/bin/dmesg.lua","/bin/shutdown.lua","/bin/label.lua","/bin/uptime.lua","/bin/resolution.lua","/bin/watch.lua","/bin/passwd.lua"},checksum="-2e3257235e131ffaf5ba1a9fd77ba946",name="plan9k-coreutil"},deps={"plan9k-corelibs","plan9k-fsutil"}},mpt={frontend="MPT",data={repo="mpt",dependencies={},files={"/usr/bin/mpt.lua"},checksum="-4bef26a6a1a0b78056600ce9487fe735",name="mpt"},deps={}},["plan9k-core"]={frontend="MPT",data={repo="plan9k",dependencies={"pipes","plan9k-coreutil","plan9k-shell"},files={"/bin/init.lua","/bin/getty.lua","/bin/readkey.lua","/lib/rc.lua","/bin/rc.lua"},checksum="6950ff30af0231e69b1ae8d0b5b8ad77",name="plan9k-core"},deps={"pipes","plan9k-coreutil","plan9k-shell"}},["plan9k-containers"]={frontend="MPT",data={repo="plan9k",dependencies={},files={"/bin/sandbox.lua"},checksum="-5ff36b0bde938782f3821bca52931c06",name="plan9k-containers"},deps={}},["openloader-init"]={frontend="MPT",data={repo="disks",dependencies={},files={"/init.lua"},checksum="-45e6d7b1e41468c1d335952ee3b89e13",name="openloader-init"},deps={}},["plan9k-ssh"]={frontend="MPT",data={repo="plan9k",dependencies={},files={"/etc/rc.d/sshd.lua","/bin/sshd.lua","/usr/sbin/sshsession.lua","/usr/bin/ssh.lua"},checksum="-2fc28a9bdd608182c931a126ca8150d",name="plan9k-ssh"},deps={}},["plan9k-shell"]={frontend="MPT",data={repo="plan9k",dependencies={},files={"/bin/sh.lua"},checksum="-7a6e50038841f4529feab7ebf0971fcb",name="plan9k-shell"},deps={}},["plan9k-extra"]={frontend="MPT",data={repo="plan9k",dependencies={"plan9k-ssh","plan9k-containers","plan9k-filesystems","plan9k","mpt"},files={"/etc/rc.d/autoupdate.lua"},checksum="42acf5b6b26058654c4ef359a6e19d14",name="plan9k-extra"},deps={"plan9k-ssh","plan9k-containers","plan9k-filesystems","plan9k","mpt"}},["plan9k-fsutil"]={frontend="MPT",data={repo="plan9k",dependencies={"plan9k-corelibs"},files={"/bin/cat.lua","/bin/ln.lua","/bin/ls.lua","/bin/mv.lua","/bin/rm.lua","/bin/tee.lua","/bin/df.lua","/bin/dd.lua","/bin/cp.lua","/bin/touch.lua","/bin/mount.lua","/bin/mount.cow.lua","/bin/mkdir.lua","/bin/pwd.lua","/bin/more.lua","/bin/du.lua"},checksum="-3e5ba058562df4c95858b2992e90365d",name="plan9k-fsutil"},deps={"plan9k-corelibs"}},["plan9k-corelibs"]={frontend="MPT",data={repo="plan9k",dependencies={},files={"/lib/serialization.lua","/lib/term.lua","/lib/text.lua","/lib/shell.lua","/lib/event.lua"},checksum="-6d48e158051e4ffa3ab82ed97dffa830",name="plan9k-corelibs"},deps={}},plan9k={frontend="MPT",data={repo="plan9k",dependencies={"plan9k-core","plan9k-network","plan9k-drivers","plan9k-edit","plan9k-data"},files={},checksum="-2d8f4b84ea60b0c9d5846f57e9f1691c",name="plan9k"},deps={"plan9k-core","plan9k-network","plan9k-drivers","plan9k-edit","plan9k-data"}},pipes={frontend="MPT",data={repo="plan9k",dependencies={"openloader-init"},files={"/boot/kernel/pipes","/lib/modules/base/05_vfs.lua","/lib/modules/base/20_threading.lua","/lib/modules/base/19_manageg.lua","/lib/modules/base/25_init.lua","/lib/modules/base/15_userspace.lua","/usr/man/pipes","/lib/modules/base/16_buffer.lua","/lib/modules/base/17_io.lua","/lib/modules/base/16_require.lua","/lib/modules/base/18_syscall.lua","/lib/modules/base/21_threadUtil.lua","/lib/modules/base/21_timer.lua","/lib/modules/base/16_component.lua","/lib/modules/base/15_keventd.lua","/lib/modules/base/10_procfs.lua","/lib/modules/base/01_util.lua","/lib/modules/base/10_devfs.lua","/lib/modules/base/18_pty.lua","/lib/modules/base/17_keyboard.lua","/lib/modules/base/06_cowfs.lua","/lib/modules/base/09_rootfs.lua","/lib/modules/base/01_gc.lua","/lib/modules/base/17_ipc.lua","/lib/modules/base/19_cgroups.lua","/lib/modules/base/02_cmd.lua"},name="pipes",checksum="-1db1c9d0e65ad1a3467e849d8b1d2709"},deps={"openloader-init"}},["plan9k-data"]={frontend="MPT",data={repo="plan9k",dependencies={},files={"/usr/bin/base64.lua","/usr/lib/data.lua","/usr/bin/deflate.lua","/usr/bin/inflate.lua","/usr/bin/md5sum.lua","/usr/bin/sha256sum.lua","/usr/bin/gpg.lua"},checksum="480a898a741b2bf424f9e0e86e5072ba",name="plan9k-data"},deps={}},["plan9k-edit"]={frontend="MPT",data={repo="plan9k",dependencies={},files={"/bin/edit.lua"},checksum="34b1046ac9b7a87a1cdd74f8c03f27ea",name="plan9k-edit"},deps={}}},oppm={repos={},packages={}}} \ No newline at end of file +{oppm={repos={"OpenPrograms/Kilobyte-Programs","OpenPrograms/Fingercomp-Programs","OpenPrograms/Plan9k","OpenPrograms/EvaKnievel-Programs","OpenPrograms/dangranos-Programs","OpenPrograms/SuPeRMiNoR2-Programs","OpenPrograms/Magik6k-Programs","OpenPrograms/Altenius-Programs","OpenPrograms/Gopher-Programs","OpenPrograms/Kenny-Programs","evgkul/moonscript-opencomputers","Vexatos/Selene","OpenPrograms/payonel-Programs","OpenPrograms/MiscPrograms","OpenPrograms/gamax92-Programs","Akuukis/RobotColorWars","OpenPrograms/Wuerfel_21-OC-Toolkit","OpenPrograms/Wobbo-Programs","vilu85/OC-programs","OpenPrograms/LizzyTrickster-Programs","OpenPrograms/Antheus-Programs","Kilobyte22/v","OpenPrograms/ds84182-Programs","SolraBizna/SolrOC","OpenPrograms/Sangar-Programs","OpenPrograms/lperkins2-Programs","OpenPrograms/Pixel-Programs","OpenPrograms/Kubuxu-Programs","OpenPrograms/OpenPrograms.ru","OpenPrograms/mpmxyz-Programs","OpenPrograms/pedrosgali-Programs","OpenPrograms/Techokami-Programs","OpenPrograms/Vexatos-Programs","OpenPrograms/istasi-Programs"},packages={applicationconf={dependencies={},repo=4,files={["master/applicationconf/etc/application.conf"]="/etc/application.conf",["master/applicationconf/lib/applicationconf.lua"]="/usr/lib/applicationconf.lua",["master/applicationconf/lib/applicationconfparser.lua"]="/usr/lib/applicationconfparser.lua"}},libdeflate={version="1.0",dependencies={1},repo=7,files={["master/libdeflate/deflate.lua"]="/usr/lib/deflate.lua"}},nano={dependencies={},repo=15,files={["master/nano/nano.lua"]="/usr/bin/nano.lua"}},["bigreactors-control"]={dependencies={},repo=33,files={["master/reactor/bigreactors-control.lua"]="/usr/bin/bigreactors-control.lua"}},chip8emu={dependencies={},repo=15,files={["master/chip8.lua"]="/usr/bin/chip8.lua"}},["draw-plus"]={dependencies={},repo=31,files={["master/drawPlus/draw-plus.lua"]="/usr/bin/draw-plus.lua"}},["holo-editor"]={dependencies={},repo=29,files={["master/holo-editor/holo-viewer.lua"]="/usr/bin/holo-viewer.lua",["master/holo-editor/holo-editor.lua"]="/usr/bin/holo-editor.lua",["master/holo-editor/README.md"]="/usr/share/doc/holo-editor/README.md"}},gml={dependencies={},repo=9,files={["master/gml/lib/default.gss"]="/usr/lib/default.gss",["master/gml/lib/gmlDialogs.lua"]="/usr/lib/gmlDialogs.lua",["master/gml/lib/gfxbuffer.lua"]="/usr/lib/gfxbuffer.lua",["master/gml/lib/gml.lua"]="/usr/lib/gml.lua",["master/gml/lib/canvas.lua"]="/usr/lib/canvas.lua",["master/gml/lib/colorutils.lua"]="/usr/lib/colorutils.lua"}},["python-edit"]={dependencies={"python-gml"},repo=26,files={["master/python-edit/libpy/editor.pyc"]="/usr/lib/python2/editor.pyc"}},wocchat={dependencies={},repo=15,files={["master/wocchat/wocchat.lua"]="/usr/bin/wocchat.lua"}},locationservice={dependencies={},repo=4,files={["master/locationService/bin/setLocation.lua"]="/usr/bin/setLocation.lua",["master/locationService/lib/locationService.lua"]="/usr/lib/locationService.lua",["master/locationService/boot/80_locationService.lua"]="/boot/80_locationService.lua"}},backtrace={dependencies={},repo=1,files={["master/backtrace/bin/bt.lua"]="/usr/bin/bt.lua"}},musicfs={dependencies={"libmusicfs"},repo=23,files={["master/musicfs/musicfs.lua"]="/usr/bin/musicfs.lua"}},msdosfs={dependencies={"fstools","vcomponent"},repo=15,files={["master/filesystems/msdos.lua"]="/usr/lib/msdos.lua"}},moonscript={dependencies={},repo=11,files={["master/lib/moonscript/base.lua"]="/usr/lib/moonscript/base.lua",["master/lib/moonscript/data.lua"]="/usr/lib/moonscript/data.lua",["master/lib/fenv_hack.lua"]="/usr/lib/fenv_hack.lua",["master/lib/moonscript/cmd/args.lua"]="/usr/lib/moonscript/cmd/args.lua",["master/lib/moonscript/transform/statement.lua"]="/usr/lib/moonscript/transform/statement.lua",["master/lib/moonscript/transform/value.lua"]="/usr/lib/moonscript/transform/value.lua",["master/lib/moonscript/transform/class.lua"]="/usr/lib/moonscript/transform/class.lua",["master/bin/moon.lua"]="/usr/bin/moon.lua",["master/lib/moonscript/parse/env.lua"]="/usr/lib/moonscript/parse/env.lua",["master/lib/moonscript/init.lua"]="/usr/lib/moonscript/init.lua",["master/lib/moonscript/compile/statement.lua"]="/usr/lib/moonscript/compile/statement.lua",["master/lib/moonscript/line_tables.lua"]="/usr/lib/moonscript/line_tables.lua",["master/lib/moonscript/compile.lua"]="/usr/lib/moonscript/compile.lua",["master/lib/alt_getopt.lua"]="/usr/lib/alt_getopt.lua",["master/lib/moonscript/transform/transformer.lua"]="/usr/lib/moonscript/transform/transformer.lua",["master/lib/moonscript/parse.lua"]="/usr/lib/moonscript/parse.lua",["master/lib/moonscript/version.lua"]="/usr/lib/moonscript/version.lua",["master/bin/moonc.lua"]="/usr/bin/moonc.lua",["master/lib/moonscript/dump.lua"]="/usr/lib/moonscript/dump.lua",["master/lib/moonscript/errors.lua"]="/usr/lib/moonscript/errors.lua",["master/lib/moonscript/transform/statements.lua"]="/usr/lib/moonscript/transform/statements.lua",["master/lib/moonscript/cmd/lint.lua"]="/usr/lib/moonscript/cmd/lint.lua",["master/lib/moonscript/transform/names.lua"]="/usr/lib/moonscript/transform/names.lua",["master/lib/moonscript/transform/destructure.lua"]="/usr/lib/moonscript/transform/destructure.lua",["master/lib/lpeg.lua"]="/usr/lib/lpeg.lua",["master/lib/moonscript/util.lua"]="/usr/lib/moonscript/util.lua",["master/lib/moonscript/parse/literals.lua"]="/usr/lib/moonscript/parse/literals.lua",["master/lib/moonscript/compile/value.lua"]="/usr/lib/moonscript/compile/value.lua",["master/lib/moonscript/parse/util.lua"]="/usr/lib/moonscript/parse/util.lua",["master/lib/moonscript/transform.lua"]="/usr/lib/moonscript/transform.lua",["master/lib/moonscript/cmd/coverage.lua"]="/usr/lib/moonscript/cmd/coverage.lua",["master/lib/lfs.lua"]="/usr/lib/lfs.lua",["master/lib/moonscript/transform/accumulator.lua"]="/usr/lib/moonscript/transform/accumulator.lua",["master/lib/moonscript/types.lua"]="/usr/lib/moonscript/types.lua",["master/lib/moonscript/cmd/moonc.lua"]="/usr/lib/moonscript/cmd/moonc.lua",["master/lib/moonscript/transform/comprehension.lua"]="/usr/lib/moonscript/transform/comprehension.lua"}},ocnetfs={dependencies={"vcomponent"},repo=15,files={["master/OCNetFS/ocnetfs.lua"]="/usr/bin/ocnetfs.lua"}},unrequire={dependencies={},repo=15,files={["master/unrequire.lua"]="/usr/bin/unrequire.lua"}},libcrc32={version="1.0",dependencies={},repo=7,files={["master/libcrc32/crc32.lua"]="/usr/lib/crc32.lua"}},["python-simpledb"]={dependencies={"python"},repo=26,files={["master/python-SimpleDB/lib/SimpleDB.lua"]="/usr/lib/SimpleDB.lua",["master/python-SimpleDB/libpy/SimpleDB.pyc"]="/usr/lib/python2/SimpleDB.pyc"}},configparser={dependencies={},repo=1,files={["master/configparse/lib/configparse.lua"]="/usr/lib/configparse.lua"}},["oop-system"]={dependencies={},repo=1,files={["master/oop-system/lib/oop-system.lua"]="/usr/lib/oop-system.lua"}},mpt={version="superold",dependencies={},repo=7,files={["master/mpt/config.db"]="/var/lib/mpt/config.db",["master/mpt/mpt.lua"]="/usr/bin/mpt.lua",["master/mpt/mpt.db"]="/var/lib/mpt/mpt.db"}},configlib={dependencies={},repo=19,files={["master/configlib/configlib.lua"]="/usr/lib/configlib.lua"}},dispenser={dependencies={"natable"},repo=17,files={["master/dispenser/dispenser.lua"]="/usr/lib/dispenser.lua"}},natable={dependencies={},repo=17,files={["master/natable/natable.lua"]="/usr/lib/natable.lua"}},autostartutil={dependencies={},repo=17,files={["master/autorun.lua"]="/autorun.lua"}},libvector={dependencies={},repo=29,files={["master/libvector/vector.lua"]="/usr/lib/vector.lua",["master/libvector/README.md"]="/usr/share/doc/libvector/README.md"}},["antheus-dns-library"]={dependencies={},repo=21,files={["master/OpenDNS/dns.lua"]="/usr/lib/dns.lua"}},libnbt={version="1.0",dependencies={},repo=7,files={["master/libnbt/nbt.lua"]="/usr/lib/nbt.lua"}},netflash={dependencies={},repo=23,files={["master/netflash.lua"]="/usr/bin/netflash.lua"}},["mpm.auto_progress"]={dependencies={},repo=30,files={["master/home/lib/mpm/auto_progress.lua"]="/usr/lib/mpm/auto_progress.lua"}},floppypirate={dependencies={},repo=17,files={["master/FloppyPirate/floppypirate.man"]="/usr/man/floppypirate.man",["master/FloppyPirate/floppypirate.lua"]="/usr/bin/floppypirate.lua"}},["gml-plan9k"]={version="1.0.0-21",dependencies={},repo=7,files={["master/gml/lib/default.gss"]="/usr/lib/default.gss",["master/gml/lib/gmlDialogs.lua"]="/usr/lib/gmlDialogs.lua",["master/gml/lib/gfxbuffer.lua"]="/usr/lib/gfxbuffer.lua",["master/gml/lib/gml.lua"]="/usr/lib/gml.lua",["master/gml/lib/canvas.lua"]="/usr/lib/canvas.lua",["master/gml/lib/colorutils.lua"]="/usr/lib/colorutils.lua"}},fancylights={dependencies={},repo=17,files={["master/fancylights/fancylights.lua"]="/usr/bin/fancylights.lua",["master/fancylights/fancylights.man"]="/usr/man/fancylights.man"}},["power-monitor"]={dependencies={"autopid","superlib"},repo=6,files={["master/power-monitor/power-monitor.lua"]="/usr/bin/power-monitor.lua"}},geo2holo={dependencies={},repo=25,files={["master/geo2holo.lua"]="/usr/bin/geo2holo.lua"}},pid={dependencies={"mpm.libarmor","mpm.qui","mpm.values"},repo=30,files={[":master/home/pid/examples"]="/usr/pid/examples/examples",["master/home/bin/gpid.lua"]="/usr/bin/gpid.lua",["master/usr/man/pid.man"]="/usr/man/pid.man",["master/home/bin/pid.lua"]="/usr/bin/pid.lua",["master/home/lib/pid.lua"]="/usr/lib/pid.lua"}},nn={dependencies={},repo=2,files={["master/nn/nn.lua"]="/usr/bin/nn.lua",["master/nn/README.md"]="/usr/share/doc/nn/README.md",["master/man/nn"]="/usr/man/nn",["master/man/nanomachines"]="/usr/man/nanomachines"}},libitem={version="1.0",dependencies={1,2},repo=7,files={["master/libitem/iview.lua"]="/usr/bin/iview.lua",["master/libitem/item.lua"]="/usr/lib/item.lua"}},["plan9k-doc-core"]={version="1.0",dependencies={},repo=3,files={["master/plan9k-doc-core/plan9k.md"]="/usr/share/man/plan9k.md"}},["opg-chat"]={dependencies={"libaevent"},repo=2,files={["master/opg-chat/chat-modules/help.module"]="/usr/lib/chat-modules/help.module",["master/opg-chat/chat-modules/input.module"]="/usr/lib/chat-modules/input.module",["master/opg-chat/chat-modules/user.module"]="/usr/lib/chat-modules/user.module",["master/opg-chat/chat-modules/channels.module"]="/usr/lib/chat-modules/channels.module",["master/opg-chat/chat-modules/admin.module"]="/usr/lib/chat-modules/admin.module",["master/opg-chat/opg-chat.lua"]="/usr/bin/opg-chat.lua",["master/opg-chat/chat-modules/network.module"]="/usr/lib/chat-modules/network.module",["master/opg-chat/chat-modules/hide.module"]="/usr/lib/chat-modules/hide.module",["master/opg-chat/README.md"]="/usr/share/doc/opg-chat/README.md"}},["ooci-tools"]={dependencies={},repo=15,files={["master/ooci/ooci-view.lua"]="/usr/bin/ooci-view.lua",["master/ooci/ooci2ctif.lua"]="/usr/bin/ooci2ctif.lua",["master/ooci/ctif2ooci.lua"]="/usr/bin/ctif2ooci.lua"}},grep={dependencies={"getopt"},repo=18,files={["master/grep/grep.lua"]="/usr/bin/grep.lua",["master/grep/grep.man"]="/usr/man/grep.man"}},["mpm.stack"]={dependencies={},repo=30,files={["master/home/lib/mpm/stack.lua"]="/usr/lib/mpm/stack.lua"}},ubersandbox={dependencies={"configparser","oop-system","deepcopy"},repo=1,files={["master/ubersandbox/bin/sandbox.lua"]="/usr/bin/sandbox.lua",["master/ubersandbox/lib/ubersandbox.lua"]="/usr/lib/ubersandbox.lua",["master/ubersandbox/lib/ubersandbox/require.lua"]="/usr/lib/ubersandbox/require.lua",["master/ubersandbox/lib/ubersandbox/whitelist.lua"]="/usr/lib/ubersandbox/whitelist.lua",["master/ubersandbox/lib/ubersandbox/sandbox.lua"]="/usr/lib/ubersandbox/sandbox.lua"}},libbigint={dependencies={},repo=2,files={["master/libbigint/README.md"]="/usr/share/doc/libbigint/README.md",["master/libbigint/bigint.lua"]="/usr/lib/bigint.lua"}},ocpiano={dependencies={},repo=17,files={["master/OCPiano/piano.man"]="/usr/man/piano.man",["master/OCPiano/piano.lua"]="/usr/bin/piano.lua"}},wsare_srv={dependencies={"snl","dispenser"},repo=17,files={["master/wsare_srv/std.lua"]="/usr/wsare/plugins/std.lua",["master/wsare_srv/wsare_srv.lua"]="/usr/bin/wsare_srv.lua",["master/wsare_srv/wsare_srv.man"]="/usr/man/wsare_srv.man"}},splashes={dependencies={},repo=17,files={["master/splashes/splashes.lua"]="/usr/lib/splashes.lua",["master/splashes/splashes"]="/etc/splashes"}},devfs={dependencies={},repo=30,files={["master/boot/98_devfs.lua"]="/boot/98_devfs.lua",[":master/lib/devfs"]="/usr/lib/devfs/devfs",[":master/lib/drivers"]="/usr/lib/drivers/drivers"}},mpttest={version="0.2",dependencies={},repo=7,files={["master/mpttest/README.md"]="/usr/share/man/mpttest.md",["master/mpttest/mpttest.lua"]="/usr/bin/mpttest.lua"}},thread={dependencies={},repo=16,files={["master/usr/man/thread.getAlarm"]="/usr/man/thread.getAlarm",["master/usr/man/thread"]="/usr/man/thread",["master/usr/man/thread.exit"]="/usr/man/thread.exit",["master/usr/man/thread.spawn"]="/usr/man/thread.spawn",["master/usr/man/thread.demonstration"]="/usr/man/thread.demonstration",["master/usr/man/thread.setFilter"]="/usr/man/thread.setFilter",["master/usr/man/thread.kill"]="/usr/man/thread.kill",["master/usr/man/thread.getFilter"]="/usr/man/thread.getFilter",["master/usr/man/thread.pause"]="/usr/man/thread.pause",["master/lib/thread.lua"]="/usr/lib/thread.lua",["master/usr/man/thread.yield"]="/usr/man/thread.yield",["master/usr/man/thread.getThreads"]="/usr/man/thread.getThreads",["master/usr/man/thread.unpause"]="/usr/man/thread.unpause",["master/usr/man/thread.examples"]="/usr/man/thread.examples",["master/usr/man/thread.getAnswer"]="/usr/man/thread.getAnswer",["master/usr/man/thread.setName"]="/usr/man/thread.setName",["master/usr/man/thread.ask"]="/usr/man/thread.ask",["master/usr/man/thread.getThread"]="/usr/man/thread.getThread",["master/usr/man/thread.manager"]="/usr/man/thread.manager",["master/usr/man/thread.dig"]="/usr/man/thread.dig",["master/usr/man/thread.setAlarm"]="/usr/man/thread.setAlarm",["master/usr/man/thread.whisper"]="/usr/man/thread.whisper",["master/usr/man/thread.setAnswer"]="/usr/man/thread.setAnswer",["master/usr/man/thread.getName"]="/usr/man/thread.getName",["master/usr/man/thread.properties"]="/usr/man/thread.properties"}},oppm={dependencies={},repo=33,files={["master/op-manager/etc/oppm.cfg"]="/etc/oppm.cfg",["master/op-manager/oppm.lua"]="/usr/bin/oppm.lua"}},["selene-openos"]={version="0.1.0.2",dependencies={"selene"},repo=12,files={["master/selene/wrappers/OpenOS/bin/selenec.lua"]="/usr/bin/selenec.lua",["master/selene/wrappers/OpenOS/boot/44_selene.lua"]="/boot/44_selene.lua",["master/selene/etc/selene.cfg"]="/etc/selene.cfg",["master/selene/wrappers/OpenOS/bin/selene.lua"]="/usr/bin/selene.lua"}},["gml-examples"]={dependencies={"gml"},repo=9,files={["master/gml/bin/gmltest.lua"]="/usr/bin/gmltest.lua",["master/gml/bin/savedlg.lua"]="/usr/bin/savedlg.lua"}},redfs={dependencies={},repo=24,files={["redfs/mount.redfs.lua"]="/usr/bin/mount.redfs.lua",["redfs/redfs.lua"]="/usr/lib/redfs.lua"}},ipack={dependencies={},repo=15,files={["master/immibis-compress/ipack.lua"]="/usr/lib/ipack.lua"}},libformat={dependencies={},repo=15,files={["master/enhanced/format.lua"]="/usr/lib/format.lua"}},["payo-tests"]={dependencies={"popm","payo-bash"},repo=13,files={[":master/payo-tests/var/payo-tests"]="/var/payo-tests/payo-tests"}},alongtimeago={dependencies={"superlib"},repo=6,files={["master/random/alongtimeago/1.txt"]="/usr/movies/1.txt",["master/random/alongtimeago/alongtimeago.lua"]="/usr/bin/alongtimeago.lua"}},superlib={dependencies={},repo=6,files={["master/superlib/superlib_tests.lua"]="/usr/bin/superlib_tests.lua",["master/superlib/superlib.lua"]="/usr/lib/superlib.lua"}},["mpm.tar"]={dependencies={"mpm.auto_progress"},repo=30,files={["master/home/bin/tar.lua"]="/usr/bin/tar.lua",["master/usr/man/tar.man"]="/usr/man/tar.man"}},gist={dependencies={},repo=2,files={["master/gist/README.md"]="/usr/share/doc/gist/README.md",["master/man/gist"]="/usr/man/gist",["master/gist/gist.lua"]="/usr/bin/gist.lua"}},["antheus-dns-server"]={dependencies={"antheus-lib"},repo=21,files={["master/OpenDNS/dns-server.lua"]="/home/dns-server.lua"}},nstest={dependencies={"noteal"},repo=17,files={["master/nstest/example.nal"]="/usr/examples/nstest/example.nal",["master/nstest/nstest.lua"]="/usr/bin/nstest.lua"}},libhttp={dependencies={"libtls"},repo=2,files={["master/libhttp/http.lua"]="/usr/lib/http.lua",["master/libhttp/README.md"]="/usr/share/doc/libhttp/README.md"}},asiebin={dependencies={},repo=33,files={["master/asiebin/asiebin.lua"]="/usr/bin/asiebin.lua"}},mc={dependencies={},repo=29,files={["master/mc/mc.lua"]="/usr/bin/mc.lua",["master/mc/README.md"]="/usr/share/doc/mc/README.md"}},p6={version="ulesesslyoldaplhapocofplan9k",dependencies={},repo=7,files={["master/p6/mod_init.lua"]="/lib/modules/init.lua",["master/p6/p6.lua"]="/boot/kernel/p6/p6.lua"}},["bigreactors-capbank"]={dependencies={},repo=33,files={["master/reactor/capbank/bigreactors-control.lua"]="/usr/bin/bigreactors-control.lua"}},sl={dependencies={},repo=8,files={["master/sl.lua"]="/usr/bin/sl.lua"}},["plan9k-docs"]={version="1.0",dependencies={"plan9k-doc-core","plan9k-man"},repo=3,files={}},getopt={dependencies={},repo=18,files={["master/getopt/getopt.lua"]="/usr/lib/getopt.lua"}},authors={dependencies={},repo=29,files={}},automount={dependencies={},repo=17,files={["master/AutoMount/automount.lua"]="/usr/bin/automount.lua"}},librt={dependencies={},repo=25,files={["master/raytracer.lua"]="/usr/lib/raytracer.lua"}},gitrepo={dependencies={},repo=9,files={["master/gitrepo.lua"]="/usr/bin/gitrepo.lua"}},ytdl={dependencies={},repo=5,files={["master/ytdl/ytdl.lua"]="/usr/bin/ytdl.lua"}},nav={dependencies={},repo=16,files={["master/usr/man/nav.getMap"]="/usr/man/nav.getMap",["master/usr/man/nav.stepDown"]="/usr/man/nav.stepDown",["master/usr/man/nav"]="/usr/man/nav",["master/usr/man/nav.getPos"]="/usr/man/nav.getPos",["master/usr/man/nav.stepUp"]="/usr/man/nav.stepUp",["master/usr/man/nav.new"]="/usr/man/nav.new",["master/usr/man/nav.step"]="/usr/man/nav.step",["master/lib/nav.lua"]="/usr/lib/nav.lua",["master/usr/man/nav.drawMap"]="/usr/man/nav.drawMap",["master/usr/man/nav.goNextTo"]="/usr/man/nav.goNextTo",["master/usr/man/nav.turnAround"]="/usr/man/nav.turnAround",["master/usr/man/nav.turnLeft"]="/usr/man/nav.turnLeft",["master/usr/man/nav.turnTo"]="/usr/man/nav.turnTo",["master/usr/man/nav.turnRight"]="/usr/man/nav.turnRight",["master/usr/man/nav.setPos"]="/usr/man/nav.setPos",["master/usr/man/nav.putMap"]="/usr/man/nav.putMap",["master/usr/man/nav.go"]="/usr/man/nav.go"}},tdit={dependencies={},repo=8,files={["master/tdit.lua"]="/usr/bin/tdit.lua"}},libmusicfs={dependencies={},repo=23,files={["master/musicfs/libmusicfs.lua"]="/usr/lib/libmusicfs.lua"}},["payo-bash"]={dependencies={"payo-lib"},repo=13,files={["master/payo-bash/etc/profile"]="/etc/profile",[":master/payo-bash/usr/bin/payo-bash"]="/usr/bin/payo-bash/payo-bash",["master/payo-bash/usr/bin/load-payo-bash.lua"]="/usr/bin/load-payo-bash.lua",["master/payo-bash/etc/rc.d/payo-bash.lua"]="/etc/rc.d/payo-bash.lua"}},deepcopy={dependencies={},repo=1,files={["master/deepcopy/lib/deepcopy.lua"]="/usr/lib/deepcopy.lua"}},libvec={dependencies={},repo=23,files={["master/libvec.lua"]="/usr/lib/libvec.lua"}},prom={dependencies={},repo=23,files={["master/prom.lua"]="/usr/bin/prom.lua"}},supercrypt={dependencies={},repo=6,files={["master/supercrypt/tests/testaes.lua"]="/usr/bin/testaes.lua",["master/supercrypt/lib/sc_aes.lua"]="/usr/lib/sc_aes.lua",["master/supercrypt/lib/aes.lua"]="/usr/lib/aes.lua",["master/supercrypt/tests/testciphers.lua"]="/usr/bin/testciphers.lua",["master/supercrypt/lib/sc_gf.lua"]="/usr/lib/sc_gf.lua",["master/supercrypt/tests/fileencrypt.lua"]="/usr/bin/fileencrypt.lua",["master/supercrypt/lib/sc_ciphermode.lua"]="/usr/lib/sc_ciphermode.lua",["master/supercrypt/tests/filedecrypt.lua"]="/usr/bin/filedecrypt.lua",["master/supercrypt/tests/aesspeed.lua"]="/usr/bin/aesspeed.lua",["master/supercrypt/lib/sc_util.lua"]="/usr/lib/sc_util.lua",["master/supercrypt/lib/sc_buffer.lua"]="/usr/lib/sc_buffer.lua",["master/supercrypt/lib/sha256.lua"]="/usr/lib/sha256.lua"}},libqr={dependencies={},repo=29,files={["master/libqr/qr.lua"]="/usr/lib/qr.lua",["master/libqr/README.md"]="/usr/share/doc/libqr/README.md"}},libgps={dependencies={"libvec"},repo=23,files={["master/gps/libgps.lua"]="/usr/lib/libgps.lua"}},ilib={dependencies={},repo=34,files={["master/ilib/lib/serialize.lua"]="/usr/lib/ilib/serialize.lua",["master/ilib/lib/eventHandler.lua"]="/usr/lib/ilib/eventHandler.lua",["master/ilib/lib/difference.lua"]="/usr/lib/ilib/difference.lua",["master/ilib/lib/screen.lua"]="/usr/lib/ilib/screen.lua"}},geomine={dependencies={},repo=29,files={["master/geomine/geomine.lua"]="/usr/bin/geomine.lua",["master/geomine/README.md"]="/usr/share/doc/geomine/README.md"}},["libsemver-src"]={dependencies={},repo=2,files={["master/libsemver/semver.moon"]="/usr/src/semver.moon"}},["game-of-life"]={dependencies={},repo=2,files={["master/game-of-life/game-of-life.lua"]="/usr/bin/game-of-life.lua",["master/game-of-life/README.md"]="/usr/share/doc/game-of-life/README.md"}},tapeutils={dependencies={},repo=15,files={["master/tapeutils/formattape.lua"]="/usr/bin/formattape.lua",["master/tapeutils/loadtape.lua"]="/usr/bin/loadtape.lua",["master/tapeutils/dumptape.lua"]="/usr/bin/dumptape.lua",["master/tapeutils/setspeed.lua"]="/usr/bin/setspeed.lua"}},["payo-lib"]={dependencies={},repo=13,files={[":master/payo-lib/usr/lib/payo-lib"]="/usr/lib/payo-lib/payo-lib"}},print3d={dependencies={},repo=25,files={["master/print3d.lua"]="/usr/bin/print3d.lua"}},libthread={dependencies={},repo=29,files={["master/libthread/thread.lua"]="/usr/lib/thread.lua",["master/libthread/README.md"]="/usr/share/doc/libthread/README.md"}},vcomponent={dependencies={},repo=15,files={["master/vcomponent/vcomponent.lua"]="/usr/lib/vcomponent.lua",["master/vcomponent/vcmanage.lua"]="/usr/bin/vcmanage.lua"}},["python-gml"]={dependencies={"GML","python"},repo=26,files={["master/python-gml/libpy/gml.pyc"]="/usr/lib/python2/gml.pyc",["master/python-gml/lib/gmlReactor.lua"]="/usr/lib/gmlReactor.lua"}},libforms={dependencies={},repo=29,files={["master/libforms/README.md"]="/usr/share/doc/libforms/README.md",["master/libforms/forms.lua"]="/usr/lib/forms.lua"}},osmagdoor={dependencies={"superlib"},repo=6,files={["master/osmagdoor/osdoor.lua"]="/usr/bin/osdoor.lua",["master/osmagdoor/osmag.lua"]="/usr/lib/osmag.lua",["master/osmagdoor/osd.lua"]="/usr/bin/osd.lua"}},energyd={dependencies={"getopt"},repo=18,files={["master/energyd/energyd.lua"]="/usr/bin/energyd.lua",["master/energyd/energyd.conf"]="/usr/etc/energyd.conf"}},camera={dependencies={},repo=29,files={["master/camera/camera.lua"]="/usr/bin/camera.lua",["master/camera/README.md"]="/usr/share/doc/camera/README.md"}},ivator={dependencies={"ilib"},repo=34,files={["master/ivator/man/ivator"]="/usr/man/ivator",["master/ivator/ivator.lua"]="/usr/bin/ivator.lua",["master/ivator/lib/zone.lua"]="/usr/lib/ivator/zone.lua",["master/ivator/etc/ivator.cfg"]="/usr/etc/ivator.cfg",["master/ivator/lib/box.lua"]="/usr/lib/ivator/box.lua"}},["lua-lockbox"]={dependencies={},repo=2,files={["master/lua-lockbox/lockbox/digest/ripemd128.lua"]="/usr/lib/lockbox/digest/ripemd128.lua",["master/lua-lockbox/lockbox/cipher/mode/ecb.lua"]="/usr/lib/lockbox/cipher/mode/ecb.lua",["master/lua-lockbox/lockbox/padding/ansix923.lua"]="/usr/lib/lockbox/padding/ansix923.lua",["master/lua-lockbox/lockbox/cipher/xtea.lua"]="/usr/lib/lockbox/cipher/xtea.lua",["master/lua-lockbox/lockbox/cipher/mode/cbc.lua"]="/usr/lib/lockbox/cipher/mode/cbc.lua",["master/lua-lockbox/lockbox/digest/sha2_256.lua"]="/usr/lib/lockbox/digest/sha2_256.lua",["master/lua-lockbox/lockbox/digest/sha1.lua"]="/usr/lib/lockbox/digest/sha1.lua",["master/lua-lockbox/lockbox/cipher/mode/ige.lua"]="/usr/lib/lockbox/cipher/mode/ige.lua",["master/lua-lockbox/lockbox/digest/md4.lua"]="/usr/lib/lockbox/digest/md4.lua",["master/lua-lockbox/lockbox/init.lua"]="/usr/lib/lockbox/init.lua",["master/lua-lockbox/lockbox/cipher/mode/ofb.lua"]="/usr/lib/lockbox/cipher/mode/ofb.lua",["master/lua-lockbox/lockbox/digest/sha2_224.lua"]="/usr/lib/lockbox/digest/sha2_224.lua",["master/lua-lockbox/lockbox/cipher/tea.lua"]="/usr/lib/lockbox/cipher/tea.lua",["master/lua-lockbox/README.md"]="/usr/share/doc/lua-lockbox/README.md",["master/lua-lockbox/lockbox/digest/ripemd160.lua"]="/usr/lib/lockbox/digest/ripemd160.lua",["master/lua-lockbox/lockbox/util/stream.lua"]="/usr/lib/lockbox/util/stream.lua",["master/lua-lockbox/lockbox/mac/hmac.lua"]="/usr/lib/lockbox/mac/hmac.lua",["master/lua-lockbox/lockbox/util/bit.lua"]="/usr/lib/lockbox/util/bit.lua",["master/lua-lockbox/lockbox/cipher/mode/cfb.lua"]="/usr/lib/lockbox/cipher/mode/cfb.lua",["master/lua-lockbox/lockbox/cipher/mode/ctr.lua"]="/usr/lib/lockbox/cipher/mode/ctr.lua",["master/lua-lockbox/lockbox/util/queue.lua"]="/usr/lib/lockbox/util/queue.lua",["master/lua-lockbox/lockbox/util/base64.lua"]="/usr/lib/lockbox/util/base64.lua",["master/lua-lockbox/lockbox/padding/zero.lua"]="/usr/lib/lockbox/padding/zero.lua",["master/lua-lockbox/lockbox/util/array.lua"]="/usr/lib/lockbox/util/array.lua",["master/lua-lockbox/lockbox/digest/md2.lua"]="/usr/lib/lockbox/digest/md2.lua",["master/lua-lockbox/lockbox/cipher/aes192.lua"]="/usr/lib/lockbox/cipher/aes192.lua",["master/lua-lockbox/lockbox/digest/md5.lua"]="/usr/lib/lockbox/digest/md5.lua",["master/lua-lockbox/lockbox/cipher/aes128.lua"]="/usr/lib/lockbox/cipher/aes128.lua",["master/lua-lockbox/lockbox/padding/isoiec7816.lua"]="/usr/lib/lockbox/padding/isoiec7816.lua",["master/lua-lockbox/lockbox/kdf/pbkdf2.lua"]="/usr/lib/lockbox/kdf/pbkdf2.lua",["master/lua-lockbox/lockbox/padding/pkcs7.lua"]="/usr/lib/lockbox/padding/pkcs7.lua",["master/lua-lockbox/lockbox/cipher/mode/pcbc.lua"]="/usr/lib/lockbox/cipher/mode/pcbc.lua",["master/lua-lockbox/lockbox/cipher/des3.lua"]="/usr/lib/lockbox/cipher/des3.lua",["master/lua-lockbox/lockbox/cipher/des.lua"]="/usr/lib/lockbox/cipher/des.lua",["master/lua-lockbox/lockbox/cipher/aes256.lua"]="/usr/lib/lockbox/cipher/aes256.lua"}},drama={dependencies={},repo=33,files={["master/drama/drama.lua"]="/usr/bin/drama.lua"}},song={dependencies={},repo=33,files={["master/song/song.lua"]="/usr/lib/song.lua"}},["drone-control"]={dependencies={},repo=33,files={["master/dronecontrol/share/bios/drone-control.lua"]="/usr/share/bios/drone-control.lua",["master/dronecontrol/bin/drone-control.lua"]="/usr/bin/drone-control.lua",["master/dronecontrol/etc/drone-control.cfg"]="/etc/drone-control.cfg"}},multiboot={version="0.1",dependencies={},repo=7,files={["master/multiboot/init.lua"]="/init.lua",["master/multiboot/openos.lua"]="/boot/kernel/OpenOS/openos.lua"}},holocol={dependencies={},repo=33,files={["master/holocol/holocol.lua"]="/usr/bin/holocol.lua"}},nettools={version="reallyold",dependencies={1},repo=7,files={["master/nettools/nc.lua"]="/usr/bin/nc.lua"}},["song-examples"]={dependencies={"song"},repo=33,files={["master/song/song-example1.lua"]="/usr/bin/song-example1.lua",["master/song/song-example2.lua"]="/usr/bin/song-example2.lua"}},sminesweeperone={dependencies={},repo=6,files={["master/games/ms1/minesweeper.lua"]="/usr/bin/minesweeper.lua"}},print={dependencies={},repo=32,files={["master/print.lua"]="/usr/bin/print.lua"}},["mpm.values"]={dependencies={},repo=30,files={["master/home/lib/mpm/values.lua"]="/usr/lib/mpm/values.lua"}},psh={dependencies={},repo=13,files={["master/psh/usr/lib/psh/client.lua"]="/usr/lib/psh/client.lua",["master/psh/usr/lib/psh/init.lua"]="/usr/lib/psh/init.lua",["master/psh/usr/bin/psh.lua"]="/usr/bin/psh.lua",["master/psh/usr/lib/psh/daemon.lua"]="/usr/lib/psh/daemon.lua",["master/psh/etc/psh/psh.cfg"]="/etc/psh/psh.cfg",["master/psh/usr/bin/pcp.lua"]="/usr/bin/pcp.lua",["master/psh/etc/rc.d/pshd.lua"]="/etc/rc.d/pshd.lua",["master/psh/usr/lib/psh/host.lua"]="/usr/lib/psh/host.lua"}},["mpm.textgfx"]={dependencies={},repo=30,files={["master/home/lib/mpm/textgfx.lua"]="/usr/lib/mpm/textgfx.lua"}},purgelib={dependencies={},repo=30,files={["master/home/bin/purgelib.lua"]="/usr/bin/purgelib.lua",["master/usr/man/purgelib.man"]="/usr/man/purgelib.man"}},["mpm.qui"]={dependencies={"mpm.stack","mpm.textgfx","mpm.values"},repo=30,files={["master/home/lib/mpm/qui.lua"]="/usr/lib/mpm/qui.lua",["master/home/lib/mpm/qevent.lua"]="/usr/lib/mpm/qevent.lua",["master/home/lib/mpm/qselect.lua"]="/usr/lib/mpm/qselect.lua",["master/home/lib/mpm/quidgets.lua"]="/usr/lib/mpm/quidgets.lua"}},["mpm.libarmor"]={dependencies={},repo=30,files={["master/home/lib/mpm/libarmor.lua"]="/usr/lib/mpm/libarmor.lua"}},["print3d-examples"]={dependencies={"print3d"},repo=25,files={[":master/models/"]="/usr/share/models/models"}},["vortex-compiler"]={dependencies={"vortex-runtime"},repo=1,files={["master/vortex-compiler/lib/vortex/util.lua"]="/usr/lib/vortex/util.lua",["master/vortex-compiler/lib/vortex/lexer.lua"]="/usr/lib/vortex/lexer.lua",["master/vortex-compiler/bin/vortex.lua"]="/usr/bin/vortex.lua",["master/vortex-compiler/lib/vortex/parser.lua"]="/usr/lib/vortex/parser.lua"}},description={dependencies={},repo=29,files={}},wsare={dependencies={"snl","dispenser"},repo=17,files={["master/wsare/wsare.lua"]="/usr/bin/wsare.lua",["master/wsare/wsare.man"]="/usr/man/wsare.man"}},["drone-sort"]={dependencies={},repo=25,files={["master/drone-sort.lua"]="/usr/share/bios/drone-sort.lua"}},name={dependencies={},repo=29,files={}},geoglasses={dependencies={},repo=29,files={["master/geoglasses/geoglasses.lua"]="/usr/bin/geoglasses.lua",["master/geoglasses/README.md"]="/usr/share/doc/geoglasses/README.md"}},repo={dependencies={},repo=29,files={}},["antheus-lib"]={dependencies={},repo=21,files={["master/AntheusLib/antheus.lua"]="/usr/lib/antheus.lua"}},derp={dependencies={},repo=25,files={["master/idontexist.lua"]="/usr/bin/idontexist.lua"}},fstools={dependencies={},repo=15,files={["master/filesystems/fslib.lua"]="/usr/lib/fslib.lua",["master/filesystems/mountfs.lua"]="/usr/bin/mountfs.lua"}},v={dependencies={"v-script","oop-system"},repo=22,files={["master/v/share/v/vs/main.vs"]="/usr/share/v/vs/main.vs",["master/v/lib/v/buffer.lua"]="/usr/lib/v/buffer.lua",["master/v/lib/v/keymap.lua"]="/usr/lib/v/keymap.lua",["master/v/bin/v.lua"]="/usr/bin/v.lua"}},["holo-demos"]={dependencies={"libnoise"},repo=25,files={["master/holo-flow.lua"]="/usr/bin/holo-flow.lua",["master/holo-count.lua"]="/usr/bin/holo-count.lua",["master/holo-text.lua"]="/usr/bin/holo-text.lua"}},tar={dependencies={"libformat"},repo=15,files={["master/tar/tar.lua"]="/usr/bin/tar.lua"}},snl={dependencies={"dispenser"},repo=17,files={["master/snl/snl_srv.lua"]="/usr/lib/snl_srv.lua",["master/snl/snl_clt.lua"]="/usr/lib/snl_clt.lua"}},gol={dependencies={},repo=25,files={["master/gol-tiny.lua"]="/usr/bin/gol-tiny.lua",["master/gol.lua"]="/usr/bin/gol.lua"}},strict={dependencies={},repo=28,files={["master/strict/strict.lua"]="/usr/lib/strict.lua"}},socfs={dependencies={"fstools","vcomponent"},repo=15,files={["master/filesystems/mksocfs.lua"]="/usr/bin/mksocfs.lua",["master/filesystems/socfs.lua"]="/usr/lib/socfs.lua"}},tapefs={dependencies={"vcomponent"},repo=15,files={["master/filesystems/tapefsd.lua"]="/usr/bin/tapefsd.lua",["master/filesystems/tapefs.lua"]="/usr/lib/tapefs.lua"}},telnet={dependencies={},repo=32,files={["master/telnet.lua"]="/usr/bin/telnet.lua"}},libsemver={dependencies={},repo=2,files={["master/libsemver/semver.lua"]="/usr/lib/semver.lua",["master/libsemver/README.md"]="/usr/share/doc/libsemver/README.md"}},python={dependencies={},repo=26,files={["master/python/lib/IEEE754.lua"]="/usr/lib/python/IEEE754.lua",["master/python/lib/python.lua"]="/usr/lib/python/python.lua",["master/python/lib/primitives.lua"]="/usr/lib/python/primitives.lua",["master/python/libpy/StringIO.pyc"]="/usr/lib/python2/StringIO.pyc",["master/python/lib/stack.lua"]="/usr/lib/python/stack.lua",["master/python/lib/builtins.lua"]="/usr/lib/python/builtins.lua",["master/python/bin/python.lua"]="/usr/bin/python.lua",["master/python/python.man"]="/usr/man/python/python.man"}},libnoise={dependencies={},repo=25,files={["master/noise.lua"]="/usr/lib/noise.lua"}},logger={dependencies={},repo=4,files={["master/logger/boot/04_logger.lua"]="/boot/04_logger.lua"}},libaevent={dependencies={},repo=2,files={["master/libaevent/README.md"]="/usr/share/doc/libaevent/README.md",["master/libaevent/aevent.lua"]="/usr/lib/aevent.lua"}},["vortex-runtime"]={dependencies={},repo=1,files={["master/vortex-runtime/lib/vortex/rt/core.lua"]="/usr/lib/vortex/rt/core.lua",["master/vortex-runtime/lib/vortex/rt/mod.lua"]="/usr/lib/vortex/rt/mod.lua",["master/vortex-runtime/lib/vortex/rt/defenv.lua"]="/usr/lib/vortex/rt/defenv.lua",["master/vortex-runtime/lib/vortex/rt/parser.lua"]="/usr/lib/vortex/rt/parser.lua",["master/vortex-runtime/lib/vortex/rt/list.lua"]="/usr/lib/vortex/rt/list.lua",["master/vortex-runtime/lib/vxrt/init.lua"]="/usr/lib/vxrt/init.lua",["master/vortex-runtime/lib/vortex/rt/object.lua"]="/usr/lib/vortex/rt/object.lua",["master/vortex-runtime/lib/vortex/rt/env.lua"]="/usr/lib/vortex/rt/env.lua",["master/vortex-runtime/lib/vortex/rt/seq.lua"]="/usr/lib/vortex/rt/seq.lua",["master/vortex-runtime/lib/rt_init.lua"]="/usr/lib/rt_init.lua",["master/vortex-runtime/lib/vortex/rt/init.lua"]="/usr/lib/vortex/rt/init.lua",["master/vortex-runtime/lib/vortex/rt.lua"]="/usr/lib/vortex/rt.lua",["master/vortex-runtime/lib/vortex/rt/table.lua"]="/usr/lib/vortex/rt/table.lua",["master/vortex-runtime/lib/vxrt/strict.lua"]="/usr/lib/vxrt/strict.lua"}},["print3d-view"]={dependencies={"librt"},repo=25,files={["master/print3d-view.lua"]="/usr/bin/print3d-view.lua"}},obj={dependencies={},repo=29,files={["master/obj/obj.lua"]="/usr/lib/obj.lua",["master/obj/README.md"]="/usr/share/doc/obj/README.md"}},smap={dependencies={},repo=2,files={["master/smap/smap/output/beep.output.lua"]="/usr/lib/smap/output/beep.output.lua",["master/smap/smap/input/nbs.input.lua"]="/usr/lib/smap/input/nbs.input.lua",["master/smap/smap/output/inb.output.lua"]="/usr/lib/smap/output/inb.output.lua",["master/smap/smap/audio/init.lua"]="/usr/lib/smap/audio/init.lua",["master/smap/smap/init.lua"]="/usr/lib/smap/init.lua",["master/smap/smap/output/pcspkr.output.lua"]="/usr/lib/smap/output/pcspkr.output.lua",["master/smap/README.md"]="/usr/share/doc/smap/README.md",["master/smap/smap.lua"]="/usr/bin/smap.lua",["master/smap/smap/output/sound.output.lua"]="/usr/lib/smap/output/sound.output.lua",["master/smap/smap/input/midi.input.lua"]="/usr/lib/smap/input/midi.input.lua"}},midi={dependencies={},repo=25,files={["master/midi.lua"]="/usr/bin/midi.lua"}},libtls={dependencies={"lua-lockbox","libbigint","libder-decoder"},repo=2,files={["master/libtls/README.md"]="/usr/share/doc/libtls/README.md",["master/libtls/tls.lua"]="/usr/lib/tls.lua"}},["libder-decoder"]={dependencies={"libbigint"},repo=2,files={["master/libder-decoder/der-decoder.lua"]="/usr/lib/der-decoder.lua",["master/libder-decoder/README.md"]="/usr/share/doc/libder-decoder/README.md"}},["v-script"]={dependencies={"oop-system"},repo=22,files={["master/v-script/lib/v-script/stdlib.lua"]="/usr/lib/v-script/stdlib.lua",["master/v-script/lib/v-script/values/symbol.lua"]="/usr/lib/v-script/values/symbol.lua",["master/v-script/lib/v-script/namespace.lua"]="/usr/lib/v-script/namespace.lua",["master/v-script/lib/v-script/args.lua"]="/usr/lib/v-script/args.lua",["master/v-script/lib/v-script/environment.lua"]="/usr/lib/v-script/environment.lua",["master/v-script/lib/v-script/lexer.lua"]="/usr/lib/v-script/lexer.lua",["master/v-script/lib/v-script/s-exp.lua"]="/usr/lib/v-script/s-exp.lua",["master/v-script/lib/v-script.lua"]="/usr/lib/v-script.lua",["master/v-script/lib/v-script/values/nil.lua"]="/usr/lib/v-script/values/nil.lua",["master/v-script/lib/v-script/values/lua.lua"]="/usr/lib/v-script/values/lua.lua",["master/v-script/lib/v-script/parser.lua"]="/usr/lib/v-script/parser.lua",["master/v-script/lib/v-script/values/number.lua"]="/usr/lib/v-script/values/number.lua",["master/v-script/lib/v-script/values/string.lua"]="/usr/lib/v-script/values/string.lua",["master/v-script/lib/v-script/scope.lua"]="/usr/lib/v-script/scope.lua",["master/v-script/lib/v-script/values/boolean.lua"]="/usr/lib/v-script/values/boolean.lua",["master/v-script/lib/v-script/values.lua"]="/usr/lib/v-script/values.lua",["master/v-script/lib/v-script/utils.lua"]="/usr/lib/v-script/utils.lua",["master/v-script/lib/v-script/token.lua"]="/usr/lib/v-script/token.lua"}},popm={dependencies={"payo-lib"},repo=13,files={["master/popm/usr/bin/popm.lua"]="/usr/bin/popm.lua",["master/popm/usr/lib/popm-lib/popm.lua"]="/usr/lib/popm-lib/popm.lua"}},lisp={dependencies={},repo=25,files={["master/lisp.lua"]="/usr/bin/lisp.lua"}},selene={version="0.1.0.2",dependencies={},repo=12,files={["master/selene/lib/selene/parser.lua"]="/usr/lib/selene/parser.lua",["master/selene/lib/selene/init.lua"]="/usr/lib/selene/init.lua"}},network={version="reallyold",dependencies={},repo=7,files={["master/network/network"]="/usr/man/network",["master/network/loopback.lua"]="/lib/network/loopback.lua",["master/network/ifconfig.lua"]="/usr/bin/ifconfig.lua",["master/network/tunnel.lua"]="/lib/network/tunnel.lua",["master/network/network.lua"]="/lib/network.lua",["master/network/80_p6network.lua"]="/boot/80_p6network.lua",["master/network/modem.lua"]="/lib/network/modem.lua",["master/network/ping.lua"]="/usr/bin/ping.lua"}},autopid={dependencies={"pid","superlib"},repo=6,files={["master/autopid/boot/99_autopid.lua"]="/boot/99_autopid.lua",["master/autopid/apids/reactor.apid"]="/usr/autopid/reactor.apid",["master/autopid/apids/turbine.apid"]="/usr/autopid/turbine.apid",["master/autopid/lib/autopidlib.lua"]="/usr/lib/autopidlib.lua",["master/autopid/man/autopid.man"]="/usr/man/autopid.man",["master/autopid/bin/auto.lua"]="/usr/bin/auto.lua",["master/autopid/bin/autopid.lua"]="/usr/bin/autopid.lua"}},dummy={dependencies={},repo=21,files={["master/dummy/dummy.lua"]="/usr/dummy/dummy.lua"}},noteal={dependencies={"autostartutil"},repo=17,files={["master/NoteAL/noteal.lua"]="/usr/lib/noteal/noteal.lua",["master/NoteAL/noteinit.lua"]="/init/noteinit.lua",["master/NoteAL/confutil.lua"]="/usr/lib/noteal/confutil.lua",["master/NoteAL/read.me"]="/usr/lib/noteal/read.me",["master/NoteAL/noteconf.lua"]="/usr/lib/noteal/noteconf.lua",["master/NoteAL/notestream.lua"]="/usr/lib/noteal/notestream.lua"}},debug={dependencies={},repo=15,files={["master/debug.lua"]="/usr/bin/debug.lua"}},["selene-plan9k"]={version="0.1.0.2",dependencies={"selene"},repo=12,files={["master/selene/etc/selene.cfg"]="/etc/selene.cfg",["master/selene/wrappers/Plan9k/lib/modules/base/17_selene.lua"]="/lib/modules/base/17_selene.lua"}},["immibis-compress"]={dependencies={"ipack"},repo=15,files={["master/immibis-compress/compress.lua"]="/usr/bin/compress.lua",["master/immibis-compress/decompress.lua"]="/usr/bin/decompress.lua"}},["lava-runner"]={dependencies={},repo=29,files={["master/lava-runner/lava-runner.lua"]="/usr/bin/lava-runner.lua",["master/lava-runner/README.md"]="/usr/share/doc/lava-runner/README.md"}}}},installed={mpt={data={dependencies={},name="mpt",repo="mpt",checksum="6113f874dfc7baa106e6884606b03060",files={"/usr/bin/mpt.lua"}},frontend="MPT",deps={}},["plan9k-drivers"]={data={dependencies={},name="plan9k-drivers",repo="plan9k",checksum="-fb640833fcfba3442555ebbbe66762b",files={"/lib/modules/base/17_eeprom.lua","/lib/modules/base/17_drive.lua","/lib/modules/base/16_partition.lua","/lib/modules/base/17_nfc.lua","/lib/modules/base/17_tape.lua","/lib/modules/base/17_data.lua","/lib/modules/base/17_gpt.lua","/lib/modules/base/17_chatbox.lua","/lib/modules/base/12_mount.lua"}},frontend="MPT",deps={}},["plan9k-edit"]={data={dependencies={},name="plan9k-edit",repo="plan9k",checksum="4a26acd9f650ce6269bac2d25c3a8946",files={"/bin/edit.lua"}},frontend="MPT",deps={}},["plan9k-containers"]={data={dependencies={},name="plan9k-containers",repo="plan9k",checksum="-5ff36b0bde938782f3821bca52931c06",files={"/bin/sandbox.lua"}},frontend="MPT",deps={}},plan9k={data={dependencies={"plan9k-core","plan9k-network","plan9k-drivers","plan9k-edit","plan9k-data"},name="plan9k",repo="plan9k",checksum="83a507dd74c6b0cf2bfb3d599c578cd",files={"/.prop"}},frontend="MPT",deps={"plan9k-core","plan9k-network","plan9k-drivers","plan9k-edit","plan9k-data"}},["plan9k-data"]={data={dependencies={},name="plan9k-data",repo="plan9k",checksum="480a898a741b2bf424f9e0e86e5072ba",files={"/usr/lib/data.lua","/usr/bin/inflate.lua","/usr/bin/sha256sum.lua","/usr/bin/deflate.lua","/usr/bin/base64.lua","/usr/bin/gpg.lua","/usr/bin/md5sum.lua"}},frontend="MPT",deps={}},["plan9k-ssh"]={data={dependencies={},name="plan9k-ssh",repo="plan9k",checksum="-2fc28a9bdd608182c931a126ca8150d",files={"/bin/sshd.lua","/usr/sbin/sshsession.lua","/usr/bin/ssh.lua","/etc/rc.d/sshd.lua"}},frontend="MPT",deps={}},["openloader-init"]={data={dependencies={},name="openloader-init",repo="disks",checksum="-45e6d7b1e41468c1d335952ee3b89e13",files={"/init.lua"}},frontend="MPT",deps={}},["plan9k-fsutil"]={data={dependencies={"plan9k-corelibs"},name="plan9k-fsutil",repo="plan9k",checksum="-1222b1c98bb3bede8ea8be775ea95f2d",files={"/bin/tee.lua","/bin/mv.lua","/bin/ln.lua","/bin/cp.lua","/bin/df.lua","/bin/mkdir.lua","/bin/dd.lua","/bin/mount.lua","/bin/du.lua","/bin/more.lua","/bin/cat.lua","/bin/rm.lua","/bin/touch.lua","/bin/find.lua","/bin/mount.cow.lua","/bin/pwd.lua","/bin/ls.lua"}},frontend="MPT",deps={"plan9k-corelibs"}},["plan9k-installer"]={data={dependencies={"plan9k","mpt","plan9k-extra"},name="plan9k-installer",repo="plan9k",checksum="-31228542b8cc1190aa9d8be7ea4ff56c",files={"/bin/install.lua"}},frontend="MPT",deps={"plan9k","mpt","plan9k-extra"}},["plan9k-coreutil"]={data={dependencies={"plan9k-corelibs","plan9k-fsutil"},name="plan9k-coreutil",repo="plan9k",checksum="73511370e5cc25ed49c1763f418d3514",files={"/bin/resolution.lua","/bin/reboot.lua","/bin/lua.lua","/bin/kill.lua","/bin/clear.lua","/bin/shutdown.lua","/bin/components.lua","/bin/dmesg.lua","/bin/passwd.lua","/bin/sleep.lua","/bin/wc.lua","/bin/uptime.lua","/bin/ps.lua","/bin/hostname.lua","/bin/echo.lua","/bin/label.lua","/bin/watch.lua"}},frontend="MPT",deps={"plan9k-corelibs","plan9k-fsutil"}},pipes={data={dependencies={"openloader-init"},name="pipes",repo="plan9k",checksum="-25daa6f9147d9d86d6002408fa8f8a09",files={"/lib/modules/base/18_pty.lua","/lib/modules/base/10_procfs.lua","/lib/modules/base/20_threading.lua","/lib/modules/base/15_keventd.lua","/lib/modules/base/21_timer.lua","/lib/modules/base/17_ipc.lua","/lib/modules/base/05_vfs.lua","/lib/modules/base/02_cmd.lua","/lib/modules/base/18_syscall.lua","/lib/modules/base/15_userspace.lua","/lib/modules/base/01_util.lua","/lib/modules/base/21_threadUtil.lua","/lib/modules/base/06_cowfs.lua","/lib/modules/base/10_sysfs.lua","/lib/modules/base/25_init.lua","/lib/modules/base/17_keyboard.lua","/usr/man/pipes","/lib/modules/base/16_require.lua","/lib/modules/base/09_rootfs.lua","/lib/modules/base/10_devfs.lua","/lib/modules/base/11_block.lua","/lib/modules/base/16_buffer.lua","/lib/modules/base/17_io.lua","/boot/kernel/pipes","/lib/modules/base/19_manageg.lua","/lib/modules/base/01_gc.lua","/lib/modules/base/16_component.lua","/lib/modules/base/19_cgroups.lua"}},frontend="MPT",deps={"openloader-init"}},["plan9k-network"]={frontend="MPT",data={dependencies={},name="plan9k-network",repo="plan9k",checksum="-5faf540f0923943a61e72e8c167d6c24",files={"/bin/wget.lua","/bin/pastebin.lua","/lib/internet.lua"}},deps={}},["plan9k-corelibs"]={data={dependencies={},name="plan9k-corelibs",repo="plan9k",checksum="46d6727c48cbe2a715cda4cb4178798a",files={"/lib/colors.lua","/lib/term.lua","/lib/serialization.lua","/lib/text.lua","/lib/sides.lua","/lib/shell.lua","/lib/event.lua"}},frontend="MPT",deps={}},["plan9k-shell"]={data={dependencies={},name="plan9k-shell",repo="plan9k",checksum="-32d4b8e73ad2888460fc0428b01d4af6",files={"/bin/sh.lua"}},frontend="MPT",deps={}},["plan9k-filesystems"]={data={dependencies={},name="plan9k-filesystems",repo="plan9k",checksum="-50d8cc1c5928bec760f210185cccfafd",files={"/lib/msdosfs.lua","/bin/mount.msdos.lua","/usr/bin/mkdosfs.lua"}},frontend="MPT",deps={}},["plan9k-extra"]={data={dependencies={"plan9k-ssh","plan9k-containers","plan9k-filesystems","plan9k","mpt"},name="plan9k-extra",repo="plan9k",checksum="7c8335894a6a92290be2bbc0d11f809f",files={"/usr/bin/go.lua","/usr/lib/robot.lua","/etc/rc.d/autoupdate.lua"}},frontend="MPT",deps={"plan9k-ssh","plan9k-containers","plan9k-filesystems","plan9k","mpt"}},["plan9k-core"]={data={dependencies={"pipes","plan9k-coreutil","plan9k-shell"},name="plan9k-core",repo="plan9k",checksum="4923988758bf8aa5f6b232469d6821c3",files={"/bin/init.lua","/bin/getty.lua","/lib/rc.lua","/bin/rc.lua","/bin/readkey.lua"}},frontend="MPT",deps={"pipes","plan9k-coreutil","plan9k-shell"}}}} \ No newline at end of file From 742c8eecb65e10d1181726dd52f2e0cf6e1c2506 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 19 Dec 2016 14:40:31 +0100 Subject: [PATCH 2/2] Fixed plan9k --- .../opencomputers/loot/plan9k/bin/sh.lua | 20 +++++++++++++++---- .../loot/plan9k/boot/kernel/pipes | 11 +++++++++- .../opencomputers/loot/plan9k/etc/rc.cfg | 1 - .../assets/opencomputers/loot/plan9k/init.lua | 2 +- .../loot/plan9k/lib/modules/base/06_cowfs.lua | 2 +- .../plan9k/lib/modules/base/09_rootfs.lua | 3 ++- .../loot/plan9k/lib/modules/base/10_sysfs.lua | 1 + .../plan9k/lib/modules/base/16_require.lua | 1 + .../plan9k/lib/modules/base/20_threading.lua | 10 ++++------ .../opencomputers/loot/plan9k/usr/bin/mpt.lua | 2 +- .../loot/plan9k/var/lib/mpt/config.db | 2 +- .../loot/plan9k/var/lib/mpt/mpt.db | 2 +- 12 files changed, 39 insertions(+), 18 deletions(-) delete mode 100644 src/main/resources/assets/opencomputers/loot/plan9k/etc/rc.cfg diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/bin/sh.lua b/src/main/resources/assets/opencomputers/loot/plan9k/bin/sh.lua index a36c481e5..4560167cc 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/bin/sh.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/bin/sh.lua @@ -194,10 +194,18 @@ builtin.exit = function() end builtin.alias = function(what, ...) + if not what then + print("Usage: alias [command] [arguments...]") + return + end alias[what] = {...} end builtin.unalias = function(what) + if not what then + print("Usage: unalias ") + return + end alias[what] = nil end @@ -216,11 +224,15 @@ if fs.exists("~/.history") then end local function log(cmd) - local hisfile = io.open("~/.history", "a") - if #cmd > 0 then - hisfile:write(cmd .. "\n") + local hisfile, err = io.open("~/.history", "a") + if hisfile then + if #cmd > 0 then + hisfile:write(cmd .. "\n") + end + hisfile:close() + else + io.stderr:write("Error writing to histfile: " .. tostring(err)) end - hisfile:close() end ------------------- diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/boot/kernel/pipes b/src/main/resources/assets/opencomputers/loot/plan9k/boot/kernel/pipes index cd978e5c3..51ffff9cb 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/boot/kernel/pipes +++ b/src/main/resources/assets/opencomputers/loot/plan9k/boot/kernel/pipes @@ -60,6 +60,9 @@ do local y = 1 function kernel._println(msg) + for line in string.gmatch(tostring(msg), "([^\n]+)") do + pcall(function()kernel.io.debug(msg)end) + end if gpu and screen then for line in string.gmatch(tostring(msg), "([^\n]+)") do kernel._K.component.invoke(gpu, "set", 1, y + 3, line) @@ -84,6 +87,7 @@ do end kernel.io.println = kernel._println + kernel.io.debug = function()end end kernel.io.println(_OSVERSION .. " Starting") @@ -184,8 +188,13 @@ kernel.io.println("Starting base modules") for i = 1, #modules do if kernel.modules[modules[i].name].start then kernel.io.println("Start module " .. modules[i].name) - local result = table.pack(pcall(kernel.modules[modules[i].name].start)) + local result = table.pack(xpcall(kernel.modules[modules[i].name].start, function(e) + pcall(kernel._println, "Module tb: " .. debug.traceback()) + pcall(kernel._println, "E: " .. tostring(e)) + end)) + if not result[1] then + pcall(kernel._println, "Module start failed: " .. modules[i].name) pcall(kernel._println, result[2]) kernel.panic() end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/etc/rc.cfg b/src/main/resources/assets/opencomputers/loot/plan9k/etc/rc.cfg deleted file mode 100644 index b7ddd2e35..000000000 --- a/src/main/resources/assets/opencomputers/loot/plan9k/etc/rc.cfg +++ /dev/null @@ -1 +0,0 @@ -enabled = {} diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/init.lua b/src/main/resources/assets/opencomputers/loot/plan9k/init.lua index 049b36b65..5e20a5a80 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/init.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/init.lua @@ -81,7 +81,7 @@ end local function dofile(fs, file) local program, reason = loadfile(fs, file) if program then - local result = table.pack(pcall(program)) + local result = table.pack(true, program()) if result[1] then return table.unpack(result, 2, result.n) else diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/06_cowfs.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/06_cowfs.lua index 789f16988..b5963493e 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/06_cowfs.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/06_cowfs.lua @@ -108,7 +108,7 @@ function new(readfs, writefs) end return result end - proxy.open = function(path, mode) --hnd = orig * 2 [+ 1] + proxy.open = function(path, mode) if mode:sub(1, 1) == "w" then if readfs.exists(path) and not writefs.exists(kernel.modules.vfs.path(path)..".cfsdel."..kernel.modules.vfs.name(path)) then if readfs.isDirectory(path) then diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/09_rootfs.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/09_rootfs.lua index 8713f4f98..3c17b635d 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/09_rootfs.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/09_rootfs.lua @@ -1,9 +1,10 @@ function start() - if component.invoke(computer.getBootAddress(), "isReadOnly") then + if component.invoke(computer.getBootAddress(), "isReadOnly") or (kernel.modules.special and kernel.modules.special.roroot) then local cow = kernel.modules.cowfs.new(computer.getBootAddress(), computer.tmpAddress()) kernel.modules.vfs.mount(cow, "/") else kernel.modules.vfs.mount(computer.getBootAddress(), "/") end + kernel.modules.vfs.mount(computer.tmpAddress(), "/tmp") end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/10_sysfs.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/10_sysfs.lua index 8fda0259d..9324c09c4 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/10_sysfs.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/10_sysfs.lua @@ -33,6 +33,7 @@ proxy.exists = function(path) return file and true or false end proxy.open = function(path) + kernel.io.debug("Sysfs open: " .. tostring(path)) local seg = kernel.modules.vfs.segments(path) local file = data for _, d in pairs(seg) do diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/16_require.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/16_require.lua index 5e925dbf0..eaca39f7f 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/16_require.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/16_require.lua @@ -94,6 +94,7 @@ function start() kernel.userspace.package.preload.computer = setmetatable({}, {__index = kernel.userspace.computer}) kernel.userspace.package.preload.io = setmetatable({}, {__index = kernel.modules.io.io}) kernel.userspace.package.preload.unicode = setmetatable({}, {__index = kernel.userspace.unicode}) + kernel.userspace.package.preload.os = setmetatable({}, {__index = kernel.userspace.os}) --TODO: fix override.. maybe diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/20_threading.lua b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/20_threading.lua index 54e498194..2df005a80 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/20_threading.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/lib/modules/base/20_threading.lua @@ -117,6 +117,8 @@ function spawn(exec, child, name, isthread, _, ...) terminate = kill } + kernel.io.debug("Spawn thread " .. tostring(name)) + return thread end @@ -125,7 +127,7 @@ end local function getPendingThreads() local res = {} for _, thread in ipairs(threads) do - if thread.coro and #thread.eventQueue > 0 then + if thread.coro then res[#res + 1] = thread end end @@ -162,7 +164,7 @@ local function processSignals() deadline = thread.deadline end end - --kernel.io.println("Deadline: "..(deadline - computer.uptime())) + --kernel.io.debug("Pull deadline: "..(deadline - computer.uptime())) local sig = {"signal", pullSignal(deadline - computer.uptime())} local function filt(f, signal, ...) @@ -206,8 +208,6 @@ local function processSignals() end end - - ---- local lastYield = computer.uptime() @@ -227,8 +227,6 @@ function start() local pending = getPendingThreads() local resumable = getResumableThreads(pending) - - lastYield = computer.uptime() while #resumable > 0 do for _, thread in ipairs(resumable) do diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/mpt.lua b/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/mpt.lua index 07bd2ee31..68527a199 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/mpt.lua +++ b/src/main/resources/assets/opencomputers/loot/plan9k/usr/bin/mpt.lua @@ -344,7 +344,7 @@ mirrorFrontend = { local todo = {} for pack, data in pairs(base.installed) do if data.frontend == mirrorFrontend.name then - if mirrorFrontend.base.installed[pack] and + if mirrorFrontend.base and mirrorFrontend.base.installed[pack] and mirrorFrontend.base.installed[pack].data.checksum ~= base.installed[pack].data.checksum .. (core.data.force and "WAT" or "") then todo[pack] = {} end diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/config.db b/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/config.db index 3ecc57b30..d1636c61e 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/config.db +++ b/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/config.db @@ -1 +1 @@ -{database="/var/lib/mpt/base.db",cacheDir="/var/lib/mpt/cache/",frontend={mpt={api="http://mpt.magik6k.net/api/"}}} \ No newline at end of file +{frontend={mpt={api="http://mpt.magik6k.net/api/"}},cacheDir="/var/lib/mpt/cache/",database="/var/lib/mpt/base.db"} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/mpt.db b/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/mpt.db index d56eba16d..aa5361a73 100644 --- a/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/mpt.db +++ b/src/main/resources/assets/opencomputers/loot/plan9k/var/lib/mpt/mpt.db @@ -1 +1 @@ -{oppm={repos={"OpenPrograms/Kilobyte-Programs","OpenPrograms/Fingercomp-Programs","OpenPrograms/Plan9k","OpenPrograms/EvaKnievel-Programs","OpenPrograms/dangranos-Programs","OpenPrograms/SuPeRMiNoR2-Programs","OpenPrograms/Magik6k-Programs","OpenPrograms/Altenius-Programs","OpenPrograms/Gopher-Programs","OpenPrograms/Kenny-Programs","evgkul/moonscript-opencomputers","Vexatos/Selene","OpenPrograms/payonel-Programs","OpenPrograms/MiscPrograms","OpenPrograms/gamax92-Programs","Akuukis/RobotColorWars","OpenPrograms/Wuerfel_21-OC-Toolkit","OpenPrograms/Wobbo-Programs","vilu85/OC-programs","OpenPrograms/LizzyTrickster-Programs","OpenPrograms/Antheus-Programs","Kilobyte22/v","OpenPrograms/ds84182-Programs","SolraBizna/SolrOC","OpenPrograms/Sangar-Programs","OpenPrograms/lperkins2-Programs","OpenPrograms/Pixel-Programs","OpenPrograms/Kubuxu-Programs","OpenPrograms/OpenPrograms.ru","OpenPrograms/mpmxyz-Programs","OpenPrograms/pedrosgali-Programs","OpenPrograms/Techokami-Programs","OpenPrograms/Vexatos-Programs","OpenPrograms/istasi-Programs"},packages={applicationconf={dependencies={},repo=4,files={["master/applicationconf/etc/application.conf"]="/etc/application.conf",["master/applicationconf/lib/applicationconf.lua"]="/usr/lib/applicationconf.lua",["master/applicationconf/lib/applicationconfparser.lua"]="/usr/lib/applicationconfparser.lua"}},libdeflate={version="1.0",dependencies={1},repo=7,files={["master/libdeflate/deflate.lua"]="/usr/lib/deflate.lua"}},nano={dependencies={},repo=15,files={["master/nano/nano.lua"]="/usr/bin/nano.lua"}},["bigreactors-control"]={dependencies={},repo=33,files={["master/reactor/bigreactors-control.lua"]="/usr/bin/bigreactors-control.lua"}},chip8emu={dependencies={},repo=15,files={["master/chip8.lua"]="/usr/bin/chip8.lua"}},["draw-plus"]={dependencies={},repo=31,files={["master/drawPlus/draw-plus.lua"]="/usr/bin/draw-plus.lua"}},["holo-editor"]={dependencies={},repo=29,files={["master/holo-editor/holo-viewer.lua"]="/usr/bin/holo-viewer.lua",["master/holo-editor/holo-editor.lua"]="/usr/bin/holo-editor.lua",["master/holo-editor/README.md"]="/usr/share/doc/holo-editor/README.md"}},gml={dependencies={},repo=9,files={["master/gml/lib/default.gss"]="/usr/lib/default.gss",["master/gml/lib/gmlDialogs.lua"]="/usr/lib/gmlDialogs.lua",["master/gml/lib/gfxbuffer.lua"]="/usr/lib/gfxbuffer.lua",["master/gml/lib/gml.lua"]="/usr/lib/gml.lua",["master/gml/lib/canvas.lua"]="/usr/lib/canvas.lua",["master/gml/lib/colorutils.lua"]="/usr/lib/colorutils.lua"}},["python-edit"]={dependencies={"python-gml"},repo=26,files={["master/python-edit/libpy/editor.pyc"]="/usr/lib/python2/editor.pyc"}},wocchat={dependencies={},repo=15,files={["master/wocchat/wocchat.lua"]="/usr/bin/wocchat.lua"}},locationservice={dependencies={},repo=4,files={["master/locationService/bin/setLocation.lua"]="/usr/bin/setLocation.lua",["master/locationService/lib/locationService.lua"]="/usr/lib/locationService.lua",["master/locationService/boot/80_locationService.lua"]="/boot/80_locationService.lua"}},backtrace={dependencies={},repo=1,files={["master/backtrace/bin/bt.lua"]="/usr/bin/bt.lua"}},musicfs={dependencies={"libmusicfs"},repo=23,files={["master/musicfs/musicfs.lua"]="/usr/bin/musicfs.lua"}},msdosfs={dependencies={"fstools","vcomponent"},repo=15,files={["master/filesystems/msdos.lua"]="/usr/lib/msdos.lua"}},moonscript={dependencies={},repo=11,files={["master/lib/moonscript/base.lua"]="/usr/lib/moonscript/base.lua",["master/lib/moonscript/data.lua"]="/usr/lib/moonscript/data.lua",["master/lib/fenv_hack.lua"]="/usr/lib/fenv_hack.lua",["master/lib/moonscript/cmd/args.lua"]="/usr/lib/moonscript/cmd/args.lua",["master/lib/moonscript/transform/statement.lua"]="/usr/lib/moonscript/transform/statement.lua",["master/lib/moonscript/transform/value.lua"]="/usr/lib/moonscript/transform/value.lua",["master/lib/moonscript/transform/class.lua"]="/usr/lib/moonscript/transform/class.lua",["master/bin/moon.lua"]="/usr/bin/moon.lua",["master/lib/moonscript/parse/env.lua"]="/usr/lib/moonscript/parse/env.lua",["master/lib/moonscript/init.lua"]="/usr/lib/moonscript/init.lua",["master/lib/moonscript/compile/statement.lua"]="/usr/lib/moonscript/compile/statement.lua",["master/lib/moonscript/line_tables.lua"]="/usr/lib/moonscript/line_tables.lua",["master/lib/moonscript/compile.lua"]="/usr/lib/moonscript/compile.lua",["master/lib/alt_getopt.lua"]="/usr/lib/alt_getopt.lua",["master/lib/moonscript/transform/transformer.lua"]="/usr/lib/moonscript/transform/transformer.lua",["master/lib/moonscript/parse.lua"]="/usr/lib/moonscript/parse.lua",["master/lib/moonscript/version.lua"]="/usr/lib/moonscript/version.lua",["master/bin/moonc.lua"]="/usr/bin/moonc.lua",["master/lib/moonscript/dump.lua"]="/usr/lib/moonscript/dump.lua",["master/lib/moonscript/errors.lua"]="/usr/lib/moonscript/errors.lua",["master/lib/moonscript/transform/statements.lua"]="/usr/lib/moonscript/transform/statements.lua",["master/lib/moonscript/cmd/lint.lua"]="/usr/lib/moonscript/cmd/lint.lua",["master/lib/moonscript/transform/names.lua"]="/usr/lib/moonscript/transform/names.lua",["master/lib/moonscript/transform/destructure.lua"]="/usr/lib/moonscript/transform/destructure.lua",["master/lib/lpeg.lua"]="/usr/lib/lpeg.lua",["master/lib/moonscript/util.lua"]="/usr/lib/moonscript/util.lua",["master/lib/moonscript/parse/literals.lua"]="/usr/lib/moonscript/parse/literals.lua",["master/lib/moonscript/compile/value.lua"]="/usr/lib/moonscript/compile/value.lua",["master/lib/moonscript/parse/util.lua"]="/usr/lib/moonscript/parse/util.lua",["master/lib/moonscript/transform.lua"]="/usr/lib/moonscript/transform.lua",["master/lib/moonscript/cmd/coverage.lua"]="/usr/lib/moonscript/cmd/coverage.lua",["master/lib/lfs.lua"]="/usr/lib/lfs.lua",["master/lib/moonscript/transform/accumulator.lua"]="/usr/lib/moonscript/transform/accumulator.lua",["master/lib/moonscript/types.lua"]="/usr/lib/moonscript/types.lua",["master/lib/moonscript/cmd/moonc.lua"]="/usr/lib/moonscript/cmd/moonc.lua",["master/lib/moonscript/transform/comprehension.lua"]="/usr/lib/moonscript/transform/comprehension.lua"}},ocnetfs={dependencies={"vcomponent"},repo=15,files={["master/OCNetFS/ocnetfs.lua"]="/usr/bin/ocnetfs.lua"}},unrequire={dependencies={},repo=15,files={["master/unrequire.lua"]="/usr/bin/unrequire.lua"}},libcrc32={version="1.0",dependencies={},repo=7,files={["master/libcrc32/crc32.lua"]="/usr/lib/crc32.lua"}},["python-simpledb"]={dependencies={"python"},repo=26,files={["master/python-SimpleDB/lib/SimpleDB.lua"]="/usr/lib/SimpleDB.lua",["master/python-SimpleDB/libpy/SimpleDB.pyc"]="/usr/lib/python2/SimpleDB.pyc"}},configparser={dependencies={},repo=1,files={["master/configparse/lib/configparse.lua"]="/usr/lib/configparse.lua"}},["oop-system"]={dependencies={},repo=1,files={["master/oop-system/lib/oop-system.lua"]="/usr/lib/oop-system.lua"}},mpt={version="superold",dependencies={},repo=7,files={["master/mpt/config.db"]="/var/lib/mpt/config.db",["master/mpt/mpt.lua"]="/usr/bin/mpt.lua",["master/mpt/mpt.db"]="/var/lib/mpt/mpt.db"}},configlib={dependencies={},repo=19,files={["master/configlib/configlib.lua"]="/usr/lib/configlib.lua"}},dispenser={dependencies={"natable"},repo=17,files={["master/dispenser/dispenser.lua"]="/usr/lib/dispenser.lua"}},natable={dependencies={},repo=17,files={["master/natable/natable.lua"]="/usr/lib/natable.lua"}},autostartutil={dependencies={},repo=17,files={["master/autorun.lua"]="/autorun.lua"}},libvector={dependencies={},repo=29,files={["master/libvector/vector.lua"]="/usr/lib/vector.lua",["master/libvector/README.md"]="/usr/share/doc/libvector/README.md"}},["antheus-dns-library"]={dependencies={},repo=21,files={["master/OpenDNS/dns.lua"]="/usr/lib/dns.lua"}},libnbt={version="1.0",dependencies={},repo=7,files={["master/libnbt/nbt.lua"]="/usr/lib/nbt.lua"}},netflash={dependencies={},repo=23,files={["master/netflash.lua"]="/usr/bin/netflash.lua"}},["mpm.auto_progress"]={dependencies={},repo=30,files={["master/home/lib/mpm/auto_progress.lua"]="/usr/lib/mpm/auto_progress.lua"}},floppypirate={dependencies={},repo=17,files={["master/FloppyPirate/floppypirate.man"]="/usr/man/floppypirate.man",["master/FloppyPirate/floppypirate.lua"]="/usr/bin/floppypirate.lua"}},["gml-plan9k"]={version="1.0.0-21",dependencies={},repo=7,files={["master/gml/lib/default.gss"]="/usr/lib/default.gss",["master/gml/lib/gmlDialogs.lua"]="/usr/lib/gmlDialogs.lua",["master/gml/lib/gfxbuffer.lua"]="/usr/lib/gfxbuffer.lua",["master/gml/lib/gml.lua"]="/usr/lib/gml.lua",["master/gml/lib/canvas.lua"]="/usr/lib/canvas.lua",["master/gml/lib/colorutils.lua"]="/usr/lib/colorutils.lua"}},fancylights={dependencies={},repo=17,files={["master/fancylights/fancylights.lua"]="/usr/bin/fancylights.lua",["master/fancylights/fancylights.man"]="/usr/man/fancylights.man"}},["power-monitor"]={dependencies={"autopid","superlib"},repo=6,files={["master/power-monitor/power-monitor.lua"]="/usr/bin/power-monitor.lua"}},geo2holo={dependencies={},repo=25,files={["master/geo2holo.lua"]="/usr/bin/geo2holo.lua"}},pid={dependencies={"mpm.libarmor","mpm.qui","mpm.values"},repo=30,files={[":master/home/pid/examples"]="/usr/pid/examples/examples",["master/home/bin/gpid.lua"]="/usr/bin/gpid.lua",["master/usr/man/pid.man"]="/usr/man/pid.man",["master/home/bin/pid.lua"]="/usr/bin/pid.lua",["master/home/lib/pid.lua"]="/usr/lib/pid.lua"}},nn={dependencies={},repo=2,files={["master/nn/nn.lua"]="/usr/bin/nn.lua",["master/nn/README.md"]="/usr/share/doc/nn/README.md",["master/man/nn"]="/usr/man/nn",["master/man/nanomachines"]="/usr/man/nanomachines"}},libitem={version="1.0",dependencies={1,2},repo=7,files={["master/libitem/iview.lua"]="/usr/bin/iview.lua",["master/libitem/item.lua"]="/usr/lib/item.lua"}},["plan9k-doc-core"]={version="1.0",dependencies={},repo=3,files={["master/plan9k-doc-core/plan9k.md"]="/usr/share/man/plan9k.md"}},["opg-chat"]={dependencies={"libaevent"},repo=2,files={["master/opg-chat/chat-modules/help.module"]="/usr/lib/chat-modules/help.module",["master/opg-chat/chat-modules/input.module"]="/usr/lib/chat-modules/input.module",["master/opg-chat/chat-modules/user.module"]="/usr/lib/chat-modules/user.module",["master/opg-chat/chat-modules/channels.module"]="/usr/lib/chat-modules/channels.module",["master/opg-chat/chat-modules/admin.module"]="/usr/lib/chat-modules/admin.module",["master/opg-chat/opg-chat.lua"]="/usr/bin/opg-chat.lua",["master/opg-chat/chat-modules/network.module"]="/usr/lib/chat-modules/network.module",["master/opg-chat/chat-modules/hide.module"]="/usr/lib/chat-modules/hide.module",["master/opg-chat/README.md"]="/usr/share/doc/opg-chat/README.md"}},["ooci-tools"]={dependencies={},repo=15,files={["master/ooci/ooci-view.lua"]="/usr/bin/ooci-view.lua",["master/ooci/ooci2ctif.lua"]="/usr/bin/ooci2ctif.lua",["master/ooci/ctif2ooci.lua"]="/usr/bin/ctif2ooci.lua"}},grep={dependencies={"getopt"},repo=18,files={["master/grep/grep.lua"]="/usr/bin/grep.lua",["master/grep/grep.man"]="/usr/man/grep.man"}},["mpm.stack"]={dependencies={},repo=30,files={["master/home/lib/mpm/stack.lua"]="/usr/lib/mpm/stack.lua"}},ubersandbox={dependencies={"configparser","oop-system","deepcopy"},repo=1,files={["master/ubersandbox/bin/sandbox.lua"]="/usr/bin/sandbox.lua",["master/ubersandbox/lib/ubersandbox.lua"]="/usr/lib/ubersandbox.lua",["master/ubersandbox/lib/ubersandbox/require.lua"]="/usr/lib/ubersandbox/require.lua",["master/ubersandbox/lib/ubersandbox/whitelist.lua"]="/usr/lib/ubersandbox/whitelist.lua",["master/ubersandbox/lib/ubersandbox/sandbox.lua"]="/usr/lib/ubersandbox/sandbox.lua"}},libbigint={dependencies={},repo=2,files={["master/libbigint/README.md"]="/usr/share/doc/libbigint/README.md",["master/libbigint/bigint.lua"]="/usr/lib/bigint.lua"}},ocpiano={dependencies={},repo=17,files={["master/OCPiano/piano.man"]="/usr/man/piano.man",["master/OCPiano/piano.lua"]="/usr/bin/piano.lua"}},wsare_srv={dependencies={"snl","dispenser"},repo=17,files={["master/wsare_srv/std.lua"]="/usr/wsare/plugins/std.lua",["master/wsare_srv/wsare_srv.lua"]="/usr/bin/wsare_srv.lua",["master/wsare_srv/wsare_srv.man"]="/usr/man/wsare_srv.man"}},splashes={dependencies={},repo=17,files={["master/splashes/splashes.lua"]="/usr/lib/splashes.lua",["master/splashes/splashes"]="/etc/splashes"}},devfs={dependencies={},repo=30,files={["master/boot/98_devfs.lua"]="/boot/98_devfs.lua",[":master/lib/devfs"]="/usr/lib/devfs/devfs",[":master/lib/drivers"]="/usr/lib/drivers/drivers"}},mpttest={version="0.2",dependencies={},repo=7,files={["master/mpttest/README.md"]="/usr/share/man/mpttest.md",["master/mpttest/mpttest.lua"]="/usr/bin/mpttest.lua"}},thread={dependencies={},repo=16,files={["master/usr/man/thread.getAlarm"]="/usr/man/thread.getAlarm",["master/usr/man/thread"]="/usr/man/thread",["master/usr/man/thread.exit"]="/usr/man/thread.exit",["master/usr/man/thread.spawn"]="/usr/man/thread.spawn",["master/usr/man/thread.demonstration"]="/usr/man/thread.demonstration",["master/usr/man/thread.setFilter"]="/usr/man/thread.setFilter",["master/usr/man/thread.kill"]="/usr/man/thread.kill",["master/usr/man/thread.getFilter"]="/usr/man/thread.getFilter",["master/usr/man/thread.pause"]="/usr/man/thread.pause",["master/lib/thread.lua"]="/usr/lib/thread.lua",["master/usr/man/thread.yield"]="/usr/man/thread.yield",["master/usr/man/thread.getThreads"]="/usr/man/thread.getThreads",["master/usr/man/thread.unpause"]="/usr/man/thread.unpause",["master/usr/man/thread.examples"]="/usr/man/thread.examples",["master/usr/man/thread.getAnswer"]="/usr/man/thread.getAnswer",["master/usr/man/thread.setName"]="/usr/man/thread.setName",["master/usr/man/thread.ask"]="/usr/man/thread.ask",["master/usr/man/thread.getThread"]="/usr/man/thread.getThread",["master/usr/man/thread.manager"]="/usr/man/thread.manager",["master/usr/man/thread.dig"]="/usr/man/thread.dig",["master/usr/man/thread.setAlarm"]="/usr/man/thread.setAlarm",["master/usr/man/thread.whisper"]="/usr/man/thread.whisper",["master/usr/man/thread.setAnswer"]="/usr/man/thread.setAnswer",["master/usr/man/thread.getName"]="/usr/man/thread.getName",["master/usr/man/thread.properties"]="/usr/man/thread.properties"}},oppm={dependencies={},repo=33,files={["master/op-manager/etc/oppm.cfg"]="/etc/oppm.cfg",["master/op-manager/oppm.lua"]="/usr/bin/oppm.lua"}},["selene-openos"]={version="0.1.0.2",dependencies={"selene"},repo=12,files={["master/selene/wrappers/OpenOS/bin/selenec.lua"]="/usr/bin/selenec.lua",["master/selene/wrappers/OpenOS/boot/44_selene.lua"]="/boot/44_selene.lua",["master/selene/etc/selene.cfg"]="/etc/selene.cfg",["master/selene/wrappers/OpenOS/bin/selene.lua"]="/usr/bin/selene.lua"}},["gml-examples"]={dependencies={"gml"},repo=9,files={["master/gml/bin/gmltest.lua"]="/usr/bin/gmltest.lua",["master/gml/bin/savedlg.lua"]="/usr/bin/savedlg.lua"}},redfs={dependencies={},repo=24,files={["redfs/mount.redfs.lua"]="/usr/bin/mount.redfs.lua",["redfs/redfs.lua"]="/usr/lib/redfs.lua"}},ipack={dependencies={},repo=15,files={["master/immibis-compress/ipack.lua"]="/usr/lib/ipack.lua"}},libformat={dependencies={},repo=15,files={["master/enhanced/format.lua"]="/usr/lib/format.lua"}},["payo-tests"]={dependencies={"popm","payo-bash"},repo=13,files={[":master/payo-tests/var/payo-tests"]="/var/payo-tests/payo-tests"}},alongtimeago={dependencies={"superlib"},repo=6,files={["master/random/alongtimeago/1.txt"]="/usr/movies/1.txt",["master/random/alongtimeago/alongtimeago.lua"]="/usr/bin/alongtimeago.lua"}},superlib={dependencies={},repo=6,files={["master/superlib/superlib_tests.lua"]="/usr/bin/superlib_tests.lua",["master/superlib/superlib.lua"]="/usr/lib/superlib.lua"}},["mpm.tar"]={dependencies={"mpm.auto_progress"},repo=30,files={["master/home/bin/tar.lua"]="/usr/bin/tar.lua",["master/usr/man/tar.man"]="/usr/man/tar.man"}},gist={dependencies={},repo=2,files={["master/gist/README.md"]="/usr/share/doc/gist/README.md",["master/man/gist"]="/usr/man/gist",["master/gist/gist.lua"]="/usr/bin/gist.lua"}},["antheus-dns-server"]={dependencies={"antheus-lib"},repo=21,files={["master/OpenDNS/dns-server.lua"]="/home/dns-server.lua"}},nstest={dependencies={"noteal"},repo=17,files={["master/nstest/example.nal"]="/usr/examples/nstest/example.nal",["master/nstest/nstest.lua"]="/usr/bin/nstest.lua"}},libhttp={dependencies={"libtls"},repo=2,files={["master/libhttp/http.lua"]="/usr/lib/http.lua",["master/libhttp/README.md"]="/usr/share/doc/libhttp/README.md"}},asiebin={dependencies={},repo=33,files={["master/asiebin/asiebin.lua"]="/usr/bin/asiebin.lua"}},mc={dependencies={},repo=29,files={["master/mc/mc.lua"]="/usr/bin/mc.lua",["master/mc/README.md"]="/usr/share/doc/mc/README.md"}},p6={version="ulesesslyoldaplhapocofplan9k",dependencies={},repo=7,files={["master/p6/mod_init.lua"]="/lib/modules/init.lua",["master/p6/p6.lua"]="/boot/kernel/p6/p6.lua"}},["bigreactors-capbank"]={dependencies={},repo=33,files={["master/reactor/capbank/bigreactors-control.lua"]="/usr/bin/bigreactors-control.lua"}},sl={dependencies={},repo=8,files={["master/sl.lua"]="/usr/bin/sl.lua"}},["plan9k-docs"]={version="1.0",dependencies={"plan9k-doc-core","plan9k-man"},repo=3,files={}},getopt={dependencies={},repo=18,files={["master/getopt/getopt.lua"]="/usr/lib/getopt.lua"}},authors={dependencies={},repo=29,files={}},automount={dependencies={},repo=17,files={["master/AutoMount/automount.lua"]="/usr/bin/automount.lua"}},librt={dependencies={},repo=25,files={["master/raytracer.lua"]="/usr/lib/raytracer.lua"}},gitrepo={dependencies={},repo=9,files={["master/gitrepo.lua"]="/usr/bin/gitrepo.lua"}},ytdl={dependencies={},repo=5,files={["master/ytdl/ytdl.lua"]="/usr/bin/ytdl.lua"}},nav={dependencies={},repo=16,files={["master/usr/man/nav.getMap"]="/usr/man/nav.getMap",["master/usr/man/nav.stepDown"]="/usr/man/nav.stepDown",["master/usr/man/nav"]="/usr/man/nav",["master/usr/man/nav.getPos"]="/usr/man/nav.getPos",["master/usr/man/nav.stepUp"]="/usr/man/nav.stepUp",["master/usr/man/nav.new"]="/usr/man/nav.new",["master/usr/man/nav.step"]="/usr/man/nav.step",["master/lib/nav.lua"]="/usr/lib/nav.lua",["master/usr/man/nav.drawMap"]="/usr/man/nav.drawMap",["master/usr/man/nav.goNextTo"]="/usr/man/nav.goNextTo",["master/usr/man/nav.turnAround"]="/usr/man/nav.turnAround",["master/usr/man/nav.turnLeft"]="/usr/man/nav.turnLeft",["master/usr/man/nav.turnTo"]="/usr/man/nav.turnTo",["master/usr/man/nav.turnRight"]="/usr/man/nav.turnRight",["master/usr/man/nav.setPos"]="/usr/man/nav.setPos",["master/usr/man/nav.putMap"]="/usr/man/nav.putMap",["master/usr/man/nav.go"]="/usr/man/nav.go"}},tdit={dependencies={},repo=8,files={["master/tdit.lua"]="/usr/bin/tdit.lua"}},libmusicfs={dependencies={},repo=23,files={["master/musicfs/libmusicfs.lua"]="/usr/lib/libmusicfs.lua"}},["payo-bash"]={dependencies={"payo-lib"},repo=13,files={["master/payo-bash/etc/profile"]="/etc/profile",[":master/payo-bash/usr/bin/payo-bash"]="/usr/bin/payo-bash/payo-bash",["master/payo-bash/usr/bin/load-payo-bash.lua"]="/usr/bin/load-payo-bash.lua",["master/payo-bash/etc/rc.d/payo-bash.lua"]="/etc/rc.d/payo-bash.lua"}},deepcopy={dependencies={},repo=1,files={["master/deepcopy/lib/deepcopy.lua"]="/usr/lib/deepcopy.lua"}},libvec={dependencies={},repo=23,files={["master/libvec.lua"]="/usr/lib/libvec.lua"}},prom={dependencies={},repo=23,files={["master/prom.lua"]="/usr/bin/prom.lua"}},supercrypt={dependencies={},repo=6,files={["master/supercrypt/tests/testaes.lua"]="/usr/bin/testaes.lua",["master/supercrypt/lib/sc_aes.lua"]="/usr/lib/sc_aes.lua",["master/supercrypt/lib/aes.lua"]="/usr/lib/aes.lua",["master/supercrypt/tests/testciphers.lua"]="/usr/bin/testciphers.lua",["master/supercrypt/lib/sc_gf.lua"]="/usr/lib/sc_gf.lua",["master/supercrypt/tests/fileencrypt.lua"]="/usr/bin/fileencrypt.lua",["master/supercrypt/lib/sc_ciphermode.lua"]="/usr/lib/sc_ciphermode.lua",["master/supercrypt/tests/filedecrypt.lua"]="/usr/bin/filedecrypt.lua",["master/supercrypt/tests/aesspeed.lua"]="/usr/bin/aesspeed.lua",["master/supercrypt/lib/sc_util.lua"]="/usr/lib/sc_util.lua",["master/supercrypt/lib/sc_buffer.lua"]="/usr/lib/sc_buffer.lua",["master/supercrypt/lib/sha256.lua"]="/usr/lib/sha256.lua"}},libqr={dependencies={},repo=29,files={["master/libqr/qr.lua"]="/usr/lib/qr.lua",["master/libqr/README.md"]="/usr/share/doc/libqr/README.md"}},libgps={dependencies={"libvec"},repo=23,files={["master/gps/libgps.lua"]="/usr/lib/libgps.lua"}},ilib={dependencies={},repo=34,files={["master/ilib/lib/serialize.lua"]="/usr/lib/ilib/serialize.lua",["master/ilib/lib/eventHandler.lua"]="/usr/lib/ilib/eventHandler.lua",["master/ilib/lib/difference.lua"]="/usr/lib/ilib/difference.lua",["master/ilib/lib/screen.lua"]="/usr/lib/ilib/screen.lua"}},geomine={dependencies={},repo=29,files={["master/geomine/geomine.lua"]="/usr/bin/geomine.lua",["master/geomine/README.md"]="/usr/share/doc/geomine/README.md"}},["libsemver-src"]={dependencies={},repo=2,files={["master/libsemver/semver.moon"]="/usr/src/semver.moon"}},["game-of-life"]={dependencies={},repo=2,files={["master/game-of-life/game-of-life.lua"]="/usr/bin/game-of-life.lua",["master/game-of-life/README.md"]="/usr/share/doc/game-of-life/README.md"}},tapeutils={dependencies={},repo=15,files={["master/tapeutils/formattape.lua"]="/usr/bin/formattape.lua",["master/tapeutils/loadtape.lua"]="/usr/bin/loadtape.lua",["master/tapeutils/dumptape.lua"]="/usr/bin/dumptape.lua",["master/tapeutils/setspeed.lua"]="/usr/bin/setspeed.lua"}},["payo-lib"]={dependencies={},repo=13,files={[":master/payo-lib/usr/lib/payo-lib"]="/usr/lib/payo-lib/payo-lib"}},print3d={dependencies={},repo=25,files={["master/print3d.lua"]="/usr/bin/print3d.lua"}},libthread={dependencies={},repo=29,files={["master/libthread/thread.lua"]="/usr/lib/thread.lua",["master/libthread/README.md"]="/usr/share/doc/libthread/README.md"}},vcomponent={dependencies={},repo=15,files={["master/vcomponent/vcomponent.lua"]="/usr/lib/vcomponent.lua",["master/vcomponent/vcmanage.lua"]="/usr/bin/vcmanage.lua"}},["python-gml"]={dependencies={"GML","python"},repo=26,files={["master/python-gml/libpy/gml.pyc"]="/usr/lib/python2/gml.pyc",["master/python-gml/lib/gmlReactor.lua"]="/usr/lib/gmlReactor.lua"}},libforms={dependencies={},repo=29,files={["master/libforms/README.md"]="/usr/share/doc/libforms/README.md",["master/libforms/forms.lua"]="/usr/lib/forms.lua"}},osmagdoor={dependencies={"superlib"},repo=6,files={["master/osmagdoor/osdoor.lua"]="/usr/bin/osdoor.lua",["master/osmagdoor/osmag.lua"]="/usr/lib/osmag.lua",["master/osmagdoor/osd.lua"]="/usr/bin/osd.lua"}},energyd={dependencies={"getopt"},repo=18,files={["master/energyd/energyd.lua"]="/usr/bin/energyd.lua",["master/energyd/energyd.conf"]="/usr/etc/energyd.conf"}},camera={dependencies={},repo=29,files={["master/camera/camera.lua"]="/usr/bin/camera.lua",["master/camera/README.md"]="/usr/share/doc/camera/README.md"}},ivator={dependencies={"ilib"},repo=34,files={["master/ivator/man/ivator"]="/usr/man/ivator",["master/ivator/ivator.lua"]="/usr/bin/ivator.lua",["master/ivator/lib/zone.lua"]="/usr/lib/ivator/zone.lua",["master/ivator/etc/ivator.cfg"]="/usr/etc/ivator.cfg",["master/ivator/lib/box.lua"]="/usr/lib/ivator/box.lua"}},["lua-lockbox"]={dependencies={},repo=2,files={["master/lua-lockbox/lockbox/digest/ripemd128.lua"]="/usr/lib/lockbox/digest/ripemd128.lua",["master/lua-lockbox/lockbox/cipher/mode/ecb.lua"]="/usr/lib/lockbox/cipher/mode/ecb.lua",["master/lua-lockbox/lockbox/padding/ansix923.lua"]="/usr/lib/lockbox/padding/ansix923.lua",["master/lua-lockbox/lockbox/cipher/xtea.lua"]="/usr/lib/lockbox/cipher/xtea.lua",["master/lua-lockbox/lockbox/cipher/mode/cbc.lua"]="/usr/lib/lockbox/cipher/mode/cbc.lua",["master/lua-lockbox/lockbox/digest/sha2_256.lua"]="/usr/lib/lockbox/digest/sha2_256.lua",["master/lua-lockbox/lockbox/digest/sha1.lua"]="/usr/lib/lockbox/digest/sha1.lua",["master/lua-lockbox/lockbox/cipher/mode/ige.lua"]="/usr/lib/lockbox/cipher/mode/ige.lua",["master/lua-lockbox/lockbox/digest/md4.lua"]="/usr/lib/lockbox/digest/md4.lua",["master/lua-lockbox/lockbox/init.lua"]="/usr/lib/lockbox/init.lua",["master/lua-lockbox/lockbox/cipher/mode/ofb.lua"]="/usr/lib/lockbox/cipher/mode/ofb.lua",["master/lua-lockbox/lockbox/digest/sha2_224.lua"]="/usr/lib/lockbox/digest/sha2_224.lua",["master/lua-lockbox/lockbox/cipher/tea.lua"]="/usr/lib/lockbox/cipher/tea.lua",["master/lua-lockbox/README.md"]="/usr/share/doc/lua-lockbox/README.md",["master/lua-lockbox/lockbox/digest/ripemd160.lua"]="/usr/lib/lockbox/digest/ripemd160.lua",["master/lua-lockbox/lockbox/util/stream.lua"]="/usr/lib/lockbox/util/stream.lua",["master/lua-lockbox/lockbox/mac/hmac.lua"]="/usr/lib/lockbox/mac/hmac.lua",["master/lua-lockbox/lockbox/util/bit.lua"]="/usr/lib/lockbox/util/bit.lua",["master/lua-lockbox/lockbox/cipher/mode/cfb.lua"]="/usr/lib/lockbox/cipher/mode/cfb.lua",["master/lua-lockbox/lockbox/cipher/mode/ctr.lua"]="/usr/lib/lockbox/cipher/mode/ctr.lua",["master/lua-lockbox/lockbox/util/queue.lua"]="/usr/lib/lockbox/util/queue.lua",["master/lua-lockbox/lockbox/util/base64.lua"]="/usr/lib/lockbox/util/base64.lua",["master/lua-lockbox/lockbox/padding/zero.lua"]="/usr/lib/lockbox/padding/zero.lua",["master/lua-lockbox/lockbox/util/array.lua"]="/usr/lib/lockbox/util/array.lua",["master/lua-lockbox/lockbox/digest/md2.lua"]="/usr/lib/lockbox/digest/md2.lua",["master/lua-lockbox/lockbox/cipher/aes192.lua"]="/usr/lib/lockbox/cipher/aes192.lua",["master/lua-lockbox/lockbox/digest/md5.lua"]="/usr/lib/lockbox/digest/md5.lua",["master/lua-lockbox/lockbox/cipher/aes128.lua"]="/usr/lib/lockbox/cipher/aes128.lua",["master/lua-lockbox/lockbox/padding/isoiec7816.lua"]="/usr/lib/lockbox/padding/isoiec7816.lua",["master/lua-lockbox/lockbox/kdf/pbkdf2.lua"]="/usr/lib/lockbox/kdf/pbkdf2.lua",["master/lua-lockbox/lockbox/padding/pkcs7.lua"]="/usr/lib/lockbox/padding/pkcs7.lua",["master/lua-lockbox/lockbox/cipher/mode/pcbc.lua"]="/usr/lib/lockbox/cipher/mode/pcbc.lua",["master/lua-lockbox/lockbox/cipher/des3.lua"]="/usr/lib/lockbox/cipher/des3.lua",["master/lua-lockbox/lockbox/cipher/des.lua"]="/usr/lib/lockbox/cipher/des.lua",["master/lua-lockbox/lockbox/cipher/aes256.lua"]="/usr/lib/lockbox/cipher/aes256.lua"}},drama={dependencies={},repo=33,files={["master/drama/drama.lua"]="/usr/bin/drama.lua"}},song={dependencies={},repo=33,files={["master/song/song.lua"]="/usr/lib/song.lua"}},["drone-control"]={dependencies={},repo=33,files={["master/dronecontrol/share/bios/drone-control.lua"]="/usr/share/bios/drone-control.lua",["master/dronecontrol/bin/drone-control.lua"]="/usr/bin/drone-control.lua",["master/dronecontrol/etc/drone-control.cfg"]="/etc/drone-control.cfg"}},multiboot={version="0.1",dependencies={},repo=7,files={["master/multiboot/init.lua"]="/init.lua",["master/multiboot/openos.lua"]="/boot/kernel/OpenOS/openos.lua"}},holocol={dependencies={},repo=33,files={["master/holocol/holocol.lua"]="/usr/bin/holocol.lua"}},nettools={version="reallyold",dependencies={1},repo=7,files={["master/nettools/nc.lua"]="/usr/bin/nc.lua"}},["song-examples"]={dependencies={"song"},repo=33,files={["master/song/song-example1.lua"]="/usr/bin/song-example1.lua",["master/song/song-example2.lua"]="/usr/bin/song-example2.lua"}},sminesweeperone={dependencies={},repo=6,files={["master/games/ms1/minesweeper.lua"]="/usr/bin/minesweeper.lua"}},print={dependencies={},repo=32,files={["master/print.lua"]="/usr/bin/print.lua"}},["mpm.values"]={dependencies={},repo=30,files={["master/home/lib/mpm/values.lua"]="/usr/lib/mpm/values.lua"}},psh={dependencies={},repo=13,files={["master/psh/usr/lib/psh/client.lua"]="/usr/lib/psh/client.lua",["master/psh/usr/lib/psh/init.lua"]="/usr/lib/psh/init.lua",["master/psh/usr/bin/psh.lua"]="/usr/bin/psh.lua",["master/psh/usr/lib/psh/daemon.lua"]="/usr/lib/psh/daemon.lua",["master/psh/etc/psh/psh.cfg"]="/etc/psh/psh.cfg",["master/psh/usr/bin/pcp.lua"]="/usr/bin/pcp.lua",["master/psh/etc/rc.d/pshd.lua"]="/etc/rc.d/pshd.lua",["master/psh/usr/lib/psh/host.lua"]="/usr/lib/psh/host.lua"}},["mpm.textgfx"]={dependencies={},repo=30,files={["master/home/lib/mpm/textgfx.lua"]="/usr/lib/mpm/textgfx.lua"}},purgelib={dependencies={},repo=30,files={["master/home/bin/purgelib.lua"]="/usr/bin/purgelib.lua",["master/usr/man/purgelib.man"]="/usr/man/purgelib.man"}},["mpm.qui"]={dependencies={"mpm.stack","mpm.textgfx","mpm.values"},repo=30,files={["master/home/lib/mpm/qui.lua"]="/usr/lib/mpm/qui.lua",["master/home/lib/mpm/qevent.lua"]="/usr/lib/mpm/qevent.lua",["master/home/lib/mpm/qselect.lua"]="/usr/lib/mpm/qselect.lua",["master/home/lib/mpm/quidgets.lua"]="/usr/lib/mpm/quidgets.lua"}},["mpm.libarmor"]={dependencies={},repo=30,files={["master/home/lib/mpm/libarmor.lua"]="/usr/lib/mpm/libarmor.lua"}},["print3d-examples"]={dependencies={"print3d"},repo=25,files={[":master/models/"]="/usr/share/models/models"}},["vortex-compiler"]={dependencies={"vortex-runtime"},repo=1,files={["master/vortex-compiler/lib/vortex/util.lua"]="/usr/lib/vortex/util.lua",["master/vortex-compiler/lib/vortex/lexer.lua"]="/usr/lib/vortex/lexer.lua",["master/vortex-compiler/bin/vortex.lua"]="/usr/bin/vortex.lua",["master/vortex-compiler/lib/vortex/parser.lua"]="/usr/lib/vortex/parser.lua"}},description={dependencies={},repo=29,files={}},wsare={dependencies={"snl","dispenser"},repo=17,files={["master/wsare/wsare.lua"]="/usr/bin/wsare.lua",["master/wsare/wsare.man"]="/usr/man/wsare.man"}},["drone-sort"]={dependencies={},repo=25,files={["master/drone-sort.lua"]="/usr/share/bios/drone-sort.lua"}},name={dependencies={},repo=29,files={}},geoglasses={dependencies={},repo=29,files={["master/geoglasses/geoglasses.lua"]="/usr/bin/geoglasses.lua",["master/geoglasses/README.md"]="/usr/share/doc/geoglasses/README.md"}},repo={dependencies={},repo=29,files={}},["antheus-lib"]={dependencies={},repo=21,files={["master/AntheusLib/antheus.lua"]="/usr/lib/antheus.lua"}},derp={dependencies={},repo=25,files={["master/idontexist.lua"]="/usr/bin/idontexist.lua"}},fstools={dependencies={},repo=15,files={["master/filesystems/fslib.lua"]="/usr/lib/fslib.lua",["master/filesystems/mountfs.lua"]="/usr/bin/mountfs.lua"}},v={dependencies={"v-script","oop-system"},repo=22,files={["master/v/share/v/vs/main.vs"]="/usr/share/v/vs/main.vs",["master/v/lib/v/buffer.lua"]="/usr/lib/v/buffer.lua",["master/v/lib/v/keymap.lua"]="/usr/lib/v/keymap.lua",["master/v/bin/v.lua"]="/usr/bin/v.lua"}},["holo-demos"]={dependencies={"libnoise"},repo=25,files={["master/holo-flow.lua"]="/usr/bin/holo-flow.lua",["master/holo-count.lua"]="/usr/bin/holo-count.lua",["master/holo-text.lua"]="/usr/bin/holo-text.lua"}},tar={dependencies={"libformat"},repo=15,files={["master/tar/tar.lua"]="/usr/bin/tar.lua"}},snl={dependencies={"dispenser"},repo=17,files={["master/snl/snl_srv.lua"]="/usr/lib/snl_srv.lua",["master/snl/snl_clt.lua"]="/usr/lib/snl_clt.lua"}},gol={dependencies={},repo=25,files={["master/gol-tiny.lua"]="/usr/bin/gol-tiny.lua",["master/gol.lua"]="/usr/bin/gol.lua"}},strict={dependencies={},repo=28,files={["master/strict/strict.lua"]="/usr/lib/strict.lua"}},socfs={dependencies={"fstools","vcomponent"},repo=15,files={["master/filesystems/mksocfs.lua"]="/usr/bin/mksocfs.lua",["master/filesystems/socfs.lua"]="/usr/lib/socfs.lua"}},tapefs={dependencies={"vcomponent"},repo=15,files={["master/filesystems/tapefsd.lua"]="/usr/bin/tapefsd.lua",["master/filesystems/tapefs.lua"]="/usr/lib/tapefs.lua"}},telnet={dependencies={},repo=32,files={["master/telnet.lua"]="/usr/bin/telnet.lua"}},libsemver={dependencies={},repo=2,files={["master/libsemver/semver.lua"]="/usr/lib/semver.lua",["master/libsemver/README.md"]="/usr/share/doc/libsemver/README.md"}},python={dependencies={},repo=26,files={["master/python/lib/IEEE754.lua"]="/usr/lib/python/IEEE754.lua",["master/python/lib/python.lua"]="/usr/lib/python/python.lua",["master/python/lib/primitives.lua"]="/usr/lib/python/primitives.lua",["master/python/libpy/StringIO.pyc"]="/usr/lib/python2/StringIO.pyc",["master/python/lib/stack.lua"]="/usr/lib/python/stack.lua",["master/python/lib/builtins.lua"]="/usr/lib/python/builtins.lua",["master/python/bin/python.lua"]="/usr/bin/python.lua",["master/python/python.man"]="/usr/man/python/python.man"}},libnoise={dependencies={},repo=25,files={["master/noise.lua"]="/usr/lib/noise.lua"}},logger={dependencies={},repo=4,files={["master/logger/boot/04_logger.lua"]="/boot/04_logger.lua"}},libaevent={dependencies={},repo=2,files={["master/libaevent/README.md"]="/usr/share/doc/libaevent/README.md",["master/libaevent/aevent.lua"]="/usr/lib/aevent.lua"}},["vortex-runtime"]={dependencies={},repo=1,files={["master/vortex-runtime/lib/vortex/rt/core.lua"]="/usr/lib/vortex/rt/core.lua",["master/vortex-runtime/lib/vortex/rt/mod.lua"]="/usr/lib/vortex/rt/mod.lua",["master/vortex-runtime/lib/vortex/rt/defenv.lua"]="/usr/lib/vortex/rt/defenv.lua",["master/vortex-runtime/lib/vortex/rt/parser.lua"]="/usr/lib/vortex/rt/parser.lua",["master/vortex-runtime/lib/vortex/rt/list.lua"]="/usr/lib/vortex/rt/list.lua",["master/vortex-runtime/lib/vxrt/init.lua"]="/usr/lib/vxrt/init.lua",["master/vortex-runtime/lib/vortex/rt/object.lua"]="/usr/lib/vortex/rt/object.lua",["master/vortex-runtime/lib/vortex/rt/env.lua"]="/usr/lib/vortex/rt/env.lua",["master/vortex-runtime/lib/vortex/rt/seq.lua"]="/usr/lib/vortex/rt/seq.lua",["master/vortex-runtime/lib/rt_init.lua"]="/usr/lib/rt_init.lua",["master/vortex-runtime/lib/vortex/rt/init.lua"]="/usr/lib/vortex/rt/init.lua",["master/vortex-runtime/lib/vortex/rt.lua"]="/usr/lib/vortex/rt.lua",["master/vortex-runtime/lib/vortex/rt/table.lua"]="/usr/lib/vortex/rt/table.lua",["master/vortex-runtime/lib/vxrt/strict.lua"]="/usr/lib/vxrt/strict.lua"}},["print3d-view"]={dependencies={"librt"},repo=25,files={["master/print3d-view.lua"]="/usr/bin/print3d-view.lua"}},obj={dependencies={},repo=29,files={["master/obj/obj.lua"]="/usr/lib/obj.lua",["master/obj/README.md"]="/usr/share/doc/obj/README.md"}},smap={dependencies={},repo=2,files={["master/smap/smap/output/beep.output.lua"]="/usr/lib/smap/output/beep.output.lua",["master/smap/smap/input/nbs.input.lua"]="/usr/lib/smap/input/nbs.input.lua",["master/smap/smap/output/inb.output.lua"]="/usr/lib/smap/output/inb.output.lua",["master/smap/smap/audio/init.lua"]="/usr/lib/smap/audio/init.lua",["master/smap/smap/init.lua"]="/usr/lib/smap/init.lua",["master/smap/smap/output/pcspkr.output.lua"]="/usr/lib/smap/output/pcspkr.output.lua",["master/smap/README.md"]="/usr/share/doc/smap/README.md",["master/smap/smap.lua"]="/usr/bin/smap.lua",["master/smap/smap/output/sound.output.lua"]="/usr/lib/smap/output/sound.output.lua",["master/smap/smap/input/midi.input.lua"]="/usr/lib/smap/input/midi.input.lua"}},midi={dependencies={},repo=25,files={["master/midi.lua"]="/usr/bin/midi.lua"}},libtls={dependencies={"lua-lockbox","libbigint","libder-decoder"},repo=2,files={["master/libtls/README.md"]="/usr/share/doc/libtls/README.md",["master/libtls/tls.lua"]="/usr/lib/tls.lua"}},["libder-decoder"]={dependencies={"libbigint"},repo=2,files={["master/libder-decoder/der-decoder.lua"]="/usr/lib/der-decoder.lua",["master/libder-decoder/README.md"]="/usr/share/doc/libder-decoder/README.md"}},["v-script"]={dependencies={"oop-system"},repo=22,files={["master/v-script/lib/v-script/stdlib.lua"]="/usr/lib/v-script/stdlib.lua",["master/v-script/lib/v-script/values/symbol.lua"]="/usr/lib/v-script/values/symbol.lua",["master/v-script/lib/v-script/namespace.lua"]="/usr/lib/v-script/namespace.lua",["master/v-script/lib/v-script/args.lua"]="/usr/lib/v-script/args.lua",["master/v-script/lib/v-script/environment.lua"]="/usr/lib/v-script/environment.lua",["master/v-script/lib/v-script/lexer.lua"]="/usr/lib/v-script/lexer.lua",["master/v-script/lib/v-script/s-exp.lua"]="/usr/lib/v-script/s-exp.lua",["master/v-script/lib/v-script.lua"]="/usr/lib/v-script.lua",["master/v-script/lib/v-script/values/nil.lua"]="/usr/lib/v-script/values/nil.lua",["master/v-script/lib/v-script/values/lua.lua"]="/usr/lib/v-script/values/lua.lua",["master/v-script/lib/v-script/parser.lua"]="/usr/lib/v-script/parser.lua",["master/v-script/lib/v-script/values/number.lua"]="/usr/lib/v-script/values/number.lua",["master/v-script/lib/v-script/values/string.lua"]="/usr/lib/v-script/values/string.lua",["master/v-script/lib/v-script/scope.lua"]="/usr/lib/v-script/scope.lua",["master/v-script/lib/v-script/values/boolean.lua"]="/usr/lib/v-script/values/boolean.lua",["master/v-script/lib/v-script/values.lua"]="/usr/lib/v-script/values.lua",["master/v-script/lib/v-script/utils.lua"]="/usr/lib/v-script/utils.lua",["master/v-script/lib/v-script/token.lua"]="/usr/lib/v-script/token.lua"}},popm={dependencies={"payo-lib"},repo=13,files={["master/popm/usr/bin/popm.lua"]="/usr/bin/popm.lua",["master/popm/usr/lib/popm-lib/popm.lua"]="/usr/lib/popm-lib/popm.lua"}},lisp={dependencies={},repo=25,files={["master/lisp.lua"]="/usr/bin/lisp.lua"}},selene={version="0.1.0.2",dependencies={},repo=12,files={["master/selene/lib/selene/parser.lua"]="/usr/lib/selene/parser.lua",["master/selene/lib/selene/init.lua"]="/usr/lib/selene/init.lua"}},network={version="reallyold",dependencies={},repo=7,files={["master/network/network"]="/usr/man/network",["master/network/loopback.lua"]="/lib/network/loopback.lua",["master/network/ifconfig.lua"]="/usr/bin/ifconfig.lua",["master/network/tunnel.lua"]="/lib/network/tunnel.lua",["master/network/network.lua"]="/lib/network.lua",["master/network/80_p6network.lua"]="/boot/80_p6network.lua",["master/network/modem.lua"]="/lib/network/modem.lua",["master/network/ping.lua"]="/usr/bin/ping.lua"}},autopid={dependencies={"pid","superlib"},repo=6,files={["master/autopid/boot/99_autopid.lua"]="/boot/99_autopid.lua",["master/autopid/apids/reactor.apid"]="/usr/autopid/reactor.apid",["master/autopid/apids/turbine.apid"]="/usr/autopid/turbine.apid",["master/autopid/lib/autopidlib.lua"]="/usr/lib/autopidlib.lua",["master/autopid/man/autopid.man"]="/usr/man/autopid.man",["master/autopid/bin/auto.lua"]="/usr/bin/auto.lua",["master/autopid/bin/autopid.lua"]="/usr/bin/autopid.lua"}},dummy={dependencies={},repo=21,files={["master/dummy/dummy.lua"]="/usr/dummy/dummy.lua"}},noteal={dependencies={"autostartutil"},repo=17,files={["master/NoteAL/noteal.lua"]="/usr/lib/noteal/noteal.lua",["master/NoteAL/noteinit.lua"]="/init/noteinit.lua",["master/NoteAL/confutil.lua"]="/usr/lib/noteal/confutil.lua",["master/NoteAL/read.me"]="/usr/lib/noteal/read.me",["master/NoteAL/noteconf.lua"]="/usr/lib/noteal/noteconf.lua",["master/NoteAL/notestream.lua"]="/usr/lib/noteal/notestream.lua"}},debug={dependencies={},repo=15,files={["master/debug.lua"]="/usr/bin/debug.lua"}},["selene-plan9k"]={version="0.1.0.2",dependencies={"selene"},repo=12,files={["master/selene/etc/selene.cfg"]="/etc/selene.cfg",["master/selene/wrappers/Plan9k/lib/modules/base/17_selene.lua"]="/lib/modules/base/17_selene.lua"}},["immibis-compress"]={dependencies={"ipack"},repo=15,files={["master/immibis-compress/compress.lua"]="/usr/bin/compress.lua",["master/immibis-compress/decompress.lua"]="/usr/bin/decompress.lua"}},["lava-runner"]={dependencies={},repo=29,files={["master/lava-runner/lava-runner.lua"]="/usr/bin/lava-runner.lua",["master/lava-runner/README.md"]="/usr/share/doc/lava-runner/README.md"}}}},installed={mpt={data={dependencies={},name="mpt",repo="mpt",checksum="6113f874dfc7baa106e6884606b03060",files={"/usr/bin/mpt.lua"}},frontend="MPT",deps={}},["plan9k-drivers"]={data={dependencies={},name="plan9k-drivers",repo="plan9k",checksum="-fb640833fcfba3442555ebbbe66762b",files={"/lib/modules/base/17_eeprom.lua","/lib/modules/base/17_drive.lua","/lib/modules/base/16_partition.lua","/lib/modules/base/17_nfc.lua","/lib/modules/base/17_tape.lua","/lib/modules/base/17_data.lua","/lib/modules/base/17_gpt.lua","/lib/modules/base/17_chatbox.lua","/lib/modules/base/12_mount.lua"}},frontend="MPT",deps={}},["plan9k-edit"]={data={dependencies={},name="plan9k-edit",repo="plan9k",checksum="4a26acd9f650ce6269bac2d25c3a8946",files={"/bin/edit.lua"}},frontend="MPT",deps={}},["plan9k-containers"]={data={dependencies={},name="plan9k-containers",repo="plan9k",checksum="-5ff36b0bde938782f3821bca52931c06",files={"/bin/sandbox.lua"}},frontend="MPT",deps={}},plan9k={data={dependencies={"plan9k-core","plan9k-network","plan9k-drivers","plan9k-edit","plan9k-data"},name="plan9k",repo="plan9k",checksum="83a507dd74c6b0cf2bfb3d599c578cd",files={"/.prop"}},frontend="MPT",deps={"plan9k-core","plan9k-network","plan9k-drivers","plan9k-edit","plan9k-data"}},["plan9k-data"]={data={dependencies={},name="plan9k-data",repo="plan9k",checksum="480a898a741b2bf424f9e0e86e5072ba",files={"/usr/lib/data.lua","/usr/bin/inflate.lua","/usr/bin/sha256sum.lua","/usr/bin/deflate.lua","/usr/bin/base64.lua","/usr/bin/gpg.lua","/usr/bin/md5sum.lua"}},frontend="MPT",deps={}},["plan9k-ssh"]={data={dependencies={},name="plan9k-ssh",repo="plan9k",checksum="-2fc28a9bdd608182c931a126ca8150d",files={"/bin/sshd.lua","/usr/sbin/sshsession.lua","/usr/bin/ssh.lua","/etc/rc.d/sshd.lua"}},frontend="MPT",deps={}},["openloader-init"]={data={dependencies={},name="openloader-init",repo="disks",checksum="-45e6d7b1e41468c1d335952ee3b89e13",files={"/init.lua"}},frontend="MPT",deps={}},["plan9k-fsutil"]={data={dependencies={"plan9k-corelibs"},name="plan9k-fsutil",repo="plan9k",checksum="-1222b1c98bb3bede8ea8be775ea95f2d",files={"/bin/tee.lua","/bin/mv.lua","/bin/ln.lua","/bin/cp.lua","/bin/df.lua","/bin/mkdir.lua","/bin/dd.lua","/bin/mount.lua","/bin/du.lua","/bin/more.lua","/bin/cat.lua","/bin/rm.lua","/bin/touch.lua","/bin/find.lua","/bin/mount.cow.lua","/bin/pwd.lua","/bin/ls.lua"}},frontend="MPT",deps={"plan9k-corelibs"}},["plan9k-installer"]={data={dependencies={"plan9k","mpt","plan9k-extra"},name="plan9k-installer",repo="plan9k",checksum="-31228542b8cc1190aa9d8be7ea4ff56c",files={"/bin/install.lua"}},frontend="MPT",deps={"plan9k","mpt","plan9k-extra"}},["plan9k-coreutil"]={data={dependencies={"plan9k-corelibs","plan9k-fsutil"},name="plan9k-coreutil",repo="plan9k",checksum="73511370e5cc25ed49c1763f418d3514",files={"/bin/resolution.lua","/bin/reboot.lua","/bin/lua.lua","/bin/kill.lua","/bin/clear.lua","/bin/shutdown.lua","/bin/components.lua","/bin/dmesg.lua","/bin/passwd.lua","/bin/sleep.lua","/bin/wc.lua","/bin/uptime.lua","/bin/ps.lua","/bin/hostname.lua","/bin/echo.lua","/bin/label.lua","/bin/watch.lua"}},frontend="MPT",deps={"plan9k-corelibs","plan9k-fsutil"}},pipes={data={dependencies={"openloader-init"},name="pipes",repo="plan9k",checksum="-25daa6f9147d9d86d6002408fa8f8a09",files={"/lib/modules/base/18_pty.lua","/lib/modules/base/10_procfs.lua","/lib/modules/base/20_threading.lua","/lib/modules/base/15_keventd.lua","/lib/modules/base/21_timer.lua","/lib/modules/base/17_ipc.lua","/lib/modules/base/05_vfs.lua","/lib/modules/base/02_cmd.lua","/lib/modules/base/18_syscall.lua","/lib/modules/base/15_userspace.lua","/lib/modules/base/01_util.lua","/lib/modules/base/21_threadUtil.lua","/lib/modules/base/06_cowfs.lua","/lib/modules/base/10_sysfs.lua","/lib/modules/base/25_init.lua","/lib/modules/base/17_keyboard.lua","/usr/man/pipes","/lib/modules/base/16_require.lua","/lib/modules/base/09_rootfs.lua","/lib/modules/base/10_devfs.lua","/lib/modules/base/11_block.lua","/lib/modules/base/16_buffer.lua","/lib/modules/base/17_io.lua","/boot/kernel/pipes","/lib/modules/base/19_manageg.lua","/lib/modules/base/01_gc.lua","/lib/modules/base/16_component.lua","/lib/modules/base/19_cgroups.lua"}},frontend="MPT",deps={"openloader-init"}},["plan9k-network"]={frontend="MPT",data={dependencies={},name="plan9k-network",repo="plan9k",checksum="-5faf540f0923943a61e72e8c167d6c24",files={"/bin/wget.lua","/bin/pastebin.lua","/lib/internet.lua"}},deps={}},["plan9k-corelibs"]={data={dependencies={},name="plan9k-corelibs",repo="plan9k",checksum="46d6727c48cbe2a715cda4cb4178798a",files={"/lib/colors.lua","/lib/term.lua","/lib/serialization.lua","/lib/text.lua","/lib/sides.lua","/lib/shell.lua","/lib/event.lua"}},frontend="MPT",deps={}},["plan9k-shell"]={data={dependencies={},name="plan9k-shell",repo="plan9k",checksum="-32d4b8e73ad2888460fc0428b01d4af6",files={"/bin/sh.lua"}},frontend="MPT",deps={}},["plan9k-filesystems"]={data={dependencies={},name="plan9k-filesystems",repo="plan9k",checksum="-50d8cc1c5928bec760f210185cccfafd",files={"/lib/msdosfs.lua","/bin/mount.msdos.lua","/usr/bin/mkdosfs.lua"}},frontend="MPT",deps={}},["plan9k-extra"]={data={dependencies={"plan9k-ssh","plan9k-containers","plan9k-filesystems","plan9k","mpt"},name="plan9k-extra",repo="plan9k",checksum="7c8335894a6a92290be2bbc0d11f809f",files={"/usr/bin/go.lua","/usr/lib/robot.lua","/etc/rc.d/autoupdate.lua"}},frontend="MPT",deps={"plan9k-ssh","plan9k-containers","plan9k-filesystems","plan9k","mpt"}},["plan9k-core"]={data={dependencies={"pipes","plan9k-coreutil","plan9k-shell"},name="plan9k-core",repo="plan9k",checksum="4923988758bf8aa5f6b232469d6821c3",files={"/bin/init.lua","/bin/getty.lua","/lib/rc.lua","/bin/rc.lua","/bin/readkey.lua"}},frontend="MPT",deps={"pipes","plan9k-coreutil","plan9k-shell"}}}} \ No newline at end of file +{oppm={repos={},packages={}},installed={["plan9k-fsutil"]={frontend="MPT",data={files={"/bin/tee.lua","/bin/mv.lua","/bin/ln.lua","/bin/cp.lua","/bin/df.lua","/bin/mkdir.lua","/bin/dd.lua","/bin/mount.lua","/bin/du.lua","/bin/more.lua","/bin/cat.lua","/bin/rm.lua","/bin/touch.lua","/bin/find.lua","/bin/mount.cow.lua","/bin/pwd.lua","/bin/ls.lua"},checksum="-1222b1c98bb3bede8ea8be775ea95f2d",name="plan9k-fsutil",dependencies={"plan9k-corelibs"},repo="plan9k"},deps={"plan9k-corelibs"}},["plan9k-edit"]={frontend="MPT",data={files={"/bin/edit.lua"},checksum="4a26acd9f650ce6269bac2d25c3a8946",name="plan9k-edit",dependencies={},repo="plan9k"},deps={}},["plan9k-filesystems"]={frontend="MPT",data={files={"/lib/msdosfs.lua","/bin/mount.msdos.lua","/usr/bin/mkdosfs.lua"},checksum="-50d8cc1c5928bec760f210185cccfafd",name="plan9k-filesystems",dependencies={},repo="plan9k"},deps={}},["plan9k-drivers"]={frontend="MPT",data={files={"/lib/modules/base/17_eeprom.lua","/lib/modules/base/17_drive.lua","/lib/modules/base/16_partition.lua","/lib/modules/base/17_nfc.lua","/lib/modules/base/17_tape.lua","/lib/modules/base/17_data.lua","/lib/modules/base/17_gpt.lua","/lib/modules/base/17_chatbox.lua","/lib/modules/base/12_mount.lua"},checksum="-fb640833fcfba3442555ebbbe66762b",name="plan9k-drivers",dependencies={},repo="plan9k"},deps={}},["plan9k-installer"]={frontend="MPT",data={files={"/bin/install.lua"},checksum="-31228542b8cc1190aa9d8be7ea4ff56c",name="plan9k-installer",dependencies={"plan9k","mpt","plan9k-extra"},repo="plan9k"},deps={"plan9k","mpt","plan9k-extra"}},["plan9k-corelibs"]={frontend="MPT",data={files={"/lib/colors.lua","/lib/term.lua","/lib/serialization.lua","/lib/text.lua","/lib/sides.lua","/lib/shell.lua","/lib/event.lua"},checksum="46d6727c48cbe2a715cda4cb4178798a",name="plan9k-corelibs",dependencies={},repo="plan9k"},deps={}},mpt={frontend="MPT",data={files={"/usr/bin/mpt.lua"},checksum="-27e3ccf071b608bd996e1e60c5fe2e9e",name="mpt",dependencies={},repo="mpt"},deps={}},["openloader-init"]={frontend="MPT",data={files={"/init.lua"},checksum="-3680f69628a75a107d486e87e2695092",name="openloader-init",dependencies={},repo="disks"},deps={}},["plan9k-extra"]={frontend="MPT",data={files={"/usr/bin/go.lua","/usr/lib/robot.lua","/etc/rc.d/autoupdate.lua"},checksum="7c8335894a6a92290be2bbc0d11f809f",name="plan9k-extra",dependencies={"plan9k-ssh","plan9k-containers","plan9k-filesystems","plan9k","mpt"},repo="plan9k"},deps={"plan9k-ssh","plan9k-containers","plan9k-filesystems","plan9k","mpt"}},["plan9k-ssh"]={frontend="MPT",data={files={"/bin/sshd.lua","/usr/sbin/sshsession.lua","/usr/bin/ssh.lua","/etc/rc.d/sshd.lua"},checksum="-17c7a134b3e83e5c3c1b4c20adcdb2c6",name="plan9k-ssh",dependencies={},repo="plan9k"},deps={}},["plan9k-network"]={frontend="MPT",data={files={"/bin/wget.lua","/bin/pastebin.lua","/lib/internet.lua"},checksum="-5faf540f0923943a61e72e8c167d6c24",name="plan9k-network",dependencies={},repo="plan9k"},deps={}},["plan9k-data"]={frontend="MPT",data={files={"/usr/lib/data.lua","/usr/bin/inflate.lua","/usr/bin/sha256sum.lua","/usr/bin/deflate.lua","/usr/bin/base64.lua","/usr/bin/gpg.lua","/usr/bin/md5sum.lua"},checksum="480a898a741b2bf424f9e0e86e5072ba",name="plan9k-data",dependencies={},repo="plan9k"},deps={}},pipes={frontend="MPT",data={files={"/lib/modules/base/18_pty.lua","/lib/modules/base/10_procfs.lua","/lib/modules/base/20_threading.lua","/lib/modules/base/15_keventd.lua","/lib/modules/base/21_timer.lua","/lib/modules/base/17_ipc.lua","/lib/modules/base/05_vfs.lua","/lib/modules/base/02_cmd.lua","/lib/modules/base/18_syscall.lua","/lib/modules/base/15_userspace.lua","/lib/modules/base/01_util.lua","/lib/modules/base/21_threadUtil.lua","/lib/modules/base/06_cowfs.lua","/lib/modules/base/10_sysfs.lua","/lib/modules/base/25_init.lua","/lib/modules/base/17_keyboard.lua","/usr/man/pipes","/lib/modules/base/16_require.lua","/lib/modules/base/09_rootfs.lua","/lib/modules/base/10_devfs.lua","/lib/modules/base/11_block.lua","/lib/modules/base/16_buffer.lua","/lib/modules/base/17_io.lua","/boot/kernel/pipes","/lib/modules/base/19_manageg.lua","/lib/modules/base/01_gc.lua","/lib/modules/base/16_component.lua","/lib/modules/base/19_cgroups.lua"},checksum="-3f5d6398d3e0d79bc51b1e1d3752d44e",name="pipes",dependencies={"openloader-init"},repo="plan9k"},deps={"openloader-init"}},plan9k={frontend="MPT",data={files={"/.prop"},checksum="83a507dd74c6b0cf2bfb3d599c578cd",name="plan9k",dependencies={"plan9k-core","plan9k-network","plan9k-drivers","plan9k-edit","plan9k-data"},repo="plan9k"},deps={"plan9k-core","plan9k-network","plan9k-drivers","plan9k-edit","plan9k-data"}},["plan9k-shell"]={frontend="MPT",data={files={"/bin/sh.lua"},checksum="456005c33de866e6cc26fc310027b6e9",name="plan9k-shell",dependencies={},repo="plan9k"},deps={}},["plan9k-containers"]={frontend="MPT",data={files={"/bin/sandbox.lua"},checksum="-5ff36b0bde938782f3821bca52931c06",name="plan9k-containers",dependencies={},repo="plan9k"},deps={}},["plan9k-coreutil"]={frontend="MPT",data={files={"/bin/resolution.lua","/bin/reboot.lua","/bin/lua.lua","/bin/kill.lua","/bin/clear.lua","/bin/shutdown.lua","/bin/components.lua","/bin/dmesg.lua","/bin/passwd.lua","/bin/sleep.lua","/bin/wc.lua","/bin/uptime.lua","/bin/ps.lua","/bin/hostname.lua","/bin/echo.lua","/bin/label.lua","/bin/watch.lua"},checksum="73511370e5cc25ed49c1763f418d3514",name="plan9k-coreutil",dependencies={"plan9k-corelibs","plan9k-fsutil"},repo="plan9k"},deps={"plan9k-corelibs","plan9k-fsutil"}},["plan9k-core"]={frontend="MPT",data={files={"/bin/init.lua","/bin/getty.lua","/lib/rc.lua","/bin/rc.lua","/bin/readkey.lua"},checksum="4923988758bf8aa5f6b232469d6821c3",name="plan9k-core",dependencies={"pipes","plan9k-coreutil","plan9k-shell"},repo="plan9k"},deps={"pipes","plan9k-coreutil","plan9k-shell"}}}} \ No newline at end of file