|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- 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
|