summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pym/portage/__init__.py33
1 files changed, 21 insertions, 12 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index bf0362f9f..6f88f00fa 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -3746,6 +3746,8 @@ def _test_pty_eof():
Raises an EnvironmentError from openpty() if it fails.
"""
+ use_fork = False
+
import array, fcntl, pty, select, termios
test_string = 2 * "blah blah blah\n"
test_string = _unicode_decode(test_string,
@@ -3765,17 +3767,23 @@ def _test_pty_eof():
termios.tcsetattr(slave_fd, termios.TCSANOW, mode)
# Simulate a subprocess writing some data to the
- # slave end of the pipe, and then exiting. Do a
- # real fork here since otherwise os.close(slave_fd)
- # would block on some platforms such as Darwin.
- pids = process.spawn_bash(_unicode_encode("echo -n '%s'" % test_string,
- encoding='utf_8', errors='strict'), env=os.environ,
- fd_pipes={0:sys.stdin.fileno(), 1:slave_fd, 2:slave_fd},
- returnpid=True)
- if isinstance(pids, int):
- os.close(master_fd)
- os.close(slave_fd)
- raise EnvironmentError('spawn failed')
+ # slave end of the pipe, and then exiting.
+ # Using a fork here gave inconsistent results,
+ # so it's disabled now.
+ pid = None
+ if use_fork:
+ pids = process.spawn_bash(_unicode_encode("echo -n '%s'" % test_string,
+ encoding='utf_8', errors='strict'), env=os.environ,
+ fd_pipes={0:sys.stdin.fileno(), 1:slave_fd, 2:slave_fd},
+ returnpid=True)
+ if isinstance(pids, int):
+ os.close(master_fd)
+ os.close(slave_fd)
+ raise EnvironmentError('spawn failed')
+ pid = pids[0]
+ else:
+ os.write(slave_fd, _unicode_encode(test_string,
+ encoding='utf_8', errors='strict'))
os.close(slave_fd)
master_file = os.fdopen(master_fd, 'rb')
@@ -3807,7 +3815,8 @@ def _test_pty_eof():
data.append(_unicode_decode(buf.tostring(),
encoding='utf_8', errors='strict'))
- os.waitpid(pids[0], 0)
+ if pid is not None:
+ os.waitpid(pid, 0)
master_file.close()
return test_string == ''.join(data)