All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lin Ma <lma@suse.com>
To: qemu-devel@nongnu.org
Cc: afaerber@suse.de, armbru@redhat.com, berrange@redhat.com,
	pbonzini@redhat.com
Subject: [Qemu-devel] [PATCH v3 3/3] object: Add 'help' option for all available backends and properties
Date: Mon, 26 Sep 2016 18:16:27 +0800	[thread overview]
Message-ID: <20160926101627.14296-4-lma@suse.com> (raw)
In-Reply-To: <20160926101627.14296-1-lma@suse.com>

'-object help' prints available user creatable backends.
'-object $typename,help' prints relevant properties.

Signed-off-by: Lin Ma <lma@suse.com>
---
 backends/hostmem.c              |  4 ++++
 crypto/secret.c                 |  4 ++++
 crypto/tlscreds.c               |  4 ++++
 include/qom/object_interfaces.h |  2 ++
 net/filter.c                    |  4 ++++
 qemu-options.hx                 |  7 +++++-
 qom/object_interfaces.c         | 48 +++++++++++++++++++++++++++++++++++++++++
 vl.c                            |  5 +++++
 8 files changed, 77 insertions(+), 1 deletion(-)

diff --git a/backends/hostmem.c b/backends/hostmem.c
index b7a208d..eea9dce 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -261,6 +261,10 @@ static void host_memory_backend_init(Object *obj)
                              HostMemPolicy_lookup,
                              host_memory_backend_get_policy,
                              host_memory_backend_set_policy, NULL);
+    object_property_set_description(obj, "policy",
+                                    "Data format: one of "
+                                    HostMemPolicy_value_str,
+                                    &error_abort);
 }
 
 MemoryRegion *
diff --git a/crypto/secret.c b/crypto/secret.c
index 285ab7a..71d06e3 100644
--- a/crypto/secret.c
+++ b/crypto/secret.c
@@ -382,6 +382,10 @@ qcrypto_secret_class_init(ObjectClass *oc, void *data)
                                    qcrypto_secret_prop_get_format,
                                    qcrypto_secret_prop_set_format,
                                    NULL);
+    object_class_property_set_description(oc, "format",
+                                          "Data format: one of "
+                                          QCryptoSecretFormat_value_str,
+                                          &error_abort);
     object_class_property_add_str(oc, "data",
                                   qcrypto_secret_prop_get_data,
                                   qcrypto_secret_prop_set_data,
diff --git a/crypto/tlscreds.c b/crypto/tlscreds.c
index a896553..d3af38a 100644
--- a/crypto/tlscreds.c
+++ b/crypto/tlscreds.c
@@ -237,6 +237,10 @@ qcrypto_tls_creds_class_init(ObjectClass *oc, void *data)
                                    qcrypto_tls_creds_prop_get_endpoint,
                                    qcrypto_tls_creds_prop_set_endpoint,
                                    NULL);
