summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pym/portage/__init__.py21
1 files changed, 5 insertions, 16 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index d7af652c6..54ef005a4 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -2484,48 +2484,37 @@ def spawn(mystring, mysettings, debug=0, free=0, droppriv=0, sesandbox=0, fakero
owtd = []
ewtd = []
import array, fcntl, select
- # Use non-blocking mode to prevent read
- # calls from blocking indefinitely.
fd_flags = {}
for f in iwtd:
fd_flags[f] = fcntl.fcntl(f.fileno(), fcntl.F_GETFL)
- fcntl.fcntl(f.fileno(), fcntl.F_SETFL,
- fd_flags[f] | os.O_NONBLOCK)
buffsize = 65536
eof = False
while not eof:
events = select.select(iwtd, owtd, ewtd)
for f in events[0]:
+ # Use non-blocking mode to prevent read
+ # calls from blocking indefinitely.
+ fcntl.fcntl(f.fileno(), fcntl.F_SETFL,
+ fd_flags[f] | os.O_NONBLOCK)
buf = array.array('B')
try:
buf.fromfile(f, buffsize)
except EOFError:
pass
+ fcntl.fcntl(f.fileno(), fcntl.F_SETFL, fd_flags[f])
if not buf:
eof = True
break
# Use blocking mode for writes since we'd rather block than
# trigger a EWOULDBLOCK error.
if f is stdin_file:
- fcntl.fcntl(master_file.fileno(),
- fcntl.F_SETFL, fd_flags[f])
buf.tofile(master_file)
master_file.flush()
- fcntl.fcntl(master_file.fileno(),
- fcntl.F_SETFL, fd_flags[f] | os.O_NONBLOCK)
else:
- # stdout usually shares the O_NONBLOCK flag with stdin
- fcntl.fcntl(stdin_file.fileno(),
- fcntl.F_SETFL, fd_flags[f])
buf.tofile(stdout_file)
stdout_file.flush()
- fcntl.fcntl(stdin_file.fileno(),
- fcntl.F_SETFL, fd_flags[f] | os.O_NONBLOCK)
buf.tofile(log_file)
log_file.flush()
- # Restore them to blocking mode.
- for f in iwtd:
- fcntl.fcntl(f.fileno(), fcntl.F_SETFL, fd_flags[f])
log_file.close()
stdin_file.close()
stdout_file.close()