On Thu, May 08, 2014 at 04:21:15PM +0200, Andreas Färber wrote:
> Implement it as a wrapper for QMP qom-list, but mimic the behavior of
> scripts/qmp/qom-list in making the path argument optional and listing
> the root if absent, to hint users what kind of path to pass.
> 
> Signed-off-by: Andreas Färber <afaer...@suse.de>
> ---
>  hmp-commands.hx | 13 +++++++++++++
>  hmp.c           | 27 +++++++++++++++++++++++++++
>  hmp.h           |  1 +
>  3 files changed, 41 insertions(+)
> 
> diff --git a/hmp-commands.hx b/hmp-commands.hx
> index 8971f1b..a0166af 100644
> --- a/hmp-commands.hx
> +++ b/hmp-commands.hx
> @@ -1678,6 +1678,19 @@ Add CPU with id @var{id}
>  ETEXI
>  
>      {
> +        .name       = "qom-list",
> +        .args_type  = "path:s?",
> +        .params     = "path",
> +        .help       = "list QOM properties",
> +        .mhandler.cmd  = hmp_qom_list,
> +    },
> +
> +STEXI
> +@item qom-list [@var{path}]
> +Print QOM properties of object at location @var{path}
> +ETEXI
> +
> +    {
>          .name       = "info",
>          .args_type  = "item:s?",
>          .params     = "[subcommand]",
> diff --git a/hmp.c b/hmp.c
> index ca869ba..1c29c8a 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -1666,3 +1666,30 @@ void hmp_object_del(Monitor *mon, const QDict *qdict)
>      qmp_object_del(id, &err);
>      hmp_handle_error(mon, &err);
>  }
> +
> +void hmp_qom_list(Monitor *mon, const QDict *qdict)
> +{
> +    const char *path = qdict_get_try_str(qdict, "path");
> +    ObjectPropertyInfoList *list;
> +    Error *err = NULL;
> +
> +    if (path == NULL) {
> +        monitor_printf(mon, "/\n");
> +        return;
> +    }
> +    list = qmp_qom_list(path, &err);
> +    if (err == NULL) {

This:

> +        while (list != NULL) {
> +            ObjectPropertyInfoList *next = list->next;
> +
> +            monitor_printf(mon, "%s (%s)\n",
> +                           list->value->name, list->value->type);
> +            g_free(list->value->name);
> +            g_free(list->value->type);
> +            g_free(list->value);
> +            g_free(list);
> +            list = next;
> +        }

could be simplified to:
        ObjectPropertyInfoList *start = list;
        while (list) {
            ObjectPropertyInfo *value = list->value;
            monitor_printf(mon, "%s (%s)\n", value->name, value->type);
            list = list->next;
        }
        qapi_free_ObjectPropertyInfoList(start);

Other than that, the patch seems fine to me.

> +    }
> +    hmp_handle_error(mon, &err);
> +}
> diff --git a/hmp.h b/hmp.h
> index 20ef454..7ab969e 100644
> --- a/hmp.h
> +++ b/hmp.h
> @@ -93,6 +93,7 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict);
>  void hmp_cpu_add(Monitor *mon, const QDict *qdict);
>  void hmp_object_add(Monitor *mon, const QDict *qdict);
>  void hmp_object_del(Monitor *mon, const QDict *qdict);
> +void hmp_qom_list(Monitor *mon, const QDict *qdict);
>  void object_add_completion(ReadLineState *rs, int nb_args, const char *str);
>  void object_del_completion(ReadLineState *rs, int nb_args, const char *str);
>  void device_add_completion(ReadLineState *rs, int nb_args, const char *str);


Reply via email to