#! /usr/bin/env python

"""
    start socket based minimal readline exec server
"""
import sys, socket, os

def runsocketcode(clientfile, g):
    try:
        source = clientfile.readline().rstrip()
    except Exception, e:
        raise SystemExit
    if not source:
        raise SystemExit
    source = eval(source)
    co = compile(source+'\n', '<remote-source>', 'exec')
    exec co in g
    
def serveonce(clientsock, name='stdin'):
    clientfile = clientsock.makefile('r+b', 0)
    g = {
        '__name__': '__socketclient__',
        '__file__': '<%s>' % (name,),
        '__clientsock__': clientsock,
        '__clientfile__': clientfile,
        '__runsocketcode__': runsocketcode,
    }
    try:
        runsocketcode(clientfile, g)
    finally:
        clientfile.close()
        clientsock.close()

def real_main():
    import sys
    hostport = eval(sys.argv[1])
    clientsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clientsock.connect(hostport)
    serveonce(clientsock)

def main():
    newglobals = {
        '__builtins__': sys.modules['__builtin__'],
        '__doc__': None,
        '__name__': '__main__',
    }
    sourcefile = __file__
    g = globals()
    g.clear()
    g.update(newglobals)
    serverglobals = {'__name__': '__socketclient__'}
    execfile(sourcefile, serverglobals, serverglobals)
    
if __name__ == '__main__':
    main()
elif __name__ == '__socketclient__':
    real_main()
