[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