From 6bcbf5501d74819f078fb0b32cadccf15d3d2cfa Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sun, 27 Sep 2009 19:45:09 +0000 Subject: Make _test_pty_eof() use non-blocking IO, required for Darwin kernel. svn path=/main/trunk/; revision=14449 --- pym/portage/__init__.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 67ab6b068..05f7b86bd 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -3746,7 +3746,7 @@ def _test_pty_eof(): Raises an EnvironmentError from openpty() if it fails. """ - import array, pty, termios + import array, fcntl, pty, select, termios test_string = 2 * "blah blah blah\n" test_string = _unicode_decode(test_string, encoding='utf_8', errors='strict') @@ -3757,6 +3757,10 @@ def _test_pty_eof(): master_file = os.fdopen(master_fd, 'rb') slave_file = os.fdopen(slave_fd, 'wb') + # Non-blocking mode is required for Darwin kernel. + fcntl.fcntl(master_fd, fcntl.F_SETFL, + fcntl.fcntl(master_fd, fcntl.F_GETFL) | os.O_NONBLOCK) + # Disable post-processing of output since otherwise weird # things like \n -> \r\n transformations may occur. mode = termios.tcgetattr(slave_fd) @@ -3771,9 +3775,17 @@ def _test_pty_eof(): eof = False data = [] + iwtd = [master_file] + owtd = [] + ewtd = [] while not eof: + events = select.select(iwtd, owtd, ewtd) + if not events[0]: + eof = True + break + buf = array.array('B') try: buf.fromfile(master_file, 1024) -- cgit v1.2.3-1-g7c22