[pypy-svn] r45995 - pypy/branch/pypy-more-rtti-inprogress/rlib

fijal at codespeak.net fijal at codespeak.net
Sun Aug 26 16:39:39 CEST 2007


Author: fijal
Date: Sun Aug 26 16:39:38 2007
New Revision: 45995

Added:
   pypy/branch/pypy-more-rtti-inprogress/rlib/_rsocket_rffi.py   (contents, props changed)
Log:
Half-by-hand translated version of _rsocket_ctypes


Added: pypy/branch/pypy-more-rtti-inprogress/rlib/_rsocket_rffi.py
==============================================================================
--- (empty file)
+++ pypy/branch/pypy-more-rtti-inprogress/rlib/_rsocket_rffi.py	Sun Aug 26 16:39:38 2007
@@ -0,0 +1,585 @@
+
+from pypy.rpython.lltypesystem import rffi
+from pypy.rpython.lltypesystem import lltype
+from pypy.rpython.tool import rffi_platform as platform
+from pypy.rpython.lltypesystem.rffi import CCHARP
+
+from pypy.rlib.rarithmetic import intmask, r_uint
+import os
+
+_POSIX = os.name == "posix"
+_MS_WINDOWS = os.name == "nt"
+
+
+if _POSIX:
+    includes = ('sys/types.h',
+                'sys/socket.h',
+                'sys/un.h',
+                'sys/poll.h',
+                'sys/select.h',
+                'netinet/in.h',
+                'netinet/tcp.h',
+                'unistd.h',
+                'fcntl.h',
+                'stdio.h',
+                'netdb.h',
+                'arpa/inet.h',
+                'stdint.h', 
+                'errno.h',
+                )
+    cond_includes = [('AF_NETLINK', 'linux/netlink.h')]
+    HEADER = ''.join(['#include <%s>\n' % filename for filename in includes])
+    COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include
+                          for cond_include in cond_includes])
+if _MS_WINDOWS:
+    HEADER = '\n'.join([
+        '#include <WinSock2.h>',
+        '#include <WS2tcpip.h>',
+        # winsock2 defines AF_UNIX, but not sockaddr_un
+        '#undef AF_UNIX',
+        # these types do not exist on windows
+        'typedef int ssize_t;',
+        'typedef unsigned __int16 uint16_t;',
+        'typedef unsigned __int32 uint32_t;',
+        ])
+    COND_HEADER = ''
+constants = {}
+
+
+class CConfig:
+    _header_ = HEADER + COND_HEADER
+    # constants
+    linux      = platform.Defined('linux')
+    MS_WINDOWS = platform.Defined('_WIN32')
+
+    O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK')
+    F_GETFL = platform.DefinedConstantInteger('F_GETFL')
+    F_SETFL = platform.DefinedConstantInteger('F_SETFL')
+    FIONBIO = platform.DefinedConstantInteger('FIONBIO')
+
+    INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET')
+    INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN')
+    INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN')
+    EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS')
+    WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS')
+    EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK')
+    WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK')
+    EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT')
+    WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT')
+constant_names = '''
+AF_AAL5 AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE
+AD_DECnet AF_ECONET AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LLC AF_NETBEUI
+AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_ROSE AF_ROUTE AF_SECURITY AF_SNA
+AF_UNIX AF_WANPIPE AF_X25 AF_UNSPEC
+
+AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST
+AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG
+
+BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM
+
+EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX
+EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE
+EAI_SOCKTYPE EAI_SYSTEM
+
+IPPROTO_AH IPPROTO_BIP IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP
+IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS 
+IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP
+IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE
+IPPROTO_PIM IPPROTO_PUP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_TCP IPPROTO_TP
+IPPROTO_VRRP IPPROTO_XTP
+
+IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS
+IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF
+IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS
+IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO
+IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0
+IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY
+
+IP_ADD_MEMBERSHIP IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL
+IP_DROP_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF
+IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_RECVDSTADDR IP_RECVOPTS
+IP_RECVRETOPTS IP_RETOPTS IP_TOS IP_TTL
+
+MSG_BTAG MSG_ETAG MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOR MSG_OOB
+MSG_PEEK MSG_TRUNC MSG_WAITALL
+
+NI_DGRAM NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST
+NI_NUMERICSERV
+
+NETLINK_ROUTE NETLINK_SKIP NETLINK_W1 NETLINK_USERSOCK NETLINK_FIREWALL
+NETLINK_TCPDIAG NETLINK_NFLOG NETLINK_XFRM NETLINK_ARPD NETLINK_ROUTE6
+NETLINK_IP6_FW NETLINK_DNRTMSG NETLINK_TAPBASE
+
+
+PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING
+PACKET_LOOPBACK PACKET_FASTROUTE
+
+
+SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM
+
+SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE 
+
+SO_ACCEPTCONN SO_BROADCAST SO_DEBUG SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE
+SO_KEEPALIVE SO_LINGER SO_OOBINLINE SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO
+SO_REUSEADDR SO_REUSEPORT SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE
+SO_USELOOPBACK
+
+TCP_CORK TCP_DEFER_ACCEPT TCP_INFO TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL
+TCP_LINGER2 TCP_MAXSEG TCP_NODELAY TCP_QUICKACK TCP_SYNCNT TCP_WINDOW_CLAMP
+
+IPX_TYPE
+
+POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL
+POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG
+
+FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE
+WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE
+FD_CONNECT_BIT FD_CLOSE_BIT
+WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE
+WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED
+'''.split()
+
+for name in constant_names:
+    setattr(CConfig, name, platform.DefinedConstantInteger(name))
+    
+constants["BDADDR_ANY"] =  "00:00:00:00:00:00"
+constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF"
+
+constants_w_defaults = [('SOL_IP', 0),
+                        ('SOL_TCP', 6),
+                        ('SOL_UDP', 17),
+                        ('SOMAXCONN', 5),
+                        ('IPPROTO_IP', 6),
+                        ('IPPROTO_ICMP', 1),
+                        ('IPPROTO_TCP', 6),
+                        ('IPPROTO_UDP', 17),
+                        ('IPPROTO_RAW', 255),
+                        ('IPPORT_RESERVED', 1024),
+                        ('IPPORT_USERRESERVED', 5000),
+                        ('INADDR_ANY', 0x00000000),
+                        ('INADDR_BROADCAST', 0xffffffff),
+                        ('INADDR_LOOPBACK', 0x7F000001),
+                        ('INADDR_UNSPEC_GROUP', 0xe0000000),
+                        ('INADDR_ALLHOSTS_GROUP', 0xe0000001),
+                        ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff),
+                        ('INADDR_NONE', 0xffffffff),
+                        ('SHUT_RD', 0),
+                        ('SHUT_WR', 1),
+                        ('SHUT_RDWR', 2),
+                        ('POLLIN', 1),
+                        ('POLLPRI', 2),
+                        ('POLLOUT', 4),
+                        ('POLLERR', 8),
+                        ('POLLHUP', 16),
+                        ]
+for name, default in constants_w_defaults:
+    setattr(CConfig, name, platform.DefinedConstantInteger(name))
+
+# types
+if _MS_WINDOWS:
+    socketfd_type = rffi.UINT
+else:
+    socketfd_type = rffi.INT
+
+CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT)
+CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT)
+CConfig.size_t = platform.SimpleType('size_t', rffi.INT)
+CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT)
+CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.INT)
+sockaddr_ptr = rffi.CStructPtr('sockaddr')
+addrinfo_ptr = rffi.CStructPtr('addrinfo')
+
+# struct types
+CConfig.sockaddr = platform.Struct('struct sockaddr',
+                                             [('sa_family', rffi.INT),
+                                   ('sa_data', rffi.CFixedArray(rffi.CHAR, 1))])
+CConfig.in_addr = platform.Struct('struct in_addr',
+                                         [('s_addr', rffi.UINT)])
+CConfig.in6_addr = platform.Struct('struct in6_addr',
+                                          [])
+CConfig.sockaddr_in = platform.Struct('struct sockaddr_in',
+                                        [('sin_family', rffi.INT),
+                                         ('sin_port',   rffi.USHORT),
+                                         ('sin_addr',   CConfig.in_addr)])
+
+CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6',
+                                              [('sin6_family', rffi.INT),
+                                               ('sin6_port',   rffi.USHORT),
+                                               ('sin6_addr', CConfig.in6_addr),
+                                               ('sin6_flowinfo', rffi.INT),
+                                               ('sin6_scope_id', rffi.INT)])
+
+CConfig.sockaddr_un = platform.Struct('struct sockaddr_un',
+                                             [('sun_family', rffi.INT),
+                                   ('sun_path', rffi.CFixedArray(rffi.UCHAR, 1))],
+                                             ifdef='AF_UNIX')
+
+CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl',
+                                             [('nl_family', rffi.INT),
+                                              ('nl_pid', rffi.INT),
+                                              ('nl_groups', rffi.INT)],
+                                             ifdef='AF_NETLINK')
+                                             
+CConfig.addrinfo = platform.Struct('struct addrinfo',
+                                     [('ai_flags', rffi.INT),
+                                      ('ai_family', rffi.INT),
+                                      ('ai_socktype', rffi.INT),
+                                      ('ai_protocol', rffi.INT),
+                                      ('ai_addrlen', rffi.INT),
+                                      ('ai_addr', sockaddr_ptr),
+                                      ('ai_canonname', CCHARP),
+                                      ('ai_next', addrinfo_ptr)])
+
+CConfig.hostent = platform.Struct('struct hostent',
+                                     [('h_name', CCHARP),
+                                      ('h_aliases', rffi.CCHARPP),
+                                      ('h_addrtype', rffi.INT),
+                                      ('h_length', rffi.INT),
+                                      ('h_addr_list', rffi.VOIDP),
+                                      ])
+
+
+CConfig.servent = platform.Struct('struct servent',
+                                         [('s_name', CCHARP),
+                                          ('s_port', rffi.INT),
+                                          ('s_proto', CCHARP),
+                                          ])
+
+CConfig.protoent = platform.Struct('struct protoent',
+                                          [('p_proto', rffi.INT),
+                                           ])
+
+if _POSIX:
+    CConfig.nfds_t = platform.SimpleType('nfds_t')
+    CConfig.pollfd = platform.Struct('struct pollfd',
+                                            [('fd', socketfd_type),
+                                             ('events', rffi.SHORT),
+                                             ('revents', rffi.SHORT)])
+if _MS_WINDOWS:
+    CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP)
+    CConfig.WSANETWORKEVENTS = platform.Struct(
+        'struct _WSANETWORKEVENTS',
+        [('lNetworkEvents', rffi.LONG),
+         ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS
+         ])
+
+CConfig.timeval = platform.Struct('struct timeval',
+                                         [('tv_sec', rffi.LONG),
+                                          ('tv_usec', rffi.LONG)])
+
+if _MS_WINDOWS:
+    CConfig.fd_set = platform.Struct('struct fd_set',
+                                   [('fd_count', rffi.UINT),
+                                   # XXX use FD_SETSIZE
+                                   ('fd_array', rffi.CFixedArray(socketfd_type, 64))])
+
+if _MS_WINDOWS:
+    CConfig.WSAData = platform.Struct('struct WSAData',
+                                     [('wVersion', rffi.USHORT),
+                                      ('wHighVersion', rffi.USHORT),
+                                      ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1)
+                                      ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1)
+                                      ('iMaxSockets', rffi.USHORT),
+                                      ('iMaxUdpDg', rffi.USHORT),
+                                      ('lpVendorInfo', CCHARP)])
+
+
+class cConfig:
+    pass
+cConfig.__dict__.update(platform.configure(CConfig))
+
+sockaddr_ptr = lltype.Ptr(cConfig.sockaddr)
+addrinfo_ptr = lltype.Ptr(cConfig.addrinfo)
+
+# HACK HACK HACK
+if _MS_WINDOWS:
+    XXX
+    from ctypes import Structure
+    for struct in cConfig.__dict__.values():
+        if isinstance(struct, type) and issubclass(struct, Structure):
+            if struct.__name__ == 'in6_addr':
+                struct.__name__ = '_in6_addr'
+            else:
+                struct._external_ = True       # hack to avoid redeclaration of the struct in C
+
+# fill in missing constants with reasonable defaults
+cConfig.NI_MAXHOST = cConfig.NI_MAXHOST or 1025
+cConfig.NI_MAXSERV = cConfig.NI_MAXSERV or 32
+cConfig.INET_ADDRSTRLEN = cConfig.INET_ADDRSTRLEN or 16
+
+for name in constant_names:
+    value = getattr(cConfig, name)
+    if value is not None:
+        constants[name] = value
+for name, default in constants_w_defaults:
+    value = getattr(cConfig, name)
+    if value is not None:
+        constants[name] = value
+    else:
+        constants[name] = default
+
+constants['has_ipv6'] = True # This is a configuration option in CPython
+for name, value in constants.items():
+    if isinstance(value, long):
+        if r_uint(value) == value:
+            constants[name] = intmask(value)
+
+locals().update(constants)
+
+O_NONBLOCK = cConfig.O_NONBLOCK
+F_GETFL = cConfig.F_GETFL
+F_SETFL = cConfig.F_SETFL
+FIONBIO = cConfig.FIONBIO
+INET_ADDRSTRLEN = cConfig.INET_ADDRSTRLEN
+INET6_ADDRSTRLEN = cConfig.INET6_ADDRSTRLEN
+EINPROGRESS = cConfig.EINPROGRESS or cConfig.WSAEINPROGRESS
+EWOULDBLOCK = cConfig.EWOULDBLOCK or cConfig.WSAEWOULDBLOCK
+EAFNOSUPPORT = cConfig.EAFNOSUPPORT or cConfig.WSAEAFNOSUPPORT
+
+linux = cConfig.linux
+MS_WINDOWS = cConfig.MS_WINDOWS
+assert MS_WINDOWS == _MS_WINDOWS
+
+if MS_WINDOWS:
+    def invalid_socket(fd):
+        return fd == INVALID_SOCKET
+    INVALID_SOCKET = cConfig.INVALID_SOCKET
+else:
+    def invalid_socket(fd):
+        return fd < 0
+    INVALID_SOCKET = -1
+
+uint16_t = cConfig.uint16_t
+uint32_t = cConfig.uint32_t
+size_t = cConfig.size_t
+ssize_t = cConfig.ssize_t
+socklen_t = cConfig.socklen_t
+sockaddr = cConfig.sockaddr
+#sockaddr_size = sizeof(sockaddr)
+sockaddr_in = cConfig.sockaddr_in
+sockaddr_in6 = cConfig.sockaddr_in6
+sockaddr_un = cConfig.sockaddr_un
+if cConfig.sockaddr_nl is not None:
+    sockaddr_nl = cConfig.sockaddr_nl
+in_addr = cConfig.in_addr
+#in_addr_size = sizeof(in_addr)
+in6_addr = cConfig.in6_addr
+addrinfo = cConfig.addrinfo
+if _POSIX:
+    nfds_t = cConfig.nfds_t
+    pollfd = cConfig.pollfd
+if MS_WINDOWS:
+    WSAEVENT = cConfig.WSAEVENT
+    WSANETWORKEVENTS = cConfig.WSANETWORKEVENTS
+timeval = cConfig.timeval
+if MS_WINDOWS:
+    fd_set = cConfig.fd_set
+
+#c_int_size = sizeof(rffi.INT)
+external = rffi.llexternal
+
+if _POSIX:
+    strerror = external('strerror', [rffi.INT], CCHARP)
+    gai_strerror = external('gai_strerror', [rffi.INT], CCHARP)
+
+#h_errno = c_int.in_dll(socketdll, 'h_errno')
+#
+#hstrerror = socketdll.hstrerror
+#hstrerror.argtypes = [c_int]
+#hstrerror.restype = c_char_p
+
+socket = external('socket', [rffi.INT, rffi.INT, rffi.INT], socketfd_type)
+
+socketclose = external('close', [socketfd_type], rffi.INT)
+
+socketconnect = external('connect', [socketfd_type, sockaddr_ptr, socklen_t], rffi.INT)
+
+if not MS_WINDOWS:
+    getaddrinfo = external('getaddrinfo', [CCHARP, CCHARP,
+                            addrinfo_ptr, rffi.CArray(addrinfo_ptr)], rffi.INT)
+    freeaddrinfo = external('freeaddrinfo', [addrinfo_ptr], lltype.Void)
+    getnameinfo = external('getnameinfo', [sockaddr_ptr, socklen_t, CCHARP,
+                           size_t, CCHARP, size_t, rffi.INT], rffi.INT)
+
+htonl = external('htonl', [rffi.UINT], rffi.UINT)
+htons = external('htons', [rffi.USHORT], rffi.USHORT)
+ntohl = external('ntohl', [rffi.UINT], rffi.UINT)
+ntohs = external('ntohs', [rffi.USHORT], rffi.USHORT)
+
+if _POSIX:
+    inet_aton = external('inet_aton', [CCHARP, lltype.Ptr(in_addr)],
+                                rffi.INT)
+
+inet_ntoa = external('inet_ntoa', [in_addr], rffi.CCHARP)
+
+if _POSIX:
+    inet_pton = external('inet_pton', [rffi.INT, rffi.CCHARP,
+                                              rffi.VOIDP], rffi.INT)
+
+    inet_ntop = external('inet_ntop', [rffi.INT, rffi.VOIDP, CCHARP,
+                                              socklen_t], CCHARP)
+
+inet_addr = external('inet_addr', [rffi.CCHARP], rffi.UINT)
+socklen_t_ptr = rffi.CArray(socklen_t)
+socketaccept = external('accept', [socketfd_type, sockaddr_ptr,
+                              socklen_t_ptr], rffi.INT)
+bind = external('bind', [rffi.INT, socketfd_type, socklen_t], rffi.INT)
+socketlisten = external('listen', [socketfd_type, rffi.INT], rffi.INT)
+socketgetpeername = external('getpeername', [socketfd_type,
+                                    sockaddr_ptr, socklen_t_ptr], rffi.INT)
+socketgetsockname = external('getsockname', [socketfd_type,
+                                   sockaddr_ptr, socklen_t_ptr], rffi.INT)
+socketgetsockopt = external('getsockopt', [socketfd_type, rffi.INT,
+                               rffi.INT, rffi.VOIDP, socklen_t_ptr], rffi.INT)
+socketsetsockopt = external('setsockopt', [socketfd_type, rffi.INT,
+                                   rffi.INT, rffi.VOIDP, socklen_t], rffi.INT)
+socketrecv = external('recv', [socketfd_type, rffi.VOIDP, rffi.INT,
+                                      rffi.INT], ssize_t)
+recvfrom = external('recvfrom', [socketfd_type, rffi.VOIDP, size_t,
+                           rffi.INT, sockaddr_ptr, socklen_t_ptr], rffi.INT)
+send = external('send', [socketfd_type, rffi.VOIDP, size_t, rffi.INT],
+                       ssize_t)
+sendto = external('sendto', [socketfd_type, rffi.VOIDP, size_t, rffi.INT,
+                                    sockaddr_ptr, socklen_t], ssize_t)
+shutdown = external('shutdown', [socketfd_type, rffi.INT], rffi.INT)
+gethostname = external('gethostname', [rffi.CCHARP, rffi.INT], rffi.INT)
+gethostbyname = external('gethostbyname', [rffi.CCHARP],
+                                lltype.Ptr(cConfig.hostent))
+gethostbyaddr = external('gethostbyaddr', [rffi.VOIDP, rffi.INT, rffi.INT], lltype.Ptr(cConfig.hostent))
+getservbyname = external('getservbyname', [rffi.CCHARP, rffi.CCHARP], lltype.Ptr(cConfig.servent))
+getservbyport = external('getservbyport', [rffi.INT, rffi.CCHARP], lltype.Ptr(cConfig.servent))
+getprotobyname = external('getprotobyname', [rffi.CCHARP], lltype.Ptr(cConfig.protoent))
+
+if _POSIX:
+    fcntl = external('fcntl', [socketfd_type, rffi.INT, rffi.INT], rffi.INT)
+    socketpair_t = rffi.CFixedArray(socketfd_type, 2)
+    socketpair = external('socketpair', [rffi.INT, rffi.INT, rffi.INT,
+                          lltype.Ptr(socketpair_t)], rffi.INT)
+
+if _MS_WINDOWS:
+    XXX
+    ioctlsocket = socketdll.ioctlsocket
+    ioctlsocket.argtypes = [socketfd_type, rffi.LONG, POINTER(c_ulong)]
+    ioctlsocket.restype = c_int
+    
+shutdown = external('shutdown', [rffi.INT, rffi.INT], rffi.INT)
+
+if _POSIX:
+    poll = external('poll', [lltype.Ptr(pollfd), nfds_t, rffi.INT], rffi.INT)
+elif MS_WINDOWS:
+    XXX
+    select = socketdll.select
+    select.argtypes = [c_int,
+                       POINTER(fd_set), POINTER(fd_set), POINTER(fd_set),
+                       POINTER(timeval)]
+    select.restype = c_int
+
+    WSACreateEvent = socketdll.WSACreateEvent
+    WSACreateEvent.argtypes = []
+    WSACreateEvent.restype = WSAEVENT
+
+    WSACloseEvent = socketdll.WSACloseEvent
+    WSACloseEvent.argtypes = [WSAEVENT]
+    WSACloseEvent.restype = c_int
+
+    WSAEventSelect = socketdll.WSAEventSelect
+    WSAEventSelect.argtypes = [socketfd_type, WSAEVENT, rffi.LONG]
+    WSAEventSelect.restype = c_int
+
+    WSAWaitForMultipleEvents = socketdll.WSAWaitForMultipleEvents
+    WSAWaitForMultipleEvents.argtypes = [rffi.LONG, POINTER(WSAEVENT),
+                                         c_int, rffi.LONG, c_int]
+    WSAWaitForMultipleEvents.restype = c_long
+
+    WSAEnumNetworkEvents = socketdll.WSAEnumNetworkEvents
+    WSAEnumNetworkEvents.argtypes = [socketfd_type, WSAEVENT,
+                                     POINTER(WSANETWORKEVENTS)]
+    WSAEnumNetworkEvents.restype = c_int
+
+if MS_WINDOWS:
+    WSAData = cConfig.WSAData
+    WSAStartup = socketdll.WSAStartup
+    WSAStartup.argtypes = [c_int, POINTER(WSAData)]
+    WSAStartup.restype = c_int
+    WSAStartup.libraries = ('ws2_32',)
+
+    WSAGetLastError = socketdll.WSAGetLastError
+    WSAGetLastError.argtypes = []
+    WSAGetLastError.restype = c_int
+    geterrno = WSAGetLastError
+    
+    import errno
+    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",
+
+        # select() errors
+        WSA_IO_PENDING: "WSA_IO_PENDING",
+        WSA_IO_INCOMPLETE: "WSA_IO_INCOMPLETE",
+        WSA_INVALID_HANDLE: "WSA_INVALID_HANDLE",
+        WSA_INVALID_PARAMETER: "WSA_INVALID_PARAMETER",
+        WSA_NOT_ENOUGH_MEMORY: "WSA_NOT_ENOUGH_MEMORY",
+        WSA_OPERATION_ABORTED: "WSA_OPERATION_ABORTED",
+        }
+
+    assert len(WIN32_ERROR_MESSAGES) == 53 # detect duplicates
+
+    def socket_strerror(errno):
+        return WIN32_ERROR_MESSAGES.get(errno, "winsock error %d" % errno)
+else:
+    def socket_strerror(errno):
+        return strerror(errno)



More information about the Pypy-commit mailing list