Commit cde76ee16adc33f29802596b3499e4fbfcabd8ff
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
Showing
5 changed files
with
46 additions
and
15 deletions
migration.c
... | ... | @@ -128,8 +128,11 @@ void do_info_migrate(Monitor *mon) |
128 | 128 | void migrate_fd_monitor_suspend(FdMigrationState *s) |
129 | 129 | { |
130 | 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 | 138 | void migrate_fd_error(FdMigrationState *s) | ... | ... |
monitor.c
... | ... | @@ -97,11 +97,17 @@ static void monitor_read_command(Monitor *mon, int show_prompt) |
97 | 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 | 113 | void monitor_flush(Monitor *mon) |
... | ... | @@ -373,6 +379,8 @@ static void do_info_history(Monitor *mon) |
373 | 379 | int i; |
374 | 380 | const char *str; |
375 | 381 | |
382 | + if (!mon->rs) | |
383 | + return; | |
376 | 384 | i = 0; |
377 | 385 | for(;;) { |
378 | 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 | 2898 | |
2891 | 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 | 2911 | cur_mon = old_mon; |
2897 | 2912 | } |
... | ... | @@ -2903,13 +2918,18 @@ static void monitor_command_cb(Monitor *mon, const char *cmdline, void *opaque) |
2903 | 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 | 2925 | mon->suspend_cnt++; |
2926 | + return 0; | |
2909 | 2927 | } |
2910 | 2928 | |
2911 | 2929 | void monitor_resume(Monitor *mon) |
2912 | 2930 | { |
2931 | + if (!mon->rs) | |
2932 | + return; | |
2913 | 2933 | if (--mon->suspend_cnt == 0) |
2914 | 2934 | readline_show_prompt(mon->rs); |
2915 | 2935 | } |
... | ... | @@ -2957,8 +2977,10 @@ void monitor_init(CharDriverState *chr, int flags) |
2957 | 2977 | mon->flags = flags; |
2958 | 2978 | if (mon->chr->focus != 0) |
2959 | 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 | 2985 | qemu_chr_add_handlers(chr, monitor_can_read, monitor_read, monitor_event, |
2964 | 2986 | mon); |
... | ... | @@ -2987,6 +3009,8 @@ void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, |
2987 | 3009 | BlockDriverCompletionFunc *completion_cb, |
2988 | 3010 | void *opaque) |
2989 | 3011 | { |
3012 | + int err; | |
3013 | + | |
2990 | 3014 | if (!bdrv_key_required(bs)) { |
2991 | 3015 | if (completion_cb) |
2992 | 3016 | completion_cb(opaque, 0); |
... | ... | @@ -2999,5 +3023,8 @@ void monitor_read_bdrv_key_start(Monitor *mon, BlockDriverState *bs, |
2999 | 3023 | mon->password_completion_cb = completion_cb; |
3000 | 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 | 9 | |
10 | 10 | /* flags for monitor_init */ |
11 | 11 | #define MONITOR_IS_DEFAULT 0x01 |
12 | +#define MONITOR_USE_READLINE 0x02 | |
12 | 13 | |
13 | 14 | void monitor_init(CharDriverState *chr, int flags); |
14 | 15 | |
15 | -void monitor_suspend(Monitor *mon); | |
16 | +int monitor_suspend(Monitor *mon); | |
16 | 17 | void monitor_resume(Monitor *mon); |
17 | 18 | |
18 | 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 | 2130 | chr = qemu_chr_open(label, p, NULL); |
2131 | 2131 | if (chr) { |
2132 | 2132 | chr = qemu_chr_open_mux(chr); |
2133 | - monitor_init(chr, 0); | |
2133 | + monitor_init(chr, MONITOR_USE_READLINE); | |
2134 | 2134 | } else { |
2135 | 2135 | printf("Unable to open driver: %s\n", p); |
2136 | 2136 | } | ... | ... |
vl.c
... | ... | @@ -5684,7 +5684,7 @@ int main(int argc, char **argv, char **envp) |
5684 | 5684 | qemu_chr_initial_reset(); |
5685 | 5685 | |
5686 | 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 | 5689 | for(i = 0; i < MAX_SERIAL_PORTS; i++) { |
5690 | 5690 | const char *devname = serial_devices[i]; | ... | ... |