Operating system for OpenComputers
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.5KB

  1. local minitel = require "minitel"
  2. local shell = require "shell"
  3. local port = 22
  4. local function sread(self, len)
  5. while true do
  6. local d=self.sock:read(len)
  7. if d then
  8. return d
  9. end
  10. coroutine.yield()
  11. end
  12. end
  13. local function swrite(self, data)
  14. while self.flushing do
  15. coroutine.yield()
  16. end
  17. if data and data:len() > 0 then
  18. self.wb = self.wb .. (data or "")
  19. end
  20. end
  21. local function sclose(self)
  22. self.sock:close()
  23. end
  24. local function sflush(self)
  25. self.flushing = true
  26. self.sock:write(self.wb)
  27. self.wb = ""
  28. self.flushing = false
  29. end
  30. function start()
  31. return os.spawn(function()
  32. local oout = io.output()
  33. local pname = os.taskInfo(os.pid()).name
  34. while true do
  35. local sock = minitel.listen(port)
  36. print(string.format("Connection from %s:%d",sock.addr,sock.port))
  37. os.spawn(function() _G.worked = {pcall(function()
  38. local fh = {}
  39. fh.sock = sock
  40. fh.read = sread
  41. fh.write = swrite
  42. fh.close = sclose
  43. fh.flush = sflush
  44. fh.wb = ""
  45. io.input(fh)
  46. io.output(fh)
  47. print(_OSVERSION.." - "..tostring(math.floor(computer.totalMemory()/1024)).."K RAM")
  48. local pid = os.spawn(shell.interactive,string.format(pname.." shell [%s:%d]",sock.addr,sock.port))
  49. repeat
  50. coroutine.yield()
  51. if fh.wb:len() > 0 then
  52. fh:flush()
  53. end
  54. until sock.state ~= "open" or not os.taskInfo(pid)
  55. sock:close()
  56. os.kill(pid)
  57. oout:write(string.format("Session %s:%d ended",sock.addr,sock.port))
  58. end)} end,string.format(pname.." [%s:%d]",sock.addr,sock.port))
  59. end
  60. end,"termsrv")
  61. end