[pypy-svn] r46763 - in pypy/dist/pypy/rlib: . test
arigo at codespeak.net
arigo at codespeak.net
Thu Sep 20 15:14:21 CEST 2007
Author: arigo
Date: Thu Sep 20 15:14:19 2007
New Revision: 46763
Modified:
pypy/dist/pypy/rlib/rsocket_rffi.py
pypy/dist/pypy/rlib/test/test_rsocket_rffi.py
Log:
getsockopt(), setsockopt()
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 15:14:19 2007
@@ -680,25 +680,41 @@
return address
def getsockopt(self, level, option, maxlen):
- buf = _c.create_string_buffer(maxlen)
- bufsize = _c.socklen_t()
- bufsize.value = maxlen
- res = _c.socketgetsockopt(self.fd, level, option, cast(buf, POINTER(c_char)), byref(bufsize))
- if res < 0:
- raise self.error_handler()
- size = bufsize.value
- assert size > 0 # socklen_t is signed on Windows
- return buf.raw[:size]
+ buf = mallocbuf(maxlen)
+ try:
+ bufsize_p = lltype.malloc(_c.socklen_t_ptr.TO, flavor='raw')
+ try:
+ bufsize_p[0] = rffi.cast(_c.socklen_t, maxlen)
+ res = _c.socketgetsockopt(self.fd, level, option,
+ buf, bufsize_p)
+ if res < 0:
+ raise self.error_handler()
+ size = bufsize_p[0]
+ assert size >= 0 # socklen_t is signed on Windows
+ result = ''.join([buf[i] for i in range(size)])
+ finally:
+ lltype.free(bufsize_p, flavor='raw')
+ finally:
+ lltype.free(buf, flavor='raw')
+ return result
def getsockopt_int(self, level, option):
- flag = _c.c_int()
- flagsize = _c.socklen_t()
- flagsize.value = sizeof(flag)
- res = _c.socketgetsockopt(self.fd, level, option,
- byref(flag), byref(flagsize))
- if res < 0:
- raise self.error_handler()
- return flag.value
+ flag_p = lltype.malloc(rffi.INTP.TO, 1, flavor='raw')
+ try:
+ flagsize_p = lltype.malloc(_c.socklen_t_ptr.TO, flavor='raw')
+ try:
+ flagsize_p[0] = rffi.cast(_c.socklen_t, rffi.sizeof(rffi.INT))
+ res = _c.socketgetsockopt(self.fd, level, option,
+ rffi.cast(rffi.VOIDP, flag_p),
+ flagsize_p)
+ if res < 0:
+ raise self.error_handler()
+ result = flag_p[0]
+ finally:
+ lltype.free(flagsize_p, flavor='raw')
+ finally:
+ lltype.free(flag_p, flavor='raw')
+ return result
def gettimeout(self):
"""Return the timeout of the socket. A timeout < 0 means that
@@ -808,14 +824,19 @@
self.settimeout(timeout)
def setsockopt(self, level, option, value):
- res = _c.socketsetsockopt(self.fd, level, option, c_char_p(value), len(value))
+ res = _c.socketsetsockopt(self.fd, level, option, value, len(value))
if res < 0:
raise self.error_handler()
def setsockopt_int(self, level, option, value):
- flag = _c.c_int(value)
- res = _c.socketsetsockopt(self.fd, level, option,
- byref(flag), sizeof(flag))
+ flag_p = lltype.malloc(rffi.INTP.TO, 1, flavor='raw')
+ try:
+ flag_p[0] = rffi.cast(rffi.INT, value)
+ res = _c.socketsetsockopt(self.fd, level, option,
+ rffi.cast(rffi.VOIDP, flag_p),
+ rffi.sizeof(rffi.INT))
+ finally:
+ lltype.free(flag_p, flavor='raw')
if res < 0:
raise self.error_handler()
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 15:14:19 2007
@@ -227,8 +227,8 @@
def test_getsetsockopt():
- py.test.skip("rewrite without ctypes")
- from ctypes import c_int, c_char, c_char_p, POINTER, cast, pointer, sizeof
+ import struct
+ assert struct.calcsize("i") == rffi.sizeof(rffi.INT)
# A socket sould start with reuse == 0
s = RSocket(AF_INET, SOCK_STREAM)
reuse = s.getsockopt_int(SOL_SOCKET, SO_REUSEADDR)
@@ -238,22 +238,14 @@
assert reuse != 0
# Test string case
s = RSocket(AF_INET, SOCK_STREAM)
- reusestr = s.getsockopt(SOL_SOCKET, SO_REUSEADDR, sizeof(c_int))
- # XXX: This strange creation fo reuse_c_char instead of plain
- # c_char_p(reusestr) is to work around a bug in the cast function
- # of ctypes version 1.0.0
- reuse_c_chars = (c_char*len(reusestr))(*[c for c in reusestr])
- reuseptr = cast(reuse_c_chars, POINTER(c_int))
- assert reuseptr[0] == 0
- optval = c_int(1)
- optvalp = cast(pointer(optval), POINTER(c_char))
- optstr = optvalp[:sizeof(c_int)]
+ reusestr = s.getsockopt(SOL_SOCKET, SO_REUSEADDR, rffi.sizeof(rffi.INT))
+ value, = struct.unpack("i", reusestr)
+ assert value == 0
+ optstr = struct.pack("i", 1)
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, optstr)
- reusestr = s.getsockopt(SOL_SOCKET, SO_REUSEADDR, sizeof(c_int))
- # XXX: See above.
- reuse_c_chars = (c_char*len(reusestr))(*[c for c in reusestr])
- reuseptr = cast(reuse_c_chars, POINTER(c_int))
- assert reuseptr[0] != 0
+ reusestr = s.getsockopt(SOL_SOCKET, SO_REUSEADDR, rffi.sizeof(rffi.INT))
+ value, = struct.unpack("i", reusestr)
+ assert value != 0
def test_dup():
py.test.skip("in-progress")
More information about the Pypy-commit
mailing list