[pypy-commit] pypy save_socket_errno: rffi's socket(2) wrapper did not preserve errno.

markrwilliams pypy.commits at gmail.com
Thu Jun 23 03:57:25 EDT 2016


Author: Mark Williams <markrwilliams at gmail.com>
Branch: save_socket_errno
Changeset: r85343:5922e2ab336d
Date: 2016-06-22 22:01 -0700
http://bitbucket.org/pypy/pypy/changeset/5922e2ab336d/

Log:	rffi's socket(2) wrapper did not preserve errno.

	Preserve errno, like the other socket system call wrappers, and add
	a test to ensure the correct errno is raised upon socket failure.

diff --git a/rpython/rlib/_rsocket_rffi.py b/rpython/rlib/_rsocket_rffi.py
--- a/rpython/rlib/_rsocket_rffi.py
+++ b/rpython/rlib/_rsocket_rffi.py
@@ -487,7 +487,9 @@
 #hstrerror.argtypes = [c_int]
 #hstrerror.restype = c_char_p
 
-socket = external('socket', [rffi.INT, rffi.INT, rffi.INT], socketfd_type)
+socket = external('socket', [rffi.INT, rffi.INT, rffi.INT], socketfd_type,
+                  save_err=SAVE_ERR)
+
 
 if WIN32:
     socketclosename = 'closesocket'
diff --git a/rpython/rlib/test/test_rsocket.py b/rpython/rlib/test/test_rsocket.py
--- a/rpython/rlib/test/test_rsocket.py
+++ b/rpython/rlib/test/test_rsocket.py
@@ -1,4 +1,4 @@
-import py, errno, sys
+import py, pytest, errno, sys
 from rpython.rlib import rsocket
 from rpython.rlib.rsocket import *
 import socket as cpy_socket
@@ -589,3 +589,15 @@
         return 0
     fc = compile(f, [], thread=True)
     assert fc() == 0
+
+def test_socket_saves_errno(tmpdir):
+    # ensure errno is set to a known value...
+    unconnected_sock = RSocket()
+    pytest.raises(CSocketError, unconnected_sock.recv, 1024)
+    # ...which is ENOTCONN
+    assert e.value.errno == errno.ENOTCONN
+
+    e = pytest.raises(CSocketError,
+                      RSocket, family=AF_INET, type=SOCK_STREAM, proto=SOL_UDP)
+    # TODO: windows??
+    assert e.value.errno in (errno.EPROTOTYPE, errno.EPROTONOSUPPORT)


More information about the pypy-commit mailing list