diff options
author | Chris Larson <chris_larson@mentor.com> | 2010-12-10 10:37:11 -0700 |
---|---|---|
committer | Chris Larson <chris_larson@mentor.com> | 2010-12-18 10:51:23 -0700 |
commit | 6720963ba3e6e7f6e82b4d778faba803436c977e (patch) | |
tree | b6a74dd435ae7763686eff9ff37e77c502969a92 | |
parent | 4988caec915305b8a27b997f54fbcb3a46b4102d (diff) | |
download | bitbake-next.tar.gz |
server: kill stdin/stdout/stderrnext
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 <chris_larson@mentor.com>
-rw-r--r-- | lib/bb/server/process.py | 8 | ||||
-rw-r--r-- | lib/bb/utils.py | 15 |
2 files changed, 23 insertions, 0 deletions
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()) |