[pypy-svn] r33376 - in pypy/dist/pypy/module/rsocket: . test
arigo at codespeak.net
arigo at codespeak.net
Tue Oct 17 16:11:52 CEST 2006
Author: arigo
Date: Tue Oct 17 16:11:48 2006
New Revision: 33376
Added:
pypy/dist/pypy/module/rsocket/interp_func.py
- copied, changed from r33365, pypy/dist/pypy/module/_socket/interp_socket.py
pypy/dist/pypy/module/rsocket/interp_socket.py
- copied, changed from r33365, pypy/dist/pypy/module/_socket/interp_socket.py
pypy/dist/pypy/module/rsocket/socketerror.py
pypy/dist/pypy/module/rsocket/test/test_sock_app.py
- copied, changed from r33357, pypy/dist/pypy/module/_socket/test/test_socket2.py
Modified:
pypy/dist/pypy/module/rsocket/__init__.py
pypy/dist/pypy/module/rsocket/ctypes_socket.py
pypy/dist/pypy/module/rsocket/rsocket.py
Log:
Intermediate check-in (work in progress)
Modified: pypy/dist/pypy/module/rsocket/__init__.py
==============================================================================
--- pypy/dist/pypy/module/rsocket/__init__.py (original)
+++ pypy/dist/pypy/module/rsocket/__init__.py Tue Oct 17 16:11:48 2006
@@ -28,7 +28,7 @@
getdefaulttimeout setdefaulttimeout
""".split():
- Module.interpleveldefs[name] = 'interp_socket.%s' % (name, )
+ Module.interpleveldefs[name] = 'interp_func.%s' % (name, )
for constant, value in _c.constants.iteritems():
Module.interpleveldefs[constant] = "space.wrap(%r)" % value
Modified: pypy/dist/pypy/module/rsocket/ctypes_socket.py
==============================================================================
--- pypy/dist/pypy/module/rsocket/ctypes_socket.py (original)
+++ pypy/dist/pypy/module/rsocket/ctypes_socket.py Tue Oct 17 16:11:48 2006
@@ -37,6 +37,8 @@
linux = ctypes_platform.Defined('linux')
MS_WINDOWS = ctypes_platform.Defined('MS_WINDOWS')
INVALID_SOCKET = ctypes_platform.DefinedConstantInteger('INVALID_SOCKET')
+ INET_ADDRSTRLEN = ctypes_platform.DefinedConstantInteger('INET_ADDRSTRLEN')
+ INET6_ADDRSTRLEN= ctypes_platform.DefinedConstantInteger('INET6_ADDRSTRLEN')
constant_names = ['AF_APPLETALK', 'AF_ASH', 'AF_ATMPVC', 'AF_ATMSVC', 'AF_AX25',
'AF_BLUETOOTH', 'AF_BRIDGE', 'AF_ECONET', 'AF_INET', 'AF_INET6',
@@ -116,6 +118,8 @@
sockaddr_ptr = POINTER('sockaddr')
CConfig.in_addr = ctypes_platform.Struct('struct in_addr',
[('s_addr', c_uint)])
+CConfig.in6_addr = ctypes_platform.Struct('struct in6_addr',
+ [])
CConfig.sockaddr_in = ctypes_platform.Struct('struct sockaddr_in',
[('sin_family', c_int),
('sin_port', c_ushort),
@@ -180,6 +184,8 @@
O_NONBLOCK = cConfig.O_NONBLOCK
F_GETFL = cConfig.F_GETFL
F_SETFL = cConfig.F_SETFL
+INET_ADDRSTRLEN = cConfig.INET_ADDRSTRLEN or 16
+INET6_ADDRSTRLEN = cConfig.INET6_ADDRSTRLEN
linux = cConfig.linux
MS_WINDOWS = cConfig.MS_WINDOWS
@@ -204,6 +210,7 @@
sockaddr_un = cConfig.sockaddr_un
in_addr = cConfig.in_addr
in_addr_size = sizeof(in_addr)
+in6_addr = cConfig.in6_addr
addrinfo = cConfig.addrinfo
c_int_size = sizeof(c_int)
@@ -290,11 +297,11 @@
inet_ntoa.restype = c_char_p
inet_pton = socketdll.inet_pton
-inet_pton.argtypes = [c_int, c_char_p, sockaddr_ptr]
+inet_pton.argtypes = [c_int, c_char_p, c_void_p]
inet_pton.restype = c_int
inet_ntop = socketdll.inet_ntop
-inet_ntop.argtypes = [c_int, sockaddr_ptr, c_char_p, socklen_t]
+inet_ntop.argtypes = [c_int, c_void_p, c_char_p, socklen_t]
inet_ntop.restype = c_char_p
socketaccept = socketdll.accept
Modified: pypy/dist/pypy/module/rsocket/rsocket.py
==============================================================================
--- pypy/dist/pypy/module/rsocket/rsocket.py (original)
+++ pypy/dist/pypy/module/rsocket/rsocket.py Tue Oct 17 16:11:48 2006
@@ -8,7 +8,8 @@
#
# - support for non-Linux platforms
# - address families other than AF_INET, AF_INET6, AF_UNIX
-# - methods getsockopt(), setsockopt(), makefile(), gettimeout(), settimeout()
+# - methods dup(), getsockopt(), setsockopt(), makefile(),
+# gettimeout(), settimeout()
# - functions gethostbyaddr(), gethostbyname_ex(), getnameinfo(),
# getprotobyname(), getservbyname(), getservbyport(),
# getdefaulttimeout(), setdefaulttimeout()
@@ -16,7 +17,7 @@
from pypy.rpython.objectmodel import instantiate
from pypy.module.rsocket import ctypes_socket as _c
-from ctypes import cast, POINTER, c_char, c_char_p, pointer, byref
+from ctypes import cast, POINTER, c_char, c_char_p, pointer, byref, c_void_p
from ctypes import create_string_buffer, sizeof
from pypy.rpython.rctypes.astruct import offsetof
@@ -142,13 +143,13 @@
def as_sockaddr_in(self):
if self.addrlen != INETAddress.maxlen:
- raise ValueError("invalid address")
+ raise RSocketError("invalid address")
return cast(pointer(self.addr), POINTER(_c.sockaddr_in)).contents
def __repr__(self):
try:
return '<INETAddress %s:%d>' % (self.get_host(), self.get_port())
- except (ValueError, GAIError):
+ except SocketError:
return '<INETAddress ?>'
def get_port(self):
@@ -188,7 +189,7 @@
def as_sockaddr_in6(self):
if self.addrlen != INET6Address.maxlen:
- raise ValueError("invalid address")
+ raise RSocketError("invalid address")
return cast(pointer(self.addr), POINTER(_c.sockaddr_in6)).contents
def __repr__(self):
@@ -197,7 +198,7 @@
self.get_port(),
self.get_flowinfo(),
self.get_scope_id())
- except (ValueError, GAIError):
+ except SocketError:
return '<INET6Address ?>'
def get_port(self):
@@ -264,13 +265,13 @@
def as_sockaddr_un(self):
if self.addrlen <= offsetof(_c.sockaddr_un, 'sun_path'):
- raise ValueError("invalid address")
+ raise RSocketError("invalid address")
return cast(pointer(self.addr), POINTER(_c.sockaddr_un)).contents
def __repr__(self):
try:
return '<UNIXAddress %r>' % (self.get_path(),)
- except ValueError:
+ except SocketError:
return '<UNIXAddress ?>'
def get_path(self):
@@ -330,12 +331,13 @@
result.addrlen = sizeof(_c.sockaddr_in)
return result
-##def make_null_address(klass):
-## result = instantiate(klass)
-## result.addr = cast(pointer(klass.struct()), _c.sockaddr_ptr).contents
-## result.addrlen = 0
-## return result
-##make_null_address._annspecialcase_ = 'specialize:arg(0)'
+def make_null_address(family):
+ klass = familyclass(family)
+ buf = create_string_buffer(klass.maxlen)
+ result = instantiate(klass)
+ result.addr = cast(buf, _c.sockaddr_ptr).contents
+ result.addrlen = 0
+ return result, len(buf)
def copy_buffer(ptr, size):
buf = create_string_buffer(size)
@@ -378,12 +380,8 @@
return af_get(self.family).from_object(space, w_address)
def _addrbuf(self):
- klass = familyclass(self.family)
- buf = create_string_buffer(klass.maxlen)
- result = instantiate(klass)
- result.addr = cast(buf, _c.sockaddr_ptr).contents
- result.addrlen = 0
- return result, _c.socklen_t(len(buf))
+ addr, maxlen = make_null_address(self.family)
+ return addr, _c.socklen_t(maxlen)
def accept(self):
"""Wait for an incoming connection.
@@ -425,7 +423,10 @@
return res
def fileno(self):
- return self.fd
+ fd = self.fd
+ if _c.invalid_socket(fd):
+ raise RSocketError("socket already closed")
+ return fd
def getsockname(self):
"""Return the address of the local endpoint."""
@@ -602,7 +603,9 @@
def gethostbyname(name):
# this is explicitly not working with IPv6, because the docs say it
# should not. Just use makeipaddr(name) for an IPv6-friendly version...
- return makeipaddr(name, instantiate(INETAddress))
+ result = instantiate(INETAddress)
+ makeipaddr(name, result)
+ return result
def getaddrinfo(host, port_or_service,
family=_c.AF_UNSPEC, socktype=0, proto=0, flags=0):
@@ -635,3 +638,56 @@
finally:
_c.freeaddrinfo(res)
return result
+
+def inet_aton(ip):
+ "IPv4 dotted string -> packed 32-bits string"
+ buf = create_string_buffer(sizeof(_c.in_addr))
+ if inet_aton(ip, cast(buf, POINTER(_c.in_addr))):
+ return buf.raw
+ else:
+ raise RSocketError("illegal IP address string passed to inet_aton")
+
+def inet_ntoa(packed):
+ "packet 32-bits string -> IPv4 dotted string"
+ if len(packed) != sizeof(_c.in_addr):
+ raise RSocketError("packed IP wrong length for inet_ntoa")
+ buf = create_string_buffer(sizeof(_c.in_addr))
+ buf.raw = packed
+ return inet_ntoa(cast(buf, POINTER(_c.in_addr)).contents)
+
+def inet_pton(family, ip):
+ "human-readable string -> packed string"
+ if family == _c.AF_INET:
+ size = sizeof(_c.in_addr)
+ elif _c.AF_INET6 is not None and family == _c.AF_INET6:
+ size = sizeof(_c.in6_addr)
+ else:
+ raise RSocketError("unknown address family")
+ buf = create_string_buffer(size)
+ res = _c.inet_pton(family, ip, cast(buf, c_void_p))
+ if res < 0:
+ raise last_error()
+ elif res == 0:
+ raise RSocketError("illegal IP address string passed to inet_pton")
+ else:
+ return buf.raw
+
+def inet_ntop(family, packed):
+ "packed string -> human-readable string"
+ if family == _c.AF_INET:
+ srcsize = sizeof(_c.in_addr)
+ dstsize = _c.INET_ADDRSTRLEN
+ elif _c.AF_INET6 is not None and family == _c.AF_INET6:
+ srcsize = sizeof(_c.in6_addr)
+ dstsize = _c.INET6_ADDRSTRLEN
+ else:
+ raise RSocketError("unknown address family")
+ if len(packed) != srcsize:
+ raise RSocketError("packed IP wrong length for inet_ntop")
+ srcbuf = create_string_buffer(srcsize)
+ srcbuf.raw = packed
+ dstbuf = create_string_buffer(dstsize)
+ res = _c.inet_ntop(family, cast(srcbuf, c_void_p), dstbuf, dstsize)
+ if res is None:
+ raise last_error()
+ return res
Added: pypy/dist/pypy/module/rsocket/socketerror.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/module/rsocket/socketerror.py Tue Oct 17 16:11:48 2006
@@ -0,0 +1,68 @@
+import sys, errno
+
+if sys.platform == 'win32':
+ WIN32_ERROR_MESSAGES = {
+ errno.WSAEINTR: "Interrupted system call",
+ errno.WSAEBADF: "Bad file descriptor",
+ errno.WSAEACCES: "Permission denied",
+ errno.WSAEFAULT: "Bad address",
+ errno.WSAEINVAL: "Invalid argument",
+ errno.WSAEMFILE: "Too many open files",
+ errno.WSAEWOULDBLOCK:
+ "The socket operation could not complete without blocking",
+ errno.WSAEINPROGRESS: "Operation now in progress",
+ errno.WSAEALREADY: "Operation already in progress",
+ errno.WSAENOTSOCK: "Socket operation on non-socket",
+ errno.WSAEDESTADDRREQ: "Destination address required",
+ errno.WSAEMSGSIZE: "Message too long",
+ errno.WSAEPROTOTYPE: "Protocol wrong type for socket",
+ errno.WSAENOPROTOOPT: "Protocol not available",
+ errno.WSAEPROTONOSUPPORT: "Protocol not supported",
+ errno.WSAESOCKTNOSUPPORT: "Socket type not supported",
+ errno.WSAEOPNOTSUPP: "Operation not supported",
+ errno.WSAEPFNOSUPPORT: "Protocol family not supported",
+ errno.WSAEAFNOSUPPORT: "Address family not supported",
+ errno.WSAEADDRINUSE: "Address already in use",
+ errno.WSAEADDRNOTAVAIL: "Can't assign requested address",
+ errno.WSAENETDOWN: "Network is down",
+ errno.WSAENETUNREACH: "Network is unreachable",
+ errno.WSAENETRESET: "Network dropped connection on reset",
+ errno.WSAECONNABORTED: "Software caused connection abort",
+ errno.WSAECONNRESET: "Connection reset by peer",
+ errno.WSAENOBUFS: "No buffer space available",
+ errno.WSAEISCONN: "Socket is already connected",
+ errno.WSAENOTCONN: "Socket is not connected",
+ errno.WSAESHUTDOWN: "Can't send after socket shutdown",
+ errno.WSAETOOMANYREFS: "Too many references: can't splice",
+ errno.WSAETIMEDOUT: "Operation timed out",
+ errno.WSAECONNREFUSED: "Connection refused",
+ errno.WSAELOOP: "Too many levels of symbolic links",
+ errno.WSAENAMETOOLONG: "File name too long",
+ errno.WSAEHOSTDOWN: "Host is down",
+ errno.WSAEHOSTUNREACH: "No route to host",
+ errno.WSAENOTEMPTY: "Directory not empty",
+ errno.WSAEPROCLIM: "Too many processes",
+ errno.WSAEUSERS: "Too many users",
+ errno.WSAEDQUOT: "Disc quota exceeded",
+ errno.WSAESTALE: "Stale NFS file handle",
+ errno.WSAEREMOTE: "Too many levels of remote in path",
+ errno.WSASYSNOTREADY: "Network subsystem is unvailable",
+ errno.WSAVERNOTSUPPORTED: "WinSock version is not supported",
+ errno.WSANOTINITIALISED: "Successful WSAStartup() not yet performed",
+ errno.WSAEDISCON: "Graceful shutdown in progress",
+
+ # Resolver errors
+ # XXX Not exported by errno. Replace by the values in winsock.h
+ # errno.WSAHOST_NOT_FOUND: "No such host is known",
+ # errno.WSATRY_AGAIN: "Host not found, or server failed",
+ # errno.WSANO_RECOVERY: "Unexpected server error encountered",
+ # errno.WSANO_DATA: "Valid name without requested data",
+ # errno.WSANO_ADDRESS: "No address, look for MX record",
+ }
+
+ def socket_strerror(errno):
+ return WIN32_ERROR_MESSAGES.get(errno, "winsock error")
+else:
+ from pypy.module.rsocket import ctypes_socket as _c
+ def socket_strerror(errno):
+ return _c.strerror(errno)
More information about the Pypy-commit
mailing list