diff --git a/halyde/apps/telnet.lua b/halyde/apps/telnet.lua new file mode 100644 index 0000000..11ac872 --- /dev/null +++ b/halyde/apps/telnet.lua @@ -0,0 +1,60 @@ +-- Despite the name it's not telnet +local component = require("component") +if not component.isAvailable("internet") then + terminal.write("telnet: this program requires an internet card to run\n") + return +end + +local internet = component.internet +if not internet.isTcpEnabled() then + terminal.write("telnet: TCP disabled\n") + return +end + +local arg = {...} +local host = arg[1] +local port = tonumber(arg[2]) + +local sock = internet.connect(host, port) + +local connected = false +local err +for _ = 1, 5 do + local ok + ok, err = sock.finishConnect() + if ok then + connected = true + break + end + coroutine.yield() +end +if not connected then + print("telnet: " .. err) + return +end + +print(("connected to %s:%d"):format(host, port)) + +while true do + local fromSocket = sock.read(math.maxinteger or math.huge) + if fromSocket == nil then + print("telnet: connection closed") + sock.close() + return + end + terminal.write(fromSocket) + terminal.flush() + local fromTerminal = terminal.read() + if fromTerminal == "" then + sock.close() + return + end + while fromTerminal ~= "" do + local nbytes, err = sock.write(fromTerminal .. "\r\n") + if err then + print("telnet: " .. err) + return + end + fromTerminal = fromTerminal:sub(nbytes + 1) + end +end