From patchwork Tue Sep 25 14:48:52 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Tokarev X-Patchwork-Id: 186834 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 1AF1F2C008A for ; Wed, 26 Sep 2012 00:49:30 +1000 (EST) Received: from localhost ([::1]:43806 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TGWRz-0006Qx-HC for incoming@patchwork.ozlabs.org; Tue, 25 Sep 2012 10:49:27 -0400 Received: from eggs.gnu.org ([208.118.235.92]:54479) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TGWRo-0006Qk-R5 for qemu-devel@nongnu.org; Tue, 25 Sep 2012 10:49:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TGWRi-0002XS-IT for qemu-devel@nongnu.org; Tue, 25 Sep 2012 10:49:16 -0400 Received: from isrv.corpit.ru ([86.62.121.231]:42035) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TGWRi-0002X8-27 for qemu-devel@nongnu.org; Tue, 25 Sep 2012 10:49:10 -0400 Received: from gandalf.tls.msk.ru (mjt.vpn.tls.msk.ru [192.168.177.99]) by isrv.corpit.ru (Postfix) with ESMTP id 15748A1A0D; Tue, 25 Sep 2012 18:49:06 +0400 (MSK) Received: by gandalf.tls.msk.ru (Postfix, from userid 1000) id 5E55E42ED; Tue, 25 Sep 2012 18:49:05 +0400 (MSK) From: Michael Tokarev To: qemu-devel@nongnu.org Date: Tue, 25 Sep 2012 18:48:52 +0400 Message-Id: <1348584532-21914-1-git-send-email-mjt@msgid.tls.msk.ru> X-Mailer: git-send-email 1.7.10.4 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 86.62.121.231 Cc: Peter Maydell , Michael Tokarev , Stefan Hajnoczi Subject: [Qemu-devel] [PATCH v2] stop using stdio for monitor/serial/etc with -daemonize X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Current code binds monitor and serial port to the guest console unless -nographic is specified, which is okay. But when there's no guest console (-nographic), the code tries to use stdio for the same default devices. But it does not check for -daemonize at the same time -- because when -daemonize is given, there's no point at using stdin since it will be closed down the line. However, when serial port is attached to stdin, tty control modes are changed (switching tty to raw mode), and qemu will switch to background, leaving the tty in bad state. Take -daemonize into account too, when assigning default devices, and for -nographic -daemonize case, assign them to "null" instead. This is https://bugs.launchpad.net/qemu/+bug/1024275 or http://bugs.debian.org/549195 . While at it, reformat this code a bit to be less of a maze of ifs and use a variable to hold common target of devices. This patch depends on another patch, 995ee2bf469de6, "curses: don't initialize curses when qemu is daemonized", by Hitoshi Mitake, which creates is_daemonized() routine. Signed-off-by: Michael Tokarev --- vl.c | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/vl.c b/vl.c index 48049ef..a210ff9 100644 --- a/vl.c +++ b/vl.c @@ -3392,30 +3392,39 @@ int main(int argc, char **argv, char **envp) default_sdcard = 0; } - if (display_type == DT_NOGRAPHIC) { - if (default_parallel) - add_device_config(DEV_PARALLEL, "null"); + /* Create default monitor, serial, parallel and virtcon devices. */ + /* reuse optarg variable */ + optarg = NULL; + if (display_type != DT_NOGRAPHIC) { + /* regular case, all devices directed to the guest console */ + optarg = "vc:80Cx24C"; + } else if (is_daemonized()) { + /* nographic and daemonize, everything => null */ + optarg = "null"; + } else { + /* nographic and no daemonize */ + /* can't have both serial and virtcon on stdio */ if (default_serial && default_monitor) { add_device_config(DEV_SERIAL, "mon:stdio"); } else if (default_virtcon && default_monitor) { add_device_config(DEV_VIRTCON, "mon:stdio"); } else { - if (default_serial) - add_device_config(DEV_SERIAL, "stdio"); - if (default_virtcon) - add_device_config(DEV_VIRTCON, "stdio"); - if (default_monitor) - monitor_parse("stdio", "readline"); + optarg = "stdio"; } - } else { - if (default_serial) - add_device_config(DEV_SERIAL, "vc:80Cx24C"); - if (default_parallel) - add_device_config(DEV_PARALLEL, "vc:80Cx24C"); - if (default_monitor) - monitor_parse("vc:80Cx24C", "readline"); - if (default_virtcon) - add_device_config(DEV_VIRTCON, "vc:80Cx24C"); + } + if (optarg && default_serial) { + add_device_config(DEV_SERIAL, optarg); + } + if (default_parallel) { + /* parallel port is connected console or to null */ + add_device_config(DEV_PARALLEL, + display_type == DT_NOGRAPHIC ? "null" : optarg); + } + if (optarg && default_monitor) { + monitor_parse(optarg, "readline"); + } + if (optarg && default_virtcon) { + add_device_config(DEV_VIRTCON, optarg); } socket_init();