From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1O2Wqy-0004Jb-N4 for qemu-devel@nongnu.org; Thu, 15 Apr 2010 17:44:04 -0400 Received: from [140.186.70.92] (port=59200 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O2Wok-0003RC-PH for qemu-devel@nongnu.org; Thu, 15 Apr 2010 17:44:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1O2WoR-00013c-3X for qemu-devel@nongnu.org; Thu, 15 Apr 2010 17:41:39 -0400 Received: from gerolde.archlinux.org ([66.211.214.132]:58498 helo=archlinux.org) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1O2WoQ-00013D-Ah for qemu-devel@nongnu.org; Thu, 15 Apr 2010 17:41:26 -0400 From: =?UTF-8?q?Thomas=20B=C3=A4chler?= Date: Thu, 15 Apr 2010 23:41:13 +0200 Message-Id: <1271367673-18975-2-git-send-email-thomas@archlinux.org> In-Reply-To: <1271367673-18975-1-git-send-email-thomas@archlinux.org> References: <1271367673-18975-1-git-send-email-thomas@archlinux.org> Subject: [Qemu-devel] [PATCH 2/2] Add a 'screen' backend to qemu-char.c List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Thomas=20B=C3=A4chler?= , kvm@vger.kernel.org This backend uses the 'pty' backend, but attaches the pseudo tty to a screen. A user can use 'screen:name' as a char device in a qemu options and run 'screen -R name' to attach to it. This is very useful for running headless qemu/qemu-kvm machines, where you can create screen sessions for the qemu monitor and serial console. --- qemu-char.c | 33 +++++++++++++++++++++++++++++++-- qemu-config.c | 3 +++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/qemu-char.c b/qemu-char.c index d845572..d82e4c6 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -973,7 +973,9 @@ static CharDriverState *qemu_chr_open_pty(QemuOpts *opts) CharDriverState *chr; PtyCharDriver *s; struct termios tty; - int slave_fd, len; + int slave_fd, len, r; + const char *screensession; + char *cmd; #if defined(__OpenBSD__) || defined(__DragonFly__) char pty_name[PATH_MAX]; #define q_ptsname(x) pty_name @@ -1001,7 +1003,29 @@ static CharDriverState *qemu_chr_open_pty(QemuOpts *opts) chr->filename = qemu_malloc(len); snprintf(chr->filename, len, "pty:%s", q_ptsname(s->fd)); qemu_opt_set(opts, "path", q_ptsname(s->fd)); - fprintf(stderr, "char device redirected to %s\n", q_ptsname(s->fd)); + + if((screensession = qemu_opt_get(opts, "screen")) != NULL) { + if(strlen(screensession) == 0) { + qemu_free(chr); + qemu_free(s); + return NULL; + } + len = strlen(screensession) + strlen(q_ptsname(s->fd)) + 20; + cmd = qemu_malloc(len); + snprintf(cmd, len, "screen -S '%s' -dm '%s'", screensession, q_ptsname(s->fd)); + r = system(cmd); + qemu_free(cmd); + if(r == -1 || WEXITSTATUS(r) != 0) { + fprintf(stderr, "failed to launch screen\n"); + qemu_free(chr); + qemu_free(s); + return NULL; + } else { + fprintf(stderr, "char device attached to screen session %s\n", screensession); + } + } else { + fprintf(stderr, "char device redirected to %s\n", q_ptsname(s->fd)); + } chr->opaque = s; chr->chr_write = pty_chr_write; @@ -2343,6 +2367,11 @@ QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename) qemu_opt_set(opts, "path", p); return opts; } + if (strstart(filename, "screen:", &p)) { + qemu_opt_set(opts, "backend", "pty"); + qemu_opt_set(opts, "screen", p); + return opts; + } if (strstart(filename, "tcp:", &p) || strstart(filename, "telnet:", &p)) { if (sscanf(p, "%64[^:]:%32[^,]%n", host, port, &pos) < 2) { diff --git a/qemu-config.c b/qemu-config.c index 150157c..8ebf219 100644 --- a/qemu-config.c +++ b/qemu-config.c @@ -146,6 +146,9 @@ QemuOptsList qemu_chardev_opts = { },{ .name = "signal", .type = QEMU_OPT_BOOL, + },{ + .name = "screen", + .type = QEMU_OPT_STRING, }, { /* end if list */ } }, -- 1.7.0.5