]> git.proxmox.com Git - qemu.git/blame - qmp.c
qmp: add qom-list command
[qemu.git] / qmp.c
CommitLineData
48a32bed
AL
1/*
2 * QEMU Management Protocol
3 *
4 * Copyright IBM, Corp. 2011
5 *
6 * Authors:
7 * Anthony Liguori <aliguori@us.ibm.com>
8 *
9 * This work is licensed under the terms of the GNU GPL, version 2. See
10 * the COPYING file in the top-level directory.
11 *
12 */
13
14#include "qemu-common.h"
15#include "sysemu.h"
16#include "qmp-commands.h"
292a2602
LC
17#include "kvm.h"
18#include "arch_init.h"
b4b12c62 19#include "hw/qdev.h"
48a32bed
AL
20
21NameInfo *qmp_query_name(Error **errp)
22{
23 NameInfo *info = g_malloc0(sizeof(*info));
24
25 if (qemu_name) {
26 info->has_name = true;
27 info->name = g_strdup(qemu_name);
28 }
29
30 return info;
31}
b9c15f16
LC
32
33VersionInfo *qmp_query_version(Error **err)
34{
35 VersionInfo *info = g_malloc0(sizeof(*info));
36 const char *version = QEMU_VERSION;
37 char *tmp;
38
39 info->qemu.major = strtol(version, &tmp, 10);
40 tmp++;
41 info->qemu.minor = strtol(tmp, &tmp, 10);
42 tmp++;
43 info->qemu.micro = strtol(tmp, &tmp, 10);
44 info->package = g_strdup(QEMU_PKGVERSION);
45
46 return info;
47}
292a2602
LC
48
49KvmInfo *qmp_query_kvm(Error **errp)
50{
51 KvmInfo *info = g_malloc0(sizeof(*info));
52
53 info->enabled = kvm_enabled();
54 info->present = kvm_available();
55
56 return info;
57}
58
efab767e
LC
59UuidInfo *qmp_query_uuid(Error **errp)
60{
61 UuidInfo *info = g_malloc0(sizeof(*info));
62 char uuid[64];
63
64 snprintf(uuid, sizeof(uuid), UUID_FMT, qemu_uuid[0], qemu_uuid[1],
65 qemu_uuid[2], qemu_uuid[3], qemu_uuid[4], qemu_uuid[5],
66 qemu_uuid[6], qemu_uuid[7], qemu_uuid[8], qemu_uuid[9],
67 qemu_uuid[10], qemu_uuid[11], qemu_uuid[12], qemu_uuid[13],
68 qemu_uuid[14], qemu_uuid[15]);
69
70 info->UUID = g_strdup(uuid);
71 return info;
72}
73
7a7f325e
LC
74void qmp_quit(Error **err)
75{
76 no_shutdown = 0;
77 qemu_system_shutdown_request();
78}
79
5f158f21
LC
80void qmp_stop(Error **errp)
81{
82 vm_stop(RUN_STATE_PAUSED);
83}
84
38d22653
LC
85void qmp_system_reset(Error **errp)
86{
87 qemu_system_reset_request();
88}
5bc465e4
LC
89
90void qmp_system_powerdown(Error **erp)
91{
92 qemu_system_powerdown_request();
93}
755f1968
LC
94
95void qmp_cpu(int64_t index, Error **errp)
96{
97 /* Just do nothing */
98}
2b54aa87
LC
99
100#ifndef CONFIG_VNC
101/* If VNC support is enabled, the "true" query-vnc command is
102 defined in the VNC subsystem */
103VncInfo *qmp_query_vnc(Error **errp)
104{
105 error_set(errp, QERR_FEATURE_DISABLED, "vnc");
106 return NULL;
107};
108#endif
d1f29646
LC
109
110#ifndef CONFIG_SPICE
111/* If SPICE support is enabled, the "true" query-spice command is
112 defined in the SPICE subsystem. Also note that we use a small
113 trick to maintain query-spice's original behavior, which is not
114 to be available in the namespace if SPICE is not compiled in */
115SpiceInfo *qmp_query_spice(Error **errp)
116{
117 error_set(errp, QERR_COMMAND_NOT_FOUND, "query-spice");
118 return NULL;
119};
120#endif
e42e818b
LC
121
122static void iostatus_bdrv_it(void *opaque, BlockDriverState *bs)
123{
124 bdrv_iostatus_reset(bs);
125}
126
127static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs)
128{
129 Error **err = opaque;
130
131 if (!error_is_set(err) && bdrv_key_required(bs)) {
132 error_set(err, QERR_DEVICE_ENCRYPTED, bdrv_get_device_name(bs));
133 }
134}
135
136void qmp_cont(Error **errp)
137{
138 Error *local_err = NULL;
139
140 if (runstate_check(RUN_STATE_INMIGRATE)) {
141 error_set(errp, QERR_MIGRATION_EXPECTED);
142 return;
143 } else if (runstate_check(RUN_STATE_INTERNAL_ERROR) ||
144 runstate_check(RUN_STATE_SHUTDOWN)) {
145 error_set(errp, QERR_RESET_REQUIRED);
146 return;
147 }
148
149 bdrv_iterate(iostatus_bdrv_it, NULL);
150 bdrv_iterate(encrypted_bdrv_it, &local_err);
151 if (local_err) {
152 error_propagate(errp, local_err);
153 return;
154 }
155
156 vm_start();
157}
b4b12c62
AL
158
159DevicePropertyInfoList *qmp_qom_list(const char *path, Error **errp)
160{
161 DeviceState *dev;
162 bool ambiguous = false;
163 DevicePropertyInfoList *props = NULL;
164 DeviceProperty *prop;
165
166 dev = qdev_resolve_path(path, &ambiguous);
167 if (dev == NULL) {
168 error_set(errp, QERR_DEVICE_NOT_FOUND, path);
169 return NULL;
170 }
171
172 QTAILQ_FOREACH(prop, &dev->properties, node) {
173 DevicePropertyInfoList *entry = g_malloc0(sizeof(*entry));
174
175 entry->value = g_malloc0(sizeof(DevicePropertyInfo));
176 entry->next = props;
177 props = entry;
178
179 entry->value->name = g_strdup(prop->name);
180 entry->value->type = g_strdup(prop->type);
181 }
182
183 return props;
184}