""" |
InputOutput Classes used for connecting gateways |
across process or computer barriers. |
""" |
|
import socket, os, sys |
|
class SocketIO: |
server_stmt = """ |
io = SocketIO(clientsock) |
import sys |
#try: |
# sys.stdout = sys.stderr = open('/tmp/execnet-socket-debug.log', 'a', 0) |
#except (IOError, OSError): |
# sys.stdout = sys.stderr = open('/dev/null', 'w') |
#print '='*60 |
""" |
|
error = (socket.error, EOFError) |
def __init__(self, sock): |
self.sock = sock |
try: |
sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1) |
sock.setsockopt(socket.SOL_IP, socket.IP_TOS, 0x10) |
except socket.error, e: |
print "WARNING: Cannot set socket option:", str(e) |
self.readable = self.writeable = True |
|
def read(self, numbytes): |
"Read exactly 'bytes' bytes from the socket." |
buf = "" |
while len(buf) < numbytes: |
t = self.sock.recv(numbytes - len(buf)) |
|
if not t: |
raise EOFError |
buf += t |
return buf |
|
def write(self, data): |
"""write out all bytes to the socket. """ |
self.sock.sendall(data) |
|
def close_read(self): |
if self.readable: |
self.sock.shutdown(0) |
self.readable = None |
def close_write(self): |
if self.writeable: |
self.sock.shutdown(1) |
self.writeable = None |
|
class Popen2IO: |
server_stmt = """ |
import sys, StringIO |
io = Popen2IO(sys.stdout, sys.stdin) |
sys.stdout = sys.stderr = StringIO.StringIO() |
#try: |
# sys.stdout = sys.stderr = open('/tmp/execnet-popen-debug.log', 'a', 0) |
#except (IOError, OSError): |
# sys.stdout = sys.stderr = open('/dev/null', 'w') |
#print '='*60 |
""" |
error = (IOError, OSError, EOFError) |
|
def __init__(self, infile, outfile): |
if sys.platform == 'win32': |
import msvcrt |
msvcrt.setmode(infile.fileno(), os.O_BINARY) |
msvcrt.setmode(outfile.fileno(), os.O_BINARY) |
self.outfile, self.infile = infile, outfile |
self.readable = self.writeable = True |
|
def read(self, numbytes): |
"""Read exactly 'bytes' bytes from the pipe. """ |
|
|
s = self.infile.read(numbytes) |
|
if len(s) < numbytes: |
raise EOFError |
return s |
|
def write(self, data): |
"""write out all bytes to the pipe. """ |
|
|
self.outfile.write(data) |
self.outfile.flush() |
|
def close_read(self): |
if self.readable: |
self.infile.close() |
self.readable = None |
def close_write(self): |
if self.writeable: |
self.outfile.close() |
self.writeable = None |
|