All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org
Subject: [PULL 32/38] qom: Factor out user_creatable_process_cmdline()
Date: Thu, 11 Mar 2021 15:48:05 +0100	[thread overview]
Message-ID: <20210311144811.313451-33-kwolf@redhat.com> (raw)
In-Reply-To: <20210311144811.313451-1-kwolf@redhat.com>

The implementation for --object can be shared between
qemu-storage-daemon and other binaries, so move it into a function in
qom/object_interfaces.c that is accessible from everywhere.

This also requires moving the implementation of qmp_object_add() into a
new user_creatable_add_qapi(), because qom/qom-qmp-cmds.c is not linked
for tools.

user_creatable_print_help_from_qdict() can become static now.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Acked-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 include/qom/object_interfaces.h      | 41 +++++++++++++++--------
 qom/object_interfaces.c              | 50 +++++++++++++++++++++++++++-
 qom/qom-qmp-cmds.c                   | 20 +----------
 storage-daemon/qemu-storage-daemon.c | 24 ++-----------
 4 files changed, 80 insertions(+), 55 deletions(-)

diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h
index 5299603f50..1e6c51b541 100644
--- a/include/qom/object_interfaces.h
+++ b/include/qom/object_interfaces.h
@@ -2,6 +2,7 @@
 #define OBJECT_INTERFACES_H
 
 #include "qom/object.h"
+#include "qapi/qapi-types-qom.h"
 #include "qapi/visitor.h"
 
 #define TYPE_USER_CREATABLE "user-creatable"
@@ -86,6 +87,18 @@ Object *user_creatable_add_type(const char *type, const char *id,
                                 const QDict *qdict,
                                 Visitor *v, Error **errp);
 
+/**
+ * user_creatable_add_qapi:
+ * @options: the object definition
+ * @errp: if an error occurs, a pointer to an area to store the error
+ *
+ * Create an instance of the user creatable object according to the
+ * options passed in @opts as described in the QAPI schema documentation.
+ *
+ * Returns: the newly created object or NULL on error
+ */
+void user_creatable_add_qapi(ObjectOptions *options, Error **errp);
+
 /**
  * user_creatable_add_opts:
  * @opts: the object definition
@@ -131,6 +144,21 @@ typedef bool (*user_creatable_add_opts_predicate)(const char *type);
 int user_creatable_add_opts_foreach(void *opaque,
                                     QemuOpts *opts, Error **errp);
 
+/**
+ * user_creatable_process_cmdline:
+ * @optarg: the object definition string as passed on the command line
+ *
+ * Create an instance of the user creatable object by parsing optarg
+ * with a keyval parser and implicit key 'qom-type', converting the
+ * result to ObjectOptions and calling into qmp_object_add().
+ *
+ * If a help option is given, print help instead and exit.
+ *
+ * This function is only meant to be called during command line parsing.
+ * It exits the process on failure or after printing help.
+ */
+void user_creatable_process_cmdline(const char *optarg);
+
 /**
  * user_creatable_print_help:
  * @type: the QOM type to be added
@@ -145,19 +173,6 @@ int user_creatable_add_opts_foreach(void *opaque,
  */
 bool user_creatable_print_help(const char *type, QemuOpts *opts);
 
-/**
- * user_creatable_print_help_from_qdict:
- * @args: options to create
- *
- * Prints help considering the other options given in @args (if "qom-type" is
- * given and valid, print properties for the type, otherwise print valid types)
- *
- * In contrast to user_creatable_print_help(), this function can't return that
- * no help was requested. It should only be called if we know that help is
- * requested and it will always print some help.
- */
-void user_creatable_print_help_from_qdict(QDict *args);
-
 /**
  * user_creatable_del:
  * @id: the unique ID for the object
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 02c3934329..2eaf9971f5 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -2,10 +2,13 @@
 
 #include "qemu/cutils.h"
 #include "qapi/error.h"
+#include "qapi/qapi-commands-qom.h"
+#include "qapi/qapi-visit-qom.h"
 #include "qapi/qmp/qdict.h"
 #include "qapi/qmp/qerror.h"
 #include "qapi/qmp/qjson.h"
 #include "qapi/qobject-input-visitor.h"
+#include "qapi/qobject-output-visitor.h"
 #include "qom/object_interfaces.h"
 #include "qemu/help_option.h"
 #include "qemu/id.h"
@@ -113,6 +116,29 @@ out:
     return obj;
 }
 
+void user_creatable_add_qapi(ObjectOptions *options, Error **errp)
+{
+    Visitor *v;
+    QObject *qobj;
+    QDict *props;
+    Object *obj;
+
+    v = qobject_output_visitor_new(&qobj);
+    visit_type_ObjectOptions(v, NULL, &options, &error_abort);
+    visit_complete(v, &qobj);
+    visit_free(v);
+
+    props = qobject_to(QDict, qobj);
+    qdict_del(props, "qom-type");
+    qdict_del(props, "id");
+
+    v = qobject_input_visitor_new(QOBJECT(props));
+    obj = user_creatable_add_type(ObjectType_str(options->qom_type),
+                                  options->id, props, v, errp);
+    object_unref(obj);
+    visit_free(v);
+}
+
 Object *user_creatable_add_opts(QemuOpts *opts, Error **errp)
 {
     Visitor *v;
@@ -256,7 +282,7 @@ bool user_creatable_print_help(const char *type, QemuOpts *opts)
     return false;
 }
 
-void user_creatable_print_help_from_qdict(QDict *args)
+static void user_creatable_print_help_from_qdict(QDict *args)
 {
     const char *type = qdict_get_try_str(args, "qom-type");
 
@@ -265,6 +291,28 @@ void user_creatable_print_help_from_qdict(QDict *args)
     }
 }
 
+void user_creatable_process_cmdline(const char *optarg)
+{
+    QDict *args;
+    bool help;
+    Visitor *v;
+    ObjectOptions *options;
+
+    args = keyval_parse(optarg, "qom-type", &help, &error_fatal);
+    if (help) {
+        user_creatable_print_help_from_qdict(args);
+        exit(EXIT_SUCCESS);
+    }
+
+    v = qobject_input_visitor_new_keyval(QOBJECT(args));
+    visit_type_ObjectOptions(v, NULL, &options, &error_fatal);
+    visit_free(v);
+    qobject_unref(args);
+
+    user_creatable_add_qapi(options, &error_fatal);
+    qapi_free_ObjectOptions(options);
+}
+
 bool user_creatable_del(const char *id, Error **errp)
 {
     QemuOptsList *opts_list;
diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
index e577a96adf..2d6f41ecc7 100644
--- a/qom/qom-qmp-cmds.c
+++ b/qom/qom-qmp-cmds.c
@@ -228,25 +228,7 @@ ObjectPropertyInfoList *qmp_qom_list_properties(const char *typename,
 
 void qmp_object_add(ObjectOptions *options, Error **errp)
 {
-    Visitor *v;
-    QObject *qobj;
-    QDict *props;
-    Object *obj;
-
-    v = qobject_output_visitor_new(&qobj);
-    visit_type_ObjectOptions(v, NULL, &options, &error_abort);
-    visit_complete(v, &qobj);
-    visit_free(v);
-
-    props = qobject_to(QDict, qobj);
-    qdict_del(props, "qom-type");
-    qdict_del(props, "id");
-
-    v = qobject_input_visitor_new(QOBJECT(props));
-    obj = user_creatable_add_type(ObjectType_str(options->qom_type),
-                                  options->id, props, v, errp);
-    object_unref(obj);
-    visit_free(v);
+    user_creatable_add_qapi(options, errp);
 }
 
 void qmp_object_del(const char *id, Error **errp)
diff --git a/storage-daemon/qemu-storage-daemon.c b/storage-daemon/qemu-storage-daemon.c
index c793c423d5..268078ad2c 100644
--- a/storage-daemon/qemu-storage-daemon.c
+++ b/storage-daemon/qemu-storage-daemon.c
@@ -38,7 +38,6 @@
 #include "qapi/qapi-visit-block-core.h"
 #include "qapi/qapi-visit-block-export.h"
 #include "qapi/qapi-visit-control.h"
-#include "qapi/qapi-visit-qom.h"
 #include "qapi/qmp/qdict.h"
 #include "qapi/qmp/qstring.h"
 #include "qapi/qobject-input-visitor.h"
@@ -271,27 +270,8 @@ static void process_options(int argc, char *argv[])
                 break;
             }
         case OPTION_OBJECT:
-            {
-                QDict *args;
-                bool help;
-                Visitor *v;
-                ObjectOptions *options;
-
-                args = keyval_parse(optarg, "qom-type", &help, &error_fatal);
-                if (help) {
-                    user_creatable_print_help_from_qdict(args);
-                    exit(EXIT_SUCCESS);
-                }
-
-                v = qobject_input_visitor_new_keyval(QOBJECT(args));
-                visit_type_ObjectOptions(v, NULL, &options, &error_fatal);
-                visit_free(v);
-                qobject_unref(args);
-
-                qmp_object_add(options, &error_fatal);
-                qapi_free_ObjectOptions(options);
-                break;
-            }
+            user_creatable_process_cmdline(optarg);
+            break;
         case OPTION_PIDFILE:
             pid_file = optarg;
             break;
-- 
2.29.2



  parent reply	other threads:[~2021-03-11 15:55 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-11 14:47 [PULL 00/38] Block layer patches and object-add QAPIfication Kevin Wolf
2021-03-11 14:47 ` [PULL 01/38] block: remove format defaults from QemuOpts in bdrv_create_file() Kevin Wolf
2021-03-11 14:47 ` [PULL 02/38] storage-daemon: Call job_cancel_sync_all() on shutdown Kevin Wolf
2021-03-11 14:47 ` [PULL 03/38] stream: Don't crash when node permission is denied Kevin Wolf
2021-03-11 14:47 ` [PULL 04/38] curl: Store BDRVCURLState pointer in CURLSocket Kevin Wolf
2021-03-11 14:47 ` [PULL 05/38] curl: Disconnect sockets from CURLState Kevin Wolf
2021-03-11 14:47 ` [PULL 06/38] block/export: disable VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD for now Kevin Wolf
2021-03-11 14:47 ` [PULL 07/38] test: new qTest case to test the vhost-user-blk-server Kevin Wolf
2021-03-11 14:47 ` [PULL 08/38] tests/qtest: add multi-queue test case to vhost-user-blk-test Kevin Wolf
2021-03-11 14:47 ` [PULL 09/38] vhost-user-blk-test: test discard/write zeroes invalid inputs Kevin Wolf
2021-03-11 14:47 ` [PULL 10/38] tests: Drop 'props' from object-add calls Kevin Wolf
2021-03-11 14:47 ` [PULL 11/38] qapi/qom: Drop deprecated 'props' from object-add Kevin Wolf
2021-03-11 14:47 ` [PULL 12/38] qapi/qom: Add ObjectOptions for iothread Kevin Wolf
2021-03-11 14:47 ` [PULL 13/38] qapi/qom: Add ObjectOptions for authz-* Kevin Wolf
2021-03-11 14:47 ` [PULL 14/38] qapi/qom: Add ObjectOptions for cryptodev-* Kevin Wolf
2021-03-11 14:47 ` [PULL 15/38] qapi/qom: Add ObjectOptions for dbus-vmstate Kevin Wolf
2021-03-11 14:47 ` [PULL 16/38] qapi/qom: Add ObjectOptions for memory-backend-* Kevin Wolf
2021-03-11 14:47 ` [PULL 17/38] qapi/qom: Add ObjectOptions for rng-*, deprecate 'opened' Kevin Wolf
2021-03-11 14:47 ` [PULL 18/38] qapi/qom: Add ObjectOptions for throttle-group Kevin Wolf
2021-03-11 14:47 ` [PULL 19/38] qapi/qom: Add ObjectOptions for secret*, deprecate 'loaded' Kevin Wolf
2021-03-11 14:47 ` [PULL 20/38] qapi/qom: Add ObjectOptions for tls-*, " Kevin Wolf
2021-03-11 14:47 ` [PULL 21/38] qapi/qom: Add ObjectOptions for can-* Kevin Wolf
2021-03-11 14:47 ` [PULL 22/38] qapi/qom: Add ObjectOptions for colo-compare Kevin Wolf
2021-03-11 14:47 ` [PULL 23/38] qapi/qom: Add ObjectOptions for filter-* Kevin Wolf
2021-03-11 14:47 ` [PULL 24/38] qapi/qom: Add ObjectOptions for pr-manager-helper Kevin Wolf
2021-03-11 14:47 ` [PULL 25/38] qapi/qom: Add ObjectOptions for confidential-guest-support Kevin Wolf
2021-03-11 14:47 ` [PULL 26/38] qapi/qom: Add ObjectOptions for input-* Kevin Wolf
2021-03-11 14:48 ` [PULL 27/38] qapi/qom: Add ObjectOptions for x-remote-object Kevin Wolf
2021-03-11 14:48 ` [PULL 28/38] qapi/qom: QAPIfy object-add Kevin Wolf
2021-03-11 14:48 ` [PULL 29/38] qom: Make "object" QemuOptsList optional Kevin Wolf
2021-03-11 14:48 ` [PULL 30/38] qemu-storage-daemon: Implement --object with qmp_object_add() Kevin Wolf
2021-03-11 14:48 ` [PULL 31/38] qom: Remove user_creatable_add_dict() Kevin Wolf
2021-03-11 14:48 ` Kevin Wolf [this message]
2021-03-11 14:48 ` [PULL 33/38] qemu-io: Use user_creatable_process_cmdline() for --object Kevin Wolf
2021-03-11 14:48 ` [PULL 34/38] qemu-nbd: " Kevin Wolf
2021-03-11 14:48 ` [PULL 35/38] qom: Add user_creatable_add_from_str() Kevin Wolf
2021-03-11 14:48 ` [PULL 36/38] qemu-img: Use user_creatable_process_cmdline() for --object Kevin Wolf
2021-03-11 14:48 ` [PULL 37/38] hmp: QAPIfy object_add Kevin Wolf
2021-03-11 14:48 ` [PULL 38/38] qom: Add user_creatable_parse_str() Kevin Wolf
2021-03-12 18:56 ` [PULL 00/38] Block layer patches and object-add QAPIfication Peter Maydell
2021-03-15 12:08   ` Kevin Wolf
2021-03-15 12:10     ` Peter Maydell

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=20210311144811.313451-33-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-block@nongnu.org \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.