block: Remove ignore_bds_parents parameter from drain_begin/end.
[qemu.git] / monitor / hmp.c
blob43fd69f98461060e013766b07f569a18d66f1283
1 /*
2 * QEMU monitor
4 * Copyright (c) 2003-2004 Fabrice Bellard
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
25 #include "qemu/osdep.h"
26 #include <dirent.h>
27 #include "hw/qdev-core.h"
28 #include "monitor-internal.h"
29 #include "monitor/hmp.h"
30 #include "qapi/error.h"
31 #include "qapi/qmp/qdict.h"
32 #include "qapi/qmp/qnum.h"
33 #include "qemu/config-file.h"
34 #include "qemu/ctype.h"
35 #include "qemu/cutils.h"
36 #include "qemu/log.h"
37 #include "qemu/option.h"
38 #include "qemu/units.h"
39 #include "sysemu/block-backend.h"
40 #include "sysemu/runstate.h"
41 #include "trace.h"
43 static void monitor_command_cb(void *opaque, const char *cmdline,
44 void *readline_opaque)
46 MonitorHMP *mon = opaque;
48 monitor_suspend(&mon->common);
49 handle_hmp_command(mon, cmdline);
50 monitor_resume(&mon->common);
53 void monitor_read_command(MonitorHMP *mon, int show_prompt)
55 if (!mon->rs) {
56 return;
59 readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
60 if (show_prompt) {
61 readline_show_prompt(mon->rs);
65 int monitor_read_password(MonitorHMP *mon, ReadLineFunc *readline_func,
66 void *opaque)
68 if (mon->rs) {
69 readline_start(mon->rs, "Password: ", 1, readline_func, opaque);
70 /* prompt is printed on return from the command handler */
71 return 0;
72 } else {
73 monitor_printf(&mon->common,
74 "terminal does not support password prompting\n");
75 return -ENOTTY;
79 static int get_str(char *buf, int buf_size, const char **pp)
81 const char *p;
82 char *q;
83 int c;
85 q = buf;
86 p = *pp;
87 while (qemu_isspace(*p)) {
88 p++;
90 if (*p == '\0') {
91 fail:
92 *q = '\0';
93 *pp = p;
94 return -1;
96 if (*p == '\"') {
97 p++;
98 while (*p != '\0' && *p != '\"') {
99 if (*p == '\\') {
100 p++;
101 c = *p++;
102 switch (c) {
103 case 'n':
104 c = '\n';
105 break;
106 case 'r':
107 c = '\r';
108 break;
109 case '\\':
110 case '\'':
111 case '\"':
112 break;
113 default:
114 printf("unsupported escape code: '\\%c'\n", c);
115 goto fail;
117 if ((q - buf) < buf_size - 1) {
118 *q++ = c;
120 } else {
121 if ((q - buf) < buf_size - 1) {
122 *q++ = *p;
124 p++;
127 if (*p != '\"') {
128 printf("unterminated string\n");
129 goto fail;
131 p++;
132 } else {
133 while (*p != '\0' && !qemu_isspace(*p)) {
134 if ((q - buf) < buf_size - 1) {
135 *q++ = *p;
137 p++;
140 *q = '\0';
141 *pp = p;
142 return 0;
145 #define MAX_ARGS 16
147 static void free_cmdline_args(char **args, int nb_args)
149 int i;
151 assert(nb_args <= MAX_ARGS);
153 for (i = 0; i < nb_args; i++) {
154 g_free(args[i]);
160 * Parse the command line to get valid args.
161 * @cmdline: command line to be parsed.
162 * @pnb_args: location to store the number of args, must NOT be NULL.
163 * @args: location to store the args, which should be freed by caller, must
164 * NOT be NULL.
166 * Returns 0 on success, negative on failure.
168 * NOTE: this parser is an approximate form of the real command parser. Number
169 * of args have a limit of MAX_ARGS. If cmdline contains more, it will
170 * return with failure.
172 static int parse_cmdline(const char *cmdline,
173 int *pnb_args, char **args)
175 const char *p;
176 int nb_args, ret;
177 char buf[1024];
179 p = cmdline;
180 nb_args = 0;
181 for (;;) {
182 while (qemu_isspace(*p)) {
183 p++;
185 if (*p == '\0') {
186 break;
188 if (nb_args >= MAX_ARGS) {
189 goto fail;
191 ret = get_str(buf, sizeof(buf), &p);
192 if (ret < 0) {
193 goto fail;
195 args[nb_args] = g_strdup(buf);
196 nb_args++;
198 *pnb_args = nb_args;
199 return 0;
201 fail:
202 free_cmdline_args(args, nb_args);
203 return -1;
207 * Can command @cmd be executed in preconfig state?
209 static bool cmd_can_preconfig(const HMPCommand *cmd)
211 if (!cmd->flags) {
212 return false;
215 return strchr(cmd->flags, 'p');
218 static bool cmd_available(const HMPCommand *cmd)
220 return phase_check(PHASE_MACHINE_READY) || cmd_can_preconfig(cmd);
223 static void help_cmd_dump_one(Monitor *mon,
224 const HMPCommand *cmd,
225 char **prefix_args,
226 int prefix_args_nb)
228 int i;
230 if (!cmd_available(cmd)) {
231 return;
234 for (i = 0; i < prefix_args_nb; i++) {
235 monitor_printf(mon, "%s ", prefix_args[i]);
237 monitor_printf(mon, "%s %s -- %s\n", cmd->name, cmd->params, cmd->help);
240 /* @args[@arg_index] is the valid command need to find in @cmds */
241 static void help_cmd_dump(Monitor *mon, const HMPCommand *cmds,
242 char **args, int nb_args, int arg_index)
244 const HMPCommand *cmd;
245 size_t i;
247 /* No valid arg need to compare with, dump all in *cmds */
248 if (arg_index >= nb_args) {
249 for (cmd = cmds; cmd->name != NULL; cmd++) {
250 help_cmd_dump_one(mon, cmd, args, arg_index);
252 return;
255 /* Find one entry to dump */
256 for (cmd = cmds; cmd->name != NULL; cmd++) {
257 if (hmp_compare_cmd(args[arg_index], cmd->name) &&
258 cmd_available(cmd)) {
259 if (cmd->sub_table) {
260 /* continue with next arg */
261 help_cmd_dump(mon, cmd->sub_table,
262 args, nb_args, arg_index + 1);
263 } else {
264 help_cmd_dump_one(mon, cmd, args, arg_index);
266 return;
270 /* Command not found */
271 monitor_printf(mon, "unknown command: '");
272 for (i = 0; i <= arg_index; i++) {
273 monitor_printf(mon, "%s%s", args[i], i == arg_index ? "'\n" : " ");
277 void help_cmd(Monitor *mon, const char *name)
279 char *args[MAX_ARGS];
280 int nb_args = 0;
282 /* 1. parse user input */
283 if (name) {
284 /* special case for log, directly dump and return */
285 if (!strcmp(name, "log")) {
286 const QEMULogItem *item;
287 monitor_printf(mon, "Log items (comma separated):\n");
288 monitor_printf(mon, "%-15s %s\n", "none", "remove all logs");
289 for (item = qemu_log_items; item->mask != 0; item++) {
290 monitor_printf(mon, "%-15s %s\n", item->name, item->help);
292 #ifdef CONFIG_TRACE_LOG
293 monitor_printf(mon, "trace:PATTERN enable trace events\n");
294 monitor_printf(mon, "\nUse \"log trace:help\" to get a list of "
295 "trace events.\n\n");
296 #endif
297 return;
300 if (parse_cmdline(name, &nb_args, args) < 0) {
301 return;
305 /* 2. dump the contents according to parsed args */
306 help_cmd_dump(mon, hmp_cmds, args, nb_args, 0);
308 free_cmdline_args(args, nb_args);
311 /*******************************************************************/
313 static const char *pch;
314 static sigjmp_buf expr_env;
316 static G_NORETURN G_GNUC_PRINTF(2, 3)
317 void expr_error(Monitor *mon, const char *fmt, ...)
319 va_list ap;
320 va_start(ap, fmt);
321 monitor_vprintf(mon, fmt, ap);
322 monitor_printf(mon, "\n");
323 va_end(ap);
324 siglongjmp(expr_env, 1);
327 static void next(void)
329 if (*pch != '\0') {
330 pch++;
331 while (qemu_isspace(*pch)) {
332 pch++;
337 static int64_t expr_sum(Monitor *mon);
339 static int64_t expr_unary(Monitor *mon)
341 int64_t n;
342 char *p;
343 int ret;
345 switch (*pch) {
346 case '+':
347 next();
348 n = expr_unary(mon);
349 break;
350 case '-':
351 next();
352 n = -expr_unary(mon);
353 break;
354 case '~':
355 next();
356 n = ~expr_unary(mon);
357 break;
358 case '(':
359 next();
360 n = expr_sum(mon);
361 if (*pch != ')') {
362 expr_error(mon, "')' expected");
364 next();
365 break;
366 case '\'':
367 pch++;
368 if (*pch == '\0') {
369 expr_error(mon, "character constant expected");
371 n = *pch;
372 pch++;
373 if (*pch != '\'') {
374 expr_error(mon, "missing terminating \' character");
376 next();
377 break;
378 case '$':
380 char buf[128], *q;
381 int64_t reg = 0;
383 pch++;
384 q = buf;
385 while ((*pch >= 'a' && *pch <= 'z') ||
386 (*pch >= 'A' && *pch <= 'Z') ||
387 (*pch >= '0' && *pch <= '9') ||
388 *pch == '_' || *pch == '.') {
389 if ((q - buf) < sizeof(buf) - 1) {
390 *q++ = *pch;
392 pch++;
394 while (qemu_isspace(*pch)) {
395 pch++;
397 *q = 0;
398 ret = get_monitor_def(mon, &reg, buf);
399 if (ret < 0) {
400 expr_error(mon, "unknown register");
402 n = reg;
404 break;
405 case '\0':
406 expr_error(mon, "unexpected end of expression");
407 n = 0;
408 break;
409 default:
410 errno = 0;
411 n = strtoull(pch, &p, 0);
412 if (errno == ERANGE) {
413 expr_error(mon, "number too large");
415 if (pch == p) {
416 expr_error(mon, "invalid char '%c' in expression", *p);
418 pch = p;
419 while (qemu_isspace(*pch)) {
420 pch++;
422 break;
424 return n;
427 static int64_t expr_prod(Monitor *mon)
429 int64_t val, val2;
430 int op;
432 val = expr_unary(mon);
433 for (;;) {
434 op = *pch;
435 if (op != '*' && op != '/' && op != '%') {
436 break;
438 next();
439 val2 = expr_unary(mon);
440 switch (op) {
441 default:
442 case '*':
443 val *= val2;
444 break;
445 case '/':
446 case '%':
447 if (val2 == 0) {
448 expr_error(mon, "division by zero");
450 if (op == '/') {
451 val /= val2;
452 } else {
453 val %= val2;
455 break;
458 return val;
461 static int64_t expr_logic(Monitor *mon)
463 int64_t val, val2;
464 int op;
466 val = expr_prod(mon);
467 for (;;) {
468 op = *pch;
469 if (op != '&' && op != '|' && op != '^') {
470 break;
472 next();
473 val2 = expr_prod(mon);
474 switch (op) {
475 default:
476 case '&':
477 val &= val2;
478 break;
479 case '|':
480 val |= val2;
481 break;
482 case '^':
483 val ^= val2;
484 break;
487 return val;
490 static int64_t expr_sum(Monitor *mon)
492 int64_t val, val2;
493 int op;
495 val = expr_logic(mon);
496 for (;;) {
497 op = *pch;
498 if (op != '+' && op != '-') {
499 break;
501 next();
502 val2 = expr_logic(mon);
503 if (op == '+') {
504 val += val2;
505 } else {
506 val -= val2;
509 return val;
512 static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
514 pch = *pp;
515 if (sigsetjmp(expr_env, 0)) {
516 *pp = pch;
517 return -1;
519 while (qemu_isspace(*pch)) {
520 pch++;
522 *pval = expr_sum(mon);
523 *pp = pch;
524 return 0;
527 static int get_double(Monitor *mon, double *pval, const char **pp)
529 const char *p = *pp;
530 char *tailp;
531 double d;
533 d = strtod(p, &tailp);
534 if (tailp == p) {
535 monitor_printf(mon, "Number expected\n");
536 return -1;
538 if (d != d || d - d != 0) {
539 /* NaN or infinity */
540 monitor_printf(mon, "Bad number\n");
541 return -1;
543 *pval = d;
544 *pp = tailp;
545 return 0;
549 * Store the command-name in cmdname, and return a pointer to
550 * the remaining of the command string.
552 static const char *get_command_name(const char *cmdline,
553 char *cmdname, size_t nlen)
555 size_t len;
556 const char *p, *pstart;
558 p = cmdline;
559 while (qemu_isspace(*p)) {
560 p++;
562 if (*p == '\0') {
563 return NULL;
565 pstart = p;
566 while (*p != '\0' && *p != '/' && !qemu_isspace(*p)) {
567 p++;
569 len = p - pstart;
570 if (len > nlen - 1) {
571 len = nlen - 1;
573 memcpy(cmdname, pstart, len);
574 cmdname[len] = '\0';
575 return p;
579 * Read key of 'type' into 'key' and return the current
580 * 'type' pointer.
582 static char *key_get_info(const char *type, char **key)
584 size_t len;
585 char *p, *str;
587 if (*type == ',') {
588 type++;
591 p = strchr(type, ':');
592 if (!p) {
593 *key = NULL;
594 return NULL;
596 len = p - type;
598 str = g_malloc(len + 1);
599 memcpy(str, type, len);
600 str[len] = '\0';
602 *key = str;
603 return ++p;
606 static int default_fmt_format = 'x';
607 static int default_fmt_size = 4;
609 static int is_valid_option(const char *c, const char *typestr)
611 char option[3];
613 option[0] = '-';
614 option[1] = *c;
615 option[2] = '\0';
617 typestr = strstr(typestr, option);
618 return (typestr != NULL);
621 static const HMPCommand *search_dispatch_table(const HMPCommand *disp_table,
622 const char *cmdname)
624 const HMPCommand *cmd;
626 for (cmd = disp_table; cmd->name != NULL; cmd++) {
627 if (hmp_compare_cmd(cmdname, cmd->name)) {
628 return cmd;
632 return NULL;
636 * Parse command name from @cmdp according to command table @table.
637 * If blank, return NULL.
638 * Else, if no valid command can be found, report to @mon, and return
639 * NULL.
640 * Else, change @cmdp to point right behind the name, and return its
641 * command table entry.
642 * Do not assume the return value points into @table! It doesn't when
643 * the command is found in a sub-command table.
645 static const HMPCommand *monitor_parse_command(MonitorHMP *hmp_mon,
646 const char *cmdp_start,
647 const char **cmdp,
648 HMPCommand *table)
650 Monitor *mon = &hmp_mon->common;
651 const char *p;
652 const HMPCommand *cmd;
653 char cmdname[256];
655 /* extract the command name */
656 p = get_command_name(*cmdp, cmdname, sizeof(cmdname));
657 if (!p) {
658 return NULL;
661 cmd = search_dispatch_table(table, cmdname);
662 if (!cmd) {
663 monitor_printf(mon, "unknown command: '%.*s'\n",
664 (int)(p - cmdp_start), cmdp_start);
665 return NULL;
667 if (!cmd_available(cmd)) {
668 monitor_printf(mon, "Command '%.*s' not available "
669 "until machine initialization has completed.\n",
670 (int)(p - cmdp_start), cmdp_start);
671 return NULL;
674 /* filter out following useless space */
675 while (qemu_isspace(*p)) {
676 p++;
679 *cmdp = p;
680 /* search sub command */
681 if (cmd->sub_table != NULL && *p != '\0') {
682 return monitor_parse_command(hmp_mon, cmdp_start, cmdp, cmd->sub_table);
685 return cmd;
689 * Parse arguments for @cmd.
690 * If it can't be parsed, report to @mon, and return NULL.
691 * Else, insert command arguments into a QDict, and return it.
692 * Note: On success, caller has to free the QDict structure.
694 static QDict *monitor_parse_arguments(Monitor *mon,
695 const char **endp,
696 const HMPCommand *cmd)
698 const char *typestr;
699 char *key;
700 int c;
701 const char *p = *endp;
702 char buf[1024];
703 QDict *qdict = qdict_new();
705 /* parse the parameters */
706 typestr = cmd->args_type;
707 for (;;) {
708 typestr = key_get_info(typestr, &key);
709 if (!typestr) {
710 break;
712 c = *typestr;
713 typestr++;
714 switch (c) {
715 case 'F':
716 case 'B':
717 case 's':
719 int ret;
721 while (qemu_isspace(*p)) {
722 p++;
724 if (*typestr == '?') {
725 typestr++;
726 if (*p == '\0') {
727 /* no optional string: NULL argument */
728 break;
731 ret = get_str(buf, sizeof(buf), &p);
732 if (ret < 0) {
733 switch (c) {
734 case 'F':
735 monitor_printf(mon, "%s: filename expected\n",
736 cmd->name);
737 break;
738 case 'B':
739 monitor_printf(mon, "%s: block device name expected\n",
740 cmd->name);
741 break;
742 default:
743 monitor_printf(mon, "%s: string expected\n", cmd->name);
744 break;
746 goto fail;
748 qdict_put_str(qdict, key, buf);
750 break;
751 case 'O':
753 QemuOptsList *opts_list;
754 QemuOpts *opts;
756 opts_list = qemu_find_opts(key);
757 if (!opts_list || opts_list->desc->name) {
758 goto bad_type;
760 while (qemu_isspace(*p)) {
761 p++;
763 if (!*p) {
764 break;
766 if (get_str(buf, sizeof(buf), &p) < 0) {
767 goto fail;
769 opts = qemu_opts_parse_noisily(opts_list, buf, true);
770 if (!opts) {
771 goto fail;
773 qemu_opts_to_qdict(opts, qdict);
774 qemu_opts_del(opts);
776 break;
777 case '/':
779 int count, format, size;
781 while (qemu_isspace(*p)) {
782 p++;
784 if (*p == '/') {
785 /* format found */
786 p++;
787 count = 1;
788 if (qemu_isdigit(*p)) {
789 count = 0;
790 while (qemu_isdigit(*p)) {
791 count = count * 10 + (*p - '0');
792 p++;
795 size = -1;
796 format = -1;
797 for (;;) {
798 switch (*p) {
799 case 'o':
800 case 'd':
801 case 'u':
802 case 'x':
803 case 'i':
804 case 'c':
805 format = *p++;
806 break;
807 case 'b':
808 size = 1;
809 p++;
810 break;
811 case 'h':
812 size = 2;
813 p++;
814 break;
815 case 'w':
816 size = 4;
817 p++;
818 break;
819 case 'g':
820 case 'L':
821 size = 8;
822 p++;
823 break;
824 default:
825 goto next;
828 next:
829 if (*p != '\0' && !qemu_isspace(*p)) {
830 monitor_printf(mon, "invalid char in format: '%c'\n",
831 *p);
832 goto fail;
834 if (format < 0) {
835 format = default_fmt_format;
837 if (format != 'i') {
838 /* for 'i', not specifying a size gives -1 as size */
839 if (size < 0) {
840 size = default_fmt_size;
842 default_fmt_size = size;
844 default_fmt_format = format;
845 } else {
846 count = 1;
847 format = default_fmt_format;
848 if (format != 'i') {
849 size = default_fmt_size;
850 } else {
851 size = -1;
854 qdict_put_int(qdict, "count", count);
855 qdict_put_int(qdict, "format", format);
856 qdict_put_int(qdict, "size", size);
858 break;
859 case 'i':
860 case 'l':
861 case 'M':
863 int64_t val;
865 while (qemu_isspace(*p)) {
866 p++;
868 if (*typestr == '?' || *typestr == '.') {
869 if (*typestr == '?') {
870 if (*p == '\0') {
871 typestr++;
872 break;
874 } else {
875 if (*p == '.') {
876 p++;
877 while (qemu_isspace(*p)) {
878 p++;
880 } else {
881 typestr++;
882 break;
885 typestr++;
887 if (get_expr(mon, &val, &p)) {
888 goto fail;
890 /* Check if 'i' is greater than 32-bit */
891 if ((c == 'i') && ((val >> 32) & 0xffffffff)) {
892 monitor_printf(mon, "\'%s\' has failed: ", cmd->name);
893 monitor_printf(mon, "integer is for 32-bit values\n");
894 goto fail;
895 } else if (c == 'M') {
896 if (val < 0) {
897 monitor_printf(mon, "enter a positive value\n");
898 goto fail;
900 val *= MiB;
902 qdict_put_int(qdict, key, val);
904 break;
905 case 'o':
907 int ret;
908 uint64_t val;
909 const char *end;
911 while (qemu_isspace(*p)) {
912 p++;
914 if (*typestr == '?') {
915 typestr++;
916 if (*p == '\0') {
917 break;
920 ret = qemu_strtosz_MiB(p, &end, &val);
921 if (ret < 0 || val > INT64_MAX) {
922 monitor_printf(mon, "invalid size\n");
923 goto fail;
925 qdict_put_int(qdict, key, val);
926 p = end;
928 break;
929 case 'T':
931 double val;
933 while (qemu_isspace(*p)) {
934 p++;
936 if (*typestr == '?') {
937 typestr++;
938 if (*p == '\0') {
939 break;
942 if (get_double(mon, &val, &p) < 0) {
943 goto fail;
945 if (p[0] && p[1] == 's') {
946 switch (*p) {
947 case 'm':
948 val /= 1e3; p += 2; break;
949 case 'u':
950 val /= 1e6; p += 2; break;
951 case 'n':
952 val /= 1e9; p += 2; break;
955 if (*p && !qemu_isspace(*p)) {
956 monitor_printf(mon, "Unknown unit suffix\n");
957 goto fail;
959 qdict_put(qdict, key, qnum_from_double(val));
961 break;
962 case 'b':
964 const char *beg;
965 bool val;
967 while (qemu_isspace(*p)) {
968 p++;
970 beg = p;
971 while (qemu_isgraph(*p)) {
972 p++;
974 if (p - beg == 2 && !memcmp(beg, "on", p - beg)) {
975 val = true;
976 } else if (p - beg == 3 && !memcmp(beg, "off", p - beg)) {
977 val = false;
978 } else {
979 monitor_printf(mon, "Expected 'on' or 'off'\n");
980 goto fail;
982 qdict_put_bool(qdict, key, val);
984 break;
985 case '-':
987 const char *tmp = p;
988 int skip_key = 0;
989 int ret;
990 /* option */
992 c = *typestr++;
993 if (c == '\0') {
994 goto bad_type;
996 while (qemu_isspace(*p)) {
997 p++;
999 if (*p == '-') {
1000 p++;
1001 if (c != *p) {
1002 if (!is_valid_option(p, typestr)) {
1003 monitor_printf(mon, "%s: unsupported option -%c\n",
1004 cmd->name, *p);
1005 goto fail;
1006 } else {
1007 skip_key = 1;
1010 if (skip_key) {
1011 p = tmp;
1012 } else if (*typestr == 's') {
1013 /* has option with string value */
1014 typestr++;
1015 tmp = p++;
1016 while (qemu_isspace(*p)) {
1017 p++;
1019 ret = get_str(buf, sizeof(buf), &p);
1020 if (ret < 0) {
1021 monitor_printf(mon, "%s: value expected for -%c\n",
1022 cmd->name, *tmp);
1023 goto fail;
1025 qdict_put_str(qdict, key, buf);
1026 } else {
1027 /* has boolean option */
1028 p++;
1029 qdict_put_bool(qdict, key, true);
1031 } else if (*typestr == 's') {
1032 typestr++;
1035 break;
1036 case 'S':
1038 /* package all remaining string */
1039 int len;
1041 while (qemu_isspace(*p)) {
1042 p++;
1044 if (*typestr == '?') {
1045 typestr++;
1046 if (*p == '\0') {
1047 /* no remaining string: NULL argument */
1048 break;
1051 len = strlen(p);
1052 if (len <= 0) {
1053 monitor_printf(mon, "%s: string expected\n",
1054 cmd->name);
1055 goto fail;
1057 qdict_put_str(qdict, key, p);
1058 p += len;
1060 break;
1061 default:
1062 bad_type:
1063 monitor_printf(mon, "%s: unknown type '%c'\n", cmd->name, c);
1064 goto fail;
1066 g_free(key);
1067 key = NULL;
1069 /* check that all arguments were parsed */
1070 while (qemu_isspace(*p)) {
1071 p++;
1073 if (*p != '\0') {
1074 monitor_printf(mon, "%s: extraneous characters at the end of line\n",
1075 cmd->name);
1076 goto fail;
1079 return qdict;
1081 fail:
1082 qobject_unref(qdict);
1083 g_free(key);
1084 return NULL;
1087 static void hmp_info_human_readable_text(Monitor *mon,
1088 HumanReadableText *(*handler)(Error **))
1090 Error *err = NULL;
1091 g_autoptr(HumanReadableText) info = handler(&err);
1093 if (hmp_handle_error(mon, err)) {
1094 return;
1097 monitor_puts(mon, info->human_readable_text);
1100 static void handle_hmp_command_exec(Monitor *mon,
1101 const HMPCommand *cmd,
1102 QDict *qdict)
1104 if (cmd->cmd_info_hrt) {
1105 hmp_info_human_readable_text(mon,
1106 cmd->cmd_info_hrt);
1107 } else {
1108 cmd->cmd(mon, qdict);
1112 typedef struct HandleHmpCommandCo {
1113 Monitor *mon;
1114 const HMPCommand *cmd;
1115 QDict *qdict;
1116 bool done;
1117 } HandleHmpCommandCo;
1119 static void handle_hmp_command_co(void *opaque)
1121 HandleHmpCommandCo *data = opaque;
1122 handle_hmp_command_exec(data->mon, data->cmd, data->qdict);
1123 monitor_set_cur(qemu_coroutine_self(), NULL);
1124 data->done = true;
1127 void handle_hmp_command(MonitorHMP *mon, const char *cmdline)
1129 QDict *qdict;
1130 const HMPCommand *cmd;
1131 const char *cmd_start = cmdline;
1133 trace_handle_hmp_command(mon, cmdline);
1135 cmd = monitor_parse_command(mon, cmdline, &cmdline, hmp_cmds);
1136 if (!cmd) {
1137 return;
1140 if (!cmd->cmd && !cmd->cmd_info_hrt) {
1141 /* FIXME: is it useful to try autoload modules here ??? */
1142 monitor_printf(&mon->common, "Command \"%.*s\" is not available.\n",
1143 (int)(cmdline - cmd_start), cmd_start);
1144 return;
1147 qdict = monitor_parse_arguments(&mon->common, &cmdline, cmd);
1148 if (!qdict) {
1149 while (cmdline > cmd_start && qemu_isspace(cmdline[-1])) {
1150 cmdline--;
1152 monitor_printf(&mon->common, "Try \"help %.*s\" for more information\n",
1153 (int)(cmdline - cmd_start), cmd_start);
1154 return;
1157 if (!cmd->coroutine) {
1158 /* old_mon is non-NULL when called from qmp_human_monitor_command() */
1159 Monitor *old_mon = monitor_set_cur(qemu_coroutine_self(), &mon->common);
1160 handle_hmp_command_exec(&mon->common, cmd, qdict);
1161 monitor_set_cur(qemu_coroutine_self(), old_mon);
1162 } else {
1163 HandleHmpCommandCo data = {
1164 .mon = &mon->common,
1165 .cmd = cmd,
1166 .qdict = qdict,
1167 .done = false,
1169 Coroutine *co = qemu_coroutine_create(handle_hmp_command_co, &data);
1170 monitor_set_cur(co, &mon->common);
1171 aio_co_enter(qemu_get_aio_context(), co);
1172 AIO_WAIT_WHILE(qemu_get_aio_context(), !data.done);
1175 qobject_unref(qdict);
1178 static void cmd_completion(MonitorHMP *mon, const char *name, const char *list)
1180 const char *p, *pstart;
1181 char cmd[128];
1182 int len;
1184 p = list;
1185 for (;;) {
1186 pstart = p;
1187 p = qemu_strchrnul(p, '|');
1188 len = p - pstart;
1189 if (len > sizeof(cmd) - 2) {
1190 len = sizeof(cmd) - 2;
1192 memcpy(cmd, pstart, len);
1193 cmd[len] = '\0';
1194 if (name[0] == '\0' || !strncmp(name, cmd, strlen(name))) {
1195 readline_add_completion(mon->rs, cmd);
1197 if (*p == '\0') {
1198 break;
1200 p++;
1204 static void file_completion(MonitorHMP *mon, const char *input)
1206 DIR *ffs;
1207 struct dirent *d;
1208 char path[1024];
1209 char file[1024], file_prefix[1024];
1210 int input_path_len;
1211 const char *p;
1213 p = strrchr(input, '/');
1214 if (!p) {
1215 input_path_len = 0;
1216 pstrcpy(file_prefix, sizeof(file_prefix), input);
1217 pstrcpy(path, sizeof(path), ".");
1218 } else {
1219 input_path_len = p - input + 1;
1220 memcpy(path, input, input_path_len);
1221 if (input_path_len > sizeof(path) - 1) {
1222 input_path_len = sizeof(path) - 1;
1224 path[input_path_len] = '\0';
1225 pstrcpy(file_prefix, sizeof(file_prefix), p + 1);
1228 ffs = opendir(path);
1229 if (!ffs) {
1230 return;
1232 for (;;) {
1233 struct stat sb;
1234 d = readdir(ffs);
1235 if (!d) {
1236 break;
1239 if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) {
1240 continue;
1243 if (strstart(d->d_name, file_prefix, NULL)) {
1244 memcpy(file, input, input_path_len);
1245 if (input_path_len < sizeof(file)) {
1246 pstrcpy(file + input_path_len, sizeof(file) - input_path_len,
1247 d->d_name);
1250 * stat the file to find out if it's a directory.
1251 * In that case add a slash to speed up typing long paths
1253 if (stat(file, &sb) == 0 && S_ISDIR(sb.st_mode)) {
1254 pstrcat(file, sizeof(file), "/");
1256 readline_add_completion(mon->rs, file);
1259 closedir(ffs);
1262 static const char *next_arg_type(const char *typestr)
1264 const char *p = strchr(typestr, ':');
1265 return (p != NULL ? ++p : typestr);
1268 static void monitor_find_completion_by_table(MonitorHMP *mon,
1269 const HMPCommand *cmd_table,
1270 char **args,
1271 int nb_args)
1273 const char *cmdname;
1274 int i;
1275 const char *ptype, *old_ptype, *str, *name;
1276 const HMPCommand *cmd;
1277 BlockBackend *blk = NULL;
1279 if (nb_args <= 1) {
1280 /* command completion */
1281 if (nb_args == 0) {
1282 cmdname = "";
1283 } else {
1284 cmdname = args[0];
1286 readline_set_completion_index(mon->rs, strlen(cmdname));
1287 for (cmd = cmd_table; cmd->name != NULL; cmd++) {
1288 if (cmd_available(cmd)) {
1289 cmd_completion(mon, cmdname, cmd->name);
1292 } else {
1293 /* find the command */
1294 for (cmd = cmd_table; cmd->name != NULL; cmd++) {
1295 if (hmp_compare_cmd(args[0], cmd->name) &&
1296 cmd_available(cmd)) {
1297 break;
1300 if (!cmd->name) {
1301 return;
1304 if (cmd->sub_table) {
1305 /* do the job again */
1306 monitor_find_completion_by_table(mon, cmd->sub_table,
1307 &args[1], nb_args - 1);
1308 return;
1310 if (cmd->command_completion) {
1311 cmd->command_completion(mon->rs, nb_args, args[nb_args - 1]);
1312 return;
1315 ptype = next_arg_type(cmd->args_type);
1316 for (i = 0; i < nb_args - 2; i++) {
1317 if (*ptype != '\0') {
1318 ptype = next_arg_type(ptype);
1319 while (*ptype == '?') {
1320 ptype = next_arg_type(ptype);
1324 str = args[nb_args - 1];
1325 old_ptype = NULL;
1326 while (*ptype == '-' && old_ptype != ptype) {
1327 old_ptype = ptype;
1328 ptype = next_arg_type(ptype);
1330 switch (*ptype) {
1331 case 'F':
1332 /* file completion */
1333 readline_set_completion_index(mon->rs, strlen(str));
1334 file_completion(mon, str);
1335 break;
1336 case 'B':
1337 /* block device name completion */
1338 readline_set_completion_index(mon->rs, strlen(str));
1339 while ((blk = blk_next(blk)) != NULL) {
1340 name = blk_name(blk);
1341 if (str[0] == '\0' ||
1342 !strncmp(name, str, strlen(str))) {
1343 readline_add_completion(mon->rs, name);
1346 break;
1347 case 's':
1348 case 'S':
1349 if (!strcmp(cmd->name, "help|?")) {
1350 monitor_find_completion_by_table(mon, cmd_table,
1351 &args[1], nb_args - 1);
1353 break;
1354 default:
1355 break;
1360 static void monitor_find_completion(void *opaque,
1361 const char *cmdline)
1363 MonitorHMP *mon = opaque;
1364 char *args[MAX_ARGS];
1365 int nb_args, len;
1367 /* 1. parse the cmdline */
1368 if (parse_cmdline(cmdline, &nb_args, args) < 0) {
1369 return;
1373 * if the line ends with a space, it means we want to complete the
1374 * next arg
1376 len = strlen(cmdline);
1377 if (len > 0 && qemu_isspace(cmdline[len - 1])) {
1378 if (nb_args >= MAX_ARGS) {
1379 goto cleanup;
1381 args[nb_args++] = g_strdup("");
1384 /* 2. auto complete according to args */
1385 monitor_find_completion_by_table(mon, hmp_cmds, args, nb_args);
1387 cleanup:
1388 free_cmdline_args(args, nb_args);
1391 static void monitor_read(void *opaque, const uint8_t *buf, int size)
1393 MonitorHMP *mon = container_of(opaque, MonitorHMP, common);
1394 int i;
1396 if (mon->rs) {
1397 for (i = 0; i < size; i++) {
1398 readline_handle_byte(mon->rs, buf[i]);
1400 } else {
1401 if (size == 0 || buf[size - 1] != 0) {
1402 monitor_printf(&mon->common, "corrupted command\n");
1403 } else {
1404 handle_hmp_command(mon, (char *)buf);
1409 static void monitor_event(void *opaque, QEMUChrEvent event)
1411 Monitor *mon = opaque;
1412 MonitorHMP *hmp_mon = container_of(mon, MonitorHMP, common);
1414 switch (event) {
1415 case CHR_EVENT_MUX_IN:
1416 qemu_mutex_lock(&mon->mon_lock);
1417 mon->mux_out = 0;
1418 qemu_mutex_unlock(&mon->mon_lock);
1419 if (mon->reset_seen) {
1420 readline_restart(hmp_mon->rs);
1421 monitor_resume(mon);
1422 monitor_flush(mon);
1423 } else {
1424 qatomic_mb_set(&mon->suspend_cnt, 0);
1426 break;
1428 case CHR_EVENT_MUX_OUT:
1429 if (mon->reset_seen) {
1430 if (qatomic_mb_read(&mon->suspend_cnt) == 0) {
1431 monitor_printf(mon, "\n");
1433 monitor_flush(mon);
1434 monitor_suspend(mon);
1435 } else {
1436 qatomic_inc(&mon->suspend_cnt);
1438 qemu_mutex_lock(&mon->mon_lock);
1439 mon->mux_out = 1;
1440 qemu_mutex_unlock(&mon->mon_lock);
1441 break;
1443 case CHR_EVENT_OPENED:
1444 monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
1445 "information\n", QEMU_VERSION);
1446 if (!mon->mux_out) {
1447 readline_restart(hmp_mon->rs);
1448 readline_show_prompt(hmp_mon->rs);
1450 mon->reset_seen = 1;
1451 mon_refcount++;
1452 break;
1454 case CHR_EVENT_CLOSED:
1455 mon_refcount--;
1456 monitor_fdsets_cleanup();
1457 break;
1459 case CHR_EVENT_BREAK:
1460 /* Ignored */
1461 break;
1467 * These functions just adapt the readline interface in a typesafe way. We
1468 * could cast function pointers but that discards compiler checks.
1470 static void G_GNUC_PRINTF(2, 3) monitor_readline_printf(void *opaque,
1471 const char *fmt, ...)
1473 MonitorHMP *mon = opaque;
1474 va_list ap;
1475 va_start(ap, fmt);
1476 monitor_vprintf(&mon->common, fmt, ap);
1477 va_end(ap);
1480 static void monitor_readline_flush(void *opaque)
1482 MonitorHMP *mon = opaque;
1483 monitor_flush(&mon->common);
1486 void monitor_init_hmp(Chardev *chr, bool use_readline, Error **errp)
1488 MonitorHMP *mon = g_new0(MonitorHMP, 1);
1490 if (!qemu_chr_fe_init(&mon->common.chr, chr, errp)) {
1491 g_free(mon);
1492 return;
1495 monitor_data_init(&mon->common, false, false, false);
1497 mon->use_readline = use_readline;
1498 if (mon->use_readline) {
1499 mon->rs = readline_init(monitor_readline_printf,
1500 monitor_readline_flush,
1501 mon,
1502 monitor_find_completion);
1503 monitor_read_command(mon, 0);
1506 qemu_chr_fe_set_handlers(&mon->common.chr, monitor_can_read, monitor_read,
1507 monitor_event, NULL, &mon->common, NULL, true);
1508 monitor_list_append(&mon->common);