[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