+    object_class_property_set_description(oc, "endpoint",
+                                          "Data format: one of "
+                                          QCryptoTLSCredsEndpoint_value_str,
+                                          &error_abort);
     object_class_property_add_str(oc, "priority",
                                   qcrypto_tls_creds_prop_get_priority,
                                   qcrypto_tls_creds_prop_set_priority,
diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h
index 8b17f4d..197cd5f 100644
--- a/include/qom/object_interfaces.h
+++ b/include/qom/object_interfaces.h
@@ -165,4 +165,6 @@ int user_creatable_add_opts_foreach(void *opaque,
  */
 void user_creatable_del(const char *id, Error **errp);
 
+int user_creatable_help_func(void *opaque, QemuOpts *opts, Error **errp);
+
 #endif
diff --git a/net/filter.c b/net/filter.c
index 1dfd2ca..205fb49 100644
--- a/net/filter.c
+++ b/net/filter.c
@@ -182,6 +182,10 @@ static void netfilter_init(Object *obj)
                              NetFilterDirection_lookup,
                              netfilter_get_direction, netfilter_set_direction,
                              NULL);
+    object_property_set_description(obj, "queue",
+                                    "Data format: one of "
+                                    NetFilterDirection_value_str,
+                                    &error_abort);
     object_property_add_str(obj, "status",
                             netfilter_get_status, netfilter_set_status,
                             NULL);
diff --git a/qemu-options.hx b/qemu-options.hx
index 0b621bb..978d37b 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -3759,7 +3759,9 @@ DEF("object", HAS_ARG, QEMU_OPTION_object,
     "                create a new object of type TYPENAME setting properties\n"
     "                in the order they are specified.  Note that the 'id'\n"
     "                property must be set.  These objects are placed in the\n"
-    "                '/objects' path.\n",
+    "                '/objects' path.\n"
+    "                Use '-object help' to print available backend types and\n"
+    "                '-object typename,help' to print relevant properties.\n",
     QEMU_ARCH_ALL)
 STEXI
 @item -object @var{typename}[,@var{prop1}=@var{value1},...]
@@ -3769,6 +3771,9 @@ in the order they are specified.  Note that the 'id'
 property must be set.  These objects are placed in the
 '/objects' path.
 
+Use @code{-object help} to print available backend types and
+@code{-object @var{typename},help} to print relevant properties.
+
 @table @option
 
 @item -object memory-backend-file,id=@var{id},size=@var{size},mem-path=@var{dir},share=@var{on|off}
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 9288242..70c1e44 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -5,6 +5,7 @@
 #include "qapi-visit.h"
 #include "qapi/qmp-output-visitor.h"
 #include "qapi/opts-visitor.h"
+#include "qemu/help_option.h"
 
 void user_creatable_complete(Object *obj, Error **errp)
 {
@@ -212,6 +213,53 @@ void user_creatable_del(const char *id, Error **errp)
     object_unparent(obj);
 }
 
+int user_creatable_help_func(void *opaque, QemuOpts *opts, Error **errp)
+{
+    char *type = NULL;
+    Object *obj = NULL;
+    ObjectProperty *prop;
+    ObjectPropertyIterator iter;
+
+    type = qemu_opt_get(opts, "qom-type");
+    if (type && is_help_option(type)) {
+        GSList *list;
+        printf("Available object backend types:\n");
+        for (list = object_class_get_list(TYPE_USER_CREATABLE, false);  \
+                list;                                                   \
+                list = list->next) {
+            const char *name;
+            name = object_class_get_name(OBJECT_CLASS(list->data));
+            printf("%s\n", name);
+        }
+        g_slist_free(list);
+        goto out;
+    }
+
+    if (!type || !qemu_opt_has_help_opt(opts)) {
+        return 0;
+    }
+
+    if (!object_class_by_name(type)) {
+        printf("invalid object type: %s\n", type);
+        goto out;
+    }
+    obj = object_new(type);
+    object_property_iter_init(&iter, obj);
+
+    while ((prop = object_property_iter_next(&iter))) {
+        if (prop->description) {
+            printf("%s (%s, %s)\n", prop->name, prop->type, prop->description);
+        } else {
+            printf("%s (%s)\n", prop->name, prop->type);
+        }
+    }
+
+out:
+    g_free(type);
+    object_unref(obj);
+    return 1;
+}
+
 static void register_types(void)
 {
     static const TypeInfo uc_interface_info = {
diff --git a/vl.c b/vl.c
index 215a6f9..c5ce7ea 100644
--- a/vl.c
+++ b/vl.c
@@ -4090,6 +4090,11 @@ int main(int argc, char **argv, char **envp)
         exit(0);
     }
 
+    if (qemu_opts_foreach(qemu_find_opts("object"), user_creatable_help_func,
+                          NULL, NULL)) {
+        exit(1);
+    }
+
     if (!trace_init_backends()) {
         exit(1);
     }
-- 
2.9.2

  parent reply	other threads:[~2016-09-26 10:17 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-26 10:16 [Qemu-devel] [PATCH v3 0/3] object: Add 'help' option for all available backends and properties Lin Ma
2016-09-26 10:16 ` [Qemu-devel] [PATCH v3 1/3] qom: make base type user-creatable abstract Lin Ma
2016-09-26 10:37   ` Daniel P. Berrange
2016-10-10 14:32     ` [Qemu-devel] 答复: " Lin Ma
2016-10-10 14:45       ` Paolo Bonzini
2016-10-10 15:01         ` Daniel P. Berrange
2016-10-10 16:37           ` Paolo Bonzini
2016-09-26 10:16 ` [Qemu-devel] [PATCH v3 2/3] qapi: auto generate enum value strings Lin Ma
2016-09-26 10:38   ` Daniel P. Berrange
2016-09-26 20:17     ` Eric Blake
2016-10-10 15:09       ` [Qemu-devel] 答复: " Lin Ma
2016-10-10 19:00         ` Eric Blake
2016-10-11  6:56           ` Markus Armbruster
2016-10-13 10:02             ` Lin Ma
2016-09-26 10:16 ` Lin Ma [this message]
2016-09-26 10:41   ` [Qemu-devel] [PATCH v3 3/3] object: Add 'help' option for all available backends and properties Daniel P. Berrange
2016-10-10 14:38     ` [Qemu-devel] 答复: " Lin Ma
2016-09-26 10:34 ` [Qemu-devel] [PATCH v3 0/3] " no-reply
2016-09-26 10:39 ` Paolo Bonzini

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=20160926101627.14296-4-lma@suse.com \
    --to=lma@suse.com \
    --cc=afaerber@suse.de \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=pbonzini@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 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.