QAPI patches for 2016-03-18
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJW69BxAAoJEDhwtADrkYZTXdsQAKULOAQSPTPdZ5U7MEOamDF+ PN6mEXqZWAbxLLzrc1fyWPuPX/HSPfIl0PHptlhsrJYh8JwzP/6AnKXbyetAxqQC LMaE9VLKQXi13hoPHwoSK7PMGD0jZgqixbfPfY726aVZEAjtSQ0vXjOJAJk0oL/L 5hDglHLHcz0llgFsP+n+S3NDv/9f9d9CqWZTa5qYAqQQ9/+rB2dgQAzZN/0EQ57s z2y+T+WH7gGBH5YznweAS/vQk1hQYT+BB+Y8fEgwhOiTvKVHE7rxVpuAxv3XP0tW zkhj56qg3jPng8toXk2BFWGwMA3iqT91oc0eMYiNNhkjk/IkD5BivSMRk49XOJEP 4eNSln8ReEkgumWIh//0PiOl2T6qXPd7rpLtxSFc9OUIkQZgU7hg/3mJbhajC/ik d3JHzlRr79oqbVZfNXqw+KQjeAmK3FI6Wxtc9S29oyryEbTw+4XIK3a97c/68++A rQt7S1ajebtpkZwsLAxMu3PmMMQs5UOCEHv7ONkumGuL9M/Cp1C9mMiPrmjIVqxo VavNurCyVWaNESbmQ4ayF8zHDv8FhVmnQXDXOzemJtjkQgIiKSznqgLxv4sb6BjQ CNIlAw6KCkilj5Rl/uSqryX02Ih6Mcc1Ae1LmmgnADuJaVDdpnl1owVKBuMHL7l+ aAkwVyE/2EDrtVHK5JPL =EvwH -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2016-03-18' into staging QAPI patches for 2016-03-18 # gpg: Signature made Fri 18 Mar 2016 09:54:57 GMT using RSA key ID EB918653 # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" # gpg: aka "Markus Armbruster <armbru@pond.sub.org>" * remotes/armbru/tags/pull-qapi-2016-03-18: qapi: Use anonymous bases in QMP flat unions qapi: Allow anonymous base for flat union qapi: Make BlockdevOptions doc example closer to reality qapi: Don't special-case simple union wrappers qapi: Drop unused c_null() qapi: Inline gen_visit_members() into lone caller qapi-commands: Inline single-use helpers of gen_marshal() qapi-commands: Utilize implicit struct visits qapi-event: Utilize implicit struct visits qapi-event: Drop qmp_output_get_qobject() null check qapi: Emit implicit structs in generated C qapi: Adjust names of implicit types qapi: Make c_type() more OO-like qapi: Fix command with named empty argument type qapi: Assert in places where variants are not handled Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
4829e0378d
@ -567,7 +567,7 @@ static CharDriverState *chr_baum_init(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevCommon *common = backend->u.braille;
|
||||
ChardevCommon *common = backend->u.braille.data;
|
||||
BaumDriverState *baum;
|
||||
CharDriverState *chr;
|
||||
brlapi_handle_t *handle;
|
||||
|
@ -68,7 +68,7 @@ static CharDriverState *qemu_chr_open_msmouse(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevCommon *common = backend->u.msmouse;
|
||||
ChardevCommon *common = backend->u.msmouse.data;
|
||||
CharDriverState *chr;
|
||||
|
||||
chr = qemu_chr_alloc(common, errp);
|
||||
|
@ -206,13 +206,13 @@ static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options, char **export,
|
||||
if (qdict_haskey(options, "path")) {
|
||||
UnixSocketAddress *q_unix;
|
||||
saddr->type = SOCKET_ADDRESS_KIND_UNIX;
|
||||
q_unix = saddr->u.q_unix = g_new0(UnixSocketAddress, 1);
|
||||
q_unix = saddr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
|
||||
q_unix->path = g_strdup(qdict_get_str(options, "path"));
|
||||
qdict_del(options, "path");
|
||||
} else {
|
||||
InetSocketAddress *inet;
|
||||
saddr->type = SOCKET_ADDRESS_KIND_INET;
|
||||
inet = saddr->u.inet = g_new0(InetSocketAddress, 1);
|
||||
inet = saddr->u.inet.data = g_new0(InetSocketAddress, 1);
|
||||
inet->host = g_strdup(qdict_get_str(options, "host"));
|
||||
if (!qdict_get_try_str(options, "port")) {
|
||||
inet->port = g_strdup_printf("%d", NBD_DEFAULT_PORT);
|
||||
@ -321,7 +321,7 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
|
||||
error_setg(errp, "TLS only supported over IP sockets");
|
||||
goto error;
|
||||
}
|
||||
hostname = saddr->u.inet->host;
|
||||
hostname = saddr->u.inet.data->host;
|
||||
}
|
||||
|
||||
/* establish TCP connection, return error if it fails
|
||||
|
@ -2800,15 +2800,15 @@ static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs)
|
||||
|
||||
*spec_info = (ImageInfoSpecific){
|
||||
.type = IMAGE_INFO_SPECIFIC_KIND_QCOW2,
|
||||
.u.qcow2 = g_new(ImageInfoSpecificQCow2, 1),
|
||||
.u.qcow2.data = g_new(ImageInfoSpecificQCow2, 1),
|
||||
};
|
||||
if (s->qcow_version == 2) {
|
||||
*spec_info->u.qcow2 = (ImageInfoSpecificQCow2){
|
||||
*spec_info->u.qcow2.data = (ImageInfoSpecificQCow2){
|
||||
.compat = g_strdup("0.10"),
|
||||
.refcount_bits = s->refcount_bits,
|
||||
};
|
||||
} else if (s->qcow_version == 3) {
|
||||
*spec_info->u.qcow2 = (ImageInfoSpecificQCow2){
|
||||
*spec_info->u.qcow2.data = (ImageInfoSpecificQCow2){
|
||||
.compat = g_strdup("1.1"),
|
||||
.lazy_refcounts = s->compatible_features &
|
||||
QCOW2_COMPAT_LAZY_REFCOUNTS,
|
||||
|
@ -2203,18 +2203,18 @@ static ImageInfoSpecific *vmdk_get_specific_info(BlockDriverState *bs)
|
||||
|
||||
*spec_info = (ImageInfoSpecific){
|
||||
.type = IMAGE_INFO_SPECIFIC_KIND_VMDK,
|
||||
{
|
||||
.vmdk = g_new0(ImageInfoSpecificVmdk, 1),
|
||||
.u = {
|
||||
.vmdk.data = g_new0(ImageInfoSpecificVmdk, 1),
|
||||
},
|
||||
};
|
||||
|
||||
*spec_info->u.vmdk = (ImageInfoSpecificVmdk) {
|
||||
*spec_info->u.vmdk.data = (ImageInfoSpecificVmdk) {
|
||||
.create_type = g_strdup(s->create_type),
|
||||
.cid = s->cid,
|
||||
.parent_cid = s->parent_cid,
|
||||
};
|
||||
|
||||
next = &spec_info->u.vmdk->extents;
|
||||
next = &spec_info->u.vmdk.data->extents;
|
||||
for (i = 0; i < s->num_extents; i++) {
|
||||
*next = g_new0(ImageInfoList, 1);
|
||||
(*next)->value = vmdk_get_extent_info(&s->extents[i]);
|
||||
|
24
blockdev.c
24
blockdev.c
@ -1247,7 +1247,7 @@ void qmp_blockdev_snapshot_sync(bool has_device, const char *device,
|
||||
};
|
||||
TransactionAction action = {
|
||||
.type = TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC,
|
||||
.u.blockdev_snapshot_sync = &snapshot,
|
||||
.u.blockdev_snapshot_sync.data = &snapshot,
|
||||
};
|
||||
blockdev_do_action(&action, errp);
|
||||
}
|
||||
@ -1261,7 +1261,7 @@ void qmp_blockdev_snapshot(const char *node, const char *overlay,
|
||||
};
|
||||
TransactionAction action = {
|
||||
.type = TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT,
|
||||
.u.blockdev_snapshot = &snapshot_data,
|
||||
.u.blockdev_snapshot.data = &snapshot_data,
|
||||
};
|
||||
blockdev_do_action(&action, errp);
|
||||
}
|
||||
@ -1276,7 +1276,7 @@ void qmp_blockdev_snapshot_internal_sync(const char *device,
|
||||
};
|
||||
TransactionAction action = {
|
||||
.type = TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC,
|
||||
.u.blockdev_snapshot_internal_sync = &snapshot,
|
||||
.u.blockdev_snapshot_internal_sync.data = &snapshot,
|
||||
};
|
||||
blockdev_do_action(&action, errp);
|
||||
}
|
||||
@ -1515,7 +1515,7 @@ static void internal_snapshot_prepare(BlkActionState *common,
|
||||
|
||||
g_assert(common->action->type ==
|
||||
TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC);
|
||||
internal = common->action->u.blockdev_snapshot_internal_sync;
|
||||
internal = common->action->u.blockdev_snapshot_internal_sync.data;
|
||||
state = DO_UPCAST(InternalSnapshotState, common, common);
|
||||
|
||||
/* 1. parse input */
|
||||
@ -1665,7 +1665,7 @@ static void external_snapshot_prepare(BlkActionState *common,
|
||||
switch (action->type) {
|
||||
case TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT:
|
||||
{
|
||||
BlockdevSnapshot *s = action->u.blockdev_snapshot;
|
||||
BlockdevSnapshot *s = action->u.blockdev_snapshot.data;
|
||||
device = s->node;
|
||||
node_name = s->node;
|
||||
new_image_file = NULL;
|
||||
@ -1674,7 +1674,7 @@ static void external_snapshot_prepare(BlkActionState *common,
|
||||
break;
|
||||
case TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC:
|
||||
{
|
||||
BlockdevSnapshotSync *s = action->u.blockdev_snapshot_sync;
|
||||
BlockdevSnapshotSync *s = action->u.blockdev_snapshot_sync.data;
|
||||
device = s->has_device ? s->device : NULL;
|
||||
node_name = s->has_node_name ? s->node_name : NULL;
|
||||
new_image_file = s->snapshot_file;
|
||||
@ -1723,7 +1723,7 @@ static void external_snapshot_prepare(BlkActionState *common,
|
||||
}
|
||||
|
||||
if (action->type == TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC) {
|
||||
BlockdevSnapshotSync *s = action->u.blockdev_snapshot_sync;
|
||||
BlockdevSnapshotSync *s = action->u.blockdev_snapshot_sync.data;
|
||||
const char *format = s->has_format ? s->format : "qcow2";
|
||||
enum NewImageMode mode;
|
||||
const char *snapshot_node_name =
|
||||
@ -1861,7 +1861,7 @@ static void drive_backup_prepare(BlkActionState *common, Error **errp)
|
||||
Error *local_err = NULL;
|
||||
|
||||
assert(common->action->type == TRANSACTION_ACTION_KIND_DRIVE_BACKUP);
|
||||
backup = common->action->u.drive_backup;
|
||||
backup = common->action->u.drive_backup.data;
|
||||
|
||||
blk = blk_by_name(backup->device);
|
||||
if (!blk) {
|
||||
@ -1943,7 +1943,7 @@ static void blockdev_backup_prepare(BlkActionState *common, Error **errp)
|
||||
Error *local_err = NULL;
|
||||
|
||||
assert(common->action->type == TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP);
|
||||
backup = common->action->u.blockdev_backup;
|
||||
backup = common->action->u.blockdev_backup.data;
|
||||
|
||||
blk = blk_by_name(backup->device);
|
||||
if (!blk) {
|
||||
@ -2029,7 +2029,7 @@ static void block_dirty_bitmap_add_prepare(BlkActionState *common,
|
||||
return;
|
||||
}
|
||||
|
||||
action = common->action->u.block_dirty_bitmap_add;
|
||||
action = common->action->u.block_dirty_bitmap_add.data;
|
||||
/* AIO context taken and released within qmp_block_dirty_bitmap_add */
|
||||
qmp_block_dirty_bitmap_add(action->node, action->name,
|
||||
action->has_granularity, action->granularity,
|
||||
@ -2048,7 +2048,7 @@ static void block_dirty_bitmap_add_abort(BlkActionState *common)
|
||||
BlockDirtyBitmapState *state = DO_UPCAST(BlockDirtyBitmapState,
|
||||
common, common);
|
||||
|
||||
action = common->action->u.block_dirty_bitmap_add;
|
||||
action = common->action->u.block_dirty_bitmap_add.data;
|
||||
/* Should not be able to fail: IF the bitmap was added via .prepare(),
|
||||
* then the node reference and bitmap name must have been valid.
|
||||
*/
|
||||
@ -2068,7 +2068,7 @@ static void block_dirty_bitmap_clear_prepare(BlkActionState *common,
|
||||
return;
|
||||
}
|
||||
|
||||
action = common->action->u.block_dirty_bitmap_clear;
|
||||
action = common->action->u.block_dirty_bitmap_clear.data;
|
||||
state->bitmap = block_dirty_bitmap_lookup(action->node,
|
||||
action->name,
|
||||
&state->bs,
|
||||
|
@ -284,7 +284,7 @@ better than open-coding the member to be type 'str'.
|
||||
=== Union types ===
|
||||
|
||||
Usage: { 'union': STRING, 'data': DICT }
|
||||
or: { 'union': STRING, 'data': DICT, 'base': STRUCT-NAME,
|
||||
or: { 'union': STRING, 'data': DICT, 'base': STRUCT-NAME-OR-DICT,
|
||||
'discriminator': ENUM-MEMBER-OF-BASE }
|
||||
|
||||
Union types are used to let the user choose between several different
|
||||
@ -297,22 +297,22 @@ be empty.
|
||||
A simple union type defines a mapping from automatic discriminator
|
||||
values to data types like in this example:
|
||||
|
||||
{ 'struct': 'FileOptions', 'data': { 'filename': 'str' } }
|
||||
{ 'struct': 'Qcow2Options',
|
||||
'data': { 'backing-file': 'str', 'lazy-refcounts': 'bool' } }
|
||||
{ 'struct': 'BlockdevOptionsFile', 'data': { 'filename': 'str' } }
|
||||
{ 'struct': 'BlockdevOptionsQcow2',
|
||||
'data': { 'backing': 'str', '*lazy-refcounts': 'bool' } }
|
||||
|
||||
{ 'union': 'BlockdevOptions',
|
||||
'data': { 'file': 'FileOptions',
|
||||
'qcow2': 'Qcow2Options' } }
|
||||
{ 'union': 'BlockdevOptionsSimple',
|
||||
'data': { 'file': 'BlockdevOptionsFile',
|
||||
'qcow2': 'BlockdevOptionsQcow2' } }
|
||||
|
||||
In the Client JSON Protocol, a simple union is represented by a
|
||||
dictionary that contains the 'type' member as a discriminator, and a
|
||||
'data' member that is of the specified data type corresponding to the
|
||||
discriminator value, as in these examples:
|
||||
|
||||
{ "type": "file", "data" : { "filename": "/some/place/my-image" } }
|
||||
{ "type": "qcow2", "data" : { "backing-file": "/some/place/my-image",
|
||||
"lazy-refcounts": true } }
|
||||
{ "type": "file", "data": { "filename": "/some/place/my-image" } }
|
||||
{ "type": "qcow2", "data": { "backing": "/some/place/my-image",
|
||||
"lazy-refcounts": true } }
|
||||
|
||||
The generated C code uses a struct containing a union. Additionally,
|
||||
an implicit C enum 'NameKind' is created, corresponding to the union
|
||||
@ -320,34 +320,35 @@ an implicit C enum 'NameKind' is created, corresponding to the union
|
||||
the union can be named 'max', as this would collide with the implicit
|
||||
enum. The value for each branch can be of any type.
|
||||
|
||||
A flat union definition specifies a struct as its base, and
|
||||
avoids nesting on the wire. All branches of the union must be
|
||||
complex types, and the top-level members of the union dictionary on
|
||||
the wire will be combination of members from both the base type and the
|
||||
appropriate branch type (when merging two dictionaries, there must be
|
||||
no keys in common). The 'discriminator' member must be the name of an
|
||||
enum-typed member of the base struct.
|
||||
A flat union definition avoids nesting on the wire, and specifies a
|
||||
set of common members that occur in all variants of the union. The
|
||||
'base' key must specifiy either a type name (the type must be a
|
||||
struct, not a union), or a dictionary representing an anonymous type.
|
||||
All branches of the union must be complex types, and the top-level
|
||||
members of the union dictionary on the wire will be combination of
|
||||
members from both the base type and the appropriate branch type (when
|
||||
merging two dictionaries, there must be no keys in common). The
|
||||
'discriminator' member must be the name of a non-optional enum-typed
|
||||
member of the base struct.
|
||||
|
||||
The following example enhances the above simple union example by
|
||||
adding a common member 'readonly', renaming the discriminator to
|
||||
something more applicable, and reducing the number of {} required on
|
||||
the wire:
|
||||
adding an optional common member 'read-only', renaming the
|
||||
discriminator to something more applicable than the simple union's
|
||||
default of 'type', and reducing the number of {} required on the wire:
|
||||
|
||||
{ 'enum': 'BlockdevDriver', 'data': [ 'file', 'qcow2' ] }
|
||||
{ 'struct': 'BlockdevCommonOptions',
|
||||
'data': { 'driver': 'BlockdevDriver', 'readonly': 'bool' } }
|
||||
{ 'union': 'BlockdevOptions',
|
||||
'base': 'BlockdevCommonOptions',
|
||||
'base': { 'driver': 'BlockdevDriver', '*read-only': 'bool' },
|
||||
'discriminator': 'driver',
|
||||
'data': { 'file': 'FileOptions',
|
||||
'qcow2': 'Qcow2Options' } }
|
||||
'data': { 'file': 'BlockdevOptionsFile',
|
||||
'qcow2': 'BlockdevOptionsQcow2' } }
|
||||
|
||||
Resulting in these JSON objects:
|
||||
|
||||
{ "driver": "file", "readonly": true,
|
||||
{ "driver": "file", "read-only": true,
|
||||
"filename": "/some/place/my-image" }
|
||||
{ "driver": "qcow2", "readonly": false,
|
||||
"backing-file": "/some/place/my-image", "lazy-refcounts": true }
|
||||
{ "driver": "qcow2", "read-only": false,
|
||||
"backing": "/some/place/my-image", "lazy-refcounts": true }
|
||||
|
||||
Notice that in a flat union, the discriminator name is controlled by
|
||||
the user, but because it must map to a base member with enum type, the
|
||||
@ -366,10 +367,9 @@ union has a struct with a single member named 'data'. That is,
|
||||
is identical on the wire to:
|
||||
|
||||
{ 'enum': 'Enum', 'data': ['one', 'two'] }
|
||||
{ 'struct': 'Base', 'data': { 'type': 'Enum' } }
|
||||
{ 'struct': 'Branch1', 'data': { 'data': 'str' } }
|
||||
{ 'struct': 'Branch2', 'data': { 'data': 'int' } }
|
||||
{ 'union': 'Flat', 'base': 'Base', 'discriminator': 'type',
|
||||
{ 'union': 'Flat': 'base': { 'type': 'Enum' }, 'discriminator': 'type',
|
||||
'data': { 'one': 'Branch1', 'two': 'Branch2' } }
|
||||
|
||||
|
||||
@ -382,7 +382,7 @@ data types (string, integer, number, or object, but currently not
|
||||
array) on the wire. The definition is similar to a simple union type,
|
||||
where each branch of the union names a QAPI type. For example:
|
||||
|
||||
{ 'alternate': 'BlockRef',
|
||||
{ 'alternate': 'BlockdevRef',
|
||||
'data': { 'definition': 'BlockdevOptions',
|
||||
'reference': 'str' } }
|
||||
|
||||
@ -403,7 +403,7 @@ following example objects:
|
||||
|
||||
{ "file": "my_existing_block_device_id" }
|
||||
{ "file": { "driver": "file",
|
||||
"readonly": false,
|
||||
"read-only": false,
|
||||
"filename": "/tmp/mydisk.qcow2" } }
|
||||
|
||||
|
||||
@ -575,9 +575,9 @@ names an object type without members.
|
||||
Example: the SchemaInfo for command query-qmp-schema
|
||||
|
||||
{ "name": "query-qmp-schema", "meta-type": "command",
|
||||
"arg-type": ":empty", "ret-type": "SchemaInfoList" }
|
||||
"arg-type": "q_empty", "ret-type": "SchemaInfoList" }
|
||||
|
||||
Type ":empty" is an object type without members, and type
|
||||
Type "q_empty" is an automatic object type without members, and type
|
||||
"SchemaInfoList" is the array of SchemaInfo type.
|
||||
|
||||
The SchemaInfo for an event has meta-type "event", and variant member
|
||||
@ -594,9 +594,9 @@ QAPI schema implicitly defines an object type.
|
||||
Example: the SchemaInfo for EVENT_C from section Events
|
||||
|
||||
{ "name": "EVENT_C", "meta-type": "event",
|
||||
"arg-type": ":obj-EVENT_C-arg" }
|
||||
"arg-type": "q_obj-EVENT_C-arg" }
|
||||
|
||||
Type ":obj-EVENT_C-arg" is an implicitly defined object type with
|
||||
Type "q_obj-EVENT_C-arg" is an implicitly defined object type with
|
||||
the two members from the event's definition.
|
||||
|
||||
The SchemaInfo for struct and union types has meta-type "object".
|
||||
@ -637,11 +637,11 @@ Union types
|
||||
{ "name": "BlockdevOptions", "meta-type": "object",
|
||||
"members": [
|
||||
{ "name": "driver", "type": "BlockdevDriver" },
|
||||
{ "name": "readonly", "type": "bool"} ],
|
||||
{ "name": "read-only", "type": "bool", "default": null } ],
|
||||
"tag": "driver",
|
||||
"variants": [
|
||||
{ "case": "file", "type": "FileOptions" },
|
||||
{ "case": "qcow2", "type": "Qcow2Options" } ] }
|
||||
{ "case": "file", "type": "BlockdevOptionsFile" },
|
||||
{ "case": "qcow2", "type": "BlockdevOptionsQcow2" } ] }
|
||||
|
||||
Note that base types are "flattened": its members are included in the
|
||||
"members" array.
|
||||
@ -652,20 +652,20 @@ discriminator (called "type" on the wire, see section Union types).
|
||||
A simple union implicitly defines an object type for each of its
|
||||
variants.
|
||||
|
||||
Example: the SchemaInfo for simple union BlockdevOptions from section
|
||||
Example: the SchemaInfo for simple union BlockdevOptionsSimple from section
|
||||
Union types
|
||||
|
||||
{ "name": "BlockdevOptions", "meta-type": "object",
|
||||
{ "name": "BlockdevOptionsSimple", "meta-type": "object",
|
||||
"members": [
|
||||
{ "name": "type", "type": "BlockdevOptionsKind" } ],
|
||||
{ "name": "type", "type": "BlockdevOptionsSimpleKind" } ],
|
||||
"tag": "type",
|
||||
"variants": [
|
||||
{ "case": "file", "type": ":obj-FileOptions-wrapper" },
|
||||
{ "case": "qcow2", "type": ":obj-Qcow2Options-wrapper" } ] }
|
||||
{ "case": "file", "type": "q_obj-BlockdevOptionsFile-wrapper" },
|
||||
{ "case": "qcow2", "type": "q_obj-BlockdevOptionsQcow2-wrapper" } ] }
|
||||
|
||||
Enumeration type "BlockdevOptionsKind" and the object types
|
||||
":obj-FileOptions-wrapper", ":obj-Qcow2Options-wrapper" are
|
||||
implicitly defined.
|
||||
Enumeration type "BlockdevOptionsSimpleKind" and the object types
|
||||
"q_obj-BlockdevOptionsFile-wrapper", "q_obj-BlockdevOptionsQcow2-wrapper"
|
||||
are implicitly defined.
|
||||
|
||||
The SchemaInfo for an alternate type has meta-type "alternate", and
|
||||
variant member "members". "members" is a JSON array. Each element is
|
||||
@ -673,9 +673,9 @@ a JSON object with member "type", which names a type. Values of the
|
||||
alternate type conform to exactly one of its member types. There is
|
||||
no guarantee on the order in which "members" will be listed.
|
||||
|
||||
Example: the SchemaInfo for BlockRef from section Alternate types
|
||||
Example: the SchemaInfo for BlockdevRef from section Alternate types
|
||||
|
||||
{ "name": "BlockRef", "meta-type": "alternate",
|
||||
{ "name": "BlockdevRef", "meta-type": "alternate",
|
||||
"members": [
|
||||
{ "type": "BlockdevOptions" },
|
||||
{ "type": "str" } ] }
|
||||
|
8
hmp.c
8
hmp.c
@ -857,7 +857,7 @@ void hmp_info_tpm(Monitor *mon, const QDict *qdict)
|
||||
|
||||
switch (ti->options->type) {
|
||||
case TPM_TYPE_OPTIONS_KIND_PASSTHROUGH:
|
||||
tpo = ti->options->u.passthrough;
|
||||
tpo = ti->options->u.passthrough.data;
|
||||
monitor_printf(mon, "%s%s%s%s",
|
||||
tpo->has_path ? ",path=" : "",
|
||||
tpo->has_path ? tpo->path : "",
|
||||
@ -1753,14 +1753,14 @@ void hmp_sendkey(Monitor *mon, const QDict *qdict)
|
||||
goto err_out;
|
||||
}
|
||||
keylist->value->type = KEY_VALUE_KIND_NUMBER;
|
||||
keylist->value->u.number = value;
|
||||
keylist->value->u.number.data = value;
|
||||
} else {
|
||||
int idx = index_from_key(keys, keyname_len);
|
||||
if (idx == Q_KEY_CODE__MAX) {
|
||||
goto err_out;
|
||||
}
|
||||
keylist->value->type = KEY_VALUE_KIND_QCODE;
|
||||
keylist->value->u.qcode = idx;
|
||||
keylist->value->u.qcode.data = idx;
|
||||
}
|
||||
|
||||
if (!separator) {
|
||||
@ -1977,7 +1977,7 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
|
||||
if (value) {
|
||||
switch (value->type) {
|
||||
case MEMORY_DEVICE_INFO_KIND_DIMM:
|
||||
di = value->u.dimm;
|
||||
di = value->u.dimm.data;
|
||||
|
||||
monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
|
||||
MemoryDeviceInfoKind_lookup[value->type],
|
||||
|
@ -845,7 +845,7 @@ static void sunkbd_handle_event(DeviceState *dev, QemuConsole *src,
|
||||
InputKeyEvent *key;
|
||||
|
||||
assert(evt->type == INPUT_EVENT_KIND_KEY);
|
||||
key = evt->u.key;
|
||||
key = evt->u.key.data;
|
||||
qcode = qemu_input_key_value_to_qcode(key->key);
|
||||
trace_escc_sunkbd_event_in(qcode, QKeyCode_lookup[qcode],
|
||||
key->down);
|
||||
|
@ -124,7 +124,7 @@ static void hid_pointer_event(DeviceState *dev, QemuConsole *src,
|
||||
|
||||
switch (evt->type) {
|
||||
case INPUT_EVENT_KIND_REL:
|
||||
move = evt->u.rel;
|
||||
move = evt->u.rel.data;
|
||||
if (move->axis == INPUT_AXIS_X) {
|
||||
e->xdx += move->value;
|
||||
} else if (move->axis == INPUT_AXIS_Y) {
|
||||
@ -133,7 +133,7 @@ static void hid_pointer_event(DeviceState *dev, QemuConsole *src,
|
||||
break;
|
||||
|
||||
case INPUT_EVENT_KIND_ABS:
|
||||
move = evt->u.abs;
|
||||
move = evt->u.abs.data;
|
||||
if (move->axis == INPUT_AXIS_X) {
|
||||
e->xdx = move->value;
|
||||
} else if (move->axis == INPUT_AXIS_Y) {
|
||||
@ -142,7 +142,7 @@ static void hid_pointer_event(DeviceState *dev, QemuConsole *src,
|
||||
break;
|
||||
|
||||
case INPUT_EVENT_KIND_BTN:
|
||||
btn = evt->u.btn;
|
||||
btn = evt->u.btn.data;
|
||||
if (btn->down) {
|
||||
e->buttons_state |= bmap[btn->button];
|
||||
if (btn->button == INPUT_BUTTON_WHEEL_UP) {
|
||||
@ -228,7 +228,7 @@ static void hid_keyboard_event(DeviceState *dev, QemuConsole *src,
|
||||
HIDState *hs = (HIDState *)dev;
|
||||
int scancodes[3], i, count;
|
||||
int slot;
|
||||
InputKeyEvent *key = evt->u.key;
|
||||
InputKeyEvent *key = evt->u.key.data;
|
||||
|
||||
count = qemu_input_key_value_to_scancode(key->key,
|
||||
key->down,
|
||||
|
@ -182,7 +182,7 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src,
|
||||
{
|
||||
PS2KbdState *s = (PS2KbdState *)dev;
|
||||
int scancodes[3], i, count;
|
||||
InputKeyEvent *key = evt->u.key;
|
||||
InputKeyEvent *key = evt->u.key.data;
|
||||
|
||||
qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER);
|
||||
count = qemu_input_key_value_to_scancode(key->key,
|
||||
@ -399,7 +399,7 @@ static void ps2_mouse_event(DeviceState *dev, QemuConsole *src,
|
||||
|
||||
switch (evt->type) {
|
||||
case INPUT_EVENT_KIND_REL:
|
||||
move = evt->u.rel;
|
||||
move = evt->u.rel.data;
|
||||
if (move->axis == INPUT_AXIS_X) {
|
||||
s->mouse_dx += move->value;
|
||||
} else if (move->axis == INPUT_AXIS_Y) {
|
||||
@ -408,7 +408,7 @@ static void ps2_mouse_event(DeviceState *dev, QemuConsole *src,
|
||||
break;
|
||||
|
||||
case INPUT_EVENT_KIND_BTN:
|
||||
btn = evt->u.btn;
|
||||
btn = evt->u.btn.data;
|
||||
if (btn->down) {
|
||||
s->mouse_buttons |= bmap[btn->button];
|
||||
if (btn->button == INPUT_BUTTON_WHEEL_UP) {
|
||||
|
@ -197,7 +197,7 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src,
|
||||
|
||||
switch (evt->type) {
|
||||
case INPUT_EVENT_KIND_KEY:
|
||||
key = evt->u.key;
|
||||
key = evt->u.key.data;
|
||||
qcode = qemu_input_key_value_to_qcode(key->key);
|
||||
if (qcode && keymap_qcode[qcode]) {
|
||||
event.type = cpu_to_le16(EV_KEY);
|
||||
@ -212,7 +212,7 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src,
|
||||
}
|
||||
break;
|
||||
case INPUT_EVENT_KIND_BTN:
|
||||
btn = evt->u.btn;
|
||||
btn = evt->u.btn.data;
|
||||
if (keymap_button[btn->button]) {
|
||||
event.type = cpu_to_le16(EV_KEY);
|
||||
event.code = cpu_to_le16(keymap_button[btn->button]);
|
||||
@ -227,14 +227,14 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src,
|
||||
}
|
||||
break;
|
||||
case INPUT_EVENT_KIND_REL:
|
||||
move = evt->u.rel;
|
||||
move = evt->u.rel.data;
|
||||
event.type = cpu_to_le16(EV_REL);
|
||||
event.code = cpu_to_le16(axismap_rel[move->axis]);
|
||||
event.value = cpu_to_le32(move->value);
|
||||
virtio_input_send(vinput, &event);
|
||||
break;
|
||||
case INPUT_EVENT_KIND_ABS:
|
||||
move = evt->u.abs;
|
||||
move = evt->u.abs.data;
|
||||
event.type = cpu_to_le16(EV_ABS);
|
||||
event.code = cpu_to_le16(axismap_abs[move->axis]);
|
||||
event.value = cpu_to_le32(move->value);
|
||||
|
@ -180,7 +180,7 @@ int qmp_pc_dimm_device_list(Object *obj, void *opaque)
|
||||
NULL);
|
||||
di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
|
||||
|
||||
info->u.dimm = di;
|
||||
info->u.dimm.data = di;
|
||||
elem->value = info;
|
||||
elem->next = NULL;
|
||||
**prev = elem;
|
||||
|
@ -189,7 +189,7 @@ int net_init_dump(const NetClientOptions *opts, const char *name,
|
||||
DumpNetClient *dnc;
|
||||
|
||||
assert(opts->type == NET_CLIENT_OPTIONS_KIND_DUMP);
|
||||
dump = opts->u.dump;
|
||||
dump = opts->u.dump.data;
|
||||
|
||||
assert(peer);
|
||||
|
||||
|
@ -288,7 +288,7 @@ int net_init_hubport(const NetClientOptions *opts, const char *name,
|
||||
|
||||
assert(opts->type == NET_CLIENT_OPTIONS_KIND_HUBPORT);
|
||||
assert(!peer);
|
||||
hubport = opts->u.hubport;
|
||||
hubport = opts->u.hubport.data;
|
||||
|
||||
net_hub_add_port(hubport->hubid, name);
|
||||
return 0;
|
||||
|
@ -546,7 +546,7 @@ int net_init_l2tpv3(const NetClientOptions *opts,
|
||||
s->header_mismatch = false;
|
||||
|
||||
assert(opts->type == NET_CLIENT_OPTIONS_KIND_L2TPV3);
|
||||
l2tpv3 = opts->u.l2tpv3;
|
||||
l2tpv3 = opts->u.l2tpv3.data;
|
||||
|
||||
if (l2tpv3->has_ipv6 && l2tpv3->ipv6) {
|
||||
s->ipv6 = l2tpv3->ipv6;
|
||||
|
@ -893,7 +893,7 @@ static int net_init_nic(const NetClientOptions *opts, const char *name,
|
||||
const NetLegacyNicOptions *nic;
|
||||
|
||||
assert(opts->type == NET_CLIENT_OPTIONS_KIND_NIC);
|
||||
nic = opts->u.nic;
|
||||
nic = opts->u.nic.data;
|
||||
|
||||
idx = nic_get_free_idx();
|
||||
if (idx == -1 || nb_nics >= MAX_NICS) {
|
||||
@ -1025,7 +1025,7 @@ static int net_client_init1(const void *object, int is_netdev, Error **errp)
|
||||
|
||||
/* Do not add to a vlan if it's a nic with a netdev= parameter. */
|
||||
if (opts->type != NET_CLIENT_OPTIONS_KIND_NIC ||
|
||||
!opts->u.nic->has_netdev) {
|
||||
!opts->u.nic.data->has_netdev) {
|
||||
peer = net_hub_add_port(net->has_vlan ? net->vlan : 0, NULL);
|
||||
}
|
||||
}
|
||||
|
@ -420,7 +420,7 @@ static NetClientInfo net_netmap_info = {
|
||||
int net_init_netmap(const NetClientOptions *opts,
|
||||
const char *name, NetClientState *peer, Error **errp)
|
||||
{
|
||||
const NetdevNetmapOptions *netmap_opts = opts->u.netmap;
|
||||
const NetdevNetmapOptions *netmap_opts = opts->u.netmap.data;
|
||||
struct nm_desc *nmd;
|
||||
NetClientState *nc;
|
||||
Error *err = NULL;
|
||||
|
@ -814,7 +814,7 @@ int net_init_slirp(const NetClientOptions *opts, const char *name,
|
||||
const char **dnssearch;
|
||||
|
||||
assert(opts->type == NET_CLIENT_OPTIONS_KIND_USER);
|
||||
user = opts->u.user;
|
||||
user = opts->u.user.data;
|
||||
|
||||
vnet = user->has_net ? g_strdup(user->net) :
|
||||
user->has_ip ? g_strdup_printf("%s/24", user->ip) :
|
||||
|
@ -704,7 +704,7 @@ int net_init_socket(const NetClientOptions *opts, const char *name,
|
||||
const NetdevSocketOptions *sock;
|
||||
|
||||
assert(opts->type == NET_CLIENT_OPTIONS_KIND_SOCKET);
|
||||
sock = opts->u.socket;
|
||||
sock = opts->u.socket.data;
|
||||
|
||||
if (sock->has_fd + sock->has_listen + sock->has_connect + sock->has_mcast +
|
||||
sock->has_udp != 1) {
|
||||
|
@ -795,7 +795,7 @@ int net_init_tap(const NetClientOptions *opts, const char *name,
|
||||
const NetdevTapOptions *tap;
|
||||
|
||||
assert(opts->type == NET_CLIENT_OPTIONS_KIND_TAP);
|
||||
tap = opts->u.tap;
|
||||
tap = opts->u.tap.data;
|
||||
|
||||
if (!tap->has_ifname) {
|
||||
error_report("tap: no interface name");
|
||||
|
@ -565,7 +565,7 @@ int net_init_bridge(const NetClientOptions *opts, const char *name,
|
||||
int fd, vnet_hdr;
|
||||
|
||||
assert(opts->type == NET_CLIENT_OPTIONS_KIND_BRIDGE);
|
||||
bridge = opts->u.bridge;
|
||||
bridge = opts->u.bridge.data;
|
||||
|
||||
helper = bridge->has_helper ? bridge->helper : DEFAULT_BRIDGE_HELPER;
|
||||
br = bridge->has_br ? bridge->br : DEFAULT_BRIDGE_INTERFACE;
|
||||
@ -728,7 +728,7 @@ int net_init_tap(const NetClientOptions *opts, const char *name,
|
||||
char ifname[128];
|
||||
|
||||
assert(opts->type == NET_CLIENT_OPTIONS_KIND_TAP);
|
||||
tap = opts->u.tap;
|
||||
tap = opts->u.tap.data;
|
||||
queues = tap->has_queues ? tap->queues : 1;
|
||||
vhostfdname = tap->has_vhostfd ? tap->vhostfd : NULL;
|
||||
|
||||
|
@ -116,7 +116,7 @@ int net_init_vde(const NetClientOptions *opts, const char *name,
|
||||
const NetdevVdeOptions *vde;
|
||||
|
||||
assert(opts->type == NET_CLIENT_OPTIONS_KIND_VDE);
|
||||
vde = opts->u.vde;
|
||||
vde = opts->u.vde.data;
|
||||
|
||||
/* missing optional values have been initialized to "all bits zero" */
|
||||
if (net_vde_init(peer, "vde", name, vde->sock, vde->port, vde->group,
|
||||
|
@ -306,7 +306,7 @@ int net_init_vhost_user(const NetClientOptions *opts, const char *name,
|
||||
CharDriverState *chr;
|
||||
|
||||
assert(opts->type == NET_CLIENT_OPTIONS_KIND_VHOST_USER);
|
||||
vhost_user_opts = opts->u.vhost_user;
|
||||
vhost_user_opts = opts->u.vhost_user.data;
|
||||
|
||||
chr = net_vhost_parse_chardev(vhost_user_opts, errp);
|
||||
if (!chr) {
|
||||
|
4
numa.c
4
numa.c
@ -228,7 +228,7 @@ static int parse_numa(void *opaque, QemuOpts *opts, Error **errp)
|
||||
|
||||
switch (object->type) {
|
||||
case NUMA_OPTIONS_KIND_NODE:
|
||||
numa_node_parse(object->u.node, opts, &err);
|
||||
numa_node_parse(object->u.node.data, opts, &err);
|
||||
if (err) {
|
||||
goto error;
|
||||
}
|
||||
@ -482,7 +482,7 @@ static void numa_stat_memory_devices(uint64_t node_mem[])
|
||||
if (value) {
|
||||
switch (value->type) {
|
||||
case MEMORY_DEVICE_INFO_KIND_DIMM:
|
||||
node_mem[value->u.dimm->node] += value->u.dimm->size;
|
||||
node_mem[value->u.dimm.data->node] += value->u.dimm.data->size;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -753,9 +753,9 @@
|
||||
'data': ['x86', 'sparc', 'ppc', 'mips', 'tricore', 'other' ] }
|
||||
|
||||
##
|
||||
# @CpuInfoBase:
|
||||
# @CpuInfo:
|
||||
#
|
||||
# Common information about a virtual CPU
|
||||
# Information about a virtual CPU
|
||||
#
|
||||
# @CPU: the index of the virtual CPU
|
||||
#
|
||||
@ -776,18 +776,10 @@
|
||||
# Notes: @halted is a transient state that changes frequently. By the time the
|
||||
# data is sent to the client, the guest may no longer be halted.
|
||||
##
|
||||
{ 'struct': 'CpuInfoBase',
|
||||
'data': {'CPU': 'int', 'current': 'bool', 'halted': 'bool',
|
||||
'qom_path': 'str', 'thread_id': 'int', 'arch': 'CpuInfoArch' } }
|
||||
|
||||
##
|
||||
# @CpuInfo:
|
||||
#
|
||||
# Information about a virtual CPU
|
||||
#
|
||||
# Since: 0.14.0
|
||||
##
|
||||
{ 'union': 'CpuInfo', 'base': 'CpuInfoBase', 'discriminator': 'arch',
|
||||
{ 'union': 'CpuInfo',
|
||||
'base': {'CPU': 'int', 'current': 'bool', 'halted': 'bool',
|
||||
'qom_path': 'str', 'thread_id': 'int', 'arch': 'CpuInfoArch' },
|
||||
'discriminator': 'arch',
|
||||
'data': { 'x86': 'CpuInfoX86',
|
||||
'sparc': 'CpuInfoSPARC',
|
||||
'ppc': 'CpuInfoPPC',
|
||||
|
@ -1643,57 +1643,6 @@
|
||||
'qcow', 'qcow2', 'qed', 'quorum', 'raw', 'tftp', 'vdi', 'vhdx',
|
||||
'vmdk', 'vpc', 'vvfat' ] }
|
||||
|
||||
##
|
||||
# @BlockdevOptionsBase
|
||||
#
|
||||
# Options that are available for all block devices, independent of the block
|
||||
# driver.
|
||||
#
|
||||
# @driver: block driver name
|
||||
# @id: #optional id by which the new block device can be referred to.
|
||||
# This option is only allowed on the top level of blockdev-add.
|
||||
# A BlockBackend will be created by blockdev-add if and only if
|
||||
# this option is given.
|
||||
# @node-name: #optional the name of a block driver state node (Since 2.0).
|
||||
# This option is required on the top level of blockdev-add if
|
||||
# the @id option is not given there.
|
||||
# @discard: #optional discard-related options (default: ignore)
|
||||
# @cache: #optional cache-related options
|
||||
# @aio: #optional AIO backend (default: threads)
|
||||
# @rerror: #optional how to handle read errors on the device
|
||||
# (default: report)
|
||||
# @werror: #optional how to handle write errors on the device
|
||||
# (default: enospc)
|
||||
# @read-only: #optional whether the block device should be read-only
|
||||
# (default: false)
|
||||
# @stats-account-invalid: #optional whether to include invalid
|
||||
# operations when computing last access statistics
|
||||
# (default: true) (Since 2.5)
|
||||
# @stats-account-failed: #optional whether to include failed
|
||||
# operations when computing latency and last
|
||||
# access statistics (default: true) (Since 2.5)
|
||||
# @stats-intervals: #optional list of intervals for collecting I/O
|
||||
# statistics, in seconds (default: none) (Since 2.5)
|
||||
# @detect-zeroes: #optional detect and optimize zero writes (Since 2.1)
|
||||
# (default: off)
|
||||
#
|
||||
# Since: 1.7
|
||||
##
|
||||
{ 'struct': 'BlockdevOptionsBase',
|
||||
'data': { 'driver': 'BlockdevDriver',
|
||||
'*id': 'str',
|
||||
'*node-name': 'str',
|
||||
'*discard': 'BlockdevDiscardOptions',
|
||||
'*cache': 'BlockdevCacheOptions',
|
||||
'*aio': 'BlockdevAioOptions',
|
||||
'*rerror': 'BlockdevOnError',
|
||||
'*werror': 'BlockdevOnError',
|
||||
'*read-only': 'bool',
|
||||
'*stats-account-invalid': 'bool',
|
||||
'*stats-account-failed': 'bool',
|
||||
'*stats-intervals': ['int'],
|
||||
'*detect-zeroes': 'BlockdevDetectZeroesOptions' } }
|
||||
|
||||
##
|
||||
# @BlockdevOptionsFile
|
||||
#
|
||||
@ -2070,12 +2019,55 @@
|
||||
##
|
||||
# @BlockdevOptions
|
||||
#
|
||||
# Options for creating a block device.
|
||||
# Options for creating a block device. Many options are available for all
|
||||
# block devices, independent of the block driver:
|
||||
#
|
||||
# @driver: block driver name
|
||||
# @id: #optional id by which the new block device can be referred to.
|
||||
# This option is only allowed on the top level of blockdev-add.
|
||||
# A BlockBackend will be created by blockdev-add if and only if
|
||||
# this option is given.
|
||||
# @node-name: #optional the name of a block driver state node (Since 2.0).
|
||||
# This option is required on the top level of blockdev-add if
|
||||
# the @id option is not given there.
|
||||
# @discard: #optional discard-related options (default: ignore)
|
||||
# @cache: #optional cache-related options
|
||||
# @aio: #optional AIO backend (default: threads)
|
||||
# @rerror: #optional how to handle read errors on the device
|
||||
# (default: report)
|
||||
# @werror: #optional how to handle write errors on the device
|
||||
# (default: enospc)
|
||||
# @read-only: #optional whether the block device should be read-only
|
||||
# (default: false)
|
||||
# @stats-account-invalid: #optional whether to include invalid
|
||||
# operations when computing last access statistics
|
||||
# (default: true) (Since 2.5)
|
||||
# @stats-account-failed: #optional whether to include failed
|
||||
# operations when computing latency and last
|
||||
# access statistics (default: true) (Since 2.5)
|
||||
# @stats-intervals: #optional list of intervals for collecting I/O
|
||||
# statistics, in seconds (default: none) (Since 2.5)
|
||||
# @detect-zeroes: #optional detect and optimize zero writes (Since 2.1)
|
||||
# (default: off)
|
||||
#
|
||||
# Remaining options are determined by the block driver.
|
||||
#
|
||||
# Since: 1.7
|
||||
##
|
||||
{ 'union': 'BlockdevOptions',
|
||||
'base': 'BlockdevOptionsBase',
|
||||
'base': { 'driver': 'BlockdevDriver',
|
||||
'*id': 'str',
|
||||
'*node-name': 'str',
|
||||
'*discard': 'BlockdevDiscardOptions',
|
||||
'*cache': 'BlockdevCacheOptions',
|
||||
'*aio': 'BlockdevAioOptions',
|
||||
'*rerror': 'BlockdevOnError',
|
||||
'*werror': 'BlockdevOnError',
|
||||
'*read-only': 'bool',
|
||||
'*stats-account-invalid': 'bool',
|
||||
'*stats-account-failed': 'bool',
|
||||
'*stats-intervals': ['int'],
|
||||
'*detect-zeroes': 'BlockdevDetectZeroesOptions' },
|
||||
'discriminator': 'driver',
|
||||
'data': {
|
||||
'archipelago':'BlockdevOptionsArchipelago',
|
||||
|
@ -74,16 +74,6 @@
|
||||
'data': [ 'builtin', 'enum', 'array', 'object', 'alternate',
|
||||
'command', 'event' ] }
|
||||
|
||||
##
|
||||
# @SchemaInfoBase
|
||||
#
|
||||
# Members common to any @SchemaInfo.
|
||||
#
|
||||
# Since: 2.5
|
||||
##
|
||||
{ 'struct': 'SchemaInfoBase',
|
||||
'data': { 'name': 'str', 'meta-type': 'SchemaMetaType' } }
|
||||
|
||||
##
|
||||
# @SchemaInfo
|
||||
#
|
||||
@ -103,7 +93,7 @@
|
||||
# Since: 2.5
|
||||
##
|
||||
{ 'union': 'SchemaInfo',
|
||||
'base': 'SchemaInfoBase',
|
||||
'base': { 'name': 'str', 'meta-type': 'SchemaMetaType' },
|
||||
'discriminator': 'meta-type',
|
||||
'data': {
|
||||
'builtin': 'SchemaInfoBuiltin',
|
||||
|
82
qemu-char.c
82
qemu-char.c
@ -98,16 +98,18 @@ static char *SocketAddress_to_str(const char *prefix, SocketAddress *addr,
|
||||
switch (addr->type) {
|
||||
case SOCKET_ADDRESS_KIND_INET:
|
||||
return g_strdup_printf("%s%s:%s:%s%s", prefix,
|
||||
is_telnet ? "telnet" : "tcp", addr->u.inet->host,
|
||||
addr->u.inet->port, is_listen ? ",server" : "");
|
||||
is_telnet ? "telnet" : "tcp",
|
||||
addr->u.inet.data->host,
|
||||
addr->u.inet.data->port,
|
||||
is_listen ? ",server" : "");
|
||||
break;
|
||||
case SOCKET_ADDRESS_KIND_UNIX:
|
||||
return g_strdup_printf("%sunix:%s%s", prefix,
|
||||
addr->u.q_unix->path,
|
||||
addr->u.q_unix.data->path,
|
||||
is_listen ? ",server" : "");
|
||||
break;
|
||||
case SOCKET_ADDRESS_KIND_FD:
|
||||
return g_strdup_printf("%sfd:%s%s", prefix, addr->u.fd->str,
|
||||
return g_strdup_printf("%sfd:%s%s", prefix, addr->u.fd.data->str,
|
||||
is_listen ? ",server" : "");
|
||||
break;
|
||||
default:
|
||||
@ -488,7 +490,7 @@ static CharDriverState *qemu_chr_open_null(const char *id,
|
||||
Error **errp)
|
||||
{
|
||||
CharDriverState *chr;
|
||||
ChardevCommon *common = backend->u.null;
|
||||
ChardevCommon *common = backend->u.null.data;
|
||||
|
||||
chr = qemu_chr_alloc(common, errp);
|
||||
if (!chr) {
|
||||
@ -789,7 +791,7 @@ static CharDriverState *qemu_chr_open_mux(const char *id,
|
||||
ChardevBackend *backend,
|
||||
ChardevReturn *ret, Error **errp)
|
||||
{
|
||||
ChardevMux *mux = backend->u.mux;
|
||||
ChardevMux *mux = backend->u.mux.data;
|
||||
CharDriverState *chr, *drv;
|
||||
MuxDriver *d;
|
||||
ChardevCommon *common = qapi_ChardevMux_base(mux);
|
||||
@ -1106,7 +1108,7 @@ static CharDriverState *qemu_chr_open_pipe(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevHostdev *opts = backend->u.pipe;
|
||||
ChardevHostdev *opts = backend->u.pipe.data;
|
||||
int fd_in, fd_out;
|
||||
char *filename_in;
|
||||
char *filename_out;
|
||||
@ -1188,7 +1190,7 @@ static CharDriverState *qemu_chr_open_stdio(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevStdio *opts = backend->u.stdio;
|
||||
ChardevStdio *opts = backend->u.stdio.data;
|
||||
CharDriverState *chr;
|
||||
struct sigaction act;
|
||||
ChardevCommon *common = qapi_ChardevStdio_base(opts);
|
||||
@ -1434,7 +1436,7 @@ static CharDriverState *qemu_chr_open_pty(const char *id,
|
||||
PtyCharDriver *s;
|
||||
int master_fd, slave_fd;
|
||||
char pty_name[PATH_MAX];
|
||||
ChardevCommon *common = backend->u.pty;
|
||||
ChardevCommon *common = backend->u.pty.data;
|
||||
|
||||
master_fd = qemu_openpty_raw(&slave_fd, pty_name);
|
||||
if (master_fd < 0) {
|
||||
@ -2205,7 +2207,7 @@ static CharDriverState *qemu_chr_open_pipe(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevHostdev *opts = backend->u.pipe;
|
||||
ChardevHostdev *opts = backend->u.pipe.data;
|
||||
const char *filename = opts->device;
|
||||
CharDriverState *chr;
|
||||
WinCharState *s;
|
||||
@ -2251,7 +2253,7 @@ static CharDriverState *qemu_chr_open_win_con(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevCommon *common = backend->u.console;
|
||||
ChardevCommon *common = backend->u.console.data;
|
||||
return qemu_chr_open_win_file(GetStdHandle(STD_OUTPUT_HANDLE),
|
||||
common, errp);
|
||||
}
|
||||
@ -2401,7 +2403,7 @@ static CharDriverState *qemu_chr_open_stdio(const char *id,
|
||||
WinStdioCharState *stdio;
|
||||
DWORD dwMode;
|
||||
int is_console = 0;
|
||||
ChardevCommon *common = qapi_ChardevStdio_base(backend->u.stdio);
|
||||
ChardevCommon *common = qapi_ChardevStdio_base(backend->u.stdio.data);
|
||||
|
||||
chr = qemu_chr_alloc(common, errp);
|
||||
if (!chr) {
|
||||
@ -3042,7 +3044,7 @@ static void tcp_chr_tls_init(CharDriverState *chr)
|
||||
} else {
|
||||
tioc = qio_channel_tls_new_client(
|
||||
s->ioc, s->tls_creds,
|
||||
s->addr->u.inet->host,
|
||||
s->addr->u.inet.data->host,
|
||||
&err);
|
||||
}
|
||||
if (tioc == NULL) {
|
||||
@ -3249,7 +3251,7 @@ static CharDriverState *qemu_chr_open_ringbuf(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevRingbuf *opts = backend->u.ringbuf;
|
||||
ChardevRingbuf *opts = backend->u.ringbuf.data;
|
||||
ChardevCommon *common = qapi_ChardevRingbuf_base(opts);
|
||||
CharDriverState *chr;
|
||||
RingBufCharDriver *d;
|
||||
@ -3546,7 +3548,7 @@ static void qemu_chr_parse_file_out(QemuOpts *opts, ChardevBackend *backend,
|
||||
error_setg(errp, "chardev: file: no filename given");
|
||||
return;
|
||||
}
|
||||
file = backend->u.file = g_new0(ChardevFile, 1);
|
||||
file = backend->u.file.data = g_new0(ChardevFile, 1);
|
||||
qemu_chr_parse_common(opts, qapi_ChardevFile_base(file));
|
||||
file->out = g_strdup(path);
|
||||
|
||||
@ -3559,7 +3561,7 @@ static void qemu_chr_parse_stdio(QemuOpts *opts, ChardevBackend *backend,
|
||||
{
|
||||
ChardevStdio *stdio;
|
||||
|
||||
stdio = backend->u.stdio = g_new0(ChardevStdio, 1);
|
||||
stdio = backend->u.stdio.data = g_new0(ChardevStdio, 1);
|
||||
qemu_chr_parse_common(opts, qapi_ChardevStdio_base(stdio));
|
||||
stdio->has_signal = true;
|
||||
stdio->signal = qemu_opt_get_bool(opts, "signal", true);
|
||||
@ -3576,7 +3578,7 @@ static void qemu_chr_parse_serial(QemuOpts *opts, ChardevBackend *backend,
|
||||
error_setg(errp, "chardev: serial/tty: no device path given");
|
||||
return;
|
||||
}
|
||||
serial = backend->u.serial = g_new0(ChardevHostdev, 1);
|
||||
serial = backend->u.serial.data = g_new0(ChardevHostdev, 1);
|
||||
qemu_chr_parse_common(opts, qapi_ChardevHostdev_base(serial));
|
||||
serial->device = g_strdup(device);
|
||||
}
|
||||
@ -3593,7 +3595,7 @@ static void qemu_chr_parse_parallel(QemuOpts *opts, ChardevBackend *backend,
|
||||
error_setg(errp, "chardev: parallel: no device path given");
|
||||
return;
|
||||
}
|
||||
parallel = backend->u.parallel = g_new0(ChardevHostdev, 1);
|
||||
parallel = backend->u.parallel.data = g_new0(ChardevHostdev, 1);
|
||||
qemu_chr_parse_common(opts, qapi_ChardevHostdev_base(parallel));
|
||||
parallel->device = g_strdup(device);
|
||||
}
|
||||
@ -3609,7 +3611,7 @@ static void qemu_chr_parse_pipe(QemuOpts *opts, ChardevBackend *backend,
|
||||
error_setg(errp, "chardev: pipe: no device path given");
|
||||
return;
|
||||
}
|
||||
dev = backend->u.pipe = g_new0(ChardevHostdev, 1);
|
||||
dev = backend->u.pipe.data = g_new0(ChardevHostdev, 1);
|
||||
qemu_chr_parse_common(opts, qapi_ChardevHostdev_base(dev));
|
||||
dev->device = g_strdup(device);
|
||||
}
|
||||
@ -3620,7 +3622,7 @@ static void qemu_chr_parse_ringbuf(QemuOpts *opts, ChardevBackend *backend,
|
||||
int val;
|
||||
ChardevRingbuf *ringbuf;
|
||||
|
||||
ringbuf = backend->u.ringbuf = g_new0(ChardevRingbuf, 1);
|
||||
ringbuf = backend->u.ringbuf.data = g_new0(ChardevRingbuf, 1);
|
||||
qemu_chr_parse_common(opts, qapi_ChardevRingbuf_base(ringbuf));
|
||||
|
||||
val = qemu_opt_get_size(opts, "size", 0);
|
||||
@ -3640,7 +3642,7 @@ static void qemu_chr_parse_mux(QemuOpts *opts, ChardevBackend *backend,
|
||||
error_setg(errp, "chardev: mux: no chardev given");
|
||||
return;
|
||||
}
|
||||
mux = backend->u.mux = g_new0(ChardevMux, 1);
|
||||
mux = backend->u.mux.data = g_new0(ChardevMux, 1);
|
||||
qemu_chr_parse_common(opts, qapi_ChardevMux_base(mux));
|
||||
mux->chardev = g_strdup(chardev);
|
||||
}
|
||||
@ -3676,7 +3678,7 @@ static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
|
||||
}
|
||||
}
|
||||
|
||||
sock = backend->u.socket = g_new0(ChardevSocket, 1);
|
||||
sock = backend->u.socket.data = g_new0(ChardevSocket, 1);
|
||||
qemu_chr_parse_common(opts, qapi_ChardevSocket_base(sock));
|
||||
|
||||
sock->has_nodelay = true;
|
||||
@ -3695,12 +3697,12 @@ static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
|
||||
if (path) {
|
||||
UnixSocketAddress *q_unix;
|
||||
addr->type = SOCKET_ADDRESS_KIND_UNIX;
|
||||
q_unix = addr->u.q_unix = g_new0(UnixSocketAddress, 1);
|
||||
q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
|
||||
q_unix->path = g_strdup(path);
|
||||
} else {
|
||||
addr->type = SOCKET_ADDRESS_KIND_INET;
|
||||
addr->u.inet = g_new(InetSocketAddress, 1);
|
||||
*addr->u.inet = (InetSocketAddress) {
|
||||
addr->u.inet.data = g_new(InetSocketAddress, 1);
|
||||
*addr->u.inet.data = (InetSocketAddress) {
|
||||
.host = g_strdup(host),
|
||||
.port = g_strdup(port),
|
||||
.has_to = qemu_opt_get(opts, "to"),
|
||||
@ -3743,13 +3745,13 @@ static void qemu_chr_parse_udp(QemuOpts *opts, ChardevBackend *backend,
|
||||
has_local = true;
|
||||
}
|
||||
|
||||
udp = backend->u.udp = g_new0(ChardevUdp, 1);
|
||||
udp = backend->u.udp.data = g_new0(ChardevUdp, 1);
|
||||
qemu_chr_parse_common(opts, qapi_ChardevUdp_base(udp));
|
||||
|
||||
addr = g_new0(SocketAddress, 1);
|
||||
addr->type = SOCKET_ADDRESS_KIND_INET;
|
||||
addr->u.inet = g_new(InetSocketAddress, 1);
|
||||
*addr->u.inet = (InetSocketAddress) {
|
||||
addr->u.inet.data = g_new(InetSocketAddress, 1);
|
||||
*addr->u.inet.data = (InetSocketAddress) {
|
||||
.host = g_strdup(host),
|
||||
.port = g_strdup(port),
|
||||
.has_ipv4 = qemu_opt_get(opts, "ipv4"),
|
||||
@ -3763,8 +3765,8 @@ static void qemu_chr_parse_udp(QemuOpts *opts, ChardevBackend *backend,
|
||||
udp->has_local = true;
|
||||
addr = g_new0(SocketAddress, 1);
|
||||
addr->type = SOCKET_ADDRESS_KIND_INET;
|
||||
addr->u.inet = g_new(InetSocketAddress, 1);
|
||||
*addr->u.inet = (InetSocketAddress) {
|
||||
addr->u.inet.data = g_new(InetSocketAddress, 1);
|
||||
*addr->u.inet.data = (InetSocketAddress) {
|
||||
.host = g_strdup(localaddr),
|
||||
.port = g_strdup(localport),
|
||||
};
|
||||
@ -3851,7 +3853,7 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
|
||||
} else {
|
||||
ChardevCommon *cc = g_new0(ChardevCommon, 1);
|
||||
qemu_chr_parse_common(opts, cc);
|
||||
backend->u.null = cc; /* Any ChardevCommon member would work */
|
||||
backend->u.null.data = cc; /* Any ChardevCommon member would work */
|
||||
}
|
||||
|
||||
ret = qmp_chardev_add(bid ? bid : id, backend, errp);
|
||||
@ -3863,9 +3865,9 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
|
||||
qapi_free_ChardevBackend(backend);
|
||||
qapi_free_ChardevReturn(ret);
|
||||
backend = g_new0(ChardevBackend, 1);
|
||||
backend->u.mux = g_new0(ChardevMux, 1);
|
||||
backend->u.mux.data = g_new0(ChardevMux, 1);
|
||||
backend->type = CHARDEV_BACKEND_KIND_MUX;
|
||||
backend->u.mux->chardev = g_strdup(bid);
|
||||
backend->u.mux.data->chardev = g_strdup(bid);
|
||||
ret = qmp_chardev_add(id, backend, errp);
|
||||
if (!ret) {
|
||||
chr = qemu_chr_find(bid);
|
||||
@ -4194,7 +4196,7 @@ static CharDriverState *qmp_chardev_open_file(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevFile *file = backend->u.file;
|
||||
ChardevFile *file = backend->u.file.data;
|
||||
ChardevCommon *common = qapi_ChardevFile_base(file);
|
||||
HANDLE out;
|
||||
|
||||
@ -4217,7 +4219,7 @@ static CharDriverState *qmp_chardev_open_serial(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevHostdev *serial = backend->u.serial;
|
||||
ChardevHostdev *serial = backend->u.serial.data;
|
||||
ChardevCommon *common = qapi_ChardevHostdev_base(serial);
|
||||
return qemu_chr_open_win_path(serial->device, common, errp);
|
||||
}
|
||||
@ -4241,7 +4243,7 @@ static CharDriverState *qmp_chardev_open_file(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevFile *file = backend->u.file;
|
||||
ChardevFile *file = backend->u.file.data;
|
||||
ChardevCommon *common = qapi_ChardevFile_base(file);
|
||||
int flags, in = -1, out;
|
||||
|
||||
@ -4275,7 +4277,7 @@ static CharDriverState *qmp_chardev_open_serial(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevHostdev *serial = backend->u.serial;
|
||||
ChardevHostdev *serial = backend->u.serial.data;
|
||||
ChardevCommon *common = qapi_ChardevHostdev_base(serial);
|
||||
int fd;
|
||||
|
||||
@ -4294,7 +4296,7 @@ static CharDriverState *qmp_chardev_open_parallel(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevHostdev *parallel = backend->u.parallel;
|
||||
ChardevHostdev *parallel = backend->u.parallel.data;
|
||||
ChardevCommon *common = qapi_ChardevHostdev_base(parallel);
|
||||
int fd;
|
||||
|
||||
@ -4335,7 +4337,7 @@ static CharDriverState *qmp_chardev_open_socket(const char *id,
|
||||
{
|
||||
CharDriverState *chr;
|
||||
TCPCharDriver *s;
|
||||
ChardevSocket *sock = backend->u.socket;
|
||||
ChardevSocket *sock = backend->u.socket.data;
|
||||
SocketAddress *addr = sock->addr;
|
||||
bool do_nodelay = sock->has_nodelay ? sock->nodelay : false;
|
||||
bool is_listen = sock->has_server ? sock->server : true;
|
||||
@ -4460,7 +4462,7 @@ static CharDriverState *qmp_chardev_open_udp(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
ChardevUdp *udp = backend->u.udp;
|
||||
ChardevUdp *udp = backend->u.udp.data;
|
||||
ChardevCommon *common = qapi_ChardevUdp_base(udp);
|
||||
QIOChannelSocket *sioc = qio_channel_socket_new();
|
||||
|
||||
|
@ -377,12 +377,12 @@ static SocketAddress *nbd_build_socket_address(const char *sockpath,
|
||||
saddr = g_new0(SocketAddress, 1);
|
||||
if (sockpath) {
|
||||
saddr->type = SOCKET_ADDRESS_KIND_UNIX;
|
||||
saddr->u.q_unix = g_new0(UnixSocketAddress, 1);
|
||||
saddr->u.q_unix->path = g_strdup(sockpath);
|
||||
saddr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
|
||||
saddr->u.q_unix.data->path = g_strdup(sockpath);
|
||||
} else {
|
||||
InetSocketAddress *inet;
|
||||
saddr->type = SOCKET_ADDRESS_KIND_INET;
|
||||
inet = saddr->u.inet = g_new0(InetSocketAddress, 1);
|
||||
inet = saddr->u.inet.data = g_new0(InetSocketAddress, 1);
|
||||
inet->host = g_strdup(bindto);
|
||||
if (port) {
|
||||
inet->port = g_strdup(port);
|
||||
|
@ -54,16 +54,16 @@ void replay_save_input_event(InputEvent *evt)
|
||||
|
||||
switch (evt->type) {
|
||||
case INPUT_EVENT_KIND_KEY:
|
||||
key = evt->u.key;
|
||||
key = evt->u.key.data;
|
||||
replay_put_dword(key->key->type);
|
||||
|
||||
switch (key->key->type) {
|
||||
case KEY_VALUE_KIND_NUMBER:
|
||||
replay_put_qword(key->key->u.number);
|
||||
replay_put_qword(key->key->u.number.data);
|
||||
replay_put_byte(key->down);
|
||||
break;
|
||||
case KEY_VALUE_KIND_QCODE:
|
||||
replay_put_dword(key->key->u.qcode);
|
||||
replay_put_dword(key->key->u.qcode.data);
|
||||
replay_put_byte(key->down);
|
||||
break;
|
||||
case KEY_VALUE_KIND__MAX:
|
||||
@ -72,17 +72,17 @@ void replay_save_input_event(InputEvent *evt)
|
||||
}
|
||||
break;
|
||||
case INPUT_EVENT_KIND_BTN:
|
||||
btn = evt->u.btn;
|
||||
btn = evt->u.btn.data;
|
||||
replay_put_dword(btn->button);
|
||||
replay_put_byte(btn->down);
|
||||
break;
|
||||
case INPUT_EVENT_KIND_REL:
|
||||
move = evt->u.rel;
|
||||
move = evt->u.rel.data;
|
||||
replay_put_dword(move->axis);
|
||||
replay_put_qword(move->value);
|
||||
break;
|
||||
case INPUT_EVENT_KIND_ABS:
|
||||
move = evt->u.abs;
|
||||
move = evt->u.abs.data;
|
||||
replay_put_dword(move->axis);
|
||||
replay_put_qword(move->value);
|
||||
break;
|
||||
@ -105,17 +105,17 @@ InputEvent *replay_read_input_event(void)
|
||||
evt.type = replay_get_dword();
|
||||
switch (evt.type) {
|
||||
case INPUT_EVENT_KIND_KEY:
|
||||
evt.u.key = &key;
|
||||
evt.u.key->key->type = replay_get_dword();
|
||||
evt.u.key.data = &key;
|
||||
evt.u.key.data->key->type = replay_get_dword();
|
||||
|
||||
switch (evt.u.key->key->type) {
|
||||
switch (evt.u.key.data->key->type) {
|
||||
case KEY_VALUE_KIND_NUMBER:
|
||||
evt.u.key->key->u.number = replay_get_qword();
|
||||
evt.u.key->down = replay_get_byte();
|
||||
evt.u.key.data->key->u.number.data = replay_get_qword();
|
||||
evt.u.key.data->down = replay_get_byte();
|
||||
break;
|
||||
case KEY_VALUE_KIND_QCODE:
|
||||
evt.u.key->key->u.qcode = (QKeyCode)replay_get_dword();
|
||||
evt.u.key->down = replay_get_byte();
|
||||
evt.u.key.data->key->u.qcode.data = (QKeyCode)replay_get_dword();
|
||||
evt.u.key.data->down = replay_get_byte();
|
||||
break;
|
||||
case KEY_VALUE_KIND__MAX:
|
||||
/* keep gcc happy */
|
||||
@ -123,19 +123,19 @@ InputEvent *replay_read_input_event(void)
|
||||
}
|
||||
break;
|
||||
case INPUT_EVENT_KIND_BTN:
|
||||
evt.u.btn = &btn;
|
||||
evt.u.btn->button = (InputButton)replay_get_dword();
|
||||
evt.u.btn->down = replay_get_byte();
|
||||
evt.u.btn.data = &btn;
|
||||
evt.u.btn.data->button = (InputButton)replay_get_dword();
|
||||
evt.u.btn.data->down = replay_get_byte();
|
||||
break;
|
||||
case INPUT_EVENT_KIND_REL:
|
||||
evt.u.rel = &rel;
|
||||
evt.u.rel->axis = (InputAxis)replay_get_dword();
|
||||
evt.u.rel->value = replay_get_qword();
|
||||
evt.u.rel.data = &rel;
|
||||
evt.u.rel.data->axis = (InputAxis)replay_get_dword();
|
||||
evt.u.rel.data->value = replay_get_qword();
|
||||
break;
|
||||
case INPUT_EVENT_KIND_ABS:
|
||||
evt.u.abs = &abs;
|
||||
evt.u.abs->axis = (InputAxis)replay_get_dword();
|
||||
evt.u.abs->value = replay_get_qword();
|
||||
evt.u.abs.data = &abs;
|
||||
evt.u.abs.data->axis = (InputAxis)replay_get_dword();
|
||||
evt.u.abs.data->value = replay_get_qword();
|
||||
break;
|
||||
case INPUT_EVENT_KIND__MAX:
|
||||
/* keep gcc happy */
|
||||
|
@ -2,7 +2,7 @@
|
||||
# QAPI command marshaller generator
|
||||
#
|
||||
# Copyright IBM, Corp. 2011
|
||||
# Copyright (C) 2014-2015 Red Hat, Inc.
|
||||
# Copyright (C) 2014-2016 Red Hat, Inc.
|
||||
#
|
||||
# Authors:
|
||||
# Anthony Liguori <aliguori@us.ibm.com>
|
||||
@ -30,10 +30,11 @@ def gen_call(name, arg_type, ret_type):
|
||||
|
||||
argstr = ''
|
||||
if arg_type:
|
||||
assert not arg_type.variants
|
||||
for memb in arg_type.members:
|
||||
if memb.optional:
|
||||
argstr += 'has_%s, ' % c_name(memb.name)
|
||||
argstr += '%s, ' % c_name(memb.name)
|
||||
argstr += 'arg.has_%s, ' % c_name(memb.name)
|
||||
argstr += 'arg.%s, ' % c_name(memb.name)
|
||||
|
||||
lhs = ''
|
||||
if ret_type:
|
||||
@ -54,72 +55,6 @@ def gen_call(name, arg_type, ret_type):
|
||||
return ret
|
||||
|
||||
|
||||
def gen_marshal_vars(arg_type, ret_type):
|
||||
ret = mcgen('''
|
||||
Error *err = NULL;
|
||||
''')
|
||||
|
||||
if ret_type:
|
||||
ret += mcgen('''
|
||||
%(c_type)s retval;
|
||||
''',
|
||||
c_type=ret_type.c_type())
|
||||
|
||||
if arg_type:
|
||||
ret += mcgen('''
|
||||
QmpInputVisitor *qiv = qmp_input_visitor_new_strict(QOBJECT(args));
|
||||
QapiDeallocVisitor *qdv;
|
||||
Visitor *v;
|
||||
''')
|
||||
|
||||
for memb in arg_type.members:
|
||||
if memb.optional:
|
||||
ret += mcgen('''
|
||||
bool has_%(c_name)s = false;
|
||||
''',
|
||||
c_name=c_name(memb.name))
|
||||
ret += mcgen('''
|
||||
%(c_type)s %(c_name)s = %(c_null)s;
|
||||
''',
|
||||
c_name=c_name(memb.name),
|
||||
c_type=memb.type.c_type(),
|
||||
c_null=memb.type.c_null())
|
||||
ret += '\n'
|
||||
else:
|
||||
ret += mcgen('''
|
||||
|
||||
(void)args;
|
||||
''')
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
def gen_marshal_input_visit(arg_type, dealloc=False):
|
||||
ret = ''
|
||||
|
||||
if not arg_type:
|
||||
return ret
|
||||
|
||||
if dealloc:
|
||||
ret += mcgen('''
|
||||
qmp_input_visitor_cleanup(qiv);
|
||||
qdv = qapi_dealloc_visitor_new();
|
||||
v = qapi_dealloc_get_visitor(qdv);
|
||||
''')
|
||||
else:
|
||||
ret += mcgen('''
|
||||
v = qmp_input_get_visitor(qiv);
|
||||
''')
|
||||
|
||||
ret += gen_visit_members(arg_type.members, skiperr=dealloc)
|
||||
|
||||
if dealloc:
|
||||
ret += mcgen('''
|
||||
qapi_dealloc_visitor_cleanup(qdv);
|
||||
''')
|
||||
return ret
|
||||
|
||||
|
||||
def gen_marshal_output(ret_type):
|
||||
return mcgen('''
|
||||
|
||||
@ -168,15 +103,40 @@ def gen_marshal(name, arg_type, ret_type):
|
||||
|
||||
%(proto)s
|
||||
{
|
||||
Error *err = NULL;
|
||||
''',
|
||||
proto=gen_marshal_proto(name))
|
||||
|
||||
ret += gen_marshal_vars(arg_type, ret_type)
|
||||
ret += gen_marshal_input_visit(arg_type)
|
||||
if ret_type:
|
||||
ret += mcgen('''
|
||||
%(c_type)s retval;
|
||||
''',
|
||||
c_type=ret_type.c_type())
|
||||
|
||||
if arg_type and arg_type.members:
|
||||
ret += mcgen('''
|
||||
QmpInputVisitor *qiv = qmp_input_visitor_new_strict(QOBJECT(args));
|
||||
QapiDeallocVisitor *qdv;
|
||||
Visitor *v;
|
||||
%(c_name)s arg = {0};
|
||||
|
||||
v = qmp_input_get_visitor(qiv);
|
||||
visit_type_%(c_name)s_members(v, &arg, &err);
|
||||
if (err) {
|
||||
goto out;
|
||||
}
|
||||
''',
|
||||
c_name=arg_type.c_name())
|
||||
|
||||
else:
|
||||
ret += mcgen('''
|
||||
|
||||
(void)args;
|
||||
''')
|
||||
|
||||
ret += gen_call(name, arg_type, ret_type)
|
||||
|
||||
# 'goto out' produced by gen_marshal_input_visit->gen_visit_members()
|
||||
# for each arg_type member, and by gen_call() for ret_type
|
||||
# 'goto out' produced above for arg_type, and by gen_call() for ret_type
|
||||
if (arg_type and arg_type.members) or ret_type:
|
||||
ret += mcgen('''
|
||||
|
||||
@ -185,7 +145,16 @@ out:
|
||||
ret += mcgen('''
|
||||
error_propagate(errp, err);
|
||||
''')
|
||||
ret += gen_marshal_input_visit(arg_type, dealloc=True)
|
||||
if arg_type and arg_type.members:
|
||||
ret += mcgen('''
|
||||
qmp_input_visitor_cleanup(qiv);
|
||||
qdv = qapi_dealloc_visitor_new();
|
||||
v = qapi_dealloc_get_visitor(qdv);
|
||||
visit_type_%(c_name)s_members(v, &arg, NULL);
|
||||
qapi_dealloc_visitor_cleanup(qdv);
|
||||
''',
|
||||
c_name=arg_type.c_name())
|
||||
|
||||
ret += mcgen('''
|
||||
}
|
||||
''')
|
||||
|
@ -28,7 +28,37 @@ def gen_event_send_decl(name, arg_type):
|
||||
proto=gen_event_send_proto(name, arg_type))
|
||||
|
||||
|
||||
# Declare and initialize an object 'qapi' using parameters from gen_params()
|
||||
def gen_param_var(typ):
|
||||
assert not typ.variants
|
||||
ret = mcgen('''
|
||||
%(c_name)s param = {
|
||||
''',
|
||||
c_name=typ.c_name())
|
||||
sep = ' '
|
||||
for memb in typ.members:
|
||||
ret += sep
|
||||
sep = ', '
|
||||
if memb.optional:
|
||||
ret += 'has_' + c_name(memb.name) + sep
|
||||
if memb.type.name == 'str':
|
||||
# Cast away const added in gen_params()
|
||||
ret += '(char *)'
|
||||
ret += c_name(memb.name)
|
||||
ret += mcgen('''
|
||||
|
||||
};
|
||||
''')
|
||||
return ret
|
||||
|
||||
|
||||
def gen_event_send(name, arg_type):
|
||||
# FIXME: Our declaration of local variables (and of 'errp' in the
|
||||
# parameter list) can collide with exploded members of the event's
|
||||
# data type passed in as parameters. If this collision ever hits in
|
||||
# practice, we can rename our local variables with a leading _ prefix,
|
||||
# or split the code into a wrapper function that creates a boxed
|
||||
# 'param' object then calls another to do the real work.
|
||||
ret = mcgen('''
|
||||
|
||||
%(proto)s
|
||||
@ -43,11 +73,11 @@ def gen_event_send(name, arg_type):
|
||||
ret += mcgen('''
|
||||
QmpOutputVisitor *qov;
|
||||
Visitor *v;
|
||||
QObject *obj;
|
||||
|
||||
''')
|
||||
ret += gen_param_var(arg_type)
|
||||
|
||||
ret += mcgen('''
|
||||
|
||||
emit = qmp_event_get_func_emit();
|
||||
if (!emit) {
|
||||
return;
|
||||
@ -64,23 +94,18 @@ def gen_event_send(name, arg_type):
|
||||
v = qmp_output_get_visitor(qov);
|
||||
|
||||
visit_start_struct(v, "%(name)s", NULL, 0, &err);
|
||||
''',
|
||||
name=name)
|
||||
ret += gen_err_check()
|
||||
ret += gen_visit_members(arg_type.members, need_cast=True,
|
||||
label='out_obj')
|
||||
ret += mcgen('''
|
||||
out_obj:
|
||||
if (err) {
|
||||
goto out;
|
||||
}
|
||||
visit_type_%(c_name)s_members(v, ¶m, &err);
|
||||
visit_end_struct(v, err ? NULL : &err);
|
||||
if (err) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
obj = qmp_output_get_qobject(qov);
|
||||
g_assert(obj);
|
||||
|
||||
qdict_put_obj(qmp, "data", obj);
|
||||
''')
|
||||
qdict_put_obj(qmp, "data", qmp_output_get_qobject(qov));
|
||||
''',
|
||||
name=name, c_name=arg_type.c_name())
|
||||
|
||||
ret += mcgen('''
|
||||
emit(%(c_enum)s, qmp, &err);
|
||||
|
@ -61,8 +61,7 @@ def gen_object(name, base, members, variants):
|
||||
ret = ''
|
||||
if variants:
|
||||
for v in variants.variants:
|
||||
if (isinstance(v.type, QAPISchemaObjectType) and
|
||||
not v.type.is_implicit()):
|
||||
if isinstance(v.type, QAPISchemaObjectType):
|
||||
ret += gen_object(v.type.name, v.type.base,
|
||||
v.type.local_members, v.type.variants)
|
||||
|
||||
@ -73,12 +72,14 @@ struct %(c_name)s {
|
||||
c_name=c_name(name))
|
||||
|
||||
if base:
|
||||
ret += mcgen('''
|
||||
if not base.is_implicit():
|
||||
ret += mcgen('''
|
||||
/* Members inherited from %(c_name)s: */
|
||||
''',
|
||||
c_name=base.c_name())
|
||||
c_name=base.c_name())
|
||||
ret += gen_struct_members(base.members)
|
||||
ret += mcgen('''
|
||||
if not base.is_implicit():
|
||||
ret += mcgen('''
|
||||
/* Own members: */
|
||||
''')
|
||||
ret += gen_struct_members(members)
|
||||
@ -122,13 +123,10 @@ def gen_variants(variants):
|
||||
c_name=c_name(variants.tag_member.name))
|
||||
|
||||
for var in variants.variants:
|
||||
# Ugly special case for simple union TODO get rid of it
|
||||
simple_union_type = var.simple_union_type()
|
||||
typ = simple_union_type or var.type
|
||||
ret += mcgen('''
|
||||
%(c_type)s %(c_name)s;
|
||||
''',
|
||||
c_type=typ.c_type(is_unboxed=not simple_union_type),
|
||||
c_type=var.type.c_unboxed_type(),
|
||||
c_name=c_name(var.name))
|
||||
|
||||
ret += mcgen('''
|
||||
@ -177,6 +175,8 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
|
||||
self._btin = None
|
||||
|
||||
def visit_begin(self, schema):
|
||||
# gen_object() is recursive, ensure it doesn't visit the empty type
|
||||
objects_seen.add(schema.the_empty_object_type.name)
|
||||
self.decl = ''
|
||||
self.defn = ''
|
||||
self._fwdecl = ''
|
||||
@ -193,11 +193,6 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
|
||||
self.decl = self._btin + self.decl
|
||||
self._btin = None
|
||||
|
||||
def visit_needed(self, entity):
|
||||
# Visit everything except implicit objects
|
||||
return not (entity.is_implicit() and
|
||||
isinstance(entity, QAPISchemaObjectType))
|
||||
|
||||
def _gen_type_cleanup(self, name):
|
||||
self.decl += gen_type_cleanup_decl(name)
|
||||
self.defn += gen_type_cleanup(name)
|
||||
@ -226,11 +221,18 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
|
||||
self._gen_type_cleanup(name)
|
||||
|
||||
def visit_object_type(self, name, info, base, members, variants):
|
||||
# Nothing to do for the special empty builtin
|
||||
if name == 'q_empty':
|
||||
return
|
||||
self._fwdecl += gen_fwd_object_or_array(name)
|
||||
self.decl += gen_object(name, base, members, variants)
|
||||
if base:
|
||||
if base and not base.is_implicit():
|
||||
self.decl += gen_upcast(name, base)
|
||||
self._gen_type_cleanup(name)
|
||||
# TODO Worth changing the visitor signature, so we could
|
||||
# directly use rather than repeat type.is_implicit()?
|
||||
if not name.startswith('q_'):
|
||||
# implicit types won't be directly allocated/freed
|
||||
self._gen_type_cleanup(name)
|
||||
|
||||
def visit_alternate_type(self, name, info, variants):
|
||||
self._fwdecl += gen_fwd_object_or_array(name)
|
||||
|
@ -51,7 +51,24 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
|
||||
c_type=base.c_name())
|
||||
ret += gen_err_check()
|
||||
|
||||
ret += gen_visit_members(members, prefix='obj->')
|
||||
for memb in members:
|
||||
if memb.optional:
|
||||
ret += mcgen('''
|
||||
if (visit_optional(v, "%(name)s", &obj->has_%(c_name)s)) {
|
||||
''',
|
||||
name=memb.name, c_name=c_name(memb.name))
|
||||
push_indent()
|
||||
ret += mcgen('''
|
||||
visit_type_%(c_type)s(v, "%(name)s", &obj->%(c_name)s, &err);
|
||||
''',
|
||||
c_type=memb.type.c_name(), name=memb.name,
|
||||
c_name=c_name(memb.name))
|
||||
ret += gen_err_check()
|
||||
if memb.optional:
|
||||
pop_indent()
|
||||
ret += mcgen('''
|
||||
}
|
||||
''')
|
||||
|
||||
if variants:
|
||||
ret += mcgen('''
|
||||
@ -60,29 +77,15 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
|
||||
c_name=c_name(variants.tag_member.name))
|
||||
|
||||
for var in variants.variants:
|
||||
# TODO ugly special case for simple union
|
||||
simple_union_type = var.simple_union_type()
|
||||
ret += mcgen('''
|
||||
case %(case)s:
|
||||
visit_type_%(c_type)s_members(v, &obj->u.%(c_name)s, &err);
|
||||
break;
|
||||
''',
|
||||
case=c_enum_const(variants.tag_member.type.name,
|
||||
var.name,
|
||||
variants.tag_member.type.prefix))
|
||||
if simple_union_type:
|
||||
ret += mcgen('''
|
||||
visit_type_%(c_type)s(v, "data", &obj->u.%(c_name)s, &err);
|
||||
''',
|
||||
c_type=simple_union_type.c_name(),
|
||||
c_name=c_name(var.name))
|
||||
else:
|
||||
ret += mcgen('''
|
||||
visit_type_%(c_type)s_members(v, &obj->u.%(c_name)s, &err);
|
||||
''',
|
||||
c_type=var.type.c_name(),
|
||||
c_name=c_name(var.name))
|
||||
ret += mcgen('''
|
||||
break;
|
||||
''')
|
||||
variants.tag_member.type.prefix),
|
||||
c_type=var.type.c_name(), c_name=c_name(var.name))
|
||||
|
||||
ret += mcgen('''
|
||||
default:
|
||||
@ -90,8 +93,8 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
|
||||
}
|
||||
''')
|
||||
|
||||
# 'goto out' produced for base, by gen_visit_members() for each member,
|
||||
# and if variants were present
|
||||
# 'goto out' produced for base, for each member, and if variants were
|
||||
# present
|
||||
if base or members or variants:
|
||||
ret += mcgen('''
|
||||
|
||||
@ -215,13 +218,11 @@ out:
|
||||
|
||||
|
||||
def gen_visit_object(name, base, members, variants):
|
||||
ret = gen_visit_object_members(name, base, members, variants)
|
||||
|
||||
# FIXME: if *obj is NULL on entry, and visit_start_struct() assigns to
|
||||
# *obj, but then visit_type_FOO_members() fails, we should clean up *obj
|
||||
# rather than leaving it non-NULL. As currently written, the caller must
|
||||
# call qapi_free_FOO() to avoid a memory leak of the partial FOO.
|
||||
ret += mcgen('''
|
||||
return mcgen('''
|
||||
|
||||
void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error **errp)
|
||||
{
|
||||
@ -245,8 +246,6 @@ out:
|
||||
''',
|
||||
c_name=c_name(name))
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
|
||||
def __init__(self):
|
||||
@ -268,11 +267,6 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
|
||||
self.decl = self._btin + self.decl
|
||||
self._btin = None
|
||||
|
||||
def visit_needed(self, entity):
|
||||
# Visit everything except implicit objects
|
||||
return not (entity.is_implicit() and
|
||||
isinstance(entity, QAPISchemaObjectType))
|
||||
|
||||
def visit_enum_type(self, name, info, values, prefix):
|
||||
# Special case for our lone builtin enum type
|
||||
# TODO use something cleaner than existence of info
|
||||
@ -296,9 +290,17 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
|
||||
self.defn += defn
|
||||
|
||||
def visit_object_type(self, name, info, base, members, variants):
|
||||
# Nothing to do for the special empty builtin
|
||||
if name == 'q_empty':
|
||||
return
|
||||
self.decl += gen_visit_members_decl(name)
|
||||
self.decl += gen_visit_decl(name)
|
||||
self.defn += gen_visit_object(name, base, members, variants)
|
||||
self.defn += gen_visit_object_members(name, base, members, variants)
|
||||
# TODO Worth changing the visitor signature, so we could
|
||||
# directly use rather than repeat type.is_implicit()?
|
||||
if not name.startswith('q_'):
|
||||
# only explicit types need an allocating visit
|
||||
self.decl += gen_visit_decl(name)
|
||||
self.defn += gen_visit_object(name, base, members, variants)
|
||||
|
||||
def visit_alternate_type(self, name, info, variants):
|
||||
self.decl += gen_visit_decl(name)
|
||||
|
171
scripts/qapi.py
171
scripts/qapi.py
@ -63,12 +63,12 @@ returns_whitelist = [
|
||||
case_whitelist = [
|
||||
# From QMP:
|
||||
'ACPISlotType', # DIMM, visible through query-acpi-ospm-status
|
||||
'CpuInfoBase', # CPU, visible through query-cpu
|
||||
'CpuInfoMIPS', # PC, visible through query-cpu
|
||||
'CpuInfoTricore', # PC, visible through query-cpu
|
||||
'QapiErrorClass', # all members, visible through errors
|
||||
'UuidInfo', # UUID, visible through query-uuid
|
||||
'X86CPURegister32', # all members, visible indirectly through qom-get
|
||||
'q_obj_CpuInfo-base', # CPU, visible through query-cpu
|
||||
]
|
||||
|
||||
enum_types = []
|
||||
@ -327,6 +327,8 @@ class QAPISchemaParser(object):
|
||||
|
||||
|
||||
def find_base_members(base):
|
||||
if isinstance(base, dict):
|
||||
return base
|
||||
base_struct_define = find_struct(base)
|
||||
if not base_struct_define:
|
||||
return None
|
||||
@ -391,7 +393,8 @@ def check_name(expr_info, source, name, allow_optional=False,
|
||||
# code always prefixes it with the enum name
|
||||
if enum_member and membername[0].isdigit():
|
||||
membername = 'D' + membername
|
||||
# Reserve the entire 'q_' namespace for c_name()
|
||||
# Reserve the entire 'q_' namespace for c_name(), and for 'q_empty'
|
||||
# and 'q_obj_*' implicit type names.
|
||||
if not valid_name.match(membername) or \
|
||||
c_name(membername, False).startswith('q_'):
|
||||
raise QAPIExprError(expr_info,
|
||||
@ -560,9 +563,10 @@ def check_union(expr, expr_info):
|
||||
|
||||
# Else, it's a flat union.
|
||||
else:
|
||||
# The object must have a string member 'base'.
|
||||
# The object must have a string or dictionary 'base'.
|
||||
check_type(expr_info, "'base' for union '%s'" % name,
|
||||
base, allow_metas=['struct'])
|
||||
base, allow_dict=True, allow_optional=True,
|
||||
allow_metas=['struct'])
|
||||
if not base:
|
||||
raise QAPIExprError(expr_info,
|
||||
"Flat union '%s' must have a base"
|
||||
@ -822,11 +826,18 @@ class QAPISchemaVisitor(object):
|
||||
|
||||
|
||||
class QAPISchemaType(QAPISchemaEntity):
|
||||
def c_type(self, is_param=False, is_unboxed=False):
|
||||
return c_name(self.name) + pointer_suffix
|
||||
# Return the C type for common use.
|
||||
# For the types we commonly box, this is a pointer type.
|
||||
def c_type(self):
|
||||
pass
|
||||
|
||||
def c_null(self):
|
||||
return 'NULL'
|
||||
# Return the C type to be used in a parameter list.
|
||||
def c_param_type(self):
|
||||
return self.c_type()
|
||||
|
||||
# Return the C type to be used where we suppress boxing.
|
||||
def c_unboxed_type(self):
|
||||
return self.c_type()
|
||||
|
||||
def json_type(self):
|
||||
pass
|
||||
@ -843,25 +854,24 @@ class QAPISchemaType(QAPISchemaEntity):
|
||||
|
||||
|
||||
class QAPISchemaBuiltinType(QAPISchemaType):
|
||||
def __init__(self, name, json_type, c_type, c_null):
|
||||
def __init__(self, name, json_type, c_type):
|
||||
QAPISchemaType.__init__(self, name, None)
|
||||
assert not c_type or isinstance(c_type, str)
|
||||
assert json_type in ('string', 'number', 'int', 'boolean', 'null',
|
||||
'value')
|
||||
self._json_type_name = json_type
|
||||
self._c_type_name = c_type
|
||||
self._c_null_val = c_null
|
||||
|
||||
def c_name(self):
|
||||
return self.name
|
||||
|
||||
def c_type(self, is_param=False, is_unboxed=False):
|
||||
if is_param and self.name == 'str':
|
||||
return 'const ' + self._c_type_name
|
||||
def c_type(self):
|
||||
return self._c_type_name
|
||||
|
||||
def c_null(self):
|
||||
return self._c_null_val
|
||||
def c_param_type(self):
|
||||
if self.name == 'str':
|
||||
return 'const ' + self._c_type_name
|
||||
return self._c_type_name
|
||||
|
||||
def json_type(self):
|
||||
return self._json_type_name
|
||||
@ -889,16 +899,12 @@ class QAPISchemaEnumType(QAPISchemaType):
|
||||
# See QAPISchema._make_implicit_enum_type()
|
||||
return self.name.endswith('Kind')
|
||||
|
||||
def c_type(self, is_param=False, is_unboxed=False):
|
||||
def c_type(self):
|
||||
return c_name(self.name)
|
||||
|
||||
def member_names(self):
|
||||
return [v.name for v in self.values]
|
||||
|
||||
def c_null(self):
|
||||
return c_enum_const(self.name, (self.member_names() + ['_MAX'])[0],
|
||||
self.prefix)
|
||||
|
||||
def json_type(self):
|
||||
return 'string'
|
||||
|
||||
@ -921,6 +927,9 @@ class QAPISchemaArrayType(QAPISchemaType):
|
||||
def is_implicit(self):
|
||||
return True
|
||||
|
||||
def c_type(self):
|
||||
return c_name(self.name) + pointer_suffix
|
||||
|
||||
def json_type(self):
|
||||
return 'array'
|
||||
|
||||
@ -978,19 +987,20 @@ class QAPISchemaObjectType(QAPISchemaType):
|
||||
m.check_clash(info, seen)
|
||||
|
||||
def is_implicit(self):
|
||||
# See QAPISchema._make_implicit_object_type()
|
||||
return self.name[0] == ':'
|
||||
# See QAPISchema._make_implicit_object_type(), as well as
|
||||
# _def_predefineds()
|
||||
return self.name.startswith('q_')
|
||||
|
||||
def c_name(self):
|
||||
assert not self.is_implicit()
|
||||
return QAPISchemaType.c_name(self)
|
||||
|
||||
def c_type(self, is_param=False, is_unboxed=False):
|
||||
def c_type(self):
|
||||
assert not self.is_implicit()
|
||||
if is_unboxed:
|
||||
return c_name(self.name)
|
||||
return c_name(self.name) + pointer_suffix
|
||||
|
||||
def c_unboxed_type(self):
|
||||
return c_name(self.name)
|
||||
|
||||
def json_type(self):
|
||||
return 'object'
|
||||
|
||||
@ -1026,12 +1036,14 @@ class QAPISchemaMember(object):
|
||||
|
||||
def _pretty_owner(self):
|
||||
owner = self.owner
|
||||
if owner.startswith(':obj-'):
|
||||
if owner.startswith('q_obj_'):
|
||||
# See QAPISchema._make_implicit_object_type() - reverse the
|
||||
# mapping there to create a nice human-readable description
|
||||
owner = owner[5:]
|
||||
owner = owner[6:]
|
||||
if owner.endswith('-arg'):
|
||||
return '(parameter of %s)' % owner[:-4]
|
||||
elif owner.endswith('-base'):
|
||||
return '(base of %s)' % owner[:-5]
|
||||
else:
|
||||
assert owner.endswith('-wrapper')
|
||||
# Unreachable and not implemented
|
||||
@ -1108,16 +1120,6 @@ class QAPISchemaObjectTypeVariant(QAPISchemaObjectTypeMember):
|
||||
def __init__(self, name, typ):
|
||||
QAPISchemaObjectTypeMember.__init__(self, name, typ, False)
|
||||
|
||||
# This function exists to support ugly simple union special cases
|
||||
# TODO get rid of them, and drop the function
|
||||
def simple_union_type(self):
|
||||
if (self.type.is_implicit() and
|
||||
isinstance(self.type, QAPISchemaObjectType)):
|
||||
assert len(self.type.members) == 1
|
||||
assert not self.type.variants
|
||||
return self.type.members[0].type
|
||||
return None
|
||||
|
||||
|
||||
class QAPISchemaAlternateType(QAPISchemaType):
|
||||
def __init__(self, name, info, variants):
|
||||
@ -1139,6 +1141,9 @@ class QAPISchemaAlternateType(QAPISchemaType):
|
||||
for v in self.variants.variants:
|
||||
v.check_clash(self.info, seen)
|
||||
|
||||
def c_type(self):
|
||||
return c_name(self.name) + pointer_suffix
|
||||
|
||||
def json_type(self):
|
||||
return 'value'
|
||||
|
||||
@ -1219,9 +1224,8 @@ class QAPISchema(object):
|
||||
def lookup_type(self, name):
|
||||
return self.lookup_entity(name, QAPISchemaType)
|
||||
|
||||
def _def_builtin_type(self, name, json_type, c_type, c_null):
|
||||
self._def_entity(QAPISchemaBuiltinType(name, json_type,
|
||||
c_type, c_null))
|
||||
def _def_builtin_type(self, name, json_type, c_type):
|
||||
self._def_entity(QAPISchemaBuiltinType(name, json_type, c_type))
|
||||
# TODO As long as we have QAPI_TYPES_BUILTIN to share multiple
|
||||
# qapi-types.h from a single .c, all arrays of builtins must be
|
||||
# declared in the first file whether or not they are used. Nicer
|
||||
@ -1230,23 +1234,23 @@ class QAPISchema(object):
|
||||
self._make_array_type(name, None)
|
||||
|
||||
def _def_predefineds(self):
|
||||
for t in [('str', 'string', 'char' + pointer_suffix, 'NULL'),
|
||||
('number', 'number', 'double', '0'),
|
||||
('int', 'int', 'int64_t', '0'),
|
||||
('int8', 'int', 'int8_t', '0'),
|
||||
('int16', 'int', 'int16_t', '0'),
|
||||
('int32', 'int', 'int32_t', '0'),
|
||||
('int64', 'int', 'int64_t', '0'),
|
||||
('uint8', 'int', 'uint8_t', '0'),
|
||||
('uint16', 'int', 'uint16_t', '0'),
|
||||
('uint32', 'int', 'uint32_t', '0'),
|
||||
('uint64', 'int', 'uint64_t', '0'),
|
||||
('size', 'int', 'uint64_t', '0'),
|
||||
('bool', 'boolean', 'bool', 'false'),
|
||||
('any', 'value', 'QObject' + pointer_suffix, 'NULL')]:
|
||||
for t in [('str', 'string', 'char' + pointer_suffix),
|
||||
('number', 'number', 'double'),
|
||||
('int', 'int', 'int64_t'),
|
||||
('int8', 'int', 'int8_t'),
|
||||
('int16', 'int', 'int16_t'),
|
||||
('int32', 'int', 'int32_t'),
|
||||
('int64', 'int', 'int64_t'),
|
||||
('uint8', 'int', 'uint8_t'),
|
||||
('uint16', 'int', 'uint16_t'),
|
||||
('uint32', 'int', 'uint32_t'),
|
||||
('uint64', 'int', 'uint64_t'),
|
||||
('size', 'int', 'uint64_t'),
|
||||
('bool', 'boolean', 'bool'),
|
||||
('any', 'value', 'QObject' + pointer_suffix)]:
|
||||
self._def_builtin_type(*t)
|
||||
self.the_empty_object_type = QAPISchemaObjectType(':empty', None, None,
|
||||
[], None)
|
||||
self.the_empty_object_type = QAPISchemaObjectType('q_empty', None,
|
||||
None, [], None)
|
||||
self._def_entity(self.the_empty_object_type)
|
||||
qtype_values = self._make_enum_members(['none', 'qnull', 'qint',
|
||||
'qstring', 'qdict', 'qlist',
|
||||
@ -1274,7 +1278,7 @@ class QAPISchema(object):
|
||||
if not members:
|
||||
return None
|
||||
# See also QAPISchemaObjectTypeMember._pretty_owner()
|
||||
name = ':obj-%s-%s' % (name, role)
|
||||
name = 'q_obj_%s-%s' % (name, role)
|
||||
if not self.lookup_entity(name, QAPISchemaObjectType):
|
||||
self._def_entity(QAPISchemaObjectType(name, info, None,
|
||||
members, None))
|
||||
@ -1326,6 +1330,9 @@ class QAPISchema(object):
|
||||
base = expr.get('base')
|
||||
tag_name = expr.get('discriminator')
|
||||
tag_member = None
|
||||
if isinstance(base, dict):
|
||||
base = (self._make_implicit_object_type(
|
||||
name, info, 'base', self._make_members(base, info)))
|
||||
if tag_name:
|
||||
variants = [self._make_variant(key, value)
|
||||
for (key, value) in data.iteritems()]
|
||||
@ -1630,60 +1637,18 @@ def gen_params(arg_type, extra):
|
||||
sep = ', '
|
||||
if memb.optional:
|
||||
ret += 'bool has_%s, ' % c_name(memb.name)
|
||||
ret += '%s %s' % (memb.type.c_type(is_param=True), c_name(memb.name))
|
||||
ret += '%s %s' % (memb.type.c_param_type(), c_name(memb.name))
|
||||
if extra:
|
||||
ret += sep + extra
|
||||
return ret
|
||||
|
||||
|
||||
def gen_err_check(label='out', skiperr=False):
|
||||
if skiperr:
|
||||
return ''
|
||||
def gen_err_check():
|
||||
return mcgen('''
|
||||
if (err) {
|
||||
goto %(label)s;
|
||||
}
|
||||
''',
|
||||
label=label)
|
||||
|
||||
|
||||
def gen_visit_members(members, prefix='', need_cast=False, skiperr=False,
|
||||
label='out'):
|
||||
ret = ''
|
||||
if skiperr:
|
||||
errparg = 'NULL'
|
||||
else:
|
||||
errparg = '&err'
|
||||
|
||||
for memb in members:
|
||||
if memb.optional:
|
||||
ret += mcgen('''
|
||||
if (visit_optional(v, "%(name)s", &%(prefix)shas_%(c_name)s)) {
|
||||
''',
|
||||
prefix=prefix, c_name=c_name(memb.name),
|
||||
name=memb.name)
|
||||
push_indent()
|
||||
|
||||
# Ugly: sometimes we need to cast away const
|
||||
if need_cast and memb.type.name == 'str':
|
||||
cast = '(char **)'
|
||||
else:
|
||||
cast = ''
|
||||
|
||||
ret += mcgen('''
|
||||
visit_type_%(c_type)s(v, "%(name)s", %(cast)s&%(prefix)s%(c_name)s, %(errp)s);
|
||||
''',
|
||||
c_type=memb.type.c_name(), prefix=prefix, cast=cast,
|
||||
c_name=c_name(memb.name), name=memb.name,
|
||||
errp=errparg)
|
||||
ret += gen_err_check(skiperr=skiperr, label=label)
|
||||
|
||||
if memb.optional:
|
||||
pop_indent()
|
||||
ret += mcgen('''
|
||||
goto out;
|
||||
}
|
||||
''')
|
||||
return ret
|
||||
|
||||
|
||||
#
|
||||
|
@ -305,9 +305,10 @@ static CharDriverState *qemu_chr_open_spice_vmc(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
const char *type = backend->u.spicevmc->type;
|
||||
ChardevSpiceChannel *spicevmc = backend->u.spicevmc.data;
|
||||
const char *type = spicevmc->type;
|
||||
const char **psubtype = spice_server_char_device_recognized_subtypes();
|
||||
ChardevCommon *common = qapi_ChardevSpiceChannel_base(backend->u.spicevmc);
|
||||
ChardevCommon *common = qapi_ChardevSpiceChannel_base(spicevmc);
|
||||
|
||||
for (; *psubtype != NULL; ++psubtype) {
|
||||
if (strcmp(type, *psubtype) == 0) {
|
||||
@ -329,8 +330,9 @@ static CharDriverState *qemu_chr_open_spice_port(const char *id,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
const char *name = backend->u.spiceport->fqdn;
|
||||
ChardevCommon *common = qapi_ChardevSpicePort_base(backend->u.spiceport);
|
||||
ChardevSpicePort *spiceport = backend->u.spiceport.data;
|
||||
const char *name = spiceport->fqdn;
|
||||
ChardevCommon *common = qapi_ChardevSpicePort_base(spiceport);
|
||||
CharDriverState *chr;
|
||||
SpiceCharDriver *s;
|
||||
|
||||
@ -372,7 +374,7 @@ static void qemu_chr_parse_spice_vmc(QemuOpts *opts, ChardevBackend *backend,
|
||||
error_setg(errp, "chardev: spice channel: no name given");
|
||||
return;
|
||||
}
|
||||
spicevmc = backend->u.spicevmc = g_new0(ChardevSpiceChannel, 1);
|
||||
spicevmc = backend->u.spicevmc.data = g_new0(ChardevSpiceChannel, 1);
|
||||
qemu_chr_parse_common(opts, qapi_ChardevSpiceChannel_base(spicevmc));
|
||||
spicevmc->type = g_strdup(name);
|
||||
}
|
||||
@ -387,7 +389,7 @@ static void qemu_chr_parse_spice_port(QemuOpts *opts, ChardevBackend *backend,
|
||||
error_setg(errp, "chardev: spice port: no name given");
|
||||
return;
|
||||
}
|
||||
spiceport = backend->u.spiceport = g_new0(ChardevSpicePort, 1);
|
||||
spiceport = backend->u.spiceport.data = g_new0(ChardevSpicePort, 1);
|
||||
qemu_chr_parse_common(opts, qapi_ChardevSpicePort_base(spiceport));
|
||||
spiceport->fqdn = g_strdup(name);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
object :empty
|
||||
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
|
||||
prefix QTYPE
|
||||
enum Status ['good', 'bad', 'ugly']
|
||||
object q_empty
|
||||
|
@ -1,3 +1,3 @@
|
||||
object :empty
|
||||
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
|
||||
prefix QTYPE
|
||||
object q_empty
|
||||
|
@ -1,4 +1,4 @@
|
||||
object :empty
|
||||
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
|
||||
prefix QTYPE
|
||||
event oops None
|
||||
object q_empty
|
||||
|
@ -1 +1 @@
|
||||
tests/qapi-schema/flat-union-bad-base.json:9: 'base' for union 'TestUnion' should be a type name
|
||||
tests/qapi-schema/flat-union-bad-base.json:8: 'string' (member of TestTypeA) collides with 'string' (base of TestUnion)
|
||||
|
@ -1,5 +1,4 @@
|
||||
# we require the base to be an existing struct
|
||||
# TODO: should we allow an anonymous inline base type?
|
||||
# we allow anonymous base, but enforce no duplicate keys
|
||||
{ 'enum': 'TestEnum',
|
||||
'data': [ 'value1', 'value2' ] }
|
||||
{ 'struct': 'TestTypeA',
|
||||
@ -7,7 +6,7 @@
|
||||
{ 'struct': 'TestTypeB',
|
||||
'data': { 'integer': 'int' } }
|
||||
{ 'union': 'TestUnion',
|
||||
'base': { 'enum1': 'TestEnum', 'kind': 'str' },
|
||||
'base': { 'enum1': 'TestEnum', 'string': 'str' },
|
||||
'discriminator': 'enum1',
|
||||
'data': { 'value1': 'TestTypeA',
|
||||
'value2': 'TestTypeB' } }
|
||||
|
@ -1,7 +1,7 @@
|
||||
object :empty
|
||||
object :obj-fooA-arg
|
||||
member bar1: str optional=False
|
||||
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
|
||||
prefix QTYPE
|
||||
command fooA :obj-fooA-arg -> None
|
||||
command fooA q_obj_fooA-arg -> None
|
||||
gen=True success_response=True
|
||||
object q_empty
|
||||
object q_obj_fooA-arg
|
||||
member bar1: str optional=False
|
||||
|
@ -1,4 +1,4 @@
|
||||
object :empty
|
||||
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
|
||||
prefix QTYPE
|
||||
enum Status ['good', 'bad', 'ugly']
|
||||
object q_empty
|
||||
|
@ -1,4 +1,4 @@
|
||||
object :empty
|
||||
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
|
||||
prefix QTYPE
|
||||
enum Status ['good', 'bad', 'ugly']
|
||||
object q_empty
|
||||
|
@ -1,4 +1,4 @@
|
||||
object :empty
|
||||
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
|
||||
prefix QTYPE
|
||||
enum Status ['good', 'bad', 'ugly']
|
||||
object q_empty
|
||||
|
@ -1,7 +1,7 @@
|
||||
object :empty
|
||||
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
|
||||
prefix QTYPE
|
||||
command eins None -> None
|
||||
gen=True success_response=True
|
||||
object q_empty
|
||||
command zwei None -> None
|
||||
gen=True success_response=True
|
||||
|
@ -18,6 +18,8 @@
|
||||
{ 'struct': 'Empty1', 'data': { } }
|
||||
{ 'struct': 'Empty2', 'base': 'Empty1', 'data': { } }
|
||||
|
||||
{ 'command': 'user_def_cmd0', 'data': 'Empty2', 'returns': 'Empty2' }
|
||||
|
||||
# for testing override of default naming heuristic
|
||||
{ 'enum': 'QEnumTwo',
|
||||
'prefix': 'QENUM_TWO',
|
||||
@ -73,14 +75,10 @@
|
||||
'base': 'UserDefZero',
|
||||
'data': { 'string': 'str', 'enum1': 'EnumOne' } }
|
||||
|
||||
{ 'struct': 'UserDefUnionBase2',
|
||||
'base': 'UserDefZero',
|
||||
'data': { 'string': 'str', 'enum1': 'QEnumTwo' } }
|
||||
|
||||
# this variant of UserDefFlatUnion defaults to a union that uses members with
|
||||
# allocated types to test corner cases in the cleanup/dealloc visitor
|
||||
{ 'union': 'UserDefFlatUnion2',
|
||||
'base': 'UserDefUnionBase2',
|
||||
'base': { '*integer': 'int', 'string': 'str', 'enum1': 'QEnumTwo' },
|
||||
'discriminator': 'enum1',
|
||||
'data': { 'value1' : 'UserDefC', # intentional forward reference
|
||||
'value2' : 'UserDefB' } }
|
||||
|
@ -1,58 +1,3 @@
|
||||
object :empty
|
||||
object :obj-EVENT_C-arg
|
||||
member a: int optional=True
|
||||
member b: UserDefOne optional=True
|
||||
member c: str optional=False
|
||||
object :obj-EVENT_D-arg
|
||||
member a: EventStructOne optional=False
|
||||
member b: str optional=False
|
||||
member c: str optional=True
|
||||
member enum3: EnumOne optional=True
|
||||
object :obj-__org.qemu_x-command-arg
|
||||
member a: __org.qemu_x-EnumList optional=False
|
||||
member b: __org.qemu_x-StructList optional=False
|
||||
member c: __org.qemu_x-Union2 optional=False
|
||||
member d: __org.qemu_x-Alt optional=False
|
||||
object :obj-anyList-wrapper
|
||||
member data: anyList optional=False
|
||||
object :obj-boolList-wrapper
|
||||
member data: boolList optional=False
|
||||
object :obj-guest-get-time-arg
|
||||
member a: int optional=False
|
||||
member b: int optional=True
|
||||
object :obj-guest-sync-arg
|
||||
member arg: any optional=False
|
||||
object :obj-int16List-wrapper
|
||||
member data: int16List optional=False
|
||||
object :obj-int32List-wrapper
|
||||
member data: int32List optional=False
|
||||
object :obj-int64List-wrapper
|
||||
member data: int64List optional=False
|
||||
object :obj-int8List-wrapper
|
||||
member data: int8List optional=False
|
||||
object :obj-intList-wrapper
|
||||
member data: intList optional=False
|
||||
object :obj-numberList-wrapper
|
||||
member data: numberList optional=False
|
||||
object :obj-sizeList-wrapper
|
||||
member data: sizeList optional=False
|
||||
object :obj-str-wrapper
|
||||
member data: str optional=False
|
||||
object :obj-strList-wrapper
|
||||
member data: strList optional=False
|
||||
object :obj-uint16List-wrapper
|
||||
member data: uint16List optional=False
|
||||
object :obj-uint32List-wrapper
|
||||
member data: uint32List optional=False
|
||||
object :obj-uint64List-wrapper
|
||||
member data: uint64List optional=False
|
||||
object :obj-uint8List-wrapper
|
||||
member data: uint8List optional=False
|
||||
object :obj-user_def_cmd1-arg
|
||||
member ud1a: UserDefOne optional=False
|
||||
object :obj-user_def_cmd2-arg
|
||||
member ud1a: UserDefOne optional=False
|
||||
member ud1b: UserDefOne optional=True
|
||||
alternate AltIntNum
|
||||
case i: int
|
||||
case n: number
|
||||
@ -73,8 +18,8 @@ alternate AltStrNum
|
||||
case n: number
|
||||
event EVENT_A None
|
||||
event EVENT_B None
|
||||
event EVENT_C :obj-EVENT_C-arg
|
||||
event EVENT_D :obj-EVENT_D-arg
|
||||
event EVENT_C q_obj_EVENT_C-arg
|
||||
event EVENT_D q_obj_EVENT_D-arg
|
||||
object Empty1
|
||||
object Empty2
|
||||
base Empty1
|
||||
@ -121,26 +66,26 @@ object UserDefFlatUnion
|
||||
case value2: UserDefB
|
||||
case value3: UserDefB
|
||||
object UserDefFlatUnion2
|
||||
base UserDefUnionBase2
|
||||
base q_obj_UserDefFlatUnion2-base
|
||||
tag enum1
|
||||
case value1: UserDefC
|
||||
case value2: UserDefB
|
||||
object UserDefNativeListUnion
|
||||
member type: UserDefNativeListUnionKind optional=False
|
||||
case integer: :obj-intList-wrapper
|
||||
case s8: :obj-int8List-wrapper
|
||||
case s16: :obj-int16List-wrapper
|
||||
case s32: :obj-int32List-wrapper
|
||||
case s64: :obj-int64List-wrapper
|
||||
case u8: :obj-uint8List-wrapper
|
||||
case u16: :obj-uint16List-wrapper
|
||||
case u32: :obj-uint32List-wrapper
|
||||
case u64: :obj-uint64List-wrapper
|
||||
case number: :obj-numberList-wrapper
|
||||
case boolean: :obj-boolList-wrapper
|
||||
case string: :obj-strList-wrapper
|
||||
case sizes: :obj-sizeList-wrapper
|
||||
case any: :obj-anyList-wrapper
|
||||
case integer: q_obj_intList-wrapper
|
||||
case s8: q_obj_int8List-wrapper
|
||||
case s16: q_obj_int16List-wrapper
|
||||
case s32: q_obj_int32List-wrapper
|
||||
case s64: q_obj_int64List-wrapper
|
||||
case u8: q_obj_uint8List-wrapper
|
||||
case u16: q_obj_uint16List-wrapper
|
||||
case u32: q_obj_uint32List-wrapper
|
||||
case u64: q_obj_uint64List-wrapper
|
||||
case number: q_obj_numberList-wrapper
|
||||
case boolean: q_obj_boolList-wrapper
|
||||
case string: q_obj_strList-wrapper
|
||||
case sizes: q_obj_sizeList-wrapper
|
||||
case any: q_obj_anyList-wrapper
|
||||
enum UserDefNativeListUnionKind ['integer', 's8', 's16', 's32', 's64', 'u8', 'u16', 'u32', 'u64', 'number', 'boolean', 'string', 'sizes', 'any']
|
||||
object UserDefOne
|
||||
base UserDefZero
|
||||
@ -166,10 +111,6 @@ object UserDefUnionBase
|
||||
base UserDefZero
|
||||
member string: str optional=False
|
||||
member enum1: EnumOne optional=False
|
||||
object UserDefUnionBase2
|
||||
base UserDefZero
|
||||
member string: str optional=False
|
||||
member enum1: QEnumTwo optional=False
|
||||
object UserDefZero
|
||||
member integer: int optional=False
|
||||
object WrapAlternate
|
||||
@ -189,21 +130,82 @@ object __org.qemu_x-Struct2
|
||||
member array: __org.qemu_x-Union1List optional=False
|
||||
object __org.qemu_x-Union1
|
||||
member type: __org.qemu_x-Union1Kind optional=False
|
||||
case __org.qemu_x-branch: :obj-str-wrapper
|
||||
case __org.qemu_x-branch: q_obj_str-wrapper
|
||||
enum __org.qemu_x-Union1Kind ['__org.qemu_x-branch']
|
||||
object __org.qemu_x-Union2
|
||||
base __org.qemu_x-Base
|
||||
tag __org.qemu_x-member1
|
||||
case __org.qemu_x-value: __org.qemu_x-Struct2
|
||||
command __org.qemu_x-command :obj-__org.qemu_x-command-arg -> __org.qemu_x-Union1
|
||||
command __org.qemu_x-command q_obj___org.qemu_x-command-arg -> __org.qemu_x-Union1
|
||||
gen=True success_response=True
|
||||
command guest-get-time :obj-guest-get-time-arg -> int
|
||||
command guest-get-time q_obj_guest-get-time-arg -> int
|
||||
gen=True success_response=True
|
||||
command guest-sync :obj-guest-sync-arg -> any
|
||||
command guest-sync q_obj_guest-sync-arg -> any
|
||||
gen=True success_response=True
|
||||
object q_empty
|
||||
object q_obj_EVENT_C-arg
|
||||
member a: int optional=True
|
||||
member b: UserDefOne optional=True
|
||||
member c: str optional=False
|
||||
object q_obj_EVENT_D-arg
|
||||
member a: EventStructOne optional=False
|
||||
member b: str optional=False
|
||||
member c: str optional=True
|
||||
member enum3: EnumOne optional=True
|
||||
object q_obj_UserDefFlatUnion2-base
|
||||
member integer: int optional=True
|
||||
member string: str optional=False
|
||||
member enum1: QEnumTwo optional=False
|
||||
object q_obj___org.qemu_x-command-arg
|
||||
member a: __org.qemu_x-EnumList optional=False
|
||||
member b: __org.qemu_x-StructList optional=False
|
||||
member c: __org.qemu_x-Union2 optional=False
|
||||
member d: __org.qemu_x-Alt optional=False
|
||||
object q_obj_anyList-wrapper
|
||||
member data: anyList optional=False
|
||||
object q_obj_boolList-wrapper
|
||||
member data: boolList optional=False
|
||||
object q_obj_guest-get-time-arg
|
||||
member a: int optional=False
|
||||
member b: int optional=True
|
||||
object q_obj_guest-sync-arg
|
||||
member arg: any optional=False
|
||||
object q_obj_int16List-wrapper
|
||||
member data: int16List optional=False
|
||||
object q_obj_int32List-wrapper
|
||||
member data: int32List optional=False
|
||||
object q_obj_int64List-wrapper
|
||||
member data: int64List optional=False
|
||||
object q_obj_int8List-wrapper
|
||||
member data: int8List optional=False
|
||||
object q_obj_intList-wrapper
|
||||
member data: intList optional=False
|
||||
object q_obj_numberList-wrapper
|
||||
member data: numberList optional=False
|
||||
object q_obj_sizeList-wrapper
|
||||
member data: sizeList optional=False
|
||||
object q_obj_str-wrapper
|
||||
member data: str optional=False
|
||||
object q_obj_strList-wrapper
|
||||
member data: strList optional=False
|
||||
object q_obj_uint16List-wrapper
|
||||
member data: uint16List optional=False
|
||||
object q_obj_uint32List-wrapper
|
||||
member data: uint32List optional=False
|
||||
object q_obj_uint64List-wrapper
|
||||
member data: uint64List optional=False
|
||||
object q_obj_uint8List-wrapper
|
||||
member data: uint8List optional=False
|
||||
object q_obj_user_def_cmd1-arg
|
||||
member ud1a: UserDefOne optional=False
|
||||
object q_obj_user_def_cmd2-arg
|
||||
member ud1a: UserDefOne optional=False
|
||||
member ud1b: UserDefOne optional=True
|
||||
command user_def_cmd None -> None
|
||||
gen=True success_response=True
|
||||
command user_def_cmd1 :obj-user_def_cmd1-arg -> None
|
||||
command user_def_cmd0 Empty2 -> Empty2
|
||||
gen=True success_response=True
|
||||
command user_def_cmd2 :obj-user_def_cmd2-arg -> UserDefTwo
|
||||
command user_def_cmd1 q_obj_user_def_cmd1-arg -> None
|
||||
gen=True success_response=True
|
||||
command user_def_cmd2 q_obj_user_def_cmd2-arg -> UserDefTwo
|
||||
gen=True success_response=True
|
||||
|
@ -131,8 +131,8 @@ static void test_io_channel_setup_sync(SocketAddress *listen_addr,
|
||||
SocketAddress *laddr = qio_channel_socket_get_local_address(
|
||||
lioc, &error_abort);
|
||||
|
||||
g_free(connect_addr->u.inet->port);
|
||||
connect_addr->u.inet->port = g_strdup(laddr->u.inet->port);
|
||||
g_free(connect_addr->u.inet.data->port);
|
||||
connect_addr->u.inet.data->port = g_strdup(laddr->u.inet.data->port);
|
||||
|
||||
qapi_free_SocketAddress(laddr);
|
||||
}
|
||||
@ -193,8 +193,8 @@ static void test_io_channel_setup_async(SocketAddress *listen_addr,
|
||||
SocketAddress *laddr = qio_channel_socket_get_local_address(
|
||||
lioc, &error_abort);
|
||||
|
||||
g_free(connect_addr->u.inet->port);
|
||||
connect_addr->u.inet->port = g_strdup(laddr->u.inet->port);
|
||||
g_free(connect_addr->u.inet.data->port);
|
||||
connect_addr->u.inet.data->port = g_strdup(laddr->u.inet.data->port);
|
||||
|
||||
qapi_free_SocketAddress(laddr);
|
||||
}
|
||||
@ -296,15 +296,15 @@ static void test_io_channel_ipv4(bool async)
|
||||
SocketAddress *connect_addr = g_new0(SocketAddress, 1);
|
||||
|
||||
listen_addr->type = SOCKET_ADDRESS_KIND_INET;
|
||||
listen_addr->u.inet = g_new(InetSocketAddress, 1);
|
||||
*listen_addr->u.inet = (InetSocketAddress) {
|
||||
listen_addr->u.inet.data = g_new(InetSocketAddress, 1);
|
||||
*listen_addr->u.inet.data = (InetSocketAddress) {
|
||||
.host = g_strdup("127.0.0.1"),
|
||||
.port = NULL, /* Auto-select */
|
||||
};
|
||||
|
||||
connect_addr->type = SOCKET_ADDRESS_KIND_INET;
|
||||
connect_addr->u.inet = g_new(InetSocketAddress, 1);
|
||||
*connect_addr->u.inet = (InetSocketAddress) {
|
||||
connect_addr->u.inet.data = g_new(InetSocketAddress, 1);
|
||||
*connect_addr->u.inet.data = (InetSocketAddress) {
|
||||
.host = g_strdup("127.0.0.1"),
|
||||
.port = NULL, /* Filled in later */
|
||||
};
|
||||
@ -334,15 +334,15 @@ static void test_io_channel_ipv6(bool async)
|
||||
SocketAddress *connect_addr = g_new0(SocketAddress, 1);
|
||||
|
||||
listen_addr->type = SOCKET_ADDRESS_KIND_INET;
|
||||
listen_addr->u.inet = g_new(InetSocketAddress, 1);
|
||||
*listen_addr->u.inet = (InetSocketAddress) {
|
||||
listen_addr->u.inet.data = g_new(InetSocketAddress, 1);
|
||||
*listen_addr->u.inet.data = (InetSocketAddress) {
|
||||
.host = g_strdup("::1"),
|
||||
.port = NULL, /* Auto-select */
|
||||
};
|
||||
|
||||
connect_addr->type = SOCKET_ADDRESS_KIND_INET;
|
||||
connect_addr->u.inet = g_new(InetSocketAddress, 1);
|
||||
*connect_addr->u.inet = (InetSocketAddress) {
|
||||
connect_addr->u.inet.data = g_new(InetSocketAddress, 1);
|
||||
*connect_addr->u.inet.data = (InetSocketAddress) {
|
||||
.host = g_strdup("::1"),
|
||||
.port = NULL, /* Filled in later */
|
||||
};
|
||||
@ -374,12 +374,12 @@ static void test_io_channel_unix(bool async)
|
||||
|
||||
#define TEST_SOCKET "test-io-channel-socket.sock"
|
||||
listen_addr->type = SOCKET_ADDRESS_KIND_UNIX;
|
||||
listen_addr->u.q_unix = g_new0(UnixSocketAddress, 1);
|
||||
listen_addr->u.q_unix->path = g_strdup(TEST_SOCKET);
|
||||
listen_addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
|
||||
listen_addr->u.q_unix.data->path = g_strdup(TEST_SOCKET);
|
||||
|
||||
connect_addr->type = SOCKET_ADDRESS_KIND_UNIX;
|
||||
connect_addr->u.q_unix = g_new0(UnixSocketAddress, 1);
|
||||
connect_addr->u.q_unix->path = g_strdup(TEST_SOCKET);
|
||||
connect_addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
|
||||
connect_addr->u.q_unix.data->path = g_strdup(TEST_SOCKET);
|
||||
|
||||
test_io_channel(async, listen_addr, connect_addr, true);
|
||||
|
||||
@ -423,12 +423,12 @@ static void test_io_channel_unix_fd_pass(void)
|
||||
fdsend[2] = testfd;
|
||||
|
||||
listen_addr->type = SOCKET_ADDRESS_KIND_UNIX;
|
||||
listen_addr->u.q_unix = g_new0(UnixSocketAddress, 1);
|
||||
listen_addr->u.q_unix->path = g_strdup(TEST_SOCKET);
|
||||
listen_addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
|
||||
listen_addr->u.q_unix.data->path = g_strdup(TEST_SOCKET);
|
||||
|
||||
connect_addr->type = SOCKET_ADDRESS_KIND_UNIX;
|
||||
connect_addr->u.q_unix = g_new0(UnixSocketAddress, 1);
|
||||
connect_addr->u.q_unix->path = g_strdup(TEST_SOCKET);
|
||||
connect_addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
|
||||
connect_addr->u.q_unix.data->path = g_strdup(TEST_SOCKET);
|
||||
|
||||
test_io_channel_setup_sync(listen_addr, connect_addr, &src, &dst);
|
||||
|
||||
|
@ -13,6 +13,11 @@ void qmp_user_def_cmd(Error **errp)
|
||||
{
|
||||
}
|
||||
|
||||
Empty2 *qmp_user_def_cmd0(Error **errp)
|
||||
{
|
||||
return g_new0(Empty2, 1);
|
||||
}
|
||||
|
||||
void qmp_user_def_cmd1(UserDefOne * ud1, Error **errp)
|
||||
{
|
||||
}
|
||||
@ -64,7 +69,7 @@ __org_qemu_x_Union1 *qmp___org_qemu_x_command(__org_qemu_x_EnumList *a,
|
||||
__org_qemu_x_Union1 *ret = g_new0(__org_qemu_x_Union1, 1);
|
||||
|
||||
ret->type = ORG_QEMU_X_UNION1_KIND___ORG_QEMU_X_BRANCH;
|
||||
ret->u.__org_qemu_x_branch = strdup("blah1");
|
||||
ret->u.__org_qemu_x_branch.data = strdup("blah1");
|
||||
|
||||
/* Also test that 'wchar-t' was munged to 'q_wchar_t' */
|
||||
if (b && b->value && !b->value->has_q_wchar_t) {
|
||||
|
@ -477,63 +477,64 @@ static void test_native_list_integer_helper(TestInputVisitorData *data,
|
||||
switch (kind) {
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER: {
|
||||
intList *elem = NULL;
|
||||
for (i = 0, elem = cvalue->u.integer; elem; elem = elem->next, i++) {
|
||||
for (i = 0, elem = cvalue->u.integer.data;
|
||||
elem; elem = elem->next, i++) {
|
||||
g_assert_cmpint(elem->value, ==, i);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_S8: {
|
||||
int8List *elem = NULL;
|
||||
for (i = 0, elem = cvalue->u.s8; elem; elem = elem->next, i++) {
|
||||
for (i = 0, elem = cvalue->u.s8.data; elem; elem = elem->next, i++) {
|
||||
g_assert_cmpint(elem->value, ==, i);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_S16: {
|
||||
int16List *elem = NULL;
|
||||
for (i = 0, elem = cvalue->u.s16; elem; elem = elem->next, i++) {
|
||||
for (i = 0, elem = cvalue->u.s16.data; elem; elem = elem->next, i++) {
|
||||
g_assert_cmpint(elem->value, ==, i);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_S32: {
|
||||
int32List *elem = NULL;
|
||||
for (i = 0, elem = cvalue->u.s32; elem; elem = elem->next, i++) {
|
||||
for (i = 0, elem = cvalue->u.s32.data; elem; elem = elem->next, i++) {
|
||||
g_assert_cmpint(elem->value, ==, i);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_S64: {
|
||||
int64List *elem = NULL;
|
||||
for (i = 0, elem = cvalue->u.s64; elem; elem = elem->next, i++) {
|
||||
for (i = 0, elem = cvalue->u.s64.data; elem; elem = elem->next, i++) {
|
||||
g_assert_cmpint(elem->value, ==, i);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_U8: {
|
||||
uint8List *elem = NULL;
|
||||
for (i = 0, elem = cvalue->u.u8; elem; elem = elem->next, i++) {
|
||||
for (i = 0, elem = cvalue->u.u8.data; elem; elem = elem->next, i++) {
|
||||
g_assert_cmpint(elem->value, ==, i);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_U16: {
|
||||
uint16List *elem = NULL;
|
||||
for (i = 0, elem = cvalue->u.u16; elem; elem = elem->next, i++) {
|
||||
for (i = 0, elem = cvalue->u.u16.data; elem; elem = elem->next, i++) {
|
||||
g_assert_cmpint(elem->value, ==, i);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_U32: {
|
||||
uint32List *elem = NULL;
|
||||
for (i = 0, elem = cvalue->u.u32; elem; elem = elem->next, i++) {
|
||||
for (i = 0, elem = cvalue->u.u32.data; elem; elem = elem->next, i++) {
|
||||
g_assert_cmpint(elem->value, ==, i);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_U64: {
|
||||
uint64List *elem = NULL;
|
||||
for (i = 0, elem = cvalue->u.u64; elem; elem = elem->next, i++) {
|
||||
for (i = 0, elem = cvalue->u.u64.data; elem; elem = elem->next, i++) {
|
||||
g_assert_cmpint(elem->value, ==, i);
|
||||
}
|
||||
break;
|
||||
@ -635,7 +636,7 @@ static void test_visitor_in_native_list_bool(TestInputVisitorData *data,
|
||||
g_assert(cvalue != NULL);
|
||||
g_assert_cmpint(cvalue->type, ==, USER_DEF_NATIVE_LIST_UNION_KIND_BOOLEAN);
|
||||
|
||||
for (i = 0, elem = cvalue->u.boolean; elem; elem = elem->next, i++) {
|
||||
for (i = 0, elem = cvalue->u.boolean.data; elem; elem = elem->next, i++) {
|
||||
g_assert_cmpint(elem->value, ==, (i % 3 == 0) ? 1 : 0);
|
||||
}
|
||||
|
||||
@ -668,7 +669,7 @@ static void test_visitor_in_native_list_string(TestInputVisitorData *data,
|
||||
g_assert(cvalue != NULL);
|
||||
g_assert_cmpint(cvalue->type, ==, USER_DEF_NATIVE_LIST_UNION_KIND_STRING);
|
||||
|
||||
for (i = 0, elem = cvalue->u.string; elem; elem = elem->next, i++) {
|
||||
for (i = 0, elem = cvalue->u.string.data; elem; elem = elem->next, i++) {
|
||||
gchar str[8];
|
||||
sprintf(str, "%d", i);
|
||||
g_assert_cmpstr(elem->value, ==, str);
|
||||
@ -705,7 +706,7 @@ static void test_visitor_in_native_list_number(TestInputVisitorData *data,
|
||||
g_assert(cvalue != NULL);
|
||||
g_assert_cmpint(cvalue->type, ==, USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER);
|
||||
|
||||
for (i = 0, elem = cvalue->u.number; elem; elem = elem->next, i++) {
|
||||
for (i = 0, elem = cvalue->u.number.data; elem; elem = elem->next, i++) {
|
||||
GString *double_expected = g_string_new("");
|
||||
GString *double_actual = g_string_new("");
|
||||
|
||||
|
@ -493,7 +493,7 @@ static void init_native_list(UserDefNativeListUnion *cvalue)
|
||||
int i;
|
||||
switch (cvalue->type) {
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER: {
|
||||
intList **list = &cvalue->u.integer;
|
||||
intList **list = &cvalue->u.integer.data;
|
||||
for (i = 0; i < 32; i++) {
|
||||
*list = g_new0(intList, 1);
|
||||
(*list)->value = i;
|
||||
@ -503,7 +503,7 @@ static void init_native_list(UserDefNativeListUnion *cvalue)
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_S8: {
|
||||
int8List **list = &cvalue->u.s8;
|
||||
int8List **list = &cvalue->u.s8.data;
|
||||
for (i = 0; i < 32; i++) {
|
||||
*list = g_new0(int8List, 1);
|
||||
(*list)->value = i;
|
||||
@ -513,7 +513,7 @@ static void init_native_list(UserDefNativeListUnion *cvalue)
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_S16: {
|
||||
int16List **list = &cvalue->u.s16;
|
||||
int16List **list = &cvalue->u.s16.data;
|
||||
for (i = 0; i < 32; i++) {
|
||||
*list = g_new0(int16List, 1);
|
||||
(*list)->value = i;
|
||||
@ -523,7 +523,7 @@ static void init_native_list(UserDefNativeListUnion *cvalue)
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_S32: {
|
||||
int32List **list = &cvalue->u.s32;
|
||||
int32List **list = &cvalue->u.s32.data;
|
||||
for (i = 0; i < 32; i++) {
|
||||
*list = g_new0(int32List, 1);
|
||||
(*list)->value = i;
|
||||
@ -533,7 +533,7 @@ static void init_native_list(UserDefNativeListUnion *cvalue)
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_S64: {
|
||||
int64List **list = &cvalue->u.s64;
|
||||
int64List **list = &cvalue->u.s64.data;
|
||||
for (i = 0; i < 32; i++) {
|
||||
*list = g_new0(int64List, 1);
|
||||
(*list)->value = i;
|
||||
@ -543,7 +543,7 @@ static void init_native_list(UserDefNativeListUnion *cvalue)
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_U8: {
|
||||
uint8List **list = &cvalue->u.u8;
|
||||
uint8List **list = &cvalue->u.u8.data;
|
||||
for (i = 0; i < 32; i++) {
|
||||
*list = g_new0(uint8List, 1);
|
||||
(*list)->value = i;
|
||||
@ -553,7 +553,7 @@ static void init_native_list(UserDefNativeListUnion *cvalue)
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_U16: {
|
||||
uint16List **list = &cvalue->u.u16;
|
||||
uint16List **list = &cvalue->u.u16.data;
|
||||
for (i = 0; i < 32; i++) {
|
||||
*list = g_new0(uint16List, 1);
|
||||
(*list)->value = i;
|
||||
@ -563,7 +563,7 @@ static void init_native_list(UserDefNativeListUnion *cvalue)
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_U32: {
|
||||
uint32List **list = &cvalue->u.u32;
|
||||
uint32List **list = &cvalue->u.u32.data;
|
||||
for (i = 0; i < 32; i++) {
|
||||
*list = g_new0(uint32List, 1);
|
||||
(*list)->value = i;
|
||||
@ -573,7 +573,7 @@ static void init_native_list(UserDefNativeListUnion *cvalue)
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_U64: {
|
||||
uint64List **list = &cvalue->u.u64;
|
||||
uint64List **list = &cvalue->u.u64.data;
|
||||
for (i = 0; i < 32; i++) {
|
||||
*list = g_new0(uint64List, 1);
|
||||
(*list)->value = i;
|
||||
@ -583,7 +583,7 @@ static void init_native_list(UserDefNativeListUnion *cvalue)
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_BOOLEAN: {
|
||||
boolList **list = &cvalue->u.boolean;
|
||||
boolList **list = &cvalue->u.boolean.data;
|
||||
for (i = 0; i < 32; i++) {
|
||||
*list = g_new0(boolList, 1);
|
||||
(*list)->value = (i % 3 == 0);
|
||||
@ -593,7 +593,7 @@ static void init_native_list(UserDefNativeListUnion *cvalue)
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_STRING: {
|
||||
strList **list = &cvalue->u.string;
|
||||
strList **list = &cvalue->u.string.data;
|
||||
for (i = 0; i < 32; i++) {
|
||||
*list = g_new0(strList, 1);
|
||||
(*list)->value = g_strdup_printf("%d", i);
|
||||
@ -603,7 +603,7 @@ static void init_native_list(UserDefNativeListUnion *cvalue)
|
||||
break;
|
||||
}
|
||||
case USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER: {
|
||||
numberList **list = &cvalue->u.number;
|
||||
numberList **list = &cvalue->u.number.data;
|
||||
for (i = 0; i < 32; i++) {
|
||||
*list = g_new0(numberList, 1);
|
||||
(*list)->value = (double)i / 3;
|
||||
|
2
tpm.c
2
tpm.c
@ -262,7 +262,7 @@ static TPMInfo *qmp_query_tpm_inst(TPMBackend *drv)
|
||||
case TPM_TYPE_PASSTHROUGH:
|
||||
res->options->type = TPM_TYPE_OPTIONS_KIND_PASSTHROUGH;
|
||||
tpo = g_new0(TPMPassthroughOptions, 1);
|
||||
res->options->u.passthrough = tpo;
|
||||
res->options->u.passthrough.data = tpo;
|
||||
if (drv->path) {
|
||||
tpo->path = g_strdup(drv->path);
|
||||
tpo->has_path = true;
|
||||
|
@ -2069,7 +2069,7 @@ static VcHandler *vc_handler = text_console_init;
|
||||
static CharDriverState *vc_init(const char *id, ChardevBackend *backend,
|
||||
ChardevReturn *ret, Error **errp)
|
||||
{
|
||||
return vc_handler(backend->u.vc, errp);
|
||||
return vc_handler(backend->u.vc.data, errp);
|
||||
}
|
||||
|
||||
void register_vc_handler(VcHandler *handler)
|
||||
@ -2111,7 +2111,7 @@ static void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend *backend,
|
||||
int val;
|
||||
ChardevVC *vc;
|
||||
|
||||
vc = backend->u.vc = g_new0(ChardevVC, 1);
|
||||
vc = backend->u.vc.data = g_new0(ChardevVC, 1);
|
||||
qemu_chr_parse_common(opts, qapi_ChardevVC_base(vc));
|
||||
|
||||
val = qemu_opt_get_number(opts, "width", 0);
|
||||
|
@ -141,10 +141,10 @@ static int number_to_qcode[0x100];
|
||||
int qemu_input_key_value_to_number(const KeyValue *value)
|
||||
{
|
||||
if (value->type == KEY_VALUE_KIND_QCODE) {
|
||||
return qcode_to_number[value->u.qcode];
|
||||
return qcode_to_number[value->u.qcode.data];
|
||||
} else {
|
||||
assert(value->type == KEY_VALUE_KIND_NUMBER);
|
||||
return value->u.number;
|
||||
return value->u.number.data;
|
||||
}
|
||||
}
|
||||
|
||||
@ -168,10 +168,10 @@ int qemu_input_key_number_to_qcode(uint8_t nr)
|
||||
int qemu_input_key_value_to_qcode(const KeyValue *value)
|
||||
{
|
||||
if (value->type == KEY_VALUE_KIND_QCODE) {
|
||||
return value->u.qcode;
|
||||
return value->u.qcode.data;
|
||||
} else {
|
||||
assert(value->type == KEY_VALUE_KIND_NUMBER);
|
||||
return qemu_input_key_number_to_qcode(value->u.number);
|
||||
return qemu_input_key_number_to_qcode(value->u.number.data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -182,7 +182,7 @@ int qemu_input_key_value_to_scancode(const KeyValue *value, bool down,
|
||||
int count = 0;
|
||||
|
||||
if (value->type == KEY_VALUE_KIND_QCODE &&
|
||||
value->u.qcode == Q_KEY_CODE_PAUSE) {
|
||||
value->u.qcode.data == Q_KEY_CODE_PAUSE) {
|
||||
/* specific case */
|
||||
int v = down ? 0 : 0x80;
|
||||
codes[count++] = 0xe1;
|
||||
|
@ -110,7 +110,7 @@ static void legacy_kbd_event(DeviceState *dev, QemuConsole *src,
|
||||
{
|
||||
QEMUPutKbdEntry *entry = (QEMUPutKbdEntry *)dev;
|
||||
int scancodes[3], i, count;
|
||||
InputKeyEvent *key = evt->u.key;
|
||||
InputKeyEvent *key = evt->u.key.data;
|
||||
|
||||
if (!entry || !entry->put_kbd) {
|
||||
return;
|
||||
@ -156,7 +156,7 @@ static void legacy_mouse_event(DeviceState *dev, QemuConsole *src,
|
||||
|
||||
switch (evt->type) {
|
||||
case INPUT_EVENT_KIND_BTN:
|
||||
btn = evt->u.btn;
|
||||
btn = evt->u.btn.data;
|
||||
if (btn->down) {
|
||||
s->buttons |= bmap[btn->button];
|
||||
} else {
|
||||
@ -178,11 +178,11 @@ static void legacy_mouse_event(DeviceState *dev, QemuConsole *src,
|
||||
}
|
||||
break;
|
||||
case INPUT_EVENT_KIND_ABS:
|
||||
move = evt->u.abs;
|
||||
move = evt->u.abs.data;
|
||||
s->axis[move->axis] = move->value;
|
||||
break;
|
||||
case INPUT_EVENT_KIND_REL:
|
||||
move = evt->u.rel;
|
||||
move = evt->u.rel.data;
|
||||
s->axis[move->axis] += move->value;
|
||||
break;
|
||||
default:
|
||||
|
34
ui/input.c
34
ui/input.c
@ -166,7 +166,7 @@ void qmp_input_send_event(bool has_device, const char *device,
|
||||
|
||||
static void qemu_input_transform_abs_rotate(InputEvent *evt)
|
||||
{
|
||||
InputMoveEvent *move = evt->u.abs;
|
||||
InputMoveEvent *move = evt->u.abs.data;
|
||||
switch (graphic_rotate) {
|
||||
case 90:
|
||||
if (move->axis == INPUT_AXIS_X) {
|
||||
@ -203,16 +203,16 @@ static void qemu_input_event_trace(QemuConsole *src, InputEvent *evt)
|
||||
}
|
||||
switch (evt->type) {
|
||||
case INPUT_EVENT_KIND_KEY:
|
||||
key = evt->u.key;
|
||||
key = evt->u.key.data;
|
||||
switch (key->key->type) {
|
||||
case KEY_VALUE_KIND_NUMBER:
|
||||
qcode = qemu_input_key_number_to_qcode(key->key->u.number);
|
||||
qcode = qemu_input_key_number_to_qcode(key->key->u.number.data);
|
||||
name = QKeyCode_lookup[qcode];
|
||||
trace_input_event_key_number(idx, key->key->u.number,
|
||||
trace_input_event_key_number(idx, key->key->u.number.data,
|
||||
name, key->down);
|
||||
break;
|
||||
case KEY_VALUE_KIND_QCODE:
|
||||
name = QKeyCode_lookup[key->key->u.qcode];
|
||||
name = QKeyCode_lookup[key->key->u.qcode.data];
|
||||
trace_input_event_key_qcode(idx, name, key->down);
|
||||
break;
|
||||
case KEY_VALUE_KIND__MAX:
|
||||
@ -221,17 +221,17 @@ static void qemu_input_event_trace(QemuConsole *src, InputEvent *evt)
|
||||
}
|
||||
break;
|
||||
case INPUT_EVENT_KIND_BTN:
|
||||
btn = evt->u.btn;
|
||||
btn = evt->u.btn.data;
|
||||
name = InputButton_lookup[btn->button];
|
||||
trace_input_event_btn(idx, name, btn->down);
|
||||
break;
|
||||
case INPUT_EVENT_KIND_REL:
|
||||
move = evt->u.rel;
|
||||
move = evt->u.rel.data;
|
||||
name = InputAxis_lookup[move->axis];
|
||||
trace_input_event_rel(idx, name, move->value);
|
||||
break;
|
||||
case INPUT_EVENT_KIND_ABS:
|
||||
move = evt->u.abs;
|
||||
move = evt->u.abs.data;
|
||||
name = InputAxis_lookup[move->axis];
|
||||
trace_input_event_abs(idx, name, move->value);
|
||||
break;
|
||||
@ -366,10 +366,10 @@ void qemu_input_event_sync(void)
|
||||
InputEvent *qemu_input_event_new_key(KeyValue *key, bool down)
|
||||
{
|
||||
InputEvent *evt = g_new0(InputEvent, 1);
|
||||
evt->u.key = g_new0(InputKeyEvent, 1);
|
||||
evt->u.key.data = g_new0(InputKeyEvent, 1);
|
||||
evt->type = INPUT_EVENT_KIND_KEY;
|
||||
evt->u.key->key = key;
|
||||
evt->u.key->down = down;
|
||||
evt->u.key.data->key = key;
|
||||
evt->u.key.data->down = down;
|
||||
return evt;
|
||||
}
|
||||
|
||||
@ -391,7 +391,7 @@ void qemu_input_event_send_key_number(QemuConsole *src, int num, bool down)
|
||||
{
|
||||
KeyValue *key = g_new0(KeyValue, 1);
|
||||
key->type = KEY_VALUE_KIND_NUMBER;
|
||||
key->u.number = num;
|
||||
key->u.number.data = num;
|
||||
qemu_input_event_send_key(src, key, down);
|
||||
}
|
||||
|
||||
@ -399,7 +399,7 @@ void qemu_input_event_send_key_qcode(QemuConsole *src, QKeyCode q, bool down)
|
||||
{
|
||||
KeyValue *key = g_new0(KeyValue, 1);
|
||||
key->type = KEY_VALUE_KIND_QCODE;
|
||||
key->u.qcode = q;
|
||||
key->u.qcode.data = q;
|
||||
qemu_input_event_send_key(src, key, down);
|
||||
}
|
||||
|
||||
@ -416,10 +416,10 @@ void qemu_input_event_send_key_delay(uint32_t delay_ms)
|
||||
InputEvent *qemu_input_event_new_btn(InputButton btn, bool down)
|
||||
{
|
||||
InputEvent *evt = g_new0(InputEvent, 1);
|
||||
evt->u.btn = g_new0(InputBtnEvent, 1);
|
||||
evt->u.btn.data = g_new0(InputBtnEvent, 1);
|
||||
evt->type = INPUT_EVENT_KIND_BTN;
|
||||
evt->u.btn->button = btn;
|
||||
evt->u.btn->down = down;
|
||||
evt->u.btn.data->button = btn;
|
||||
evt->u.btn.data->down = down;
|
||||
return evt;
|
||||
}
|
||||
|
||||
@ -470,7 +470,7 @@ InputEvent *qemu_input_event_new_move(InputEventKind kind,
|
||||
InputMoveEvent *move = g_new0(InputMoveEvent, 1);
|
||||
|
||||
evt->type = kind;
|
||||
evt->u.rel = move; /* evt->u.rel is the same as evt->u.abs */
|
||||
evt->u.rel.data = move; /* evt->u.rel is the same as evt->u.abs */
|
||||
move->axis = axis;
|
||||
move->value = value;
|
||||
return evt;
|
||||
|
@ -513,7 +513,8 @@ vnc_socket_ip_addr_string(QIOChannelSocket *ioc,
|
||||
error_setg(errp, "Not an inet socket type");
|
||||
return NULL;
|
||||
}
|
||||
ret = g_strdup_printf("%s;%s", addr->u.inet->host, addr->u.inet->port);
|
||||
ret = g_strdup_printf("%s;%s", addr->u.inet.data->host,
|
||||
addr->u.inet.data->port);
|
||||
qapi_free_SocketAddress(addr);
|
||||
return ret;
|
||||
}
|
||||
|
29
ui/vnc.c
29
ui/vnc.c
@ -112,9 +112,9 @@ static void vnc_init_basic_info(SocketAddress *addr,
|
||||
{
|
||||
switch (addr->type) {
|
||||
case SOCKET_ADDRESS_KIND_INET:
|
||||
info->host = g_strdup(addr->u.inet->host);
|
||||
info->service = g_strdup(addr->u.inet->port);
|
||||
if (addr->u.inet->ipv6) {
|
||||
info->host = g_strdup(addr->u.inet.data->host);
|
||||
info->service = g_strdup(addr->u.inet.data->port);
|
||||
if (addr->u.inet.data->ipv6) {
|
||||
info->family = NETWORK_ADDRESS_FAMILY_IPV6;
|
||||
} else {
|
||||
info->family = NETWORK_ADDRESS_FAMILY_IPV4;
|
||||
@ -123,7 +123,7 @@ static void vnc_init_basic_info(SocketAddress *addr,
|
||||
|
||||
case SOCKET_ADDRESS_KIND_UNIX:
|
||||
info->host = g_strdup("");
|
||||
info->service = g_strdup(addr->u.q_unix->path);
|
||||
info->service = g_strdup(addr->u.q_unix.data->path);
|
||||
info->family = NETWORK_ADDRESS_FAMILY_UNIX;
|
||||
break;
|
||||
|
||||
@ -385,9 +385,9 @@ VncInfo *qmp_query_vnc(Error **errp)
|
||||
|
||||
switch (addr->type) {
|
||||
case SOCKET_ADDRESS_KIND_INET:
|
||||
info->host = g_strdup(addr->u.inet->host);
|
||||
info->service = g_strdup(addr->u.inet->port);
|
||||
if (addr->u.inet->ipv6) {
|
||||
info->host = g_strdup(addr->u.inet.data->host);
|
||||
info->service = g_strdup(addr->u.inet.data->port);
|
||||
if (addr->u.inet.data->ipv6) {
|
||||
info->family = NETWORK_ADDRESS_FAMILY_IPV6;
|
||||
} else {
|
||||
info->family = NETWORK_ADDRESS_FAMILY_IPV4;
|
||||
@ -396,7 +396,7 @@ VncInfo *qmp_query_vnc(Error **errp)
|
||||
|
||||
case SOCKET_ADDRESS_KIND_UNIX:
|
||||
info->host = g_strdup("");
|
||||
info->service = g_strdup(addr->u.q_unix->path);
|
||||
info->service = g_strdup(addr->u.q_unix.data->path);
|
||||
info->family = NETWORK_ADDRESS_FAMILY_UNIX;
|
||||
break;
|
||||
|
||||
@ -3192,7 +3192,8 @@ char *vnc_display_local_addr(const char *id)
|
||||
qapi_free_SocketAddress(addr);
|
||||
return NULL;
|
||||
}
|
||||
ret = g_strdup_printf("%s;%s", addr->u.inet->host, addr->u.inet->port);
|
||||
ret = g_strdup_printf("%s;%s", addr->u.inet.data->host,
|
||||
addr->u.inet.data->port);
|
||||
qapi_free_SocketAddress(addr);
|
||||
|
||||
return ret;
|
||||
@ -3524,8 +3525,8 @@ void vnc_display_open(const char *id, Error **errp)
|
||||
|
||||
if (strncmp(vnc, "unix:", 5) == 0) {
|
||||
saddr->type = SOCKET_ADDRESS_KIND_UNIX;
|
||||
saddr->u.q_unix = g_new0(UnixSocketAddress, 1);
|
||||
saddr->u.q_unix->path = g_strdup(vnc + 5);
|
||||
saddr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
|
||||
saddr->u.q_unix.data->path = g_strdup(vnc + 5);
|
||||
|
||||
if (vs->ws_enabled) {
|
||||
error_setg(errp, "UNIX sockets not supported with websock");
|
||||
@ -3535,7 +3536,7 @@ void vnc_display_open(const char *id, Error **errp)
|
||||
unsigned long long baseport;
|
||||
InetSocketAddress *inet;
|
||||
saddr->type = SOCKET_ADDRESS_KIND_INET;
|
||||
inet = saddr->u.inet = g_new0(InetSocketAddress, 1);
|
||||
inet = saddr->u.inet.data = g_new0(InetSocketAddress, 1);
|
||||
if (vnc[0] == '[' && vnc[hlen - 1] == ']') {
|
||||
inet->host = g_strndup(vnc + 1, hlen - 2);
|
||||
} else {
|
||||
@ -3564,8 +3565,8 @@ void vnc_display_open(const char *id, Error **errp)
|
||||
|
||||
if (vs->ws_enabled) {
|
||||
wsaddr->type = SOCKET_ADDRESS_KIND_INET;
|
||||
inet = wsaddr->u.inet = g_new0(InetSocketAddress, 1);
|
||||
inet->host = g_strdup(saddr->u.inet->host);
|
||||
inet = wsaddr->u.inet.data = g_new0(InetSocketAddress, 1);
|
||||
inet->host = g_strdup(saddr->u.inet.data->host);
|
||||
inet->port = g_strdup(websocket);
|
||||
|
||||
if (to) {
|
||||
|
@ -901,8 +901,8 @@ SocketAddress *socket_parse(const char *str, Error **errp)
|
||||
goto fail;
|
||||
} else {
|
||||
addr->type = SOCKET_ADDRESS_KIND_UNIX;
|
||||
addr->u.q_unix = g_new(UnixSocketAddress, 1);
|
||||
addr->u.q_unix->path = g_strdup(str + 5);
|
||||
addr->u.q_unix.data = g_new(UnixSocketAddress, 1);
|
||||
addr->u.q_unix.data->path = g_strdup(str + 5);
|
||||
}
|
||||
} else if (strstart(str, "fd:", NULL)) {
|
||||
if (str[3] == '\0') {
|
||||
@ -910,13 +910,13 @@ SocketAddress *socket_parse(const char *str, Error **errp)
|
||||
goto fail;
|
||||
} else {
|
||||
addr->type = SOCKET_ADDRESS_KIND_FD;
|
||||
addr->u.fd = g_new(String, 1);
|
||||
addr->u.fd->str = g_strdup(str + 3);
|
||||
addr->u.fd.data = g_new(String, 1);
|
||||
addr->u.fd.data->str = g_strdup(str + 3);
|
||||
}
|
||||
} else {
|
||||
addr->type = SOCKET_ADDRESS_KIND_INET;
|
||||
addr->u.inet = inet_parse(str, errp);
|
||||
if (addr->u.inet == NULL) {
|
||||
addr->u.inet.data = inet_parse(str, errp);
|
||||
if (addr->u.inet.data == NULL) {
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
@ -934,15 +934,15 @@ int socket_connect(SocketAddress *addr, Error **errp,
|
||||
|
||||
switch (addr->type) {
|
||||
case SOCKET_ADDRESS_KIND_INET:
|
||||
fd = inet_connect_saddr(addr->u.inet, errp, callback, opaque);
|
||||
fd = inet_connect_saddr(addr->u.inet.data, errp, callback, opaque);
|
||||
break;
|
||||
|
||||
case SOCKET_ADDRESS_KIND_UNIX:
|
||||
fd = unix_connect_saddr(addr->u.q_unix, errp, callback, opaque);
|
||||
fd = unix_connect_saddr(addr->u.q_unix.data, errp, callback, opaque);
|
||||
break;
|
||||
|
||||
case SOCKET_ADDRESS_KIND_FD:
|
||||
fd = monitor_get_fd(cur_mon, addr->u.fd->str, errp);
|
||||
fd = monitor_get_fd(cur_mon, addr->u.fd.data->str, errp);
|
||||
if (fd >= 0 && callback) {
|
||||
qemu_set_nonblock(fd);
|
||||
callback(fd, NULL, opaque);
|
||||
@ -961,15 +961,15 @@ int socket_listen(SocketAddress *addr, Error **errp)
|
||||
|
||||
switch (addr->type) {
|
||||
case SOCKET_ADDRESS_KIND_INET:
|
||||
fd = inet_listen_saddr(addr->u.inet, 0, false, errp);
|
||||
fd = inet_listen_saddr(addr->u.inet.data, 0, false, errp);
|
||||
break;
|
||||
|
||||
case SOCKET_ADDRESS_KIND_UNIX:
|
||||
fd = unix_listen_saddr(addr->u.q_unix, false, errp);
|
||||
fd = unix_listen_saddr(addr->u.q_unix.data, false, errp);
|
||||
break;
|
||||
|
||||
case SOCKET_ADDRESS_KIND_FD:
|
||||
fd = monitor_get_fd(cur_mon, addr->u.fd->str, errp);
|
||||
fd = monitor_get_fd(cur_mon, addr->u.fd.data->str, errp);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -984,7 +984,8 @@ int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp)
|
||||
|
||||
switch (remote->type) {
|
||||
case SOCKET_ADDRESS_KIND_INET:
|
||||
fd = inet_dgram_saddr(remote->u.inet, local ? local->u.inet : NULL, errp);
|
||||
fd = inet_dgram_saddr(remote->u.inet.data,
|
||||
local ? local->u.inet.data : NULL, errp);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -1018,7 +1019,7 @@ socket_sockaddr_to_address_inet(struct sockaddr_storage *sa,
|
||||
|
||||
addr = g_new0(SocketAddress, 1);
|
||||
addr->type = SOCKET_ADDRESS_KIND_INET;
|
||||
inet = addr->u.inet = g_new0(InetSocketAddress, 1);
|
||||
inet = addr->u.inet.data = g_new0(InetSocketAddress, 1);
|
||||
inet->host = g_strdup(host);
|
||||
inet->port = g_strdup(serv);
|
||||
if (sa->ss_family == AF_INET) {
|
||||
@ -1042,10 +1043,10 @@ socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
|
||||
|
||||
addr = g_new0(SocketAddress, 1);
|
||||
addr->type = SOCKET_ADDRESS_KIND_UNIX;
|
||||
addr->u.q_unix = g_new0(UnixSocketAddress, 1);
|
||||
addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
|
||||
if (su->sun_path[0]) {
|
||||
addr->u.q_unix->path = g_strndup(su->sun_path,
|
||||
sizeof(su->sun_path));
|
||||
addr->u.q_unix.data->path = g_strndup(su->sun_path,
|
||||
sizeof(su->sun_path));
|
||||
}
|
||||
|
||||
return addr;
|
||||
|
Loading…
Reference in New Issue
Block a user