From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LfMZe-0008Vs-8k for qemu-devel@nongnu.org; Thu, 05 Mar 2009 18:01:54 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LfMZd-0008VG-Ka for qemu-devel@nongnu.org; Thu, 05 Mar 2009 18:01:53 -0500 Received: from [199.232.76.173] (port=37328 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LfMZd-0008VD-EF for qemu-devel@nongnu.org; Thu, 05 Mar 2009 18:01:53 -0500 Received: from savannah.gnu.org ([199.232.41.3]:59826 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LfMZc-0005fl-UV for qemu-devel@nongnu.org; Thu, 05 Mar 2009 18:01:53 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1LfMZc-0002Xc-HH for qemu-devel@nongnu.org; Thu, 05 Mar 2009 23:01:52 +0000 Received: from aliguori by cvs.savannah.gnu.org with local (Exim 4.69) (envelope-from ) id 1LfMZc-0002X0-7p for qemu-devel@nongnu.org; Thu, 05 Mar 2009 23:01:52 +0000 MIME-Version: 1.0 Errors-To: aliguori Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Anthony Liguori Message-Id: Date: Thu, 05 Mar 2009 23:01:52 +0000 Subject: [Qemu-devel] [6717] monitor: Introduce MONITOR_USE_READLINE flag (Jan Kiszka) Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6717 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6717 Author: aliguori Date: 2009-03-05 23:01:51 +0000 (Thu, 05 Mar 2009) Log Message: ----------- monitor: Introduce MONITOR_USE_READLINE flag (Jan Kiszka) This allows to create monitor terminals that do not make use of the interactive readline back-end but rather send complete commands. The pass-through monitor interface of the gdbstub will be an example. Signed-off-by: Jan Kiszka Signed-off-by: Anthony Liguori Modified Paths: -------------- trunk/migration.c trunk/monitor.c trunk/monitor.h trunk/qemu-char.c trunk/vl.c Modified: trunk/migration.c =================================================================== --- trunk/migration.c 2009-03-05 23:01:47 UTC (rev 6716) +++ trunk/migration.c 2009-03-05 23:01:51 UTC (rev 6717) @@ -128,8 +128,11 @@ void migrate_fd_monitor_suspend(FdMigrationState *s) { s->mon_resume = cur_mon; - monitor_suspend(cur_mon); - dprintf("suspending monitor\n"); + if (monitor_suspend(cur_mon) == 0) + dprintf("suspending monitor\n"); + else + monitor_printf(cur_mon, "terminal does not allow synchronous " + "migration, continuing detached\n"); } void migrate_fd_error(FdMigrationState *s) Modified: trunk/monitor.c =================================================================== --- trunk/monitor.c 2009-03-05 23:01:47 UTC (rev 6716) +++ trunk/monitor.c 2009-03-05 23:01:51 UTC (rev 6717) @@ -97,11 +97,17 @@ readline_show_prompt(mon->rs); } -static void monitor_read_password(Monitor *mon, ReadLineFunc *readline_func, - void *opaque) +static int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func, + void *opaque) { - readline_start(mon->rs, "Password: ", 1, readline_func, opaque); - /* prompt is printed on return from the command handler */ + if (mon->rs) { + readline_start(mon->rs, "Password: ", 1, readline_func, opaque); + /* prompt is printed on return from the command handler */ + return 0; + } else { + monitor_printf(mon, "terminal does not support password prompting\n"); + return -ENOTTY; + } } void monitor_flush(Monitor *mon) @@ -373,6 +379,8 @@ int i; const char *str; + if (!mon->rs) + return; i = 0; for(;;) { str = readline_get_history(mon->rs, i); @@ -2890,8 +2898,15 @@ cur_mon = opaque; - for (i = 0; i < size; i++) - readline_handle_byte(cur_mon->rs, buf[i]); + if (cur_mon->rs) { + for (i = 0; i < size; i++) + readline_handle_byte(cur_mon->rs, buf[i]); + } else { + if (size == 0 || buf[size - 1] != 0) + monitor_printf(cur_mon, "corrupted command\n"); + else + monitor_handle_command(cur_mon, (char *)buf); + } cur_mon = old_mon; } @@ -2903,13 +2918,18 @@ monitor_resume(mon); } -void monitor_suspend(Monitor *mon) +int monitor_suspend(Monitor *mon) { + if (!mon->rs) + return -ENOTTY; mon->suspend_cnt++; + return 0; } void monitor_resume(Monitor *mon) { + if (!mon->rs) + return; if (--mon->suspend_cnt == 0) readline_show_prompt(mon->rs); } @@ -2957,8 +2977,10 @@ mon->flags = flags; if (mon->chr->focus != 0) mon->suspend_cnt = 1; /* mux'ed monitors start suspended */ - mon->rs = readline_init(mon, monitor_find_completion); - monitor_read_command(mon, 0); + if (flags & MONITOR_USE_READLINE) { + mon->rs = readline_init(mon, monitor_find_completion); + monitor_read_command(mon, 0); + } qemu_chr_add_handlers(chr, monitor_can_read, monitor_read, monitor_event, mon); @@ -2987,6 +3009,8 @@ BlockDriverCompletionFunc *completion_cb, void *opaque) { + int err; + if (!bdrv_key_required(bs)) { if (completion_cb) completion_cb(opaque, 0); @@ -2999,5 +3023,8 @@ mon->password_completion_cb = completion_cb; mon->password_opaque = opaque; - monitor_read_password(mon, bdrv_password_cb, bs); + err = monitor_read_password(mon, bdrv_password_cb, bs); + + if (err && completion_cb) + completion_cb(opaque, err); } Modified: trunk/monitor.h =================================================================== --- trunk/monitor.h 2009-03-05 23:01:47 UTC (rev 6716) +++ trunk/monitor.h 2009-03-05 23:01:51 UTC (rev 6717) @@ -9,10 +9,11 @@ /* flags for monitor_init */ #define MONITOR_IS_DEFAULT 0x01 +#define MONITOR_USE_READLINE 0x02 void monitor_init(CharDriverState *chr, int flags); -void monitor_suspend(Monitor *mon); +int monitor_suspend(Monitor *mon); void monitor_resume(Monitor *mon); void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, Modified: trunk/qemu-char.c =================================================================== --- trunk/qemu-char.c 2009-03-05 23:01:47 UTC (rev 6716) +++ trunk/qemu-char.c 2009-03-05 23:01:51 UTC (rev 6717) @@ -2130,7 +2130,7 @@ chr = qemu_chr_open(label, p, NULL); if (chr) { chr = qemu_chr_open_mux(chr); - monitor_init(chr, 0); + monitor_init(chr, MONITOR_USE_READLINE); } else { printf("Unable to open driver: %s\n", p); } Modified: trunk/vl.c =================================================================== --- trunk/vl.c 2009-03-05 23:01:47 UTC (rev 6716) +++ trunk/vl.c 2009-03-05 23:01:51 UTC (rev 6717) @@ -5684,7 +5684,7 @@ qemu_chr_initial_reset(); if (monitor_device && monitor_hd) - monitor_init(monitor_hd, MONITOR_IS_DEFAULT); + monitor_init(monitor_hd, MONITOR_USE_READLINE | MONITOR_IS_DEFAULT); for(i = 0; i < MAX_SERIAL_PORTS; i++) { const char *devname = serial_devices[i];