diff options
Diffstat (limited to 'Lib/plat-beos/socket.py')
-rw-r--r-- | Lib/plat-beos/socket.py | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/Lib/plat-beos/socket.py b/Lib/plat-beos/socket.py new file mode 100644 index 0000000..d3d26ed --- /dev/null +++ b/Lib/plat-beos/socket.py @@ -0,0 +1,133 @@ +"Socket wrapper for BeOS, which does not support dup()." + +# (And hence, fromfd() and makefile() are unimplemented in C....) + +# XXX Living dangerously here -- close() is implemented by deleting a +# reference. Thus we rely on the real _socket module to close on +# deallocation, and also hope that nobody keeps a reference to our _sock +# member. + + + +try: + from _socket import * +except ImportError: + from socket import * + +_realsocketcall = socket + + +def socket(family, type, proto=0): + return _socketobject(_realsocketcall(family, type, proto)) + + +class _socketobject: + + def __init__(self, sock): + self._sock = sock + + def close(self): + self._sock = 0 + + def __del__(self): + self.close() + + def accept(self): + sock, addr = self._sock.accept() + return _socketobject(sock), addr + + def dup(self): + return _socketobject(self._sock) + + def makefile(self, mode='r', bufsize=-1): + return _fileobject(self._sock, mode, bufsize) + + _s = "def %s(self, *args): return apply(self._sock.%s, args)\n\n" + for _m in ('bind', 'connect', 'fileno', 'listen', + 'getpeername', 'getsockname', + 'getsockopt', 'setsockopt', + 'recv', 'recvfrom', 'send', 'sendto', + 'setblocking', + 'shutdown'): + exec _s % (_m, _m) + + +class _fileobject: + + def __init__(self, sock, mode, bufsize): + self._sock = sock + self._mode = mode + if bufsize < 0: + bufsize = 512 + self._rbufsize = max(1, bufsize) + self._wbufsize = bufsize + self._wbuf = self._rbuf = "" + + def close(self): + try: + if self._sock: + self.flush() + finally: + self._sock = 0 + + def __del__(self): + self.close() + + def flush(self): + if self._wbuf: + self._sock.send(self._wbuf) + self._wbuf = "" + + def fileno(self): + return self._sock.fileno() + + def write(self, data): + self._wbuf = self._wbuf + data + if self._wbufsize == 1: + if '\n' in data: + self.flush() + else: + if len(self._wbuf) >= self._wbufsize: + self.flush() + + def writelines(self, list): + filter(self._sock.send, list) + self.flush() + + def read(self, n=-1): + if n >= 0: + while len(self._rbuf) < n: + new = self._sock.recv(self._rbufsize) + if not new: break + self._rbuf = self._rbuf + new + data, self._rbuf = self._rbuf[:n], self._rbuf[n:] + return data + while 1: + new = self._sock.recv(self._rbufsize) + if not new: break + self._rbuf = self._rbuf + new + data, self._rbuf = self._rbuf, "" + return data + + def readline(self): + import string + data = "" + i = string.find(self._rbuf, '\n') + while i < 0: + new = self._sock.recv(self._rbufsize) + if not new: break + i = string.find(new, '\n') + if i >= 0: i = i + len(self._rbuf) + self._rbuf = self._rbuf + new + if i < 0: i = len(self._rbuf) + else: i = i+1 + data, self._rbuf = self._rbuf[:i], self._rbuf[i:] + return data + + def readlines(self): + list = [] + while 1: + line = self.readline() + if not line: break + list.append(line) + return list |