symbian-qemu-0.9.1-12/python-2.6.1/Demo/sockets/telnet.py
author Gareth Stockwell <gareth.stockwell@accenture.com>
Wed, 22 Sep 2010 15:40:40 +0100
branchgraphics-phase-3
changeset 111 345f1c88c950
parent 1 2fb8b9db1c86
permissions -rw-r--r--
Fixes to syborg-graphicswrapper.vcproj These changes allow syborg-graphicswrapper to link against the hostthreadadapter and khronosapiwrapper libraries built by the graphics.simulator component. The .vcproj file uses relative paths, which requires that the following three packages are laid out as follows: os/ graphics adapt/ graphics.simulator qemu

#! /usr/bin/env python

# Minimal interface to the Internet telnet protocol.
#
# It refuses all telnet options and does not recognize any of the other
# telnet commands, but can still be used to connect in line-by-line mode.
# It's also useful to play with a number of other services,
# like time, finger, smtp and even ftp.
#
# Usage: telnet host [port]
#
# The port may be a service name or a decimal port number;
# it defaults to 'telnet'.


import sys, posix, time
from socket import *

BUFSIZE = 1024

# Telnet protocol characters

IAC  = chr(255) # Interpret as command
DONT = chr(254)
DO   = chr(253)
WONT = chr(252)
WILL = chr(251)

def main():
    host = sys.argv[1]
    try:
        hostaddr = gethostbyname(host)
    except error:
        sys.stderr.write(sys.argv[1] + ': bad host name\n')
        sys.exit(2)
    #
    if len(sys.argv) > 2:
        servname = sys.argv[2]
    else:
        servname = 'telnet'
    #
    if '0' <= servname[:1] <= '9':
        port = eval(servname)
    else:
        try:
            port = getservbyname(servname, 'tcp')
        except error:
            sys.stderr.write(servname + ': bad tcp service name\n')
            sys.exit(2)
    #
    s = socket(AF_INET, SOCK_STREAM)
    #
    try:
        s.connect((host, port))
    except error, msg:
        sys.stderr.write('connect failed: ' + repr(msg) + '\n')
        sys.exit(1)
    #
    pid = posix.fork()
    #
    if pid == 0:
        # child -- read stdin, write socket
        while 1:
            line = sys.stdin.readline()
            s.send(line)
    else:
        # parent -- read socket, write stdout
        iac = 0         # Interpret next char as command
        opt = ''        # Interpret next char as option
        while 1:
            data = s.recv(BUFSIZE)
            if not data:
                # EOF; kill child and exit
                sys.stderr.write( '(Closed by remote host)\n')
                posix.kill(pid, 9)
                sys.exit(1)
            cleandata = ''
            for c in data:
                if opt:
                    print ord(c)
                    s.send(opt + c)
                    opt = ''
                elif iac:
                    iac = 0
                    if c == IAC:
                        cleandata = cleandata + c
                    elif c in (DO, DONT):
                        if c == DO: print '(DO)',
                        else: print '(DONT)',
                        opt = IAC + WONT
                    elif c in (WILL, WONT):
                        if c == WILL: print '(WILL)',
                        else: print '(WONT)',
                        opt = IAC + DONT
                    else:
                        print '(command)', ord(c)
                elif c == IAC:
                    iac = 1
                    print '(IAC)',
                else:
                    cleandata = cleandata + c
            sys.stdout.write(cleandata)
            sys.stdout.flush()


try:
    main()
except KeyboardInterrupt:
    pass