Commit cde76ee16adc33f29802596b3499e4fbfcabd8ff

Authored by aliguori
1 parent 2724b180

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 <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6717 c046a42c-6fe2-441c-8c8c-71466251a162
migration.c
@@ -128,8 +128,11 @@ void do_info_migrate(Monitor *mon) @@ -128,8 +128,11 @@ void do_info_migrate(Monitor *mon)
128 void migrate_fd_monitor_suspend(FdMigrationState *s) 128 void migrate_fd_monitor_suspend(FdMigrationState *s)
129 { 129 {
130 s->mon_resume = cur_mon; 130 s->mon_resume = cur_mon;
131 - monitor_suspend(cur_mon);  
132 - dprintf("suspending monitor\n"); 131 + if (monitor_suspend(cur_mon) == 0)
  132 + dprintf("suspending monitor\n");
  133 + else
  134 + monitor_printf(cur_mon, "terminal does not allow synchronous "
  135 + "migration, continuing detached\n");
133 } 136 }
134 137
135 void migrate_fd_error(FdMigrationState *s) 138 void migrate_fd_error(FdMigrationState *s)
monitor.c
@@ -97,11 +97,17 @@ static void monitor_read_command(Monitor *mon, int show_prompt) @@ -97,11 +97,17 @@ static void monitor_read_command(Monitor *mon, int show_prompt)
97 readline_show_prompt(mon->rs); 97 readline_show_prompt(mon->rs);
98 } 98 }
99 99
100 -static void monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,  
101 - void *opaque) 100 +static int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
  101 + void *opaque)
102 { 102 {
103 - readline_start(mon->rs, "Password: ", 1, readline_func, opaque);  
104 - /* prompt is printed on return from the command handler */ 103 + if (mon->rs) {
  104 + readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
  105 + /* prompt is printed on return from the command handler */
  106 + return 0;
  107 + } else {
  108 + monitor_printf(mon, "terminal does not support password prompting\n");
  109 + return -ENOTTY;
  110 + }
105 } 111 }
106 112
107 void monitor_flush(Monitor *mon) 113 void monitor_flush(Monitor *mon)
@@ -373,6 +379,8 @@ static void do_info_history(Monitor *mon) @@ -373,6 +379,8 @@ static void do_info_history(Monitor *mon)
373 int i; 379 int i;
374 const char *str; 380 const char *str;
375 381
  382 + if (!mon->rs)
  383 + return;
376 i = 0; 384 i = 0;
377 for(;;) { 385 for(;;) {
378 str = readline_get_history(mon->rs, i); 386 str = readline_get_history(mon->rs, i);
@@ -2890,8 +2898,15 @@ static void monitor_read(void *opaque, const uint8_t *buf, int size) @@ -2890,8 +2898,15 @@ static void monitor_read(void *opaque, const uint8_t *buf, int size)
2890 2898
2891 cur_mon = opaque; 2899 cur_mon = opaque;
2892 2900
2893 - for (i = 0; i < size; i++)  
2894 - readline_handle_byte(cur_mon->rs, buf[i]); 2901 + if (cur_mon->rs) {
  2902 + for (i = 0; i < size; i++)
  2903 + readline_handle_byte(cur_mon->rs, buf[i]);
  2904 + } else {
  2905 + if (size == 0 || buf[size - 1] != 0)
  2906 + monitor_printf(cur_mon, "corrupted command\n");
  2907 + else
  2908 + monitor_handle_command(cur_mon, (char *)buf);
  2909 + }
2895 2910
2896 cur_mon = old_mon; 2911 cur_mon = old_mon;
2897 } 2912 }
@@ -2903,13 +2918,18 @@ static void monitor_command_cb(Monitor *mon, const char *cmdline, void *opaque) @@ -2903,13 +2918,18 @@ static void monitor_command_cb(Monitor *mon, const char *cmdline, void *opaque)
2903 monitor_resume(mon); 2918 monitor_resume(mon);
2904 } 2919 }
2905 2920
2906 -void monitor_suspend(Monitor *mon) 2921 +int monitor_suspend(Monitor *mon)
2907 { 2922 {
  2923 + if (!mon->rs)
  2924 + return -ENOTTY;
2908 mon->suspend_cnt++; 2925 mon->suspend_cnt++;
  2926 + return 0;
2909 } 2927 }
2910 2928
2911 void monitor_resume(Monitor *mon) 2929 void monitor_resume(Monitor *mon)
2912 { 2930 {
  2931 + if (!mon->rs)
  2932 + return;
2913 if (--mon->suspend_cnt == 0) 2933 if (--mon->suspend_cnt == 0)
2914 readline_show_prompt(mon->rs); 2934 readline_show_prompt(mon->rs);
2915 } 2935 }
@@ -2957,8 +2977,10 @@ void monitor_init(CharDriverState *chr, int flags) @@ -2957,8 +2977,10 @@ void monitor_init(CharDriverState *chr, int flags)
2957 mon->flags = flags; 2977 mon->flags = flags;
2958 if (mon->chr->focus != 0) 2978 if (mon->chr->focus != 0)
2959 mon->suspend_cnt = 1; /* mux'ed monitors start suspended */ 2979 mon->suspend_cnt = 1; /* mux'ed monitors start suspended */
2960 - mon->rs = readline_init(mon, monitor_find_completion);  
2961 - monitor_read_command(mon, 0); 2980 + if (flags & MONITOR_USE_READLINE) {
  2981 + mon->rs = readline_init(mon, monitor_find_completion);
  2982 + monitor_read_command(mon, 0);
  2983 + }
