From 6720963ba3e6e7f6e82b4d778faba803436c977e Mon Sep 17 00:00:00 2001 From: Chris Larson Date: Fri, 10 Dec 2010 10:37:11 -0700 Subject: server: kill stdin/stdout/stderr This ensures that nothing run from the server can touch the console, in particular event handlers and python tasks, both of which can use bb.msg or the bitbake loggers to send output to the UI in a correct fashion instead. Signed-off-by: Chris Larson --- lib/bb/server/process.py | 8 ++++++++ lib/bb/utils.py | 15 +++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/lib/bb/server/process.py b/lib/bb/server/process.py index 279934849..e9de38e70 100644 --- a/lib/bb/server/process.py +++ b/lib/bb/server/process.py @@ -22,6 +22,7 @@ import logging import signal +import sys import time import bb import bb.event @@ -29,6 +30,7 @@ from multiprocessing import Process, Event from bb.cooker import BBCooker logger = logging.getLogger('BitBake') +NULL = open('/dev/null', 'r+') class ServerCommunicator(): def __init__(self, connection): @@ -88,6 +90,12 @@ class ProcessServer(Process): self._idlefunctions[function] = data def run(self): + """Run the server, killing off stdin/stdout/stderr""" + with bb.utils.redirected_fds([sys.stdin, sys.stdout, sys.stderr], + [NULL, NULL, NULL]): + return self.main() + + def main(self): # Ignore SIGINT within the server, as all SIGINT handling is done by # the UI and communicated to us signal.signal(signal.SIGINT, signal.SIG_IGN) diff --git a/lib/bb/utils.py b/lib/bb/utils.py index 761c243c6..22793a9f6 100644 --- a/lib/bb/utils.py +++ b/lib/bb/utils.py @@ -794,3 +794,18 @@ def init_logger(logger, verbose, debug, debug_domains): if debug_domains: bb.msg.set_debug_domains(debug_domains) + +@contextmanager +def redirected_fds(from_files, to_files): + assert len(from_files) == len(to_files), 'from_files / to_files length mismatch' + + old_fds = [] + for position, fobj in enumerate(from_files): + fd = fobj.fileno() + old_fds.append(os.dup(fd)) + os.dup2(to_files[position].fileno(), fd) + + yield + + for position, fd in enumerate(old_fds): + os.dup2(fd, from_files[position].fileno()) -- cgit 1.2.3-korg