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