Skip to content

Commit

Permalink
vl: list user creatable properties when 'help' is argument
Browse files Browse the repository at this point in the history
Iterate over the writable class properties, sort and print them out
with the description if available.

Ex: qemu -object memory-backend-file,help
memory-backend-file.align=int
memory-backend-file.discard-data=bool
memory-backend-file.dump=bool - Set to 'off' to exclude from core dump
memory-backend-file.host-nodes=int - Binds memory to the list of NUMA host nodes
memory-backend-file.mem-path=string
memory-backend-file.merge=bool - Mark memory as mergeable
memory-backend-file.pmem=bool
memory-backend-file.policy=HostMemPolicy - Set the NUMA policy
memory-backend-file.prealloc=bool - Preallocate memory
memory-backend-file.share=bool - Mark the memory as private to QEMU or shared
memory-backend-file.size=int - Size of the memory region (ex: 500M)

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
elmarco committed Oct 5, 2018
1 parent 033bfc5 commit 1195fa2
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 6 deletions.
6 changes: 3 additions & 3 deletions qom/object_interfaces.c
Expand Up @@ -141,14 +141,14 @@ Object *user_creatable_add_opts(QemuOpts *opts, Error **errp)

int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
{
bool (*type_predicate)(const char *) = opaque;
bool (*type_opt_predicate)(const char *, QemuOpts *) = opaque;
Object *obj = NULL;
Error *err = NULL;
const char *type;

type = qemu_opt_get(opts, "qom-type");
if (type && type_predicate &&
!type_predicate(type)) {
if (type && type_opt_predicate &&
!type_opt_predicate(type, opts)) {
return 0;
}

Expand Down
40 changes: 37 additions & 3 deletions vl.c
Expand Up @@ -2696,8 +2696,10 @@ static int machine_set_property(void *opaque,
* cannot be created here, as it depends on the chardev
* already existing.
*/
static bool object_create_initial(const char *type)
static bool object_create_initial(const char *type, QemuOpts *opts)
{
ObjectClass *klass;

if (is_help_option(type)) {
GSList *l, *list;

Expand All @@ -2711,6 +2713,38 @@ static bool object_create_initial(const char *type)
exit(0);
}

klass = object_class_by_name(type);
if (klass && qemu_opt_has_help_opt(opts)) {
ObjectPropertyIterator iter;
ObjectProperty *prop;
GPtrArray *array = g_ptr_array_new();
int i;

object_class_property_iter_init(&iter, klass);
while ((prop = object_property_iter_next(&iter))) {
GString *str;

if (!prop->set) {
continue;
}

str = g_string_new(NULL);
g_string_append_printf(str, "%s.%s=%s", type,
prop->name, prop->type);
if (prop->description) {
g_string_append_printf(str, " - %s", prop->description);
}
g_ptr_array_add(array, g_string_free(str, false));
}
g_ptr_array_sort(array, (GCompareFunc)qemu_pstrcmp0);
for (i = 0; i < array->len; i++) {
printf("%s\n", (char *)array->pdata[i]);
}
g_ptr_array_set_free_func(array, g_free);
g_ptr_array_free(array, true);
exit(0);
}

if (g_str_equal(type, "rng-egd") ||
g_str_has_prefix(type, "pr-manager-")) {
return false;
Expand Down Expand Up @@ -2757,9 +2791,9 @@ static bool object_create_initial(const char *type)
* The remainder of object creation happens after the
* creation of chardev, fsdev, net clients and device data types.
*/
static bool object_create_delayed(const char *type)
static bool object_create_delayed(const char *type, QemuOpts *opts)
{
return !object_create_initial(type);
return !object_create_initial(type, opts);
}


Expand Down

0 comments on commit 1195fa2

Please sign in to comment.