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]; | ... | ... |