For bug #186876, fall back it os.pipe() if pty.openpty() fails. (trunk r7422)
authorZac Medico <zmedico@gentoo.org>
Sat, 28 Jul 2007 22:52:37 +0000 (22:52 -0000)
committerZac Medico <zmedico@gentoo.org>
Sat, 28 Jul 2007 22:52:37 +0000 (22:52 -0000)
svn path=/main/branches/2.1.2/; revision=7423

pym/portage.py

index 077175654c79139e2869cd3f56bbb3b4f3fe8439..1b97fa8556a044ea3aeca339bb3665f390395158 100644 (file)
@@ -2332,6 +2332,7 @@ def spawn(mystring, mysettings, debug=0, free=0, droppriv=0, sesandbox=0, fakero
        master_fd = None
        slave_fd = None
        fd_pipes_orig = None
+       got_pty = False
        if logfile:
                del keywords["logfile"]
                fd_pipes = keywords.get("fd_pipes")
@@ -2340,10 +2341,16 @@ def spawn(mystring, mysettings, debug=0, free=0, droppriv=0, sesandbox=0, fakero
                elif 1 not in fd_pipes or 2 not in fd_pipes:
                        raise ValueError(fd_pipes)
                from pty import openpty
-               master_fd, slave_fd = openpty()
+               try:
+                       master_fd, slave_fd = openpty()
+                       got_pty = True
+               except EnvironmentError, e:
+                       writemsg("openpty failed: '%s'\n" % str(e), noiselevel=1)
+                       del e
+                       master_fd, slave_fd = os.pipe()
                fd_pipes.setdefault(0, sys.stdin.fileno())
                fd_pipes_orig = fd_pipes.copy()
-               if os.isatty(fd_pipes_orig[1]):
+               if got_pty and os.isatty(fd_pipes_orig[1]):
                        from output import get_term_size, set_term_size
                        rows, columns = get_term_size()
                        set_term_size(rows, columns, slave_fd)
@@ -2398,7 +2405,7 @@ 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, 'w+')
+               master_file = os.fdopen(master_fd, 'r')
                iwtd = [master_file]
                owtd = []
                ewtd = []