2962 2984
2963 qemu_chr_add_handlers(chr, monitor_can_read, monitor_read, monitor_event, 2985 qemu_chr_add_handlers(chr, monitor_can_read, monitor_read, monitor_event,
2964 mon); 2986 mon);
@@ -2987,6 +3009,8 @@ void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, @@ -2987,6 +3009,8 @@ void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
2987 BlockDriverCompletionFunc *completion_cb, 3009 BlockDriverCompletionFunc *completion_cb,
2988 void *opaque) 3010 void *opaque)
2989 { 3011 {
  3012 + int err;
  3013 +
2990 if (!bdrv_key_required(bs)) { 3014 if (!bdrv_key_required(bs)) {
2991 if (completion_cb) 3015 if (completion_cb)
2992 completion_cb(opaque, 0); 3016 completion_cb(opaque, 0);
@@ -2999,5 +3023,8 @@ void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, @@ -2999,5 +3023,8 @@ void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
2999 mon->password_completion_cb = completion_cb; 3023 mon->password_completion_cb = completion_cb;
3000 mon->password_opaque = opaque; 3024 mon->password_opaque = opaque;
3001 3025
3002 - monitor_read_password(mon, bdrv_password_cb, bs); 3026 + err = monitor_read_password(mon, bdrv_password_cb, bs);
  3027 +
  3028 + if (err && completion_cb)
  3029 + completion_cb(opaque, err);
3003 } 3030 }
monitor.h
@@ -9,10 +9,11 @@ extern Monitor *cur_mon; @@ -9,10 +9,11 @@ extern Monitor *cur_mon;
9 9
10 /* flags for monitor_init */ 10 /* flags for monitor_init */
11 #define MONITOR_IS_DEFAULT 0x01 11 #define MONITOR_IS_DEFAULT 0x01
  12 +#define MONITOR_USE_READLINE 0x02
12 13
13 void monitor_init(CharDriverState *chr, int flags); 14 void monitor_init(CharDriverState *chr, int flags);
14 15
15 -void monitor_suspend(Monitor *mon); 16 +int monitor_suspend(Monitor *mon);
16 void monitor_resume(Monitor *mon); 17 void monitor_resume(Monitor *mon);
17 18
18 void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, 19 void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs,
qemu-char.c
@@ -2130,7 +2130,7 @@ CharDriverState *qemu_chr_open(const char *label, const char *filename, void (*i @@ -2130,7 +2130,7 @@ CharDriverState *qemu_chr_open(const char *label, const char *filename, void (*i
2130 chr = qemu_chr_open(label, p, NULL); 2130 chr = qemu_chr_open(label, p, NULL);
2131 if (chr) { 2131 if (chr) {
2132 chr = qemu_chr_open_mux(chr); 2132 chr = qemu_chr_open_mux(chr);
2133 - monitor_init(chr, 0); 2133 + monitor_init(chr, MONITOR_USE_READLINE);
2134 } else { 2134 } else {
2135 printf("Unable to open driver: %s\n", p); 2135 printf("Unable to open driver: %s\n", p);
2136 } 2136 }
@@ -5684,7 +5684,7 @@ int main(int argc, char **argv, char **envp) @@ -5684,7 +5684,7 @@ int main(int argc, char **argv, char **envp)
5684 qemu_chr_initial_reset(); 5684 qemu_chr_initial_reset();
5685 5685
5686 if (monitor_device && monitor_hd) 5686 if (monitor_device && monitor_hd)
5687 - monitor_init(monitor_hd, MONITOR_IS_DEFAULT); 5687 + monitor_init(monitor_hd, MONITOR_USE_READLINE | MONITOR_IS_DEFAULT);
5688 5688
5689 for(i = 0; i < MAX_SERIAL_PORTS; i++) { 5689 for(i = 0; i < MAX_SERIAL_PORTS; i++) {
5690 const char *devname = serial_devices[i]; 5690 const char *devname = serial_devices[i];