[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