qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: Luiz Capitulino <lcapitulino@redhat.com>
Subject: [Qemu-devel] [PATCH 48/50] monitor: New argument type 'O'
Date: Thu,  4 Mar 2010 16:57:09 +0100	[thread overview]
Message-ID: <1267718231-13303-49-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1267718231-13303-1-git-send-email-armbru@redhat.com>

In the human monitor, it declares a single optional argument to be
parsed according to the QemuOptsList given by its name.

In QMP, it declares an optional argument for each member of the
QemuOptsList.

Restriction: only lists with empty desc are supported for now.  Good
enough for the job at hand.  We'll lift the restriction when we need
that.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 monitor.c |   54 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/monitor.c b/monitor.c
index dfeb9db..895d83b 100644
--- a/monitor.c
+++ b/monitor.c
@@ -67,6 +67,11 @@
  * 'F'          filename
  * 'B'          block device name
  * 's'          string (accept optional quote)
+ * 'O'          option string of the form NAME=VALUE,...
+ *              parsed according to QemuOptsList given by its name
+ *              Example: 'device:O' uses qemu_device_opts.
+ *              Restriction: only lists with empty desc are supported
+ *              TODO lift the restriction
  * 'i'          32 bit integer
  * 'l'          target long (32 or 64 bit)
  * 'M'          just like 'l', except in user mode the value is
@@ -3642,6 +3647,31 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
                 qdict_put(qdict, key, qstring_from_str(buf));
             }
             break;
+        case 'O':
+            {
+                QemuOptsList *opts_list;
+                QemuOpts *opts;
+
+                opts_list = qemu_find_opts(key);
+                if (!opts_list || opts_list->desc->name) {
+                    goto bad_type;
+                }
+                while (qemu_isspace(*p)) {
+                    p++;
+                }
+                if (!*p)
+                    break;
+                if (get_str(buf, sizeof(buf), &p) < 0) {
+                    goto fail;
+                }
+                opts = qemu_opts_parse(opts_list, buf, 1);
+                if (!opts) {
+                    goto fail;
+                }
+                qemu_opts_to_qdict(opts, qdict);
+                qemu_opts_del(opts);
+            }
+            break;
         case '/':
             {
                 int count, format, size;
@@ -4296,6 +4326,7 @@ static int check_arg(const CmdArgs *cmd_args, QDict *args)
                          qint_from_int(qbool_get_int(qobject_to_qbool(value))));
             }
             break;
+        case 'O':
         default:
             /* impossible */
             abort();
@@ -4310,6 +4341,12 @@ static void cmd_args_init(CmdArgs *cmd_args)
     cmd_args->type = cmd_args->flag = cmd_args->optional = 0;
 }
 
+static int check_opts(QemuOptsList *opts_list, QDict *args)
+{
+    assert(!opts_list->desc->name);
+    return 0;
+}
+
 /*
  * This is not trivial, we have to parse Monitor command's argument
  * type syntax to be able to check the arguments provided by clients.
@@ -4322,6 +4359,7 @@ static int monitor_check_qmp_args(const mon_cmd_t *cmd, QDict *args)
     int err;
     const char *p;
     CmdArgs cmd_args;
+    QemuOptsList *opts_list;
 
     if (cmd->args_type == NULL) {
         return (qdict_size(args) == 0 ? 0 : -1);
@@ -4329,6 +4367,7 @@ static int monitor_check_qmp_args(const mon_cmd_t *cmd, QDict *args)
 
     err = 0;
     cmd_args_init(&cmd_args);
+    opts_list = NULL;
 
     for (p = cmd->args_type;; p++) {
         if (*p == ':') {
@@ -4337,16 +4376,23 @@ static int monitor_check_qmp_args(const mon_cmd_t *cmd, QDict *args)
             if (cmd_args.type == '-') {
                 cmd_args.flag = *p++;
                 cmd_args.optional = 1;
+            } else if (cmd_args.type == 'O') {
+                opts_list = qemu_find_opts(qstring_get_str(cmd_args.name));
+                assert(opts_list);
             } else if (*p == '?') {
                 cmd_args.optional = 1;
                 p++;
             }
 
             assert(*p == ',' || *p == '\0');
-            err = check_arg(&cmd_args, args);
-
-            QDECREF(cmd_args.name);
-            cmd_args_init(&cmd_args);
+            if (opts_list) {
+                err = check_opts(opts_list, args);
+                opts_list = NULL;
+            } else {
+                err = check_arg(&cmd_args, args);
+                QDECREF(cmd_args.name);
+                cmd_args_init(&cmd_args);
+            }
 
             if (err < 0) {
                 break;
-- 
1.6.6.1

  parent reply	other threads:[~2010-03-04 16:04 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-04 15:56 [Qemu-devel] [PATCH 00/50] Convert device_add to QObject / QError Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 01/50] usb: Remove disabled monitor_printf() in usb_read_file() Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 02/50] savevm: Fix -loadvm to report errors to stderr, not the monitor Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 03/50] pc: Fix error reporting for -boot once Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 04/50] pc: Factor common code out of pc_boot_set() and cmos_init() Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 05/50] tools: Remove unused cur_mon from qemu-tool.c Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 06/50] monitor: Separate "default monitor" and "current monitor" cleanly Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 07/50] block: Simplify usb_msd_initfn() test for "can read bdrv key" Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 08/50] monitor: Factor monitor_set_error() out of qemu_error_internal() Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 09/50] error: Move qemu_error() & friends from monitor.c to own file Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 10/50] error: Simplify error sink setup Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 11/50] error: Move qemu_error & friends into their own header Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 12/50] error: New error_printf() and error_vprintf() Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 13/50] error: Don't abuse qemu_error() for non-error in qdev_device_help() Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 14/50] error: Don't abuse qemu_error() for non-error in qbus_find() Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 15/50] error: Don't abuse qemu_error() for non-error in scsi_hot_add() Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 16/50] error: Replace qemu_error() by error_report() Markus Armbruster
2010-03-13  2:34   ` [Qemu-devel] " Luiz Capitulino
2010-03-04 15:56 ` [Qemu-devel] [PATCH 17/50] error: Rename qemu_error_new() to qerror_report() Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 18/50] error: Infrastructure to track locations for error reporting Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 19/50] error: Include the program name in error messages to stderr Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 20/50] error: Track locations in configuration files Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 21/50] QemuOpts: Fix qemu_config_parse() to catch file read errors Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 22/50] error: Track locations on command line Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 23/50] qdev: Fix -device and device_add to handle unsuitable bus gracefully Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 24/50] qdev: Factor qdev_create_from_info() out of qdev_create() Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 25/50] qdev: Hide "no_user" devices from users Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 26/50] qdev: Hide "ptr" properties " Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 27/50] monitor: New monitor_cur_is_qmp() Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 28/50] error: Let converted handlers print in human monitor Markus Armbruster
2010-03-04 20:50   ` [Qemu-devel] " Luiz Capitulino
2010-03-04 21:06     ` Markus Armbruster
2010-03-04 21:14       ` Luiz Capitulino
2010-03-05 15:43     ` Luiz Capitulino
2010-03-05 16:43       ` Markus Armbruster
2010-03-08 13:41         ` Luiz Capitulino
2010-03-04 15:56 ` [Qemu-devel] [PATCH 29/50] error: Polish human-readable error descriptions Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 30/50] error: New QERR_PROPERTY_NOT_FOUND Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 31/50] error: New QERR_PROPERTY_VALUE_BAD Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 32/50] qdev: convert setting device properties to QError Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 33/50] qdev: Relax parsing of bus option Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 34/50] error: New QERR_BUS_NOT_FOUND Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 35/50] error: New QERR_DEVICE_MULTIPLE_BUSSES Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 36/50] error: New QERR_DEVICE_NO_BUS Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 37/50] qdev: Convert qbus_find() to QError Markus Armbruster
2010-03-04 15:56 ` [Qemu-devel] [PATCH 38/50] error: New error_printf_unless_qmp() Markus Armbruster
2010-03-04 15:57 ` [Qemu-devel] [PATCH 39/50] error: New QERR_BAD_BUS_FOR_DEVICE Markus Armbruster
2010-03-04 15:57 ` [Qemu-devel] [PATCH 40/50] error: New QERR_BUS_NO_HOTPLUG Markus Armbruster
2010-03-04 15:57 ` [Qemu-devel] [PATCH 41/50] error: New QERR_DEVICE_INIT_FAILED Markus Armbruster
2010-03-04 15:57 ` [Qemu-devel] [PATCH 42/50] error: New QERR_NO_BUS_FOR_DEVICE Markus Armbruster
2010-03-04 15:57 ` [Qemu-devel] [PATCH 43/50] Revert "qdev: Use QError for 'device not found' error" Markus Armbruster
2010-03-04 15:57 ` [Qemu-devel] [PATCH 44/50] error: Convert do_device_add() to QError Markus Armbruster
2010-03-04 15:57 ` [Qemu-devel] [PATCH 45/50] qemu-option: Functions to convert to/from QDict Markus Armbruster
2010-03-04 20:55   ` [Qemu-devel] " Luiz Capitulino
2010-03-04 21:12     ` Markus Armbruster
2010-03-04 21:17       ` Luiz Capitulino
2010-03-04 15:57 ` [Qemu-devel] [PATCH 46/50] qemu-option: Move the implied first name into QemuOptsList Markus Armbruster
2010-03-04 15:57 ` [Qemu-devel] [PATCH 47/50] qemu-option: Rename find_list() to qemu_find_opts() & external linkage Markus Armbruster
2010-03-04 15:57 ` Markus Armbruster [this message]
2010-03-04 15:57 ` [Qemu-devel] [PATCH 49/50] monitor: Use argument type 'O' for device_add Markus Armbruster
2010-03-04 15:57 ` [Qemu-devel] [PATCH 50/50] monitor: convert do_device_add() to QObject Markus Armbruster
2010-03-16 18:31 ` [Qemu-devel] [PULL v2] Convert device_add to QObject / QError Markus Armbruster
2010-03-17 15:28   ` Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1267718231-13303-49-git-send-email-armbru@redhat.com \
    --to=armbru@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).