[pypy-svn] r26212 - in pypy/dist/pypy/rpython/rctypes/socketmodule: . test
ac at codespeak.net
ac at codespeak.net
Mon Apr 24 04:41:24 CEST 2006
Author: ac
Date: Mon Apr 24 04:41:24 2006
New Revision: 26212
Modified:
pypy/dist/pypy/rpython/rctypes/socketmodule/_socket.py
pypy/dist/pypy/rpython/rctypes/socketmodule/test/test__socket.py
Log:
(aleale, arre)
Implement accept.
Modified: pypy/dist/pypy/rpython/rctypes/socketmodule/_socket.py
==============================================================================
--- pypy/dist/pypy/rpython/rctypes/socketmodule/_socket.py (original)
+++ pypy/dist/pypy/rpython/rctypes/socketmodule/_socket.py Mon Apr 24 04:41:24 2006
@@ -11,14 +11,17 @@
class socket(object):
- def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0):
+ def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _fd=None):
self.family = family
self.type = type
self.proto = proto
- self._fd = _c.socket(family, type, proto)
- if self._fd == -1:
- raise error(_c.errno.value)
-
+ if _fd is None:
+ self._fd = _c.socket(family, type, proto)
+ if self._fd == -1:
+ raise error(_c.errno.value)
+ else:
+ self._fd = _fd
+
def __del__(self):
if self._fd != -1:
_c.socketclose(self._fd)
@@ -45,20 +48,34 @@
_c.inet_aton(ip, pointer(caddr.sin_addr))
return caddr
else:
- raise NotImplementedError('sorry') # XXX
-
+ raise NotImplementedError('Unsupported address family') # XXX
+
+ def _convert_from_caddr(self, caddr):
+ family = caddr.sa_family
+ if family == AF_INET:
+ caddr = cast(pointer(caddr), POINTER(_c.sockaddr_in)).contents
+ return (_c.inet_ntoa(caddr.sin_addr), _c.ntohs(caddr.sin_port))
+ else:
+ raise NotImplementedError('Unsupported address family') # XXX
+
def listen(self, backlog):
if self._fd != -1:
fd = self._fd
res = _c.listen(fd, backlog)
if res == -1:
- XXX
+ raise error(_c.errno.value)
else:
XXX
def accept(self):
- pass
-
+ peeraddr = _c.sockaddr()
+
+ newfd = _c.socketaccept(self._fd, pointer(peeraddr), sizeof(peeraddr))
+ if newfd < 0:
+ raise error(_c.errno.value)
+ newsocket = socket(self.family, self.type, self.proto, newfd)
+ return (newsocket, self._convert_from_caddr(peeraddr))
+
def connect_ex(self):
pass
Modified: pypy/dist/pypy/rpython/rctypes/socketmodule/test/test__socket.py
==============================================================================
--- pypy/dist/pypy/rpython/rctypes/socketmodule/test/test__socket.py (original)
+++ pypy/dist/pypy/rpython/rctypes/socketmodule/test/test__socket.py Mon Apr 24 04:41:24 2006
@@ -1,5 +1,5 @@
import py
-import _socket
+import _socket, errno
from pypy.rpython.rctypes.socketmodule import _socket as _rsocket
def interface_matcher(interface1, interface2):
@@ -13,3 +13,10 @@
#interface_matcher(_rsocket, _socket)
interface_matcher(_socket.socket, _rsocket.socket)
interface_matcher(_rsocket.socket, _socket.socket)
+
+def test_accept():
+ s = _rsocket.socket(_rsocket.AF_INET, _rsocket.SOCK_STREAM,
+ _socket.IPPROTO_TCP)
+ e = py.test.raises(_rsocket.error, s.accept).value
+ assert e.args[0] == errno.EINVAL
+
More information about the Pypy-commit
mailing list