[pypy-svn] r46761 - in pypy/dist/pypy/rlib: . test
arigo at codespeak.net
arigo at codespeak.net
Thu Sep 20 14:57:40 CEST 2007
Author: arigo
Date: Thu Sep 20 14:57:40 2007
New Revision: 46761
Modified:
pypy/dist/pypy/rlib/_rsocket_rffi.py
pypy/dist/pypy/rlib/rsocket_rffi.py
pypy/dist/pypy/rlib/test/test_rsocket_rffi.py
Log:
Some more operations.
Modified: pypy/dist/pypy/rlib/_rsocket_rffi.py
==============================================================================
--- pypy/dist/pypy/rlib/_rsocket_rffi.py (original)
+++ pypy/dist/pypy/rlib/_rsocket_rffi.py Thu Sep 20 14:57:40 2007
@@ -3,6 +3,7 @@
from pypy.rpython.lltypesystem import lltype
from pypy.rpython.tool import rffi_platform as platform
from pypy.rpython.lltypesystem.rffi import CCHARP
+from pypy.rpython.lltypesystem.rffi import get_errno as geterrno
from pypy.rlib.rarithmetic import intmask, r_uint
import os
@@ -379,7 +380,6 @@
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')
@@ -421,10 +421,11 @@
socklen_t], CCHARP)
inet_addr = external('inet_addr', [rffi.CCHARP], rffi.UINT)
-socklen_t_ptr = rffi.CArray(socklen_t)
+socklen_t_ptr = lltype.Ptr(rffi.CFixedArray(socklen_t, 1))
socketaccept = external('accept', [socketfd_type, sockaddr_ptr,
socklen_t_ptr], rffi.INT)
-bind = external('bind', [rffi.INT, socketfd_type, socklen_t], rffi.INT)
+socketbind = external('bind', [socketfd_type, sockaddr_ptr, 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)
@@ -582,5 +583,4 @@
def socket_strerror(errno):
return WIN32_ERROR_MESSAGES.get(errno, "winsock error %d" % errno)
else:
- def socket_strerror(errno):
- return strerror(errno)
+ socket_strerror = os.strerror
Modified: pypy/dist/pypy/rlib/rsocket_rffi.py
==============================================================================
--- pypy/dist/pypy/rlib/rsocket_rffi.py (original)
+++ pypy/dist/pypy/rlib/rsocket_rffi.py Thu Sep 20 14:57:40 2007
@@ -456,12 +456,10 @@
def make_null_address(family):
klass = familyclass(family)
- buf = create_string_buffer(klass.maxlen)
result = instantiate(klass)
- XXX; result._addr_keepalive2 = buf
- result.addr = cast(buf, _c.sockaddr_ptr).contents
- result.addrlen = 0
- return result, len(buf)
+ buf = mallocbuf(klass.maxlen)
+ result.setdata(buf, 0)
+ return result, klass.maxlen
def ipaddr_from_object(space, w_sockaddr):
host = space.str_w(space.getitem(w_sockaddr, space.wrap(0)))
@@ -562,7 +560,9 @@
def _addrbuf(self):
addr, maxlen = make_null_address(self.family)
- return addr, _c.socklen_t(maxlen)
+ addrlen_p = lltype.malloc(_c.socklen_t_ptr.TO, flavor='raw')
+ addrlen_p[0] = rffi.cast(_c.socklen_t, maxlen)
+ return addr, addrlen_p
def accept(self, SocketClass=None):
"""Wait for an incoming connection.
@@ -571,18 +571,22 @@
SocketClass = RSocket
if self._select(False) == 1:
raise SocketTimeout
- address, addrlen = self._addrbuf()
- newfd = _c.socketaccept(self.fd, byref(address.addr), byref(addrlen))
+ address, addrlen_p = self._addrbuf()
+ try:
+ newfd = _c.socketaccept(self.fd, address.addr, addrlen_p)
+ addrlen = addrlen_p[0]
+ finally:
+ lltype.free(addrlen_p, flavor='raw')
if _c.invalid_socket(newfd):
raise self.error_handler()
- address.addrlen = addrlen.value
+ address.addrlen = addrlen
sock = make_socket(newfd, self.family, self.type, self.proto,
SocketClass)
return (sock, address)
def bind(self, address):
"""Bind the socket to a local address."""
- res = _c.socketbind(self.fd, byref(address.addr), address.addrlen)
+ res = _c.socketbind(self.fd, address.addr, address.addrlen)
if res < 0:
raise self.error_handler()
@@ -597,13 +601,13 @@
def connect(self, address):
"""Connect the socket to a remote address."""
- res = _c.socketconnect(self.fd, byref(address.addr), address.addrlen)
+ res = _c.socketconnect(self.fd, address.addr, address.addrlen)
if self.timeout > 0.0:
errno = _c.geterrno()
if res < 0 and errno == _c.EINPROGRESS:
timeout = self._select(True)
if timeout == 0:
- res = _c.socketconnect(self.fd, byref(address.addr),
+ res = _c.socketconnect(self.fd, address.addr,
address.addrlen)
elif timeout == -1:
raise self.error_handler()
@@ -616,13 +620,13 @@
def connect_ex(self, address):
"""This is like connect(address), but returns an error code (the errno
value) instead of raising an exception when an error occurs."""
- res = _c.socketconnect(self.fd, byref(address.addr), address.addrlen)
+ res = _c.socketconnect(self.fd, address.addr, address.addrlen)
if self.timeout > 0.0:
errno = _c.geterrno()
if res < 0 and errno == _c.EINPROGRESS:
timeout = self._select(True)
if timeout == 0:
- res = _c.socketconnect(self.fd, byref(address.addr),
+ res = _c.socketconnect(self.fd, address.addr,
address.addrlen)
elif timeout == -1:
return _c.geterrno()
@@ -651,22 +655,28 @@
def getpeername(self):
"""Return the address of the remote endpoint."""
- address, addrlen = self._addrbuf()
- res = _c.socketgetpeername(self.fd, byref(address.addr),
- byref(addrlen))
+ address, addrlen_p = self._addrbuf()
+ try:
+ res = _c.socketgetpeername(self.fd, address.addr, addrlen_p)
+ addrlen = addrlen_p[0]
+ finally:
+ lltype.free(addrlen_p, flavor='raw')
if res < 0:
raise self.error_handler()
- address.addrlen = addrlen.value
+ address.addrlen = addrlen
return address
def getsockname(self):
"""Return the address of the local endpoint."""
- address, addrlen = self._addrbuf()
- res = _c.socketgetsockname(self.fd, byref(address.addr),
- byref(addrlen))
+ address, addrlen_p = self._addrbuf()
+ try:
+ res = _c.socketgetsockname(self.fd, address.addr, addrlen_p)
+ addrlen = addrlen_p[0]
+ finally:
+ lltype.free(addrlen_p, flavor='raw')
if res < 0:
raise self.error_handler()
- address.addrlen = addrlen.value
+ address.addrlen = addrlen
return address
def getsockopt(self, level, option, maxlen):
@@ -733,18 +743,25 @@
if timeout == 1:
raise SocketTimeout
elif timeout == 0:
- buf = create_string_buffer(buffersize)
- address, addrlen = self._addrbuf()
- read_bytes = _c.recvfrom(self.fd, buf, buffersize, flags,
- byref(address.addr), byref(addrlen))
- if read_bytes < 0:
- raise self.error_handler()
- result_addrlen = addrlen.value
- if result_addrlen:
- address.addrlen = result_addrlen
- else:
- address = None
- return (buf[:read_bytes], address)
+ buf = mallocbuf(buffersize)
+ try:
+ address, addrlen_p = self._addrbuf()
+ try:
+ read_bytes = _c.recvfrom(self.fd, buf, buffersize, flags,
+ address.addr, addrlen_p)
+ addrlen = addrlen_p[0]
+ finally:
+ lltype.free(addrlen_p, flavor='raw')
+ if read_bytes >= 0:
+ if addrlen:
+ address.addrlen = addrlen
+ else:
+ address = None
+ data = ''.join([buf[i] for i in range(read_bytes)])
+ return (data, address)
+ finally:
+ lltype.free(buf, flavor='raw')
+ raise self.error_handler()
def send(self, data, flags=0):
"""Send a data string to the socket. For the optional flags
Modified: pypy/dist/pypy/rlib/test/test_rsocket_rffi.py
==============================================================================
--- pypy/dist/pypy/rlib/test/test_rsocket_rffi.py (original)
+++ pypy/dist/pypy/rlib/test/test_rsocket_rffi.py Thu Sep 20 14:57:40 2007
@@ -58,7 +58,6 @@
s2.close()
def test_simple_tcp():
- py.test.skip("in-progress")
import thread
sock = RSocket()
try_ports = [1023] + range(20000, 30000, 437)
@@ -78,21 +77,27 @@
sock.listen(1)
s2 = RSocket(AF_INET, SOCK_STREAM)
thread.start_new_thread(s2.connect, (addr,))
+ print 'waiting for connexion'
s1, addr2 = sock.accept()
+ print 'connexion accepted'
assert addr.eq(s2.getpeername())
assert addr2.eq(s2.getsockname())
assert addr2.eq(s1.getpeername())
s1.send('?')
+ print 'sent one character'
buf = s2.recv(100)
assert buf == '?'
- thread.start_new_thread(s2.sendall, ('x'*500000,))
+ print 'received ok'
+ thread.start_new_thread(s2.sendall, ('x'*50000,))
buf = ''
- while len(buf) < 500000:
- data = s1.recv(500100)
+ while len(buf) < 50000:
+ data = s1.recv(50100)
+ print 'recv returned %d bytes' % (len(data,))
assert data
buf += data
- assert buf == 'x'*500000
+ assert buf == 'x'*50000
+ print 'data received ok'
s1.close()
s2.close()
More information about the Pypy-commit
mailing list