summaryrefslogtreecommitdiffstats
path: root/pym/portage/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'pym/portage/__init__.py')
-rw-r--r--pym/portage/__init__.py38
1 files changed, 21 insertions, 17 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index 97ee03ec5..d86d2e3c7 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -3131,34 +3131,38 @@ def spawn(mystring, mysettings, debug=0, free=0, droppriv=0, sesandbox=0, fakero
if logfile:
log_file = open(logfile, 'a')
stdout_file = os.fdopen(os.dup(fd_pipes_orig[1]), 'w')
- master_file = os.fdopen(master_fd, 'r')
- iwtd = [master_file]
+ iwtd = [master_fd]
owtd = []
ewtd = []
- import array, select
+ import select
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.
- buf = array.array('B')
- try:
- buf.fromfile(f, buffsize)
- except EOFError:
- pass
- if not buf:
- eof = True
- break
- if f is master_file:
- buf.tofile(stdout_file)
+ while True:
+ try:
+ buf = os.read(master_fd, buffsize)
+ except OSError, e:
+ # EIO happens with pty on Linux after the
+ # slave end of the pty has been closed.
+ if e.errno == errno.EIO:
+ # EOF
+ eof = True
+ break
+ elif e.errno == errno.EAGAIN:
+ break
+ else:
+ raise
+
+ stdout_file.write(buf)
stdout_file.flush()
- buf.tofile(log_file)
+ log_file.write(buf)
log_file.flush()
+
log_file.close()
stdout_file.close()
- master_file.close()
+ os.close(master_fd)
pid = mypids[-1]
retval = os.waitpid(pid, 0)[1]
portage.process.spawned_pids.remove(pid)