Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
76de8ca302 | ||
|
50cfb2bbf2 |
6
.buildactions/00_init.lua
Normal file
6
.buildactions/00_init.lua
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
function actions.init()
|
||||||
|
os.execute("mkdir -p target")
|
||||||
|
os.execute("luacomp module/bootloader.lua -O target/init.lua")
|
||||||
|
end
|
||||||
|
|
||||||
|
actions[#actions+1] = "init"
|
19
.buildactions/10_zlua.lua
Normal file
19
.buildactions/10_zlua.lua
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
local function makezlua(file)
|
||||||
|
local path = file:match("^(.+)/.+%..+$")
|
||||||
|
os.execute("mkdir -p target/"..path)
|
||||||
|
os.execute("cat "..file.." | luamin -c | lua zlua.lua > target/"..file)
|
||||||
|
end
|
||||||
|
|
||||||
|
function actions.files()
|
||||||
|
local libs = find("lib", "*.lua")
|
||||||
|
local svcs = find("service", "*.lua")
|
||||||
|
for i=1, #libs do
|
||||||
|
makezlua(libs[i])
|
||||||
|
end
|
||||||
|
|
||||||
|
for i=1, #svcs do
|
||||||
|
makezlua(svcs[i])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
actions[#actions+1] = "files"
|
6
.buildactions/90_package.lua
Normal file
6
.buildactions/90_package.lua
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
function actions.package()
|
||||||
|
os.execute("cp -r cfg target")
|
||||||
|
os.execute("cd target; find $".."(ls) -depth | tsar -o > ../psychos.tsar")
|
||||||
|
end
|
||||||
|
|
||||||
|
actions[#actions+1] = "package"
|
16
build.sh
16
build.sh
@ -1,14 +1,2 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
LUA=${LUA:-lua}
|
luacomp luabuild.lua 2>/dev/null | lua - $@
|
||||||
rm -r target/*
|
|
||||||
mkdir -p target/doc &>/dev/null
|
|
||||||
$LUA luapreproc.lua module/init.lua target/init.lua
|
|
||||||
echo _OSVERSION=\"PsychOS 2.0a2-$(git rev-parse --short HEAD)\" > target/version.lua
|
|
||||||
cat target/version.lua target/init.lua > target/tinit.lua
|
|
||||||
mv target/tinit.lua target/init.lua
|
|
||||||
cp -r service/ lib/ cfg/ target/
|
|
||||||
rm target/version.lua
|
|
||||||
rm -r doc/ &>/dev/null
|
|
||||||
$LUA finddesc.lua doc/ $(find lib/ module/ -type f|sort)
|
|
||||||
$LUA gendoc.lua target/doc/kernel.dict $(find module/ -type f|sort)
|
|
||||||
pandoc doc/apidoc.md docs-metadata.yml --template=template.tex -o doc/apidoc.pdf
|
|
14
build.sh.old
Executable file
14
build.sh.old
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
LUA=${LUA:-lua}
|
||||||
|
rm -r target/*
|
||||||
|
mkdir -p target/doc &>/dev/null
|
||||||
|
$LUA luapreproc.lua module/init.lua target/init.lua
|
||||||
|
echo _OSVERSION=\"PsychOS 2.0a2-$(git rev-parse --short HEAD)\" > target/version.lua
|
||||||
|
cat target/version.lua target/init.lua > target/tinit.lua
|
||||||
|
mv target/tinit.lua target/init.lua
|
||||||
|
cp -r service/ lib/ cfg/ target/
|
||||||
|
rm target/version.lua
|
||||||
|
rm -r doc/ &>/dev/null
|
||||||
|
$LUA finddesc.lua doc/ $(find lib/ module/ -type f|sort)
|
||||||
|
$LUA gendoc.lua target/doc/kernel.dict $(find module/ -type f|sort)
|
||||||
|
pandoc doc/apidoc.md docs-metadata.yml --template=template.tex -o doc/apidoc.pdf
|
@ -1 +1 @@
|
|||||||
{enabled={"getty","minitel"}}
|
{enabled={"getty","minitel","clipboard","fsmanager"}}
|
||||||
|
22
escape.lua
Normal file
22
escape.lua
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
local function mkstr(d)
|
||||||
|
local dat = "\""
|
||||||
|
for i=1, #d do
|
||||||
|
if (d:sub(i,i) == "\\") then
|
||||||
|
dat = dat .. ("\\\\")
|
||||||
|
elseif (d:sub(i,i) == "\"") then
|
||||||
|
dat = dat .. ("\\\"")
|
||||||
|
elseif (d:sub(i,i) == "\n") then
|
||||||
|
dat = dat .. ("\\n")
|
||||||
|
elseif (d:sub(i,i) == "\r") then
|
||||||
|
dat = dat .. ("\\r")
|
||||||
|
elseif (d:sub(i,i) == "\t") then
|
||||||
|
dat = dat .. ("\\t")
|
||||||
|
else
|
||||||
|
dat = dat .. (d:sub(i,i))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
dat = dat .. ("\"")
|
||||||
|
return dat
|
||||||
|
end
|
||||||
|
|
||||||
|
io.stdout:write(mkstr(io.stdin:read("*a")))
|
128
lib/doc.lua
128
lib/doc.lua
@ -1,128 +0,0 @@
|
|||||||
local _,serial = pcall(require,"serialization")
|
|
||||||
local doc = {}
|
|
||||||
doc.searchers = {}
|
|
||||||
doc.tctab = {
|
|
||||||
["string"] = 31,
|
|
||||||
["table"] = 32,
|
|
||||||
["number"] = 33,
|
|
||||||
["boolean"] = 35,
|
|
||||||
["function"] = 36
|
|
||||||
}
|
|
||||||
|
|
||||||
function doc.parsefile(path) -- string -- table -- parses file from *path* to return a documentation table
|
|
||||||
local fdoc = {}
|
|
||||||
local f = io.open(path)
|
|
||||||
local lines = {}
|
|
||||||
for l in f:read("*a"):gmatch("[^\n]+") do
|
|
||||||
if l:find("function") and not l:find("local") then
|
|
||||||
lines[#lines+1] = l
|
|
||||||
end
|
|
||||||
end
|
|
||||||
for k,v in pairs(lines) do
|
|
||||||
local name, args, desc = v:match("function%s+(.+)%s*%((.*)%)%s*%-%-%s*(.+)")
|
|
||||||
if name and args and desc then
|
|
||||||
local fd = {["description"]=desc or desc,["args"]={},["atypes"]={}}
|
|
||||||
for word in args:gmatch("[^%s,]+") do
|
|
||||||
fd.args[#fd.args+1] = {word}
|
|
||||||
fd.atypes[word] = "unknown"
|
|
||||||
end
|
|
||||||
local argtypes, outtypes, description = desc:match("(.-)%-%-(.-)%-%-%s*(.+)")
|
|
||||||
if argtypes and outtypes and description then
|
|
||||||
local wc = 1
|
|
||||||
for word in argtypes:gmatch("%S+") do
|
|
||||||
fd.args[wc][2] = word
|
|
||||||
fd.atypes[fd.args[wc][1]] = word
|
|
||||||
wc = wc + 1
|
|
||||||
end
|
|
||||||
local wc = 1
|
|
||||||
for word in outtypes:gmatch("%S+") do
|
|
||||||
fd.outtypes = fd.outtypes or {}
|
|
||||||
fd.outtypes[#fd.outtypes+1] = word
|
|
||||||
end
|
|
||||||
fd.description = description
|
|
||||||
end
|
|
||||||
fdoc[name] = fd
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return fdoc
|
|
||||||
end
|
|
||||||
|
|
||||||
function doc.format(fdoc) -- table -- string -- returns VT100 formatted documentation from documentation table *fdoc*
|
|
||||||
local rs = "" -- string to return
|
|
||||||
for fname,finfo in pairs(fdoc) do
|
|
||||||
if rs:len() > 0 then rs = rs .. "\n\n" end
|
|
||||||
local as = "" -- string containing arguments for a given function, with colours for type
|
|
||||||
for k,v in ipairs(finfo.args) do
|
|
||||||
local c = doc.tctab[v[2]] or 0
|
|
||||||
if k > 1 then
|
|
||||||
as = as .. ", "
|
|
||||||
end
|
|
||||||
if v[2] then
|
|
||||||
as = string.format("%s%s: \27[%im%s\27[0m",as,v[2],c,v[1])
|
|
||||||
else
|
|
||||||
as = string.format("%s\27[%im%s\27[0m",as,c,v[1])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local rv = ""
|
|
||||||
if finfo.outtypes then
|
|
||||||
rv = ": "
|
|
||||||
for k,v in ipairs(finfo.outtypes) do
|
|
||||||
if k > 1 then
|
|
||||||
rv = rv .. ", "
|
|
||||||
end
|
|
||||||
local c = doc.tctab[v] or 0
|
|
||||||
rv = string.format("%s\27[%im%s\27[0m",rv,c,v)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local nd = finfo.description
|
|
||||||
for k,v in pairs(finfo.atypes) do
|
|
||||||
local c = doc.tctab[v] or 7
|
|
||||||
nd=nd:gsub("%*"..k.."%*","\27["..tostring(c).."m"..k.."\27[0m")
|
|
||||||
end
|
|
||||||
rs = string.format("%s\27[36m%s\27[0m(%s)%s\n%s",rs,fname,as,rv,nd)
|
|
||||||
end
|
|
||||||
return rs
|
|
||||||
end
|
|
||||||
|
|
||||||
function doc.searchers.lib(name) -- string -- string string -- Tries to find a documentation from a library with *name*. Returns either a string of documentation, or false and a reason.
|
|
||||||
local lib = os.getenv("LIB") or "/boot/lib"
|
|
||||||
local dt
|
|
||||||
for d in lib:gmatch("[^\n]+") do
|
|
||||||
if fs.exists(d.."/"..name) then
|
|
||||||
dt = doc.parsefile(d.."/"..name)
|
|
||||||
elseif fs.exists(d.."/"..name..".lua") then
|
|
||||||
dt = doc.parsefile(d.."/"..name..".lua")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if not dt then return false, "unable to find documentation for "..tostring(name) end
|
|
||||||
return doc.format(dt)
|
|
||||||
end
|
|
||||||
function doc.searchers.cdoc(topic) -- string -- string string -- Searches for documentation labelled as *topic* in .dict files under /boot/doc/
|
|
||||||
if not serial then return end
|
|
||||||
for k,v in ipairs(fs.list("/boot/doc")) do
|
|
||||||
if v:sub(-5) == ".dict" then
|
|
||||||
local f=io.open("/boot/doc/"..v,"rb")
|
|
||||||
for line in f:lines() do
|
|
||||||
local mname, docs = line:match("^(.-)\t(.+)$")
|
|
||||||
if mname == topic or mname == topic..".lua" then
|
|
||||||
return doc.format(serial.unserialize(docs))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function doc.docs(topic) -- string -- boolean -- Displays the documentation for *topic*, returning true, or errors. Also callable as just doc().
|
|
||||||
local lib = os.getenv("LIB") or "/boot/lib"
|
|
||||||
local dt
|
|
||||||
for k,v in pairs(doc.searchers) do
|
|
||||||
dt=v(topic)
|
|
||||||
if dt then
|
|
||||||
print(dt)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
error("unable to find documentation for "..tostring(name))
|
|
||||||
end
|
|
||||||
|
|
||||||
return setmetatable(doc,{__call=function(_,topic) return doc.docs(topic) end})
|
|
0
lib/foxfs.lua
Normal file
0
lib/foxfs.lua
Normal file
@ -1,63 +0,0 @@
|
|||||||
local imt = {}
|
|
||||||
|
|
||||||
imt.ttypes = {}
|
|
||||||
imt.ttypes.string=1
|
|
||||||
imt.ttypes.number=2
|
|
||||||
|
|
||||||
imt.ftypes = {tostring,tonumber}
|
|
||||||
|
|
||||||
function imt.to16bn(n)
|
|
||||||
return string.char(math.floor(n/256))..string.char(math.floor(n%256))
|
|
||||||
end
|
|
||||||
function imt.from16bn(s)
|
|
||||||
return (string.byte(s,1,1)*256)+string.byte(s,2,2)
|
|
||||||
end
|
|
||||||
|
|
||||||
function imt.encodePacket(...)
|
|
||||||
local tArgs = {...}
|
|
||||||
local packet = string.char(#tArgs%256)
|
|
||||||
for _,segment in ipairs(tArgs) do
|
|
||||||
local segtype = type(segment)
|
|
||||||
segment = tostring(segment)
|
|
||||||
packet = packet .. imt.to16bn(segment:len()) .. string.char(imt.ttypes[segtype]) .. tostring(segment)
|
|
||||||
end
|
|
||||||
packet = imt.to16bn(packet:len()) .. packet
|
|
||||||
return packet
|
|
||||||
end
|
|
||||||
|
|
||||||
function imt.decodePacket(s)
|
|
||||||
local function getfirst(n)
|
|
||||||
local ns = s:sub(1,n)
|
|
||||||
s=s:sub(n+1)
|
|
||||||
return ns
|
|
||||||
end
|
|
||||||
if s:len() < 2 then return false end
|
|
||||||
local plen = imt.from16bn(getfirst(2))
|
|
||||||
local segments = {}
|
|
||||||
if s:len() < plen then return false end
|
|
||||||
local nsegments = string.byte(getfirst(1))
|
|
||||||
--print(tostring(plen).." bytes, "..tostring(nsegments).." segments")
|
|
||||||
for i = 1, nsegments do
|
|
||||||
local seglen = imt.from16bn(getfirst(2))
|
|
||||||
local segtype = imt.ftypes[string.byte(getfirst(1))]
|
|
||||||
local segment = segtype(getfirst(seglen))
|
|
||||||
--print(seglen,segtype,segment,type(segment))
|
|
||||||
segments[#segments+1] = segment
|
|
||||||
end
|
|
||||||
return table.unpack(segments)
|
|
||||||
end
|
|
||||||
function imt.getRemainder(s)
|
|
||||||
local function getfirst(n)
|
|
||||||
local ns = s:sub(1,n)
|
|
||||||
s=s:sub(n+1)
|
|
||||||
return ns
|
|
||||||
end
|
|
||||||
local plen = imt.from16bn(getfirst(2))
|
|
||||||
if s:len() > plen then
|
|
||||||
getfirst(plen)
|
|
||||||
return s
|
|
||||||
end
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
return imt
|
|
0
lib/osdi.lua
Normal file
0
lib/osdi.lua
Normal file
@ -2,7 +2,6 @@ local component = require "component"
|
|||||||
local fs = require "fs"
|
local fs = require "fs"
|
||||||
local shell = require "shell"
|
local shell = require "shell"
|
||||||
local ed = require "ed"
|
local ed = require "ed"
|
||||||
local doc = require "doc"
|
|
||||||
local shutil = {}
|
local shutil = {}
|
||||||
shutil.ed = ed.interactive
|
shutil.ed = ed.interactive
|
||||||
shutil.vi = ed.visual
|
shutil.vi = ed.visual
|
||||||
@ -124,4 +123,42 @@ shutil.mkdir = fs.makeDirectory
|
|||||||
shutil.cp = fs.copy
|
shutil.cp = fs.copy
|
||||||
shutil.rm = fs.remove
|
shutil.rm = fs.remove
|
||||||
|
|
||||||
|
local function find_dir(t, dir)
|
||||||
|
local f = fs.list(dir)
|
||||||
|
for i=1, #f do
|
||||||
|
if (f[i]:sub(#f[i]) == "/") then
|
||||||
|
find_dir(t, dir..f[i])
|
||||||
|
end
|
||||||
|
t[#t+1] = dir..f[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function shutil.find(...)
|
||||||
|
local paths = {...}
|
||||||
|
if not paths[1] then paths = {"."} end
|
||||||
|
for i=1, #paths do
|
||||||
|
if (paths[i]:sub(#paths[i]) ~= "/") then
|
||||||
|
paths[i] = paths[i] .. "/"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local t = {}
|
||||||
|
for i=1, #paths do
|
||||||
|
if fs.isDirectory(paths[i]) then
|
||||||
|
find_dir(t, paths[i])
|
||||||
|
end
|
||||||
|
t[#t+1] = paths[i]
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
|
||||||
|
function shutil.filter(t, func)
|
||||||
|
local t2 = {}
|
||||||
|
for i=1, #t do
|
||||||
|
if (func(t[i])) then
|
||||||
|
t2[#t2+1] = t[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return t2
|
||||||
|
end
|
||||||
|
|
||||||
return shutil
|
return shutil
|
||||||
|
13
lib/tsar.lua
Normal file
13
lib/tsar.lua
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
local tsar = package.loaded.tsar or {}
|
||||||
|
|
||||||
|
function tsar.extract(fd, path, ...)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function tsar.create(paths, fd)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function tsar.list(fd)
|
||||||
|
|
||||||
|
end
|
14
lib/tsuki.lua
Normal file
14
lib/tsuki.lua
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
local foxfs = require "foxfs"
|
||||||
|
local tsuki = {}
|
||||||
|
|
||||||
|
function tsuki.reset_security_node(path)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function tsuki.reset_dev_permissions(path)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function tsuki.make_security_node(path)
|
||||||
|
|
||||||
|
end
|
7
lib/velx.lua
Normal file
7
lib/velx.lua
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
local velx = package.loaded.velx or {}
|
||||||
|
|
||||||
|
function velx.parse(fd)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
return velx
|
47
luabuild.lua
Normal file
47
luabuild.lua
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
local actions = {}
|
||||||
|
|
||||||
|
local function list(dir)
|
||||||
|
local h = io.popen("ls \""..dir.."\"", "r")
|
||||||
|
local ents = {}
|
||||||
|
for l in h:lines() do
|
||||||
|
ents[#ents+1] = l
|
||||||
|
end
|
||||||
|
h:close()
|
||||||
|
return ents
|
||||||
|
end
|
||||||
|
|
||||||
|
local function find(dir, pattern, inverse, ctype)
|
||||||
|
local h = io.popen("find \""..dir.."\" "..(((inverse) and "-not ") or "")..(((ctype) and "-type "..ctype.." ") or "").."-name \""..pattern.."\"", "r")
|
||||||
|
local ents = {}
|
||||||
|
for l in h:lines() do
|
||||||
|
ents[#ents+1] = l
|
||||||
|
end
|
||||||
|
h:close()
|
||||||
|
return ents
|
||||||
|
end
|
||||||
|
|
||||||
|
local function lastmod(file)
|
||||||
|
local h = io.popen("stat -c %Y \""..file.."\"")
|
||||||
|
local num = tonumber(h:read("*a"))
|
||||||
|
h:close()
|
||||||
|
return num
|
||||||
|
end
|
||||||
|
|
||||||
|
@[[local h = io.popen("ls .buildactions", "r")
|
||||||
|
for line in h:lines() do]]
|
||||||
|
--#include @[{".buildactions/"..line}]
|
||||||
|
@[[end]]
|
||||||
|
|
||||||
|
function actions.all()
|
||||||
|
for i=1, #actions do
|
||||||
|
actions[actions[i]]()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not arg[1] then
|
||||||
|
arg[1] = "all"
|
||||||
|
end
|
||||||
|
|
||||||
|
actions[arg[1]]()
|
||||||
|
|
||||||
|
print("Build complete.")
|
21
module/bootloader.lua
Normal file
21
module/bootloader.lua
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
_OSVERSION="PsychOS 2.0a2-$[[git rev-parse --short HEAD]]"
|
||||||
|
function lzss_decompress(a)local b,c,d,e,j,i,h,g=1,'',''while b<=#a do
|
||||||
|
e=c.byte(a,b)b=b+1
|
||||||
|
for k=0,7 do h=c.sub
|
||||||
|
g=h(a,b,b)if e>>k&1<1 and b<#a then
|
||||||
|
i=c.unpack('>I2',a,b)j=1+(i>>4)g=h(d,j,j+(i&15)+2)b=b+1
|
||||||
|
end
|
||||||
|
b=b+1
|
||||||
|
c=c..g
|
||||||
|
d=h(d..g,-4^6)end
|
||||||
|
end
|
||||||
|
return c end
|
||||||
|
local oload = load
|
||||||
|
function load(src, ...)
|
||||||
|
if (src:sub(1,4) == "\27ZLS") then
|
||||||
|
src = lzss_decompress(src:sub(5))
|
||||||
|
end
|
||||||
|
return oload(src, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
load($[[ luacomp -mluamin module/init.lua | lua zlua.lua | lua escape.lua ]])()
|
BIN
psychos.tsar
Normal file
BIN
psychos.tsar
Normal file
Binary file not shown.
@ -1,95 +0,0 @@
|
|||||||
local minitel = require "minitel"
|
|
||||||
local serial = require "serialization"
|
|
||||||
|
|
||||||
local cfg = {["path"]="/boot/srv/frequest",["port"]=70}
|
|
||||||
|
|
||||||
f=io.open("/boot/cfg/fserv.cfg","rb")
|
|
||||||
if f then
|
|
||||||
local ncfg = serial.unserialize(f:read("*a"))
|
|
||||||
f:close()
|
|
||||||
for k,v in pairs(ncfg) do
|
|
||||||
cfg[k] = v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function fileHandler(socket,rtype,path)
|
|
||||||
syslog(string.format("[%s:%d] %s %s",socket.addr,socket.port,rtype,path),syslog.info,"fserv")
|
|
||||||
if rtype == "t" then
|
|
||||||
if fs.exists(path) and fs.isDirectory(path) then
|
|
||||||
socket:write("d")
|
|
||||||
for _,file in ipairs(fs.list(path)) do
|
|
||||||
socket:write(file.."\n")
|
|
||||||
end
|
|
||||||
elseif fs.exists(path) and not fs.isDirectory(path) then
|
|
||||||
local f,err = io.open(path,"rb")
|
|
||||||
if f then
|
|
||||||
socket:write("y")
|
|
||||||
while true do
|
|
||||||
local c = f:read(4096)
|
|
||||||
if not c or c == "" then break end
|
|
||||||
socket:write(c)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
socket:write("fFailed to open file: "..err)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
socket:write("nFile not found")
|
|
||||||
end
|
|
||||||
elseif rtype == "s" then
|
|
||||||
if fs.exists(path) then
|
|
||||||
local ftype = "f"
|
|
||||||
if fs.isDirectory(path) then
|
|
||||||
ftype = "d"
|
|
||||||
end
|
|
||||||
socket:write(string.format("y%s\n%d",ftype,fs.size(path)))
|
|
||||||
else
|
|
||||||
socket:write("nFile not found.")
|
|
||||||
end
|
|
||||||
else
|
|
||||||
socket:write("fUnknown request type")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local function httpHandler(socket,rtype,path)
|
|
||||||
local tPath = fs.segments(path)
|
|
||||||
local proto = table.remove(tPath,1)
|
|
||||||
local url = string.format("%s://%s",proto,table.concat(tPath,"/"))
|
|
||||||
local request = component.invoke(component.list("internet")(),"request",url)
|
|
||||||
repeat
|
|
||||||
coroutine.yield()
|
|
||||||
until request.finishConnect()
|
|
||||||
local code, message, headers = request.response()
|
|
||||||
if code < 200 or code > 299 then
|
|
||||||
socket:write(string.format("f%d\n%s",code,message))
|
|
||||||
else
|
|
||||||
local data = ""
|
|
||||||
repeat
|
|
||||||
coroutine.yield()
|
|
||||||
data = request.read()
|
|
||||||
if data then
|
|
||||||
socket:write(data)
|
|
||||||
end
|
|
||||||
until not data
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function socketHandler(socket)
|
|
||||||
return function()
|
|
||||||
local line = nil
|
|
||||||
repeat
|
|
||||||
coroutine.yield()
|
|
||||||
line = socket:read()
|
|
||||||
until line
|
|
||||||
local rtype, path = line:match("(.)(.+)")
|
|
||||||
if fs.segments(path)[1] == "http" or fs.segments(path)[1] == "https" then
|
|
||||||
httpHandler(socket,rtype,path)
|
|
||||||
else
|
|
||||||
path = (cfg.path .. "/" .. path:gsub("../","")):gsub("/+","/")
|
|
||||||
fileHandler(socket,rtype,path)
|
|
||||||
end
|
|
||||||
socket:close()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
while true do
|
|
||||||
os.spawn(socketHandler(minitel.listen(70)),"fserv worker process")
|
|
||||||
end
|
|
@ -1,25 +0,0 @@
|
|||||||
local lastkey = computer.uptime()
|
|
||||||
local state = true
|
|
||||||
local delay = 60
|
|
||||||
function start()
|
|
||||||
return os.spawn(function()
|
|
||||||
while true do
|
|
||||||
tEv = {coroutine.yield()}
|
|
||||||
if tEv[1] == "key_down" then
|
|
||||||
lastkey = computer.uptime()
|
|
||||||
if not state then
|
|
||||||
for addr in component.list("screen") do
|
|
||||||
component.invoke(addr,"turnOn")
|
|
||||||
end
|
|
||||||
state = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if computer.uptime() > lastkey + delay and state then
|
|
||||||
for addr in component.list("screen") do
|
|
||||||
component.invoke(addr,"turnOff")
|
|
||||||
end
|
|
||||||
state = false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end,"screenblank")
|
|
||||||
end
|
|
@ -1,28 +0,0 @@
|
|||||||
local counter = 0
|
|
||||||
local td = {}
|
|
||||||
local function addNode(addr)
|
|
||||||
devfs.register("tape"..tonumber(counter),function()
|
|
||||||
local tape = component.proxy(addr)
|
|
||||||
tape.seek(-math.huge)
|
|
||||||
return tape.read, tape.write, function() end, tape.seek
|
|
||||||
end)
|
|
||||||
devfs.register("tapen"..tonumber(counter),function()
|
|
||||||
local tape = component.proxy(addr)
|
|
||||||
return tape.read, tape.write, function() end, tape.seek
|
|
||||||
end)
|
|
||||||
td[addr] = counter
|
|
||||||
counter = counter + 1
|
|
||||||
end
|
|
||||||
for addr in component.list("tape_drive") do
|
|
||||||
addNode(addr)
|
|
||||||
end
|
|
||||||
while true do
|
|
||||||
local tE = {coroutine.yield()}
|
|
||||||
if tE[1] == "component_added" and tE[3] == "tape_drive" then
|
|
||||||
addNode(tE[2])
|
|
||||||
elseif tE[1] == "component_removed" and tE[3] == "tape_drive" then
|
|
||||||
if td[tE[2]] then
|
|
||||||
fs.remove("/dev/tape"..tostring(td[tE[2]]))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,63 +0,0 @@
|
|||||||
local minitel = require "minitel"
|
|
||||||
local shell = require "shell"
|
|
||||||
local port = 22
|
|
||||||
|
|
||||||
local function sread(self, len)
|
|
||||||
while true do
|
|
||||||
local d=self.sock:read(len)
|
|
||||||
if d then
|
|
||||||
return d
|
|
||||||
end
|
|
||||||
coroutine.yield()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local function swrite(self, data)
|
|
||||||
while self.flushing do
|
|
||||||
coroutine.yield()
|
|
||||||
end
|
|
||||||
if data and data:len() > 0 then
|
|
||||||
self.wb = self.wb .. (data or "")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local function sclose(self)
|
|
||||||
self.sock:close()
|
|
||||||
end
|
|
||||||
local function sflush(self)
|
|
||||||
self.flushing = true
|
|
||||||
self.sock:write(self.wb)
|
|
||||||
self.wb = ""
|
|
||||||
self.flushing = false
|
|
||||||
end
|
|
||||||
|
|
||||||
function start()
|
|
||||||
return os.spawn(function()
|
|
||||||
local oout = io.output()
|
|
||||||
local pname = os.taskInfo(os.pid()).name
|
|
||||||
while true do
|
|
||||||
local sock = minitel.listen(port)
|
|
||||||
print(string.format("Connection from %s:%d",sock.addr,sock.port))
|
|
||||||
os.spawn(function() _G.worked = {pcall(function()
|
|
||||||
local fh = {}
|
|
||||||
fh.sock = sock
|
|
||||||
fh.read = sread
|
|
||||||
fh.write = swrite
|
|
||||||
fh.close = sclose
|
|
||||||
fh.flush = sflush
|
|
||||||
fh.wb = ""
|
|
||||||
io.input(fh)
|
|
||||||
io.output(fh)
|
|
||||||
print(_OSVERSION.." - "..tostring(math.floor(computer.totalMemory()/1024)).."K RAM")
|
|
||||||
local pid = os.spawn(shell.interactive,string.format(pname.." shell [%s:%d]",sock.addr,sock.port))
|
|
||||||
repeat
|
|
||||||
coroutine.yield()
|
|
||||||
if fh.wb:len() > 0 then
|
|
||||||
fh:flush()
|
|
||||||
end
|
|
||||||
until sock.state ~= "open" or not os.taskInfo(pid)
|
|
||||||
sock:close()
|
|
||||||
os.kill(pid)
|
|
||||||
oout:write(string.format("Session %s:%d ended",sock.addr,sock.port))
|
|
||||||
end)} end,string.format(pname.." [%s:%d]",sock.addr,sock.port))
|
|
||||||
end
|
|
||||||
end,"termsrv")
|
|
||||||
end
|
|
@ -1,162 +0,0 @@
|
|||||||
local vcomponent = require "vcomponent"
|
|
||||||
local serial = require "serialization"
|
|
||||||
local component = require "component"
|
|
||||||
local computer = require "computer"
|
|
||||||
local event = require "event"
|
|
||||||
local imt = require "interminitel"
|
|
||||||
|
|
||||||
local cfg = {}
|
|
||||||
cfg.peers = {}
|
|
||||||
cfg.rtimer = 5
|
|
||||||
cfg.katimer = 30
|
|
||||||
local listeners = {}
|
|
||||||
local proxies = {}
|
|
||||||
|
|
||||||
local function loadcfg()
|
|
||||||
local f = io.open("/boot/cfg/vtunnel.cfg","rb")
|
|
||||||
if not f then return false end
|
|
||||||
for k,v in pairs(serial.unserialize(f:read("*a")) or {}) do
|
|
||||||
cfg[k] = v
|
|
||||||
end
|
|
||||||
f:close()
|
|
||||||
end
|
|
||||||
local function savecfg()
|
|
||||||
local f = io.open("/boot/cfg/vtunnel.cfg","wb")
|
|
||||||
if not f then
|
|
||||||
print("Warning: unable to save configuration.")
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
f:write(serial.serialize(cfg))
|
|
||||||
f:close()
|
|
||||||
end
|
|
||||||
|
|
||||||
local function createTunnel(host,port,addr,raddr)
|
|
||||||
local proxy = {address=addr,buffer=""}
|
|
||||||
function proxy.connect()
|
|
||||||
if proxy.socket then
|
|
||||||
proxy.socket.close()
|
|
||||||
end
|
|
||||||
proxy.socket = component.invoke(component.list("internet")(),"connect",host,port)
|
|
||||||
local st = computer.uptime()
|
|
||||||
repeat
|
|
||||||
coroutine.yield()
|
|
||||||
until proxy.socket.finishConnect() or computer.uptime() > st+5
|
|
||||||
end
|
|
||||||
function proxy.send(...)
|
|
||||||
rt = 0
|
|
||||||
while not proxy.socket.write(imt.encodePacket(...)) and rt < 10 do
|
|
||||||
proxy.connect()
|
|
||||||
rt = rt + 1
|
|
||||||
end
|
|
||||||
proxy.last = computer.uptime()
|
|
||||||
end
|
|
||||||
function proxy.read()
|
|
||||||
local rb, r
|
|
||||||
local rt = 0
|
|
||||||
while true do
|
|
||||||
rb,r = proxy.socket.read(4096)
|
|
||||||
if rb or rt > 10 then break end
|
|
||||||
if type(rb) == "nil" then
|
|
||||||
proxy.connect()
|
|
||||||
end
|
|
||||||
rt = rt + 1
|
|
||||||
end
|
|
||||||
proxy.buffer = proxy.buffer .. rb
|
|
||||||
while imt.decodePacket(proxy.buffer) do
|
|
||||||
computer.pushSignal("modem_message",addr,raddr,0,0,imt.decodePacket(proxy.buffer))
|
|
||||||
proxy.buffer = imt.getRemainder(proxy.buffer) or ""
|
|
||||||
end
|
|
||||||
if computer.uptime() > proxy.last + cfg.katimer then
|
|
||||||
proxy.socket.write("\0\1\0")
|
|
||||||
proxy.last = computer.uptime()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function proxy.getWakeMessage()
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
proxy.setWakeMessage = proxy.getWakeMessage
|
|
||||||
function proxy.maxPacketSize()
|
|
||||||
return 8192
|
|
||||||
end
|
|
||||||
function proxy.getChannel()
|
|
||||||
return host..":"..tostring(port)
|
|
||||||
end
|
|
||||||
proxy.connect()
|
|
||||||
proxy.last = computer.uptime()
|
|
||||||
return proxy
|
|
||||||
end
|
|
||||||
|
|
||||||
vt = {}
|
|
||||||
function start()
|
|
||||||
loadcfg()
|
|
||||||
for k,v in pairs(cfg.peers) do
|
|
||||||
print(string.format("Connecting to %s:%d",v.host,v.port))
|
|
||||||
v.addr = v.addr or vcomponent.uuid()
|
|
||||||
v.raddr = v.raddr or vcomponent.uuid()
|
|
||||||
local px = createTunnel(v.host, v.port, v.addr, v.raddr)
|
|
||||||
vcomponent.register(v.addr, "tunnel", px)
|
|
||||||
proxies[v.addr] = px
|
|
||||||
end
|
|
||||||
for k,v in pairs(os.tasks()) do
|
|
||||||
if os.taskInfo(v).name:match("minitel") then
|
|
||||||
os.kill(v)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function vt.stop()
|
|
||||||
for k,v in pairs(proxies) do
|
|
||||||
vcomponent.unregister(k)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function vt.listpeers()
|
|
||||||
for k,v in pairs(cfg.peers) do
|
|
||||||
print(string.format("#%d (%s:%d)\n Local address: %s\n Remote address: %s",k,v.host,v.port,v.addr,v.raddr))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function vt.addpeer(host,port)
|
|
||||||
port = tonumber(port) or 4096
|
|
||||||
local t = {}
|
|
||||||
t.host = host
|
|
||||||
t.port = port
|
|
||||||
t.addr = vcomponent.uuid()
|
|
||||||
t.raddr = vcomponent.uuid()
|
|
||||||
cfg.peers[#cfg.peers+1] = t
|
|
||||||
print(string.format("Added peer #%d (%s:%d) to the configuration.\nRestart to apply changes.",#cfg.peers,host,port))
|
|
||||||
savecfg()
|
|
||||||
end
|
|
||||||
function vt.delpeer(n)
|
|
||||||
n=tonumber(n)
|
|
||||||
if not n then
|
|
||||||
print("delpeer requires a number, representing the peer number, as an argument.")
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
local dp = table.remove(cfg.peers, n)
|
|
||||||
savecfg()
|
|
||||||
print(string.format("Removed peer %s:%d",dp.host, dp.port))
|
|
||||||
end
|
|
||||||
|
|
||||||
function vt.settimer(time)
|
|
||||||
time = tonumber(time)
|
|
||||||
if not time then
|
|
||||||
print("Timer must be a number.")
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
cfg.rtime = time
|
|
||||||
savecfg()
|
|
||||||
end
|
|
||||||
|
|
||||||
vt.start = start
|
|
||||||
_G.libs.vtunnel = vt
|
|
||||||
|
|
||||||
start()
|
|
||||||
local last = computer.uptime()
|
|
||||||
while true do
|
|
||||||
local tE = {coroutine.yield()}
|
|
||||||
if computer.uptime() > last + cfg.rtimer then
|
|
||||||
for k,v in pairs(proxies) do
|
|
||||||
v.read()
|
|
||||||
end
|
|
||||||
last = computer.uptime()
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,18 +0,0 @@
|
|||||||
local delay = 60
|
|
||||||
local port = 3442
|
|
||||||
local message = "WoLBeacon"
|
|
||||||
|
|
||||||
for modem in component.list("modem") do
|
|
||||||
component.invoke(modem,"setWakeMessage",message)
|
|
||||||
end
|
|
||||||
|
|
||||||
local ltime = computer.uptime()
|
|
||||||
while true do
|
|
||||||
if computer.uptime() > ltime+delay then
|
|
||||||
for modem in component.list("modem") do
|
|
||||||
component.invoke(modem,"broadcast",port,message)
|
|
||||||
end
|
|
||||||
ltime=computer.uptime()
|
|
||||||
end
|
|
||||||
coroutine.yield()
|
|
||||||
end
|
|
82
zlua.lua
Normal file
82
zlua.lua
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
local f = io.stdin:read("*a")
|
||||||
|
|
||||||
|
--[[----------------------------------------------------------------------------
|
||||||
|
LZSS - encoder / decoder
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
|
--]]----------------------------------------------------------------------------
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local M = {}
|
||||||
|
local string, table = string, table
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local POS_BITS = 12
|
||||||
|
local LEN_BITS = 16 - POS_BITS
|
||||||
|
local POS_SIZE = 1 << POS_BITS
|
||||||
|
local LEN_SIZE = 1 << LEN_BITS
|
||||||
|
local LEN_MIN = 3
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
function M.compress(input)
|
||||||
|
local offset, output = 1, {}
|
||||||
|
local window = ''
|
||||||
|
|
||||||
|
local function search()
|
||||||
|
for i = LEN_SIZE + LEN_MIN - 1, LEN_MIN, -1 do
|
||||||
|
local str = string.sub(input, offset, offset + i - 1)
|
||||||
|
local pos = string.find(window, str, 1, true)
|
||||||
|
if pos then
|
||||||
|
return pos, str
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
while offset <= #input do
|
||||||
|
local flags, buffer = 0, {}
|
||||||
|
|
||||||
|
for i = 0, 7 do
|
||||||
|
if offset <= #input then
|
||||||
|
local pos, str = search()
|
||||||
|
if pos and #str >= LEN_MIN then
|
||||||
|
local tmp = ((pos - 1) << LEN_BITS) | (#str - LEN_MIN)
|
||||||
|
buffer[#buffer + 1] = string.pack('>I2', tmp)
|
||||||
|
else
|
||||||
|
flags = flags | (1 << i)
|
||||||
|
str = string.sub(input, offset, offset)
|
||||||
|
buffer[#buffer + 1] = str
|
||||||
|
end
|
||||||
|
window = string.sub(window .. str, -POS_SIZE)
|
||||||
|
offset = offset + #str
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if #buffer > 0 then
|
||||||
|
output[#output + 1] = string.char(flags)
|
||||||
|
output[#output + 1] = table.concat(buffer)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.concat(output)
|
||||||
|
end
|
||||||
|
|
||||||
|
io.stdout:write("\27ZLS"..M.compress(f))
|
Loading…
Reference in New Issue
Block a user