[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