Author: Armin Rigo <[email protected]>
Branch: py3.5-noninherit
Changeset: r86573:b918e61bdf64
Date: 2016-08-26 17:45 +0200
http://bitbucket.org/pypy/pypy/changeset/b918e61bdf64/
Log: socket.socket()
diff --git a/pypy/module/_socket/interp_socket.py
b/pypy/module/_socket/interp_socket.py
--- a/pypy/module/_socket/interp_socket.py
+++ b/pypy/module/_socket/interp_socket.py
@@ -177,7 +177,7 @@
sock = RSocket(family, type, proto,
fd=space.c_filedescriptor_w(w_fileno))
else:
- sock = RSocket(family, type, proto)
+ sock = RSocket(family, type, proto, inheritable=False)
W_Socket.__init__(self, space, sock)
except SocketError as e:
raise converted_error(space, e)
diff --git a/pypy/module/_socket/test/test_sock_app.py
b/pypy/module/_socket/test/test_sock_app.py
--- a/pypy/module/_socket/test/test_sock_app.py
+++ b/pypy/module/_socket/test/test_sock_app.py
@@ -648,6 +648,12 @@
assert len(w) == 1, [str(warning) for warning in w]
assert r in str(w[0])
+ def test_socket_non_inheritable(self):
+ import _socket, posix
+ s1 = _socket.socket()
+ assert posix.get_inheritable(s1.fileno()) is False
+ s1.close()
+
def test_socketpair_non_inheritable(self):
import _socket, posix
if not hasattr(_socket, 'socketpair'):
diff --git a/rpython/rlib/rsocket.py b/rpython/rlib/rsocket.py
--- a/rpython/rlib/rsocket.py
+++ b/rpython/rlib/rsocket.py
@@ -522,12 +522,28 @@
timeout = -1.0
def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0,
- fd=_c.INVALID_SOCKET):
+ fd=_c.INVALID_SOCKET, inheritable=True):
"""Create a new socket."""
if _c.invalid_socket(fd):
- fd = _c.socket(family, type, proto)
- if _c.invalid_socket(fd):
- raise self.error_handler()
+ if not inheritable and SOCK_CLOEXEC is not None:
+ # Non-inheritable: we try to call socket() with
+ # SOCK_CLOEXEC, which may fail. If we get EINVAL,
+ # then we fall back to the SOCK_CLOEXEC-less case.
+ fd = _c.socket(family, type | SOCK_CLOEXEC, proto)
+ if fd < 0:
+ if _c.geterrno() == errno.EINVAL:
+ # Linux older than 2.6.27 does not support
+ # SOCK_CLOEXEC. An EINVAL might be caused by
+ # random other things, though. Don't cache.
+ pass
+ else:
+ raise self.error_handler()
+ if _c.invalid_socket(fd):
+ fd = _c.socket(family, type, proto)
+ if _c.invalid_socket(fd):
+ raise self.error_handler()
+ if not inheritable:
+ sock_set_inheritable(fd, False)
# PLAT RISCOS
self.fd = fd
self.family = family
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
@@ -388,6 +388,12 @@
s1.close()
s2.close()
+def test_inheritable():
+ for inh in [False, True]:
+ s1 = RSocket(inheritable=inh)
+ assert rposix.get_inheritable(s1.fd) == inh
+ s1.close()
+
def test_getaddrinfo_http():
lst = getaddrinfo('localhost', 'http')
assert isinstance(lst, list)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit