]> git.proxmox.com Git - mirror_edk2.git/blobdiff - AppPkg/Applications/Python/Python-2.7.2/Demo/sockets/telnet.py
AppPkg/Applications/Python: Add Python 2.7.2 sources since the release of Python...
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Demo / sockets / telnet.py
diff --git a/AppPkg/Applications/Python/Python-2.7.2/Demo/sockets/telnet.py b/AppPkg/Applications/Python/Python-2.7.2/Demo/sockets/telnet.py
new file mode 100644 (file)
index 0000000..1702392
--- /dev/null
@@ -0,0 +1,109 @@
+#! /usr/bin/env python\r
+\r
+# Minimal interface to the Internet telnet protocol.\r
+#\r
+# It refuses all telnet options and does not recognize any of the other\r
+# telnet commands, but can still be used to connect in line-by-line mode.\r
+# It's also useful to play with a number of other services,\r
+# like time, finger, smtp and even ftp.\r
+#\r
+# Usage: telnet host [port]\r
+#\r
+# The port may be a service name or a decimal port number;\r
+# it defaults to 'telnet'.\r
+\r
+\r
+import sys, posix, time\r
+from socket import *\r
+\r
+BUFSIZE = 1024\r
+\r
+# Telnet protocol characters\r
+\r
+IAC  = chr(255) # Interpret as command\r
+DONT = chr(254)\r
+DO   = chr(253)\r
+WONT = chr(252)\r
+WILL = chr(251)\r
+\r
+def main():\r
+    host = sys.argv[1]\r
+    try:\r
+        hostaddr = gethostbyname(host)\r
+    except error:\r
+        sys.stderr.write(sys.argv[1] + ': bad host name\n')\r
+        sys.exit(2)\r
+    #\r
+    if len(sys.argv) > 2:\r
+        servname = sys.argv[2]\r
+    else:\r
+        servname = 'telnet'\r
+    #\r
+    if '0' <= servname[:1] <= '9':\r
+        port = eval(servname)\r
+    else:\r
+        try:\r
+            port = getservbyname(servname, 'tcp')\r
+        except error:\r
+            sys.stderr.write(servname + ': bad tcp service name\n')\r
+            sys.exit(2)\r
+    #\r
+    s = socket(AF_INET, SOCK_STREAM)\r
+    #\r
+    try:\r
+        s.connect((host, port))\r
+    except error, msg:\r
+        sys.stderr.write('connect failed: ' + repr(msg) + '\n')\r
+        sys.exit(1)\r
+    #\r
+    pid = posix.fork()\r
+    #\r
+    if pid == 0:\r
+        # child -- read stdin, write socket\r
+        while 1:\r
+            line = sys.stdin.readline()\r
+            s.send(line)\r
+    else:\r
+        # parent -- read socket, write stdout\r
+        iac = 0         # Interpret next char as command\r
+        opt = ''        # Interpret next char as option\r
+        while 1:\r
+            data = s.recv(BUFSIZE)\r
+            if not data:\r
+                # EOF; kill child and exit\r
+                sys.stderr.write( '(Closed by remote host)\n')\r
+                posix.kill(pid, 9)\r
+                sys.exit(1)\r
+            cleandata = ''\r
+            for c in data:\r
+                if opt:\r
+                    print ord(c)\r
+                    s.send(opt + c)\r
+                    opt = ''\r
+                elif iac:\r
+                    iac = 0\r
+                    if c == IAC:\r
+                        cleandata = cleandata + c\r
+                    elif c in (DO, DONT):\r
+                        if c == DO: print '(DO)',\r
+                        else: print '(DONT)',\r
+                        opt = IAC + WONT\r
+                    elif c in (WILL, WONT):\r
+                        if c == WILL: print '(WILL)',\r
+                        else: print '(WONT)',\r
+                        opt = IAC + DONT\r
+                    else:\r
+                        print '(command)', ord(c)\r
+                elif c == IAC:\r
+                    iac = 1\r
+                    print '(IAC)',\r
+                else:\r
+                    cleandata = cleandata + c\r
+            sys.stdout.write(cleandata)\r
+            sys.stdout.flush()\r
+\r
+\r
+try:\r
+    main()\r
+except KeyboardInterrupt:\r
+    pass\r