[pypy-svn] r25831 - pypy/dist/pypy/rpython/rctypes/socketmodule

arigo at codespeak.net arigo at codespeak.net
Fri Apr 14 18:14:25 CEST 2006


Author: arigo
Date: Fri Apr 14 18:14:23 2006
New Revision: 25831

Added:
   pypy/dist/pypy/rpython/rctypes/socketmodule/   (props changed)
   pypy/dist/pypy/rpython/rctypes/socketmodule/_socket.py   (contents, props changed)
   pypy/dist/pypy/rpython/rctypes/socketmodule/ctypes_socket.py   (contents, props changed)
Log:
A draft start at a ctypes-based socket module.


Added: pypy/dist/pypy/rpython/rctypes/socketmodule/_socket.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/rctypes/socketmodule/_socket.py	Fri Apr 14 18:14:23 2006
@@ -0,0 +1,41 @@
+import ctypes_socket as _c
+
+
+globals().update(_c.constants)
+
+
+class socket(object):
+
+    def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0):
+        self.family = family
+        self.type   = type
+        self.proto  = proto
+        self._fd = _c.socket(family, type, proto)
+        if self._fd == -1:
+            XXX
+
+    def __del__(self):
+        if self._fd != -1:
+            _c.closesocket(self._fd)
+
+    def close(self):
+        fd = self._fd
+        if fd != -1:
+            self._fd = -1
+            _c.closesocket(fd)
+
+    def bind(self, addr):
+        caddr, caddrlen = self._getsockaddr(addr)
+        res = _c.bind(self._fd, caddr, caddrlen)
+        if res < 0:
+            XXX
+
+    def _getsockaddr(self, addr):
+        if self.family == AF_INET:
+            (host, port) = addr
+            caddr = sockaddr_in()
+            caddr.sin_family = AF_INET
+            caddr.sin_port   = port
+            caddr.sin_addr.s_addr = getaddrinfo(host)
+        else:
+            XXX

Added: pypy/dist/pypy/rpython/rctypes/socketmodule/ctypes_socket.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/rctypes/socketmodule/ctypes_socket.py	Fri Apr 14 18:14:23 2006
@@ -0,0 +1,55 @@
+import os
+from pypy.rpython.rctypes import ctypes_platform
+from ctypes import *
+
+includes = ('sys/types.h', 'sys/socket.h', 'netinet/in.h', 'netdb.h')
+HEADER = ''.join(['#include <%s>\n' % filename for filename in includes])
+constants = {}
+
+# constants
+for name in ['AF_INET',
+             'SOCK_STREAM',
+             'SOCK_DGRAM',
+             ]:
+    constants[name] = ctypes_platform.getconstantinteger(name, HEADER)
+
+# types
+sockaddr = ctypes_platform.getstruct('struct sockaddr', HEADER,
+                                     [('sa_family', c_int),
+                                      # unknown and variable fields follow
+                                      ])
+in_addr = ctypes_platform.getstruct('struct in_addr', HEADER,
+                                    [('s_addr', c_uint)])
+sockaddr_in = ctypes_platform.getstruct('struct sockaddr_in', HEADER,
+                                        [('sin_family', c_int),
+                                         ('sin_port',   c_ushort),
+                                         ('sin_addr',   in_addr)])
+addrinfo_ptr = POINTER("addrinfo")
+addrinfo = ctypes_platform.getstruct('struct addrinfo', HEADER,
+                                     [('ai_flags', c_int),
+                                      ('ai_family', c_int),
+                                      ('ai_socktype', c_int),
+                                      ('ai_protocol', c_int),
+                                      ('ai_addrlen', c_int),
+                                      ('ai_addr', POINTER(sockaddr)),
+                                      ('ai_canonname', c_char_p),
+                                      ('ai_next', addrinfo_ptr)])
+SetPointerType(addrinfo_ptr, addrinfo)
+
+# functions
+socketdll = cdll.load('libc.so.6')
+
+socket = socketdll.socket
+socket.argtypes = [c_int, c_int, c_int]
+socket.restype = c_int
+
+socketclose = os.close
+
+getaddrinfo = socketdll.getaddrinfo
+getaddrinfo.argtypes = [c_char_p, c_char_p, POINTER(addrinfo),
+                        POINTER(POINTER(addrinfo))]
+getaddrinfo.restype = c_int
+
+freeaddrinfo = socketdll.freeaddrinfo
+freeaddrinfo.argtypes = [POINTER(addrinfo)]
+freeaddrinfo.restype = None



More information about the Pypy-commit mailing list