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:
qubesuser 2017-11-07 17:56:56 +01:00
parent ef17e86810
commit cb644eb174

View File

@ -26,7 +26,7 @@ import sys
import multiprocessing import multiprocessing
import fcntl import select
import qubesadmin.tools import qubesadmin.tools
import qubesadmin.exc import qubesadmin.exc
@ -114,11 +114,11 @@ def copy_stdin(stream):
'''Copy stdin to *stream*''' '''Copy stdin to *stream*'''
# multiprocessing.Process have sys.stdin connected to /dev/null, use fd 0 # multiprocessing.Process have sys.stdin connected to /dev/null, use fd 0
# directly # directly
flags = fcntl.fcntl(0, fcntl.F_GETFL) while True:
flags &= ~os.O_NONBLOCK # select so this code works even if fd 0 is non-blocking
fcntl.fcntl(0, fcntl.F_SETFL, flags) select.select([0], [], [])
for data in iter(lambda: os.read(0, 65536), b''): data = os.read(0, 65536)
if data is None: if data is None or data == b'':
break break
stream.write(data) stream.write(data)
stream.flush() stream.flush()