Author: Amaury Forgeot d'Arc <amaur...@gmail.com> Branch: Changeset: r57541:968e401d5ff6 Date: 2012-09-25 01:21 +0200 http://bitbucket.org/pypy/pypy/changeset/968e401d5ff6/
Log: Reduce differences in rsocket.py between default and py3k: RSocket.accept only returns the file descriptor, the client is responsible for creating the new socket object. diff --git a/pypy/module/_socket/interp_socket.py b/pypy/module/_socket/interp_socket.py --- a/pypy/module/_socket/interp_socket.py +++ b/pypy/module/_socket/interp_socket.py @@ -29,7 +29,9 @@ info is a pair (hostaddr, port). """ try: - sock, addr = self.accept(W_RSocket) + fd, addr = self.accept() + sock = rsocket.make_socket( + fd, self.family, self.type, self.proto, W_RSocket) return space.newtuple([space.wrap(sock), addr.as_object(sock.fd, space)]) except SocketError, e: diff --git a/pypy/rlib/rsocket.py b/pypy/rlib/rsocket.py --- a/pypy/rlib/rsocket.py +++ b/pypy/rlib/rsocket.py @@ -609,9 +609,11 @@ """ _mixin_ = True # for interp_socket.py fd = _c.INVALID_SOCKET - def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0): + def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, + fd=_c.INVALID_SOCKET): """Create a new socket.""" - fd = _c.socket(family, type, proto) + if _c.invalid_socket(fd): + fd = _c.socket(family, type, proto) if _c.invalid_socket(fd): raise self.error_handler() # PLAT RISCOS @@ -717,11 +719,9 @@ addrlen_p[0] = rffi.cast(_c.socklen_t, maxlen) return addr, addr.addr_p, addrlen_p - def accept(self, SocketClass=None): + def accept(self): """Wait for an incoming connection. - Return (new socket object, client address).""" - if SocketClass is None: - SocketClass = RSocket + Return (new socket fd, client address).""" if self._select(False) == 1: raise SocketTimeout address, addr_p, addrlen_p = self._addrbuf() @@ -734,9 +734,7 @@ if _c.invalid_socket(newfd): raise self.error_handler() address.addrlen = rffi.cast(lltype.Signed, addrlen) - sock = make_socket(newfd, self.family, self.type, self.proto, - SocketClass) - return (sock, address) + return (newfd, address) def bind(self, address): """Bind the socket to a local address.""" @@ -755,6 +753,11 @@ if res != 0: raise self.error_handler() + def detach(self): + fd = self.fd + self.fd = _c.INVALID_SOCKET + return fd + if _c.WIN32: def _connect(self, address): """Connect the socket to a remote address.""" diff --git a/pypy/rlib/test/test_rsocket.py b/pypy/rlib/test/test_rsocket.py --- a/pypy/rlib/test/test_rsocket.py +++ b/pypy/rlib/test/test_rsocket.py @@ -167,7 +167,8 @@ lock.acquire() thread.start_new_thread(connecting, ()) print 'waiting for connection' - s1, addr2 = sock.accept() + fd1, addr2 = sock.accept() + s1 = RSocket(fd=fd1) print 'connection accepted' lock.acquire() print 'connecting side knows that the connection was accepted too' @@ -255,7 +256,8 @@ if errcodesok: assert err.value.errno in (errno.EINPROGRESS, errno.EWOULDBLOCK) - s1, addr2 = sock.accept() + fd1, addr2 = sock.accept() + s1 = RSocket(fd=fd1) s1.setblocking(False) assert addr.eq(s2.getpeername()) assert addr2.get_port() == s2.getsockname().get_port() @@ -414,7 +416,8 @@ clientsock = RSocket(AF_UNIX) clientsock.connect(a) - s, addr = serversock.accept() + fd, addr = serversock.accept() + s = RSocket(AF_UNIX, fd=fd) s.send('X') data = clientsock.recv(100) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit