mirror of
https://git.shadowkat.net/izaya/OC-PsychOS2.git
synced 2024-11-25 12:42:10 -05:00
64 lines
1.5 KiB
Lua
64 lines
1.5 KiB
Lua
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
|