mirror of https://github.com/proxmox/mirror_qemu
monitor: introduce query-command-line-options
Libvirt has no way to probe if an option or property is supported, This patch introduces a new qmp command to query command line option information. hmp command isn't added because it's not needed. Signed-off-by: Amos Kong <akong@redhat.com> CC: Luiz Capitulino <lcapitulino@redhat.com> CC: Osier Yang <jyang@redhat.com> CC: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>master
parent
9953f8822c
commit
1f8f987d34
|
@ -3505,3 +3505,69 @@
|
||||||
'*asl_compiler_rev': 'uint32',
|
'*asl_compiler_rev': 'uint32',
|
||||||
'*file': 'str',
|
'*file': 'str',
|
||||||
'*data': 'str' }}
|
'*data': 'str' }}
|
||||||
|
|
||||||
|
##
|
||||||
|
# @CommandLineParameterType:
|
||||||
|
#
|
||||||
|
# Possible types for an option parameter.
|
||||||
|
#
|
||||||
|
# @string: accepts a character string
|
||||||
|
#
|
||||||
|
# @boolean: accepts "on" or "off"
|
||||||
|
#
|
||||||
|
# @number: accepts a number
|
||||||
|
#
|
||||||
|
# @size: accepts a number followed by an optional suffix (K)ilo,
|
||||||
|
# (M)ega, (G)iga, (T)era
|
||||||
|
#
|
||||||
|
# Since 1.5
|
||||||
|
##
|
||||||
|
{ 'enum': 'CommandLineParameterType',
|
||||||
|
'data': ['string', 'boolean', 'number', 'size'] }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @CommandLineParameterInfo:
|
||||||
|
#
|
||||||
|
# Details about a single parameter of a command line option.
|
||||||
|
#
|
||||||
|
# @name: parameter name
|
||||||
|
#
|
||||||
|
# @type: parameter @CommandLineParameterType
|
||||||
|
#
|
||||||
|
# @help: #optional human readable text string, not suitable for parsing.
|
||||||
|
#
|
||||||
|
# Since 1.5
|
||||||
|
##
|
||||||
|
{ 'type': 'CommandLineParameterInfo',
|
||||||
|
'data': { 'name': 'str',
|
||||||
|
'type': 'CommandLineParameterType',
|
||||||
|
'*help': 'str' } }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @CommandLineOptionInfo:
|
||||||
|
#
|
||||||
|
# Details about a command line option, including its list of parameter details
|
||||||
|
#
|
||||||
|
# @option: option name
|
||||||
|
#
|
||||||
|
# @parameters: an array of @CommandLineParameterInfo
|
||||||
|
#
|
||||||
|
# Since 1.5
|
||||||
|
##
|
||||||
|
{ 'type': 'CommandLineOptionInfo',
|
||||||
|
'data': { 'option': 'str', 'parameters': ['CommandLineParameterInfo'] } }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @query-command-line-options:
|
||||||
|
#
|
||||||
|
# Query command line option schema.
|
||||||
|
#
|
||||||
|
# @option: #optional option name
|
||||||
|
#
|
||||||
|
# Returns: list of @CommandLineOptionInfo for all options (or for the given
|
||||||
|
# @option). Returns an error if the given @option doesn't exist.
|
||||||
|
#
|
||||||
|
# Since 1.5
|
||||||
|
##
|
||||||
|
{'command': 'query-command-line-options', 'data': { '*option': 'str' },
|
||||||
|
'returns': ['CommandLineOptionInfo'] }
|
||||||
|
|
|
@ -2415,6 +2415,53 @@ EQMP
|
||||||
.mhandler.cmd_new = qmp_marshal_input_query_uuid,
|
.mhandler.cmd_new = qmp_marshal_input_query_uuid,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
SQMP
|
||||||
|
query-command-line-options
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Show command line option schema.
|
||||||
|
|
||||||
|
Return a json-array of command line option schema for all options (or for
|
||||||
|
the given option), returning an error if the given option doesn't exist.
|
||||||
|
|
||||||
|
Each array entry contains the following:
|
||||||
|
|
||||||
|
- "option": option name (json-string)
|
||||||
|
- "parameters": a json-array describes all parameters of the option:
|
||||||
|
- "name": parameter name (json-string)
|
||||||
|
- "type": parameter type (one of 'string', 'boolean', 'number',
|
||||||
|
or 'size')
|
||||||
|
- "help": human readable description of the parameter
|
||||||
|
(json-string, optional)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
-> { "execute": "query-command-line-options", "arguments": { "option": "option-rom" } }
|
||||||
|
<- { "return": [
|
||||||
|
{
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "romfile",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "bootindex",
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"option": "option-rom"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
EQMP
|
||||||
|
|
||||||
|
{
|
||||||
|
.name = "query-command-line-options",
|
||||||
|
.args_type = "option:s?",
|
||||||
|
.mhandler.cmd_new = qmp_marshal_input_query_command_line_options,
|
||||||
|
},
|
||||||
|
|
||||||
SQMP
|
SQMP
|
||||||
query-migrate
|
query-migrate
|
||||||
-------------
|
-------------
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "qapi/qmp/qerror.h"
|
#include "qapi/qmp/qerror.h"
|
||||||
#include "hw/qdev.h"
|
#include "hw/qdev.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
|
#include "qmp-commands.h"
|
||||||
|
|
||||||
static QemuOptsList *vm_config_groups[32];
|
static QemuOptsList *vm_config_groups[32];
|
||||||
|
|
||||||
|
@ -37,6 +38,72 @@ QemuOptsList *qemu_find_opts(const char *group)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static CommandLineParameterInfoList *query_option_descs(const QemuOptDesc *desc)
|
||||||
|
{
|
||||||
|
CommandLineParameterInfoList *param_list = NULL, *entry;
|
||||||
|
CommandLineParameterInfo *info;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; desc[i].name != NULL; i++) {
|
||||||
|
info = g_malloc0(sizeof(*info));
|
||||||
|
info->name = g_strdup(desc[i].name);
|
||||||
|
|
||||||
|
switch (desc[i].type) {
|
||||||
|
case QEMU_OPT_STRING:
|
||||||
|
info->type = COMMAND_LINE_PARAMETER_TYPE_STRING;
|
||||||
|
break;
|
||||||
|
case QEMU_OPT_BOOL:
|
||||||
|
info->type = COMMAND_LINE_PARAMETER_TYPE_BOOLEAN;
|
||||||
|
break;
|
||||||
|
case QEMU_OPT_NUMBER:
|
||||||
|
info->type = COMMAND_LINE_PARAMETER_TYPE_NUMBER;
|
||||||
|
break;
|
||||||
|
case QEMU_OPT_SIZE:
|
||||||
|
info->type = COMMAND_LINE_PARAMETER_TYPE_SIZE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (desc[i].help) {
|
||||||
|
info->has_help = true;
|
||||||
|
info->help = g_strdup(desc[i].help);
|
||||||
|
}
|
||||||
|
|
||||||
|
entry = g_malloc0(sizeof(*entry));
|
||||||
|
entry->value = info;
|
||||||
|
entry->next = param_list;
|
||||||
|
param_list = entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
return param_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
CommandLineOptionInfoList *qmp_query_command_line_options(bool has_option,
|
||||||
|
const char *option,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
CommandLineOptionInfoList *conf_list = NULL, *entry;
|
||||||
|
CommandLineOptionInfo *info;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; vm_config_groups[i] != NULL; i++) {
|
||||||
|
if (!has_option || !strcmp(option, vm_config_groups[i]->name)) {
|
||||||
|
info = g_malloc0(sizeof(*info));
|
||||||
|
info->option = g_strdup(vm_config_groups[i]->name);
|
||||||
|
info->parameters = query_option_descs(vm_config_groups[i]->desc);
|
||||||
|
entry = g_malloc0(sizeof(*entry));
|
||||||
|
entry->value = info;
|
||||||
|
entry->next = conf_list;
|
||||||
|
conf_list = entry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (conf_list == NULL) {
|
||||||
|
error_setg(errp, "invalid option name: %s", option);
|
||||||
|
}
|
||||||
|
|
||||||
|
return conf_list;
|
||||||
|
}
|
||||||
|
|
||||||
QemuOptsList *qemu_find_opts_err(const char *group, Error **errp)
|
QemuOptsList *qemu_find_opts_err(const char *group, Error **errp)
|
||||||
{
|
{
|
||||||
return find_list(vm_config_groups, group, errp);
|
return find_list(vm_config_groups, group, errp);
|
||||||
|
|
Loading…
Reference in New Issue