aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Larson <chris_larson@mentor.com>2010-12-10 10:37:11 -0700
committerChris Larson <chris_larson@mentor.com>2010-12-18 10:51:23 -0700
commit6720963ba3e6e7f6e82b4d778faba803436c977e (patch)
treeb6a74dd435ae7763686eff9ff37e77c502969a92
parent4988caec915305b8a27b997f54fbcb3a46b4102d (diff)
downloadbitbake-next.tar.gz
bitbake-next.tar.bz2
bitbake-next.zip
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.py8
-rw-r--r--lib/bb/utils.py15
2 files changed, 23 insertions, 0 deletions
diff --git a/lib/bb/server/process.py b/lib/bb/server/process.py
index 27993484..e9de38e7 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 761c243c..22793a9f 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())