make qvm-run work for non-blocking stdin
The main process sometimes sets fd 1 to O_NONBLOCK, and since in the terminal case fd 0 and 1 are the same fd, this also results in fd 0 being non-blocking, causing qvm-run to crash with EAGAIN. So just make the code work for both blocking and non-blocking stdin.
This commit is contained in:
		
							parent
							
								
									ef17e86810
								
							
						
					
					
						commit
						cb644eb174
					
				@ -26,7 +26,7 @@ import sys
 | 
			
		||||
 | 
			
		||||
import multiprocessing
 | 
			
		||||
 | 
			
		||||
import fcntl
 | 
			
		||||
import select
 | 
			
		||||
 | 
			
		||||
import qubesadmin.tools
 | 
			
		||||
import qubesadmin.exc
 | 
			
		||||
@ -114,11 +114,11 @@ def copy_stdin(stream):
 | 
			
		||||
    '''Copy stdin to *stream*'''
 | 
			
		||||
    # multiprocessing.Process have sys.stdin connected to /dev/null, use fd 0
 | 
			
		||||
    #  directly
 | 
			
		||||
    flags = fcntl.fcntl(0, fcntl.F_GETFL)
 | 
			
		||||
    flags &= ~os.O_NONBLOCK
 | 
			
		||||
    fcntl.fcntl(0, fcntl.F_SETFL, flags)
 | 
			
		||||
    for data in iter(lambda: os.read(0, 65536), b''):
 | 
			
		||||
        if data is None:
 | 
			
		||||
    while True:
 | 
			
		||||
        # select so this code works even if fd 0 is non-blocking
 | 
			
		||||
        select.select([0], [], [])
 | 
			
		||||
        data = os.read(0, 65536)
 | 
			
		||||
        if data is None or data == b'':
 | 
			
		||||
            break
 | 
			
		||||
        stream.write(data)
 | 
			
		||||
        stream.flush()
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user