[libvirt] [PATCH 0/8] qemu: Kill text/HMP monitor code

Most of the code is now dead as we support qemu 1.5 and upwards. Remove the unused bits. Peter Krempa (8): qemu: monitor: Drop fallback to text monitor for 'inject-nmi' command qemu: monitor: Drop fallback to text monitor for 'send-key' command qemu: monitor: Remove unused qemuMonitor(Add|Remove)HostNetwork qemu: monitor: Drop QEMU_CHECK_MONITOR_JSON... macros qemu: monitor: Drop JSON versions of savevm/delvm/loadv tests: Drop qemumonitortest qemu: monitor: Drop calls to text monitor impl where possible qemu: monitor: Remove dead code from text monitor src/qemu/qemu_monitor.c | 519 +++------- src/qemu/qemu_monitor.h | 12 - src/qemu/qemu_monitor_json.c | 41 +- src/qemu/qemu_monitor_json.h | 4 - src/qemu/qemu_monitor_text.c | 2166 ------------------------------------------ src/qemu/qemu_monitor_text.h | 150 --- tests/Makefile.am | 11 +- tests/qemumonitortest.c | 203 ---- 8 files changed, 144 insertions(+), 2962 deletions(-) delete mode 100644 tests/qemumonitortest.c -- 2.16.2

The QMP version was added in qemu commit ab49ab5c488237f3656689 which is included in v1.1. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor_json.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 6dcded9369..530a5b9de2 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -4396,14 +4396,8 @@ int qemuMonitorJSONInjectNMI(qemuMonitorPtr mon) if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) goto cleanup; - if (qemuMonitorJSONHasError(reply, "CommandNotFound")) { - VIR_DEBUG("inject-nmi command not found, trying HMP"); - if (qemuMonitorTextInjectNMI(mon) < 0) - goto cleanup; - } else { - if (qemuMonitorJSONCheckError(cmd, reply) < 0) - goto cleanup; - } + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + goto cleanup; ret = 0; cleanup: -- 2.16.2

On Tue, May 22, 2018 at 02:35:41PM +0200, Peter Krempa wrote:
The QMP version was added in qemu commit ab49ab5c488237f3656689 which is included in v1.1.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor_json.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

The QMP version was added in qemu commit e4c8f004c55d9da3eae3e14 which is included in v1.3. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor_json.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 530a5b9de2..7ddecbc907 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -4458,14 +4458,8 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon, if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) goto cleanup; - if (qemuMonitorJSONHasError(reply, "CommandNotFound")) { - VIR_DEBUG("send-key command not found, trying HMP"); - if (qemuMonitorTextSendKey(mon, holdtime, keycodes, nkeycodes) < 0) - goto cleanup; - } else { - if (qemuMonitorJSONCheckError(cmd, reply) < 0) - goto cleanup; - } + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + goto cleanup; ret = 0; cleanup: -- 2.16.2

On Tue, May 22, 2018 at 02:35:42PM +0200, Peter Krempa wrote:
The QMP version was added in qemu commit e4c8f004c55d9da3eae3e14 which is included in v1.3.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor_json.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

There are no callers for these. Remove them and the monitor implementations. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor.c | 66 -------------------------------------------- src/qemu/qemu_monitor.h | 12 -------- src/qemu/qemu_monitor_text.c | 54 ------------------------------------ src/qemu/qemu_monitor_text.h | 7 ----- 4 files changed, 139 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index f21bf7000d..3e87bf5a4a 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2944,72 +2944,6 @@ qemuMonitorRemoveFd(qemuMonitorPtr mon, int fdset, int fd) } -int -qemuMonitorAddHostNetwork(qemuMonitorPtr mon, - const char *netstr, - int *tapfd, char **tapfdName, int tapfdSize, - int *vhostfd, char **vhostfdName, int vhostfdSize) -{ - int ret = -1; - size_t i = 0, j = 0; - - VIR_DEBUG("netstr=%s tapfd=%p tapfdName=%p tapfdSize=%d " - "vhostfd=%p vhostfdName=%p vhostfdSize=%d", - netstr, tapfd, tapfdName, tapfdSize, - vhostfd, vhostfdName, vhostfdSize); - - QEMU_CHECK_MONITOR(mon); - - for (i = 0; i < tapfdSize; i++) { - if (qemuMonitorSendFileHandle(mon, tapfdName[i], tapfd[i]) < 0) - goto cleanup; - } - for (j = 0; j < vhostfdSize; j++) { - if (qemuMonitorSendFileHandle(mon, vhostfdName[j], vhostfd[j]) < 0) - goto cleanup; - } - - if (mon->json) - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", - _("JSON monitor should be using AddNetdev")); - else - ret = qemuMonitorTextAddHostNetwork(mon, netstr); - - cleanup: - if (ret < 0) { - while (i--) { - if (qemuMonitorCloseFileHandle(mon, tapfdName[i]) < 0) - VIR_WARN("failed to close device handle '%s'", tapfdName[i]); - } - while (j--) { - if (qemuMonitorCloseFileHandle(mon, vhostfdName[j]) < 0) - VIR_WARN("failed to close device handle '%s'", vhostfdName[j]); - } - } - - return ret; -} - - -int -qemuMonitorRemoveHostNetwork(qemuMonitorPtr mon, - int vlan, - const char *netname) -{ - VIR_DEBUG("netname=%s", netname); - - QEMU_CHECK_MONITOR(mon); - - if (mon->json) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", - _("JSON monitor should be using RemoveNetdev")); - return -1; - } - - return qemuMonitorTextRemoveHostNetwork(mon, vlan, netname); -} - - int qemuMonitorAddNetdev(qemuMonitorPtr mon, const char *netdevstr, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 6cba37c281..b3aeb83cf0 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -771,18 +771,6 @@ int qemuMonitorCloseFileHandle(qemuMonitorPtr mon, const char *fdname); int qemuMonitorRemoveFd(qemuMonitorPtr mon, int fdset, int fd); -/* XXX do we really want to hardcode 'netstr' as the - * sendable item here - */ -int qemuMonitorAddHostNetwork(qemuMonitorPtr mon, - const char *netstr, - int *tapfd, char **tapfdName, int tapfdSize, - int *vhostfd, char **vhostfdName, int vhostfdSize); - -int qemuMonitorRemoveHostNetwork(qemuMonitorPtr mon, - int vlan, - const char *netname); - int qemuMonitorAddNetdev(qemuMonitorPtr mon, const char *netdevstr, int *tapfd, char **tapfdName, int tapfdSize, diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index 7c34ca5b07..58d695ea22 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -1650,60 +1650,6 @@ int qemuMonitorTextCloseFileHandle(qemuMonitorPtr mon, } -int qemuMonitorTextAddHostNetwork(qemuMonitorPtr mon, - const char *netstr) -{ - char *cmd; - char *reply = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "host_net_add %s", netstr) < 0) - return -1; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - if (STRNEQ(reply, "")) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unable to add host net: %s"), - reply); - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(cmd); - VIR_FREE(reply); - return ret; -} - - -int qemuMonitorTextRemoveHostNetwork(qemuMonitorPtr mon, - int vlan, - const char *netname) -{ - char *cmd; - char *reply = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "host_net_remove %d %s", vlan, netname) < 0) - return -1; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - /* XXX error messages here ? */ - - ret = 0; - - cleanup: - VIR_FREE(cmd); - VIR_FREE(reply); - return ret; -} - - int qemuMonitorTextAddNetdev(qemuMonitorPtr mon, const char *netdevstr) { diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h index d57bdbc55f..a9cdce5f61 100644 --- a/src/qemu/qemu_monitor_text.h +++ b/src/qemu/qemu_monitor_text.h @@ -126,13 +126,6 @@ int qemuMonitorTextSendFileHandle(qemuMonitorPtr mon, int qemuMonitorTextCloseFileHandle(qemuMonitorPtr mon, const char *fdname); -int qemuMonitorTextAddHostNetwork(qemuMonitorPtr mon, - const char *netstr); - -int qemuMonitorTextRemoveHostNetwork(qemuMonitorPtr mon, - int vlan, - const char *netname); - int qemuMonitorTextAddNetdev(qemuMonitorPtr mon, const char *netdevstr); -- 2.16.2

On Tue, May 22, 2018 at 02:35:43PM +0200, Peter Krempa wrote:
There are no callers for these. Remove them and the monitor implementations.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor.c | 66 -------------------------------------------- src/qemu/qemu_monitor.h | 12 -------- src/qemu/qemu_monitor_text.c | 54 ------------------------------------ src/qemu/qemu_monitor_text.h | 7 ----- 4 files changed, 139 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Monitor is now JSON only. Drop the old cruft. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor.c | 138 ++++++++++++++++++++++-------------------------- 1 file changed, 63 insertions(+), 75 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 3e87bf5a4a..9d665928d6 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -119,46 +119,34 @@ struct _qemuMonitor { /** * QEMU_CHECK_MONITOR_FULL: * @mon: monitor pointer variable to check, evaluated multiple times, no parentheses - * @force_json: force JSON monitor, true or false * @exit: statement that is used to exit the function * * This macro checks that the monitor is valid for given operation and exits * the function if not. The macro also adds a debug statement regarding the * monitor. */ -#define QEMU_CHECK_MONITOR_FULL(mon, force_json, exit) \ +#define QEMU_CHECK_MONITOR_FULL(mon, exit) \ do { \ if (!mon) { \ virReportError(VIR_ERR_INVALID_ARG, "%s", \ _("monitor must not be NULL")); \ exit; \ } \ - VIR_DEBUG("mon:%p vm:%p json:%d fd:%d", \ - mon, mon->vm, mon->json, mon->fd); \ - if (force_json && !mon->json) { \ - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", \ - _("JSON monitor is required")); \ - exit; \ - } \ + VIR_DEBUG("mon:%p vm:%p fd:%d", \ + mon, mon->vm, mon->fd); \ } while (0) /* Check monitor and return NULL on error */ #define QEMU_CHECK_MONITOR_NULL(mon) \ - QEMU_CHECK_MONITOR_FULL(mon, false, return NULL) -#define QEMU_CHECK_MONITOR_JSON_NULL(mon) \ - QEMU_CHECK_MONITOR_FULL(mon, true, return NULL) + QEMU_CHECK_MONITOR_FULL(mon, return NULL) /* Check monitor and return -1 on error */ #define QEMU_CHECK_MONITOR(mon) \ - QEMU_CHECK_MONITOR_FULL(mon, false, return -1) -#define QEMU_CHECK_MONITOR_JSON(mon) \ - QEMU_CHECK_MONITOR_FULL(mon, true, return -1) + QEMU_CHECK_MONITOR_FULL(mon, return -1) /* Check monitor and jump to the provided label */ #define QEMU_CHECK_MONITOR_GOTO(mon, label) \ - QEMU_CHECK_MONITOR_FULL(mon, false, goto label) -#define QEMU_CHECK_MONITOR_JSON_GOTO(mon, label) \ - QEMU_CHECK_MONITOR_FULL(mon, true, goto label) + QEMU_CHECK_MONITOR_FULL(mon, goto label) static virClassPtr qemuMonitorClass; static void qemuMonitorDispose(void *obj); @@ -2280,7 +2268,7 @@ qemuMonitorGetBlockInfo(qemuMonitorPtr mon) virJSONValuePtr qemuMonitorQueryBlockstats(qemuMonitorPtr mon) { - QEMU_CHECK_MONITOR_JSON_NULL(mon); + QEMU_CHECK_MONITOR_NULL(mon); return qemuMonitorJSONQueryBlockstats(mon); } @@ -2345,7 +2333,7 @@ qemuMonitorBlockStatsUpdateCapacity(qemuMonitorPtr mon, { VIR_DEBUG("stats=%p, backing=%d", stats, backingChain); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONBlockStatsUpdateCapacity(mon, stats, backingChain); } @@ -2602,7 +2590,7 @@ qemuMonitorGetMigrationCacheSize(qemuMonitorPtr mon, { VIR_DEBUG("cacheSize=%p", cacheSize); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetMigrationCacheSize(mon, cacheSize); } @@ -2614,7 +2602,7 @@ qemuMonitorSetMigrationCacheSize(qemuMonitorPtr mon, { VIR_DEBUG("cacheSize=%llu", cacheSize); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONSetMigrationCacheSize(mon, cacheSize); } @@ -2635,7 +2623,7 @@ int qemuMonitorGetMigrationParams(qemuMonitorPtr mon, virJSONValuePtr *params) { - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetMigrationParams(mon, params); } @@ -2655,7 +2643,7 @@ int qemuMonitorSetMigrationParams(qemuMonitorPtr mon, virJSONValuePtr params) { - QEMU_CHECK_MONITOR_JSON_GOTO(mon, error); + QEMU_CHECK_MONITOR_GOTO(mon, error); return qemuMonitorJSONSetMigrationParams(mon, params); @@ -2755,7 +2743,7 @@ int qemuMonitorQueryDump(qemuMonitorPtr mon, qemuMonitorDumpStatsPtr stats) { - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONQueryDump(mon, stats); } @@ -2789,7 +2777,7 @@ qemuMonitorDumpToFd(qemuMonitorPtr mon, int ret; VIR_DEBUG("fd=%d dumpformat=%s", fd, dumpformat); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); if (qemuMonitorSendFileHandle(mon, "dump", fd) < 0) return -1; @@ -2899,7 +2887,7 @@ qemuMonitorAddFd(qemuMonitorPtr mon, int fdset, int fd, const char *name) { VIR_DEBUG("fdset=%d, fd=%d, name=%s", fdset, fd, NULLSTR(name)); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); if (fd < 0 || fdset < 0) { virReportError(VIR_ERR_INVALID_ARG, "%s", @@ -2931,7 +2919,7 @@ qemuMonitorRemoveFd(qemuMonitorPtr mon, int fdset, int fd) error = virSaveLastError(); - QEMU_CHECK_MONITOR_JSON_GOTO(mon, cleanup); + QEMU_CHECK_MONITOR_GOTO(mon, cleanup); ret = qemuMonitorJSONRemoveFd(mon, fdset, fd); @@ -3011,7 +2999,7 @@ qemuMonitorQueryRxFilter(qemuMonitorPtr mon, const char *alias, { VIR_DEBUG("alias=%s filter=%p", alias, filter); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONQueryRxFilter(mon, alias, filter); } @@ -3143,7 +3131,7 @@ int qemuMonitorAddDeviceArgs(qemuMonitorPtr mon, virJSONValuePtr args) { - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONAddDeviceArgs(mon, args); } @@ -3167,7 +3155,7 @@ qemuMonitorAddObject(qemuMonitorPtr mon, { VIR_DEBUG("type=%s objalias=%s props=%p", type, objalias, props); - QEMU_CHECK_MONITOR_JSON_GOTO(mon, error); + QEMU_CHECK_MONITOR_GOTO(mon, error); return qemuMonitorJSONAddObject(mon, type, objalias, props); @@ -3183,7 +3171,7 @@ qemuMonitorDelObject(qemuMonitorPtr mon, { VIR_DEBUG("objalias=%s", objalias); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONDelObject(mon, objalias); } @@ -3270,7 +3258,7 @@ qemuMonitorDiskSnapshot(qemuMonitorPtr mon, virJSONValuePtr actions, VIR_DEBUG("actions=%p, device=%s, file=%s, format=%s, reuse=%d", actions, device, file, format, reuse); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONDiskSnapshot(mon, actions, device, file, format, reuse); } @@ -3289,7 +3277,7 @@ qemuMonitorDriveMirror(qemuMonitorPtr mon, device, file, NULLSTR(format), bandwidth, granularity, buf_size, flags); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONDriveMirror(mon, device, file, format, bandwidth, granularity, buf_size, flags); @@ -3302,7 +3290,7 @@ qemuMonitorTransaction(qemuMonitorPtr mon, virJSONValuePtr *actions) { VIR_DEBUG("actions=%p", *actions); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONTransaction(mon, actions); } @@ -3318,7 +3306,7 @@ qemuMonitorBlockCommit(qemuMonitorPtr mon, const char *device, VIR_DEBUG("device=%s, top=%s, base=%s, backingName=%s, bandwidth=%llu", device, top, base, NULLSTR(backingName), bandwidth); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONBlockCommit(mon, device, top, base, backingName, bandwidth); @@ -3344,7 +3332,7 @@ qemuMonitorDiskNameLookup(qemuMonitorPtr mon, virStorageSourcePtr top, virStorageSourcePtr target) { - QEMU_CHECK_MONITOR_JSON_NULL(mon); + QEMU_CHECK_MONITOR_NULL(mon); return qemuMonitorJSONDiskNameLookup(mon, device, top, target); } @@ -3357,7 +3345,7 @@ qemuMonitorDrivePivot(qemuMonitorPtr mon, { VIR_DEBUG("device=%s", device); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONDrivePivot(mon, device); } @@ -3437,7 +3425,7 @@ qemuMonitorBlockStream(qemuMonitorPtr mon, VIR_DEBUG("device=%s, base=%s, backingName=%s, bandwidth=%lluB", device, NULLSTR(base), NULLSTR(backingName), bandwidth); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONBlockStream(mon, device, base, backingName, bandwidth); } @@ -3449,7 +3437,7 @@ qemuMonitorBlockJobCancel(qemuMonitorPtr mon, { VIR_DEBUG("device=%s", device); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONBlockJobCancel(mon, device); } @@ -3462,7 +3450,7 @@ qemuMonitorBlockJobSetSpeed(qemuMonitorPtr mon, { VIR_DEBUG("device=%s, bandwidth=%lluB", device, bandwidth); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONBlockJobSetSpeed(mon, device, bandwidth); } @@ -3471,7 +3459,7 @@ qemuMonitorBlockJobSetSpeed(qemuMonitorPtr mon, virHashTablePtr qemuMonitorGetAllBlockJobInfo(qemuMonitorPtr mon) { - QEMU_CHECK_MONITOR_JSON_NULL(mon); + QEMU_CHECK_MONITOR_NULL(mon); return qemuMonitorJSONGetAllBlockJobInfo(mon); } @@ -3631,7 +3619,7 @@ qemuMonitorOpenGraphics(qemuMonitorPtr mon, int qemuMonitorSystemWakeup(qemuMonitorPtr mon) { - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONSystemWakeup(mon); } @@ -3647,7 +3635,7 @@ qemuMonitorGetVersion(qemuMonitorPtr mon, VIR_DEBUG("major=%p minor=%p micro=%p package=%p", major, minor, micro, package); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetVersion(mon, major, minor, micro, package); } @@ -3659,7 +3647,7 @@ qemuMonitorGetMachines(qemuMonitorPtr mon, { VIR_DEBUG("machines=%p", machines); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetMachines(mon, machines); } @@ -3682,7 +3670,7 @@ qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon, { VIR_DEBUG("cpus=%p", cpus); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetCPUDefinitions(mon, cpus); } @@ -3710,7 +3698,7 @@ qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon, VIR_DEBUG("type=%d model_name=%s migratable=%d", type, model_name, migratable); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetCPUModelExpansion(mon, type, model_name, migratable, model_info); @@ -3795,7 +3783,7 @@ qemuMonitorGetCommands(qemuMonitorPtr mon, { VIR_DEBUG("commands=%p", commands); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetCommands(mon, commands); } @@ -3807,7 +3795,7 @@ qemuMonitorGetEvents(qemuMonitorPtr mon, { VIR_DEBUG("events=%p", events); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetEvents(mon, events); } @@ -3823,7 +3811,7 @@ qemuMonitorGetCommandLineOptionParameters(qemuMonitorPtr mon, { VIR_DEBUG("option=%s params=%p", option, params); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetCommandLineOptionParameters(mon, option, params, found); @@ -3837,7 +3825,7 @@ qemuMonitorGetKVMState(qemuMonitorPtr mon, { VIR_DEBUG("enabled=%p present=%p", enabled, present); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetKVMState(mon, enabled, present); } @@ -3849,7 +3837,7 @@ qemuMonitorGetObjectTypes(qemuMonitorPtr mon, { VIR_DEBUG("types=%p", types); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetObjectTypes(mon, types); } @@ -3862,7 +3850,7 @@ qemuMonitorGetDeviceProps(qemuMonitorPtr mon, { VIR_DEBUG("device=%s props=%p", device, props); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetDeviceProps(mon, device, props); } @@ -3875,7 +3863,7 @@ qemuMonitorGetObjectProps(qemuMonitorPtr mon, { VIR_DEBUG("object=%s props=%p", object, props); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetObjectProps(mon, object, props); } @@ -3884,7 +3872,7 @@ qemuMonitorGetObjectProps(qemuMonitorPtr mon, char * qemuMonitorGetTargetArch(qemuMonitorPtr mon) { - QEMU_CHECK_MONITOR_JSON_NULL(mon); + QEMU_CHECK_MONITOR_NULL(mon); return qemuMonitorJSONGetTargetArch(mon); } @@ -3918,7 +3906,7 @@ int qemuMonitorSetMigrationCapabilities(qemuMonitorPtr mon, virJSONValuePtr caps) { - QEMU_CHECK_MONITOR_JSON_GOTO(mon, error); + QEMU_CHECK_MONITOR_GOTO(mon, error); return qemuMonitorJSONSetMigrationCapabilities(mon, caps); @@ -3939,7 +3927,7 @@ int qemuMonitorGetGICCapabilities(qemuMonitorPtr mon, virGICCapability **capabilities) { - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetGICCapabilities(mon, capabilities); } @@ -3953,7 +3941,7 @@ qemuMonitorNBDServerStart(qemuMonitorPtr mon, { VIR_DEBUG("host=%s port=%u tls_alias=%s", host, port, NULLSTR(tls_alias)); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONNBDServerStart(mon, host, port, tls_alias); } @@ -3966,7 +3954,7 @@ qemuMonitorNBDServerAdd(qemuMonitorPtr mon, { VIR_DEBUG("deviceID=%s", deviceID); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONNBDServerAdd(mon, deviceID, writable); } @@ -3975,7 +3963,7 @@ qemuMonitorNBDServerAdd(qemuMonitorPtr mon, int qemuMonitorNBDServerStop(qemuMonitorPtr mon) { - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONNBDServerStop(mon); } @@ -3987,7 +3975,7 @@ qemuMonitorGetTPMModels(qemuMonitorPtr mon, { VIR_DEBUG("tpmmodels=%p", tpmmodels); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetTPMModels(mon, tpmmodels); } @@ -3999,7 +3987,7 @@ qemuMonitorGetTPMTypes(qemuMonitorPtr mon, { VIR_DEBUG("tpmtypes=%p", tpmtypes); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetTPMTypes(mon, tpmtypes); } @@ -4012,7 +4000,7 @@ qemuMonitorAttachCharDev(qemuMonitorPtr mon, { VIR_DEBUG("chrID=%s chr=%p", chrID, chr); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONAttachCharDev(mon, chrID, chr); } @@ -4024,7 +4012,7 @@ qemuMonitorDetachCharDev(qemuMonitorPtr mon, { VIR_DEBUG("chrID=%s", chrID); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONDetachCharDev(mon, chrID); } @@ -4036,7 +4024,7 @@ qemuMonitorGetDeviceAliases(qemuMonitorPtr mon, { VIR_DEBUG("aliases=%p", aliases); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetDeviceAliases(mon, aliases); } @@ -4112,7 +4100,7 @@ qemuMonitorGetGuestCPU(qemuMonitorPtr mon, VIR_DEBUG("arch=%s data=%p disabled=%p", virArchToString(arch), data, disabled); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); *data = NULL; if (disabled) @@ -4137,7 +4125,7 @@ qemuMonitorGetGuestCPU(qemuMonitorPtr mon, int qemuMonitorRTCResetReinjection(qemuMonitorPtr mon) { - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONRTCResetReinjection(mon); } @@ -4217,7 +4205,7 @@ qemuMonitorMigrateIncoming(qemuMonitorPtr mon, { VIR_DEBUG("uri=%s", uri); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONMigrateIncoming(mon, uri); } @@ -4226,7 +4214,7 @@ qemuMonitorMigrateIncoming(qemuMonitorPtr mon, int qemuMonitorMigrateStartPostCopy(qemuMonitorPtr mon) { - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONMigrateStartPostCopy(mon); } @@ -4238,7 +4226,7 @@ qemuMonitorMigrateContinue(qemuMonitorPtr mon, { VIR_DEBUG("status=%s", qemuMonitorMigrationStatusTypeToString(status)); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONMigrateContinue(mon, status); } @@ -4248,7 +4236,7 @@ int qemuMonitorGetRTCTime(qemuMonitorPtr mon, struct tm *tm) { - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONGetRTCTime(mon, tm); } @@ -4257,7 +4245,7 @@ qemuMonitorGetRTCTime(qemuMonitorPtr mon, virJSONValuePtr qemuMonitorQueryQMPSchema(qemuMonitorPtr mon) { - QEMU_CHECK_MONITOR_JSON_NULL(mon); + QEMU_CHECK_MONITOR_NULL(mon); return qemuMonitorJSONQueryQMPSchema(mon); } @@ -4270,7 +4258,7 @@ qemuMonitorSetBlockThreshold(qemuMonitorPtr mon, { VIR_DEBUG("node='%s', threshold=%llu", nodename, threshold); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONSetBlockThreshold(mon, nodename, threshold); } @@ -4279,7 +4267,7 @@ qemuMonitorSetBlockThreshold(qemuMonitorPtr mon, virJSONValuePtr qemuMonitorQueryNamedBlockNodes(qemuMonitorPtr mon) { - QEMU_CHECK_MONITOR_JSON_NULL(mon); + QEMU_CHECK_MONITOR_NULL(mon); return qemuMonitorJSONQueryNamedBlockNodes(mon); } @@ -4342,7 +4330,7 @@ qemuMonitorSetWatchdogAction(qemuMonitorPtr mon, { VIR_DEBUG("watchdogAction=%s", action); - QEMU_CHECK_MONITOR_JSON(mon); + QEMU_CHECK_MONITOR(mon); return qemuMonitorJSONSetWatchdogAction(mon, action); } -- 2.16.2

On Tue, May 22, 2018 at 02:35:44PM +0200, Peter Krempa wrote:
Monitor is now JSON only. Drop the old cruft.
In theory, you should still be able to get a domain with a text monitor via qemu-attach. In practice, attaching to such domains seems pointless - if we don't support starting them, touching their mointor might just break them. Maybe we should drop qemu-attach as well?
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor.c | 138 ++++++++++++++++++++++-------------------------- 1 file changed, 63 insertions(+), 75 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

On Tue, May 22, 2018 at 15:24:06 +0200, Ján Tomko wrote:
On Tue, May 22, 2018 at 02:35:44PM +0200, Peter Krempa wrote:
Monitor is now JSON only. Drop the old cruft.
In theory, you should still be able to get a domain with a text monitor via qemu-attach.
In practice, attaching to such domains seems pointless - if we don't support starting them, touching their mointor might just break them.
I can leave the part of the macro that checks whether the monitor is JSON still in. That way it will at least report sane errors.
Maybe we should drop qemu-attach as well?
I hope so, but it should be probably done separately.

On Wed, May 23, 2018 at 03:04:47PM +0200, Peter Krempa wrote:
On Tue, May 22, 2018 at 15:24:06 +0200, Ján Tomko wrote:
On Tue, May 22, 2018 at 02:35:44PM +0200, Peter Krempa wrote:
Monitor is now JSON only. Drop the old cruft.
In theory, you should still be able to get a domain with a text monitor via qemu-attach.
In practice, attaching to such domains seems pointless - if we don't support starting them, touching their mointor might just break them.
I can leave the part of the macro that checks whether the monitor is JSON still in. That way it will at least report sane errors.
Sounds good to me. Even with that change: Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
Maybe we should drop qemu-attach as well?
I hope so, but it should be probably done separately.

qemu did not QAPIfy these and the design and name will most probably change. The replacements will not be compatible. Drop the JSON stubs and annotate that there won't be a replacement. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor.c | 18 ++++++------------ src/qemu/qemu_monitor_json.c | 21 --------------------- src/qemu/qemu_monitor_json.h | 4 ---- 3 files changed, 6 insertions(+), 37 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 9d665928d6..e07d578fa8 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3213,10 +3213,8 @@ qemuMonitorCreateSnapshot(qemuMonitorPtr mon, const char *name) QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONCreateSnapshot(mon, name); - else - return qemuMonitorTextCreateSnapshot(mon, name); + /* there won't ever be a direct QMP replacement for this function */ + return qemuMonitorTextCreateSnapshot(mon, name); } int @@ -3226,10 +3224,8 @@ qemuMonitorLoadSnapshot(qemuMonitorPtr mon, const char *name) QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONLoadSnapshot(mon, name); - else - return qemuMonitorTextLoadSnapshot(mon, name); + /* there won't ever be a direct QMP replacement for this function */ + return qemuMonitorTextLoadSnapshot(mon, name); } @@ -3240,10 +3236,8 @@ qemuMonitorDeleteSnapshot(qemuMonitorPtr mon, const char *name) QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONDeleteSnapshot(mon, name); - else - return qemuMonitorTextDeleteSnapshot(mon, name); + /* there won't ever be a direct QMP replacement for this function */ + return qemuMonitorTextDeleteSnapshot(mon, name); } diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 7ddecbc907..42afa6201f 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -4062,27 +4062,6 @@ int qemuMonitorJSONSetDrivePassphrase(qemuMonitorPtr mon, return ret; } -int qemuMonitorJSONCreateSnapshot(qemuMonitorPtr mon, const char *name) -{ - /* XXX Update to use QMP, if QMP ever adds support for savevm */ - VIR_DEBUG("savevm command not found, trying HMP"); - return qemuMonitorTextCreateSnapshot(mon, name); -} - -int qemuMonitorJSONLoadSnapshot(qemuMonitorPtr mon, const char *name) -{ - /* XXX Update to use QMP, if QMP ever adds support for loadvm */ - VIR_DEBUG("loadvm command not found, trying HMP"); - return qemuMonitorTextLoadSnapshot(mon, name); -} - -int qemuMonitorJSONDeleteSnapshot(qemuMonitorPtr mon, const char *name) -{ - /* XXX Update to use QMP, if QMP ever adds support for delvm */ - VIR_DEBUG("delvm command not found, trying HMP"); - return qemuMonitorTextDeleteSnapshot(mon, name); -} - int qemuMonitorJSONDiskSnapshot(qemuMonitorPtr mon, virJSONValuePtr actions, const char *device, const char *file, diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 8461932cac..8a9c214c82 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -241,10 +241,6 @@ int qemuMonitorJSONSetDrivePassphrase(qemuMonitorPtr mon, const char *alias, const char *passphrase); -int qemuMonitorJSONCreateSnapshot(qemuMonitorPtr mon, const char *name); -int qemuMonitorJSONLoadSnapshot(qemuMonitorPtr mon, const char *name); -int qemuMonitorJSONDeleteSnapshot(qemuMonitorPtr mon, const char *name); - int qemuMonitorJSONDiskSnapshot(qemuMonitorPtr mon, virJSONValuePtr actions, const char *device, -- 2.16.2

s/loadv/loadvm/ On Tue, May 22, 2018 at 02:35:45PM +0200, Peter Krempa wrote:
qemu did not QAPIfy these and the design and name will most probably change. The replacements will not be compatible. Drop the JSON stubs and annotate that there won't be a replacement.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor.c | 18 ++++++------------ src/qemu/qemu_monitor_json.c | 21 --------------------- src/qemu/qemu_monitor_json.h | 4 ---- 3 files changed, 6 insertions(+), 37 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

No need to test the old stuff which will not be used any more. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tests/Makefile.am | 11 +-- tests/qemumonitortest.c | 203 ------------------------------------------------ 2 files changed, 2 insertions(+), 212 deletions(-) delete mode 100644 tests/qemumonitortest.c diff --git a/tests/Makefile.am b/tests/Makefile.am index ac92190845..1ce3dbb50f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -282,7 +282,7 @@ endif WITH_LIBXL if WITH_QEMU test_programs += qemuxml2argvtest qemuxml2xmltest \ qemuargv2xmltest domainsnapshotxml2xmltest \ - qemumonitortest qemumonitorjsontest qemuhotplugtest \ + qemumonitorjsontest qemuhotplugtest \ qemuagenttest qemucapabilitiestest qemucaps2xmltest \ qemumemlocktest \ qemucommandutiltest \ @@ -590,13 +590,6 @@ qemuargv2xmltest_SOURCES = \ testutils.c testutils.h qemuargv2xmltest_LDADD = $(qemu_LDADDS) $(LDADDS) -qemumonitortest_SOURCES = \ - qemumonitortest.c \ - testutils.c testutils.h \ - testutilsqemu.c testutilsqemu.h -qemumonitortest_LDADD = libqemumonitortestutils.la \ - $(qemu_LDADDS) $(LDADDS) - qemumonitorjsontest_SOURCES = \ qemumonitorjsontest.c \ testutils.c testutils.h \ @@ -691,7 +684,7 @@ qemumigparamstest_LDADD = libqemumonitortestutils.la \ else ! WITH_QEMU EXTRA_DIST += qemuxml2argvtest.c qemuxml2xmltest.c qemuargv2xmltest.c \ domainsnapshotxml2xmltest.c \ - qemumonitortest.c testutilsqemu.c testutilsqemu.h \ + testutilsqemu.c testutilsqemu.h \ testutilsqemuschema.c testutilsqemuschema.h \ qemumonitorjsontest.c qemuhotplugtest.c \ qemuagenttest.c qemucapabilitiestest.c \ diff --git a/tests/qemumonitortest.c b/tests/qemumonitortest.c deleted file mode 100644 index 0231ce083e..0000000000 --- a/tests/qemumonitortest.c +++ /dev/null @@ -1,203 +0,0 @@ -#include <config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "testutils.h" - -#ifdef WITH_QEMU - -# include "internal.h" -# include "viralloc.h" -# include "qemu/qemu_monitor.h" -# include "qemu/qemu_monitor_text.h" -# include "qemumonitortestutils.h" -# include "testutilsqemu.h" - -# define VIR_FROM_THIS VIR_FROM_NONE - -struct testEscapeString -{ - const char *unescaped; - const char *escaped; -}; - -static struct testEscapeString escapeStrings[] = { - { "", "" }, - { " ", " " }, - { "\\", "\\\\" }, - { "\n", "\\n" }, - { "\r", "\\r" }, - { "\"", "\\\"" }, - { "\"\"\"\\\\\n\r\\\\\n\r\"\"\"", "\\\"\\\"\\\"\\\\\\\\\\n\\r\\\\\\\\\\n\\r\\\"\\\"\\\"" }, - { "drive_add dummy file=foo\\", "drive_add dummy file=foo\\\\" }, - { "block info", "block info" }, - { "set_password \":\\\"\"", "set_password \\\":\\\\\\\"\\\"" }, -}; - -static int testEscapeArg(const void *data ATTRIBUTE_UNUSED) -{ - size_t i; - char *escaped = NULL; - for (i = 0; i < ARRAY_CARDINALITY(escapeStrings); ++i) { - escaped = qemuMonitorEscapeArg(escapeStrings[i].unescaped); - if (!escaped) { - VIR_TEST_DEBUG("\nUnescaped string [%s]\n", - escapeStrings[i].unescaped); - VIR_TEST_DEBUG("Expect result [%s]\n", - escapeStrings[i].escaped); - VIR_TEST_DEBUG("Actual result [(null)]\n"); - return -1; - } - if (STRNEQ(escapeStrings[i].escaped, escaped)) { - virTestDifference(stderr, escapeStrings[i].escaped, escaped); - VIR_FREE(escaped); - return -1; - } - VIR_FREE(escaped); - } - - return 0; -} - -static int testUnescapeArg(const void *data ATTRIBUTE_UNUSED) -{ - size_t i; - char *unescaped = NULL; - for (i = 0; i < ARRAY_CARDINALITY(escapeStrings); ++i) { - unescaped = qemuMonitorUnescapeArg(escapeStrings[i].escaped); - if (!unescaped) { - VIR_TEST_DEBUG("\nEscaped string [%s]\n", - escapeStrings[i].escaped); - VIR_TEST_DEBUG("Expect result [%s]\n", - escapeStrings[i].unescaped); - VIR_TEST_DEBUG("Actual result [(null)]\n"); - return -1; - } - if (STRNEQ(escapeStrings[i].unescaped, unescaped)) { - virTestDifference(stderr, escapeStrings[i].unescaped, unescaped); - VIR_FREE(unescaped); - return -1; - } - VIR_FREE(unescaped); - } - - return 0; -} - -struct blockInfoData { - const char *dev; - qemuBlockStats data; -}; - -static const struct blockInfoData testBlockInfoData[] = -{ -/* NAME, rd_req, rd_bytes, wr_req, wr_bytes, rd_total_time, wr_total_time, - * flush_req, flush_total_time, capacity, physical, wr_highest_offset, - * wr_highest_offset_valid*/ - {"vda", {11, 12, 13, 14, 15, 16, 17, 18, 0, 0, 0, false}}, - {"vdb", {21, 22, 23, 24, 25, 26, 27, 28, 0, 0, 0, false}}, - {"vdc", {31, 32, 33, -1, 35, 36, 37, 38, 0, 0, 0, false}}, - {"vdd", {-1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, false}}, - {"vde", {41, 42, 43, 44, 45, 46, 47, 48, 0, 0, 0, false}} -}; - -static const char testBlockInfoReply[] = -"(qemu) info blockstats\r\n" -"vda: rd_operations=11 rd_bytes=12 wr_operations=13 wr_bytes=14 rd_total_time_ns=15 wr_total_time_ns=16 flush_operations=17 flush_total_time_ns=18\n" -"vdb: rd_total_time_ns=25 wr_total_time_ns=26 flush_operations=27 flush_total_time_ns=28 rd_operations=21 rd_bytes=22 wr_operations=23 wr_bytes=24 \n" -"drive-vdc: rd_operations=31 rd_bytes=32 wr_operations=33 rd_total_time_ns=35 wr_total_time_ns=36 flush_operations=37 flush_total_time_ns=38\n" -"vdd: \n" -"vde: rd_operations=41 rd_bytes=42 wr_operations=43 wr_bytes=44 rd_total_time_ns=45 wr_total_time_ns=46 flush_operations=47 flush_total_time_ns=48\n" -"(qemu) "; - -static int -testMonitorTextBlockInfo(const void *opaque) -{ - virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr) opaque; - qemuMonitorTestPtr test = qemuMonitorTestNewSimple(false, xmlopt); - virHashTablePtr blockstats = NULL; - size_t i; - int ret = -1; - - if (!test) - return -1; - - if (!(blockstats = virHashCreate(10, virHashValueFree))) - goto cleanup; - - if (qemuMonitorTestAddItem(test, "info", testBlockInfoReply) < 0) - goto cleanup; - - if (qemuMonitorTextGetAllBlockStatsInfo(qemuMonitorTestGetMonitor(test), - blockstats) < 0) - goto cleanup; - - for (i = 0; i < ARRAY_CARDINALITY(testBlockInfoData); i++) { - qemuBlockStatsPtr entry; - - if (!(entry = virHashLookup(blockstats, testBlockInfoData[i].dev))) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "device '%s' was not found in text block stats reply", - testBlockInfoData[i].dev); - goto cleanup; - } - - if (memcmp(entry, &testBlockInfoData[i].data, sizeof(qemuBlockStats)) != 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "block stats for device '%s' differ", - testBlockInfoData[i].dev); - goto cleanup; - } - } - - ret = 0; - - cleanup: - qemuMonitorTestFree(test); - virHashFree(blockstats); - return ret; -} - - -static int -mymain(void) -{ - virQEMUDriver driver; - int result = 0; - - if (virThreadInitialize() < 0 || - qemuTestDriverInit(&driver) < 0) - return EXIT_FAILURE; - - virEventRegisterDefaultImpl(); - -# define DO_TEST(_name) \ - do { \ - if (virTestRun("qemu monitor "#_name, test##_name, \ - driver.xmlopt) < 0) { \ - result = -1; \ - } \ - } while (0) - - DO_TEST(EscapeArg); - DO_TEST(UnescapeArg); - DO_TEST(MonitorTextBlockInfo); - - qemuTestDriverFree(&driver); - - return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE; -} - -VIR_TEST_MAIN(mymain) - -#else - -int main(void) -{ - return EXIT_AM_SKIP; -} - -#endif /* WITH_QEMU */ -- 2.16.2

On Tue, May 22, 2018 at 02:35:46PM +0200, Peter Krempa wrote:
No need to test the old stuff which will not be used any more.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tests/Makefile.am | 11 +-- tests/qemumonitortest.c | 203 ------------------------------------------------ 2 files changed, 2 insertions(+), 212 deletions(-) delete mode 100644 tests/qemumonitortest.c
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Drop all conditional calls which have JSON variants, now that we guarantee JSON monitor. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor.c | 297 +++++++++++------------------------------------- 1 file changed, 69 insertions(+), 228 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index e07d578fa8..ac1fbddb91 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -430,15 +430,9 @@ qemuMonitorIOProcess(qemuMonitorPtr mon) PROBE_QUIET(QEMU_MONITOR_IO_PROCESS, "mon=%p buf=%s len=%zu", mon, mon->buffer, mon->bufferOffset); - if (mon->json) - len = qemuMonitorJSONIOProcess(mon, - mon->buffer, mon->bufferOffset, - msg); - else - len = qemuMonitorTextIOProcess(mon, - mon->buffer, mon->bufferOffset, - msg); - + len = qemuMonitorJSONIOProcess(mon, + mon->buffer, mon->bufferOffset, + msg); if (len < 0) return -1; @@ -1264,19 +1258,15 @@ qemuMonitorHMPCommandWithFd(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) { - /* hack to avoid complicating each call to text monitor functions */ - json_cmd = qemuMonitorUnescapeArg(cmd); - if (!json_cmd) { - VIR_DEBUG("Could not unescape command: %s", cmd); - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Unable to unescape command")); - goto cleanup; - } - ret = qemuMonitorJSONHumanCommandWithFd(mon, json_cmd, scm_fd, reply); - } else { - ret = qemuMonitorTextCommandWithFd(mon, cmd, scm_fd, reply); + /* hack to avoid complicating each call to text monitor functions */ + json_cmd = qemuMonitorUnescapeArg(cmd); + if (!json_cmd) { + VIR_DEBUG("Could not unescape command: %s", cmd); + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Unable to unescape command")); + goto cleanup; } + ret = qemuMonitorJSONHumanCommandWithFd(mon, json_cmd, scm_fd, reply); cleanup: VIR_FREE(json_cmd); @@ -1683,10 +1673,7 @@ qemuMonitorStartCPUs(qemuMonitorPtr mon) { QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONStartCPUs(mon); - else - return qemuMonitorTextStartCPUs(mon); + return qemuMonitorJSONStartCPUs(mon); } @@ -1695,10 +1682,7 @@ qemuMonitorStopCPUs(qemuMonitorPtr mon) { QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONStopCPUs(mon); - else - return qemuMonitorTextStopCPUs(mon); + return qemuMonitorJSONStopCPUs(mon); } @@ -1719,10 +1703,7 @@ qemuMonitorGetStatus(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONGetStatus(mon, running, reason); - else - return qemuMonitorTextGetStatus(mon, running, reason); + return qemuMonitorJSONGetStatus(mon, running, reason); } @@ -1731,10 +1712,7 @@ qemuMonitorSystemPowerdown(qemuMonitorPtr mon) { QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONSystemPowerdown(mon); - else - return qemuMonitorTextSystemPowerdown(mon); + return qemuMonitorJSONSystemPowerdown(mon); } @@ -1743,10 +1721,7 @@ qemuMonitorSystemReset(qemuMonitorPtr mon) { QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONSystemReset(mon); - else - return qemuMonitorTextSystemReset(mon); + return qemuMonitorJSONSystemReset(mon); } @@ -2011,11 +1986,8 @@ qemuMonitorGetCPUInfo(qemuMonitorPtr mon, (qemuMonitorJSONGetHotpluggableCPUs(mon, &hotplugcpus, &nhotplugcpus)) < 0) goto cleanup; - if (mon->json) - rc = qemuMonitorJSONQueryCPUs(mon, &cpuentries, &ncpuentries, hotplug, - fast); - else - rc = qemuMonitorTextQueryCPUs(mon, &cpuentries, &ncpuentries); + rc = qemuMonitorJSONQueryCPUs(mon, &cpuentries, &ncpuentries, hotplug, + fast); if (rc < 0) { if (!hotplug && rc == -2) { @@ -2066,11 +2038,8 @@ qemuMonitorGetCpuHalted(qemuMonitorPtr mon, QEMU_CHECK_MONITOR_NULL(mon); - if (mon->json) - rc = qemuMonitorJSONQueryCPUs(mon, &cpuentries, &ncpuentries, false, - fast); - else - rc = qemuMonitorTextQueryCPUs(mon, &cpuentries, &ncpuentries); + rc = qemuMonitorJSONQueryCPUs(mon, &cpuentries, &ncpuentries, false, + fast); if (rc < 0) goto cleanup; @@ -2098,10 +2067,7 @@ qemuMonitorSetLink(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONSetLink(mon, name, state); - else - return qemuMonitorTextSetLink(mon, name, state); + return qemuMonitorJSONSetLink(mon, name, state); } @@ -2111,10 +2077,7 @@ qemuMonitorGetVirtType(qemuMonitorPtr mon, { QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONGetVirtType(mon, virtType); - else - return qemuMonitorTextGetVirtType(mon, virtType); + return qemuMonitorJSONGetVirtType(mon, virtType); } @@ -2128,10 +2091,7 @@ qemuMonitorGetBalloonInfo(qemuMonitorPtr mon, { QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONGetBalloonInfo(mon, currmem); - else - return qemuMonitorTextGetBalloonInfo(mon, currmem); + return qemuMonitorJSONGetBalloonInfo(mon, currmem); } @@ -2145,13 +2105,9 @@ qemuMonitorGetMemoryStats(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) { - qemuMonitorInitBalloonObjectPath(mon, balloon); - return qemuMonitorJSONGetMemoryStats(mon, mon->balloonpath, - stats, nr_stats); - } else { - return qemuMonitorTextGetMemoryStats(mon, stats, nr_stats); - } + qemuMonitorInitBalloonObjectPath(mon, balloon); + return qemuMonitorJSONGetMemoryStats(mon, mon->balloonpath, + stats, nr_stats); } @@ -2245,10 +2201,7 @@ qemuMonitorGetBlockInfo(qemuMonitorPtr mon) if (!(table = virHashCreate(32, qemuDomainDiskInfoFree))) return NULL; - if (mon->json) - ret = qemuMonitorJSONGetBlockInfo(mon, table); - else - ret = qemuMonitorTextGetBlockInfo(mon, table); + ret = qemuMonitorJSONGetBlockInfo(mon, table); if (ret < 0) { virHashFree(table); @@ -2299,19 +2252,8 @@ qemuMonitorGetAllBlockStatsInfo(qemuMonitorPtr mon, if (!(*ret_stats = virHashCreate(10, virHashValueFree))) goto error; - if (mon->json) { - ret = qemuMonitorJSONGetAllBlockStatsInfo(mon, *ret_stats, - backingChain); - } else { - if (backingChain) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", - _("text monitor doesn't support block stats for " - "backing chain members")); - goto error; - } - - ret = qemuMonitorTextGetAllBlockStatsInfo(mon, *ret_stats); - } + ret = qemuMonitorJSONGetAllBlockStatsInfo(mon, *ret_stats, + backingChain); if (ret < 0) goto error; @@ -2348,10 +2290,7 @@ qemuMonitorBlockResize(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONBlockResize(mon, device, size); - else - return qemuMonitorTextBlockResize(mon, device, size); + return qemuMonitorJSONBlockResize(mon, device, size); } @@ -2366,10 +2305,7 @@ qemuMonitorSetVNCPassword(qemuMonitorPtr mon, if (!password) password = ""; - if (mon->json) - return qemuMonitorJSONSetVNCPassword(mon, password); - else - return qemuMonitorTextSetVNCPassword(mon, password); + return qemuMonitorJSONSetVNCPassword(mon, password); } @@ -2413,10 +2349,7 @@ qemuMonitorSetPassword(qemuMonitorPtr mon, if (!action_if_connected) action_if_connected = "keep"; - if (mon->json) - return qemuMonitorJSONSetPassword(mon, protocol, password, action_if_connected); - else - return qemuMonitorTextSetPassword(mon, protocol, password, action_if_connected); + return qemuMonitorJSONSetPassword(mon, protocol, password, action_if_connected); } @@ -2437,10 +2370,7 @@ qemuMonitorExpirePassword(qemuMonitorPtr mon, if (!expire_time) expire_time = "now"; - if (mon->json) - return qemuMonitorJSONExpirePassword(mon, protocol, expire_time); - else - return qemuMonitorTextExpirePassword(mon, protocol, expire_time); + return qemuMonitorJSONExpirePassword(mon, protocol, expire_time); } @@ -2456,10 +2386,7 @@ qemuMonitorSetBalloon(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONSetBalloon(mon, newmem); - else - return qemuMonitorTextSetBalloon(mon, newmem); + return qemuMonitorJSONSetBalloon(mon, newmem); } @@ -2473,10 +2400,7 @@ qemuMonitorSetCPU(qemuMonitorPtr mon, int cpu, bool online) QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONSetCPU(mon, cpu, online); - else - return qemuMonitorTextSetCPU(mon, cpu, online); + return qemuMonitorJSONSetCPU(mon, cpu, online); } @@ -2489,10 +2413,7 @@ qemuMonitorEjectMedia(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONEjectMedia(mon, dev_name, force); - else - return qemuMonitorTextEjectMedia(mon, dev_name, force); + return qemuMonitorJSONEjectMedia(mon, dev_name, force); } @@ -2506,10 +2427,7 @@ qemuMonitorChangeMedia(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONChangeMedia(mon, dev_name, newmedia, format); - else - return qemuMonitorTextChangeMedia(mon, dev_name, newmedia, format); + return qemuMonitorJSONChangeMedia(mon, dev_name, newmedia, format); } @@ -2523,10 +2441,7 @@ qemuMonitorSaveVirtualMemory(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONSaveVirtualMemory(mon, offset, length, path); - else - return qemuMonitorTextSaveVirtualMemory(mon, offset, length, path); + return qemuMonitorJSONSaveVirtualMemory(mon, offset, length, path); } @@ -2540,10 +2455,7 @@ qemuMonitorSavePhysicalMemory(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONSavePhysicalMemory(mon, offset, length, path); - else - return qemuMonitorTextSavePhysicalMemory(mon, offset, length, path); + return qemuMonitorJSONSavePhysicalMemory(mon, offset, length, path); } @@ -2562,10 +2474,7 @@ qemuMonitorSetMigrationSpeed(qemuMonitorPtr mon, return -1; } - if (mon->json) - return qemuMonitorJSONSetMigrationSpeed(mon, bandwidth); - else - return qemuMonitorTextSetMigrationSpeed(mon, bandwidth); + return qemuMonitorJSONSetMigrationSpeed(mon, bandwidth); } @@ -2577,10 +2486,7 @@ qemuMonitorSetMigrationDowntime(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONSetMigrationDowntime(mon, downtime); - else - return qemuMonitorTextSetMigrationDowntime(mon, downtime); + return qemuMonitorJSONSetMigrationDowntime(mon, downtime); } @@ -2663,10 +2569,7 @@ qemuMonitorGetMigrationStats(qemuMonitorPtr mon, if (error) *error = NULL; - if (mon->json) - return qemuMonitorJSONGetMigrationStats(mon, stats, error); - else - return qemuMonitorTextGetMigrationStats(mon, stats); + return qemuMonitorJSONGetMigrationStats(mon, stats, error); } @@ -2683,10 +2586,7 @@ qemuMonitorMigrateToFd(qemuMonitorPtr mon, if (qemuMonitorSendFileHandle(mon, "migrate", fd) < 0) return -1; - if (mon->json) - ret = qemuMonitorJSONMigrate(mon, flags, "fd:migrate"); - else - ret = qemuMonitorTextMigrate(mon, flags, "fd:migrate"); + ret = qemuMonitorJSONMigrate(mon, flags, "fd:migrate"); if (ret < 0) { if (qemuMonitorCloseFileHandle(mon, "migrate") < 0) @@ -2717,10 +2617,7 @@ qemuMonitorMigrateToHost(qemuMonitorPtr mon, return -1; } - if (mon->json) - ret = qemuMonitorJSONMigrate(mon, flags, uri); - else - ret = qemuMonitorTextMigrate(mon, flags, uri); + ret = qemuMonitorJSONMigrate(mon, flags, uri); VIR_FREE(uri); return ret; @@ -2732,10 +2629,7 @@ qemuMonitorMigrateCancel(qemuMonitorPtr mon) { QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONMigrateCancel(mon); - else - return qemuMonitorTextMigrateCancel(mon); + return qemuMonitorJSONMigrateCancel(mon); } @@ -2806,20 +2700,12 @@ qemuMonitorGraphicsRelocate(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONGraphicsRelocate(mon, - type, - hostname, - port, - tlsPort, - tlsSubject); - else - return qemuMonitorTextGraphicsRelocate(mon, - type, - hostname, - port, - tlsPort, - tlsSubject); + return qemuMonitorJSONGraphicsRelocate(mon, + type, + hostname, + port, + tlsPort, + tlsSubject); } @@ -2845,10 +2731,7 @@ qemuMonitorSendFileHandle(qemuMonitorPtr mon, return -1; } - if (mon->json) - return qemuMonitorJSONSendFileHandle(mon, fdname, fd); - else - return qemuMonitorTextSendFileHandle(mon, fdname, fd); + return qemuMonitorJSONSendFileHandle(mon, fdname, fd); } @@ -2865,10 +2748,7 @@ qemuMonitorCloseFileHandle(qemuMonitorPtr mon, QEMU_CHECK_MONITOR_GOTO(mon, cleanup); - if (mon->json) - ret = qemuMonitorJSONCloseFileHandle(mon, fdname); - else - ret = qemuMonitorTextCloseFileHandle(mon, fdname); + ret = qemuMonitorJSONCloseFileHandle(mon, fdname); cleanup: if (error) { @@ -2957,10 +2837,7 @@ qemuMonitorAddNetdev(qemuMonitorPtr mon, goto cleanup; } - if (mon->json) - ret = qemuMonitorJSONAddNetdev(mon, netdevstr); - else - ret = qemuMonitorTextAddNetdev(mon, netdevstr); + ret = qemuMonitorJSONAddNetdev(mon, netdevstr); cleanup: if (ret < 0) { @@ -2986,10 +2863,7 @@ qemuMonitorRemoveNetdev(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONRemoveNetdev(mon, alias); - else - return qemuMonitorTextRemoveNetdev(mon, alias); + return qemuMonitorJSONRemoveNetdev(mon, alias); } @@ -3030,10 +2904,7 @@ qemuMonitorGetChardevInfo(qemuMonitorPtr mon, if (!(info = virHashCreate(10, qemuMonitorChardevInfoFree))) goto error; - if (mon->json) - ret = qemuMonitorJSONGetChardevInfo(mon, info); - else - ret = qemuMonitorTextGetChardevInfo(mon, info); + ret = qemuMonitorJSONGetChardevInfo(mon, info); if (ret < 0) goto error; @@ -3076,10 +2947,7 @@ qemuMonitorDelDevice(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONDelDevice(mon, devalias); - else - return qemuMonitorTextDelDevice(mon, devalias); + return qemuMonitorJSONDelDevice(mon, devalias); } @@ -3097,10 +2965,7 @@ qemuMonitorAddDeviceWithFd(qemuMonitorPtr mon, if (fd >= 0 && qemuMonitorSendFileHandle(mon, fdname, fd) < 0) return -1; - if (mon->json) - ret = qemuMonitorJSONAddDevice(mon, devicestr); - else - ret = qemuMonitorTextAddDevice(mon, devicestr); + ret = qemuMonitorJSONAddDevice(mon, devicestr); if (ret < 0 && fd >= 0) { if (qemuMonitorCloseFileHandle(mon, fdname) < 0) @@ -3199,10 +3064,7 @@ qemuMonitorSetDrivePassphrase(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONSetDrivePassphrase(mon, alias, passphrase); - else - return qemuMonitorTextSetDrivePassphrase(mon, alias, passphrase); + return qemuMonitorJSONSetDrivePassphrase(mon, alias, passphrase); } @@ -3355,10 +3217,7 @@ qemuMonitorArbitraryCommand(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONArbitraryCommand(mon, cmd, reply, hmp); - else - return qemuMonitorTextArbitraryCommand(mon, cmd, reply); + return qemuMonitorJSONArbitraryCommand(mon, cmd, reply, hmp); } @@ -3367,10 +3226,7 @@ qemuMonitorInjectNMI(qemuMonitorPtr mon) { QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONInjectNMI(mon); - else - return qemuMonitorTextInjectNMI(mon); + return qemuMonitorJSONInjectNMI(mon); } @@ -3384,10 +3240,7 @@ qemuMonitorSendKey(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONSendKey(mon, holdtime, keycodes, nkeycodes); - else - return qemuMonitorTextSendKey(mon, holdtime, keycodes, nkeycodes); + return qemuMonitorJSONSendKey(mon, holdtime, keycodes, nkeycodes); } @@ -3401,10 +3254,7 @@ qemuMonitorScreendump(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONScreendump(mon, device, head, file); - else - return qemuMonitorTextScreendump(mon, file); + return qemuMonitorJSONScreendump(mon, device, head, file); } @@ -3499,13 +3349,10 @@ qemuMonitorSetBlockIoThrottle(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONSetBlockIoThrottle(mon, device, info, - supportMaxOptions, - supportGroupNameOption, - supportMaxLengthOptions); - else - return qemuMonitorTextSetBlockIoThrottle(mon, device, info); + return qemuMonitorJSONSetBlockIoThrottle(mon, device, info, + supportMaxOptions, + supportGroupNameOption, + supportMaxLengthOptions); } @@ -3518,10 +3365,7 @@ qemuMonitorGetBlockIoThrottle(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) - return qemuMonitorJSONGetBlockIoThrottle(mon, device, reply); - else - return qemuMonitorTextGetBlockIoThrottle(mon, device, reply); + return qemuMonitorJSONGetBlockIoThrottle(mon, device, reply); } @@ -3596,10 +3440,7 @@ qemuMonitorOpenGraphics(qemuMonitorPtr mon, if (qemuMonitorSendFileHandle(mon, fdname, fd) < 0) return -1; - if (mon->json) - ret = qemuMonitorJSONOpenGraphics(mon, protocol, fdname, skipauth); - else - ret = qemuMonitorTextOpenGraphics(mon, protocol, fdname, skipauth); + ret = qemuMonitorJSONOpenGraphics(mon, protocol, fdname, skipauth); if (ret < 0) { if (qemuMonitorCloseFileHandle(mon, fdname) < 0) -- 2.16.2

On Tue, May 22, 2018 at 02:35:47PM +0200, Peter Krempa wrote:
Drop all conditional calls which have JSON variants, now that we guarantee JSON monitor.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor.c | 297 +++++++++++------------------------------------- 1 file changed, 69 insertions(+), 228 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Remove all unused functions and cleanup headers. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor_text.c | 2112 ------------------------------------------ src/qemu/qemu_monitor_text.h | 143 --- 2 files changed, 2255 deletions(-) diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index 58d695ea22..90a58cd86b 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -23,1127 +23,18 @@ #include <config.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <poll.h> -#include <unistd.h> #include <string.h> #include "qemu_monitor_text.h" -#include "qemu_alias.h" -#include "c-ctype.h" -#include "c-strcasestr.h" #include "viralloc.h" #include "virlog.h" -#include "driver.h" -#include "datatypes.h" #include "virerror.h" -#include "virbuffer.h" -#include "virprobe.h" #include "virstring.h" -#ifdef WITH_DTRACE_PROBES -# include "libvirt_qemu_probes.h" -#endif - #define VIR_FROM_THIS VIR_FROM_QEMU VIR_LOG_INIT("qemu.qemu_monitor_text"); -#define DEBUG_IO 0 - -/* Return -1 for error, 0 for success */ -typedef int qemuMonitorExtraPromptHandler(qemuMonitorPtr mon, - const char *buf, - const char *prompt, - void *data); - - -/* When connecting to a monitor, QEMU will print a greeting like - * - * QEMU 0.11.0 monitor - type 'help' for more information - * - * Don't expect the version number bit to be stable :-) - */ -#define GREETING_PREFIX "QEMU " -#define GREETING_POSTFIX "type 'help' for more information\r\n(qemu) " -#define BASIC_PROMPT "(qemu) " -#define PASSWORD_PROMPT "Password:" -#define DISK_ENCRYPTION_PREFIX "(" -#define DISK_ENCRYPTION_POSTFIX ") is encrypted." -#define LINE_ENDING "\r\n" - -int qemuMonitorTextIOProcess(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - const char *data, - size_t len ATTRIBUTE_UNUSED, - qemuMonitorMessagePtr msg) -{ - int used = 0; - - /* Check for & discard greeting */ - if (STRPREFIX(data, GREETING_PREFIX)) { - const char *offset = strstr(data, GREETING_POSTFIX); - - /* We see the greeting prefix, but not postfix, so pretend we've - not consumed anything. We'll restart when more data arrives. */ - if (!offset) { -#if DEBUG_IO - VIR_DEBUG("Partial greeting seen, getting out & waiting for more"); -#endif - return 0; - } - - used = offset - data + strlen(GREETING_POSTFIX); - -#if DEBUG_IO - VIR_DEBUG("Discarded monitor greeting"); -#endif - } - - /* Don't print raw data in debug because its full of control chars */ - /*VIR_DEBUG("Process data %d byts of data [%s]", len - used, data + used);*/ -#if DEBUG_IO - VIR_DEBUG("Process data %d byts of data", (int)(len - used)); -#endif - - /* Look for a non-zero reply followed by prompt */ - if (msg && !msg->finished) { - char *start = NULL; - char *end = NULL; - char *skip; - - /* If we're here, we've already sent the command. We now - * strip the trailing '\r' because it makes the matching - * code that follows a little easier ie we can just strstr() - * for the original command - */ - if (msg->txLength > 0) { - char *tmp; - if ((tmp = strchr(msg->txBuffer, '\r'))) - *tmp = '\0'; - } - - /* QEMU echos the command back to us, full of control - * character junk that we don't want. We have to skip - * over this junk by looking for the first complete - * repetition of our command. Then we can look for - * the prompt that is supposed to follow - * - * NB, we can't optimize by immediately looking for - * LINE_ENDING, because QEMU 0.10 has bad problems - * when initially connecting where it might write a - * prompt in the wrong place. So we must not look - * for LINE_ENDING, or BASIC_PROMPT until we've - * seen our original command echod. - */ - skip = strstr(data + used, msg->txBuffer); - - /* After the junk we should have a line ending... */ - if (skip) - start = strstr(skip + strlen(msg->txBuffer), LINE_ENDING); - - /* ... then our command reply data, following by a (qemu) prompt */ - if (start) { - char *passwd; - start += strlen(LINE_ENDING); - - /* We might get a prompt for a password before the (qemu) prompt */ - passwd = strstr(start, PASSWORD_PROMPT); - if (passwd) { -#if DEBUG_IO - VIR_DEBUG("Seen a password prompt [%s]", data + used); -#endif - if (msg->passwordHandler) { - size_t i; - /* Try and handle the prompt. The handler is required - * to report a normal libvirt error */ - if (msg->passwordHandler(mon, msg, - start, - passwd - start + strlen(PASSWORD_PROMPT), - msg->passwordOpaque) < 0) - return -1; - - /* Blank out the password prompt so we don't re-trigger - * if we have to go back to sleep for more I/O */ - for (i = 0; i < strlen(PASSWORD_PROMPT); i++) - start[i] = ' '; - - /* Handled, so skip forward over password prompt */ - start = passwd; - } else { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Password request seen, but no handler available")); - return -1; - } - } - - end = strstr(start, BASIC_PROMPT); - } - - if (start && end) { - int want = end - start; - /* Annoyingly some commands may not have any reply data - * at all upon success, but since we've detected the - * BASIC_PROMPT we can reasonably reliably cope */ - if (want) { - if (VIR_REALLOC_N(msg->rxBuffer, - msg->rxLength + want + 1) < 0) - return -1; - memcpy(msg->rxBuffer + msg->rxLength, start, want); - msg->rxLength += want; - msg->rxBuffer[msg->rxLength] = '\0'; -#if DEBUG_IO - VIR_DEBUG("Finished %d byte reply [%s]", want, msg->rxBuffer); - } else { - VIR_DEBUG("Finished 0 byte reply"); -#endif - } - PROBE(QEMU_MONITOR_RECV_REPLY, - "mon=%p reply=%s", - mon, msg->rxBuffer); - msg->finished = 1; - used += end - (data + used); - used += strlen(BASIC_PROMPT); - } - } - -#if DEBUG_IO - VIR_DEBUG("Total used %d", used); -#endif - return used; -} - -static int -qemuMonitorTextCommandWithHandler(qemuMonitorPtr mon, - const char *cmd, - qemuMonitorPasswordHandler passwordHandler, - void *passwordOpaque, - int scm_fd, - char **reply) -{ - int ret; - qemuMonitorMessage msg; - - *reply = NULL; - - memset(&msg, 0, sizeof(msg)); - - if (virAsprintf(&msg.txBuffer, "%s\r", cmd) < 0) - return -1; - msg.txLength = strlen(msg.txBuffer); - msg.txFD = scm_fd; - msg.passwordHandler = passwordHandler; - msg.passwordOpaque = passwordOpaque; - - VIR_DEBUG("Send command '%s' for write with FD %d", cmd, scm_fd); - - ret = qemuMonitorSend(mon, &msg); - - VIR_DEBUG("Receive command reply ret=%d rxLength=%d rxBuffer='%s'", - ret, msg.rxLength, msg.rxBuffer); - - /* Just in case buffer had some passwords in */ - memset(msg.txBuffer, 0, msg.txLength); - VIR_FREE(msg.txBuffer); - - if (ret >= 0) { - /* To make life safer for callers, already ensure there's at least an empty string */ - if (msg.rxBuffer) { - *reply = msg.rxBuffer; - } else { - if (VIR_STRDUP(*reply, "") < 0) - return -1; - } - } - - return ret; -} - -int -qemuMonitorTextCommandWithFd(qemuMonitorPtr mon, - const char *cmd, - int scm_fd, - char **reply) -{ - return qemuMonitorTextCommandWithHandler(mon, cmd, NULL, NULL, - scm_fd, reply); -} - -/* Check monitor output for evidence that the command was not recognized. - * For 'info' commands, qemu returns help text. For other commands, qemu - * returns 'unknown command:'. - */ -static int -qemuMonitorTextCommandNotFound(const char *cmd, const char *reply) -{ - if (STRPREFIX(cmd, "info ")) { - if (strstr(reply, "info version")) - return 1; - } else { - if (strstr(reply, "unknown command:")) - return 1; - } - - return 0; -} - -static int -qemuMonitorSendDiskPassphrase(qemuMonitorPtr mon, - qemuMonitorMessagePtr msg, - const char *data, - size_t len ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) -{ - char *path; - char *passphrase = NULL; - size_t passphrase_len = 0; - int res; - const char *pathStart; - const char *pathEnd; - - /* - * For disk passwords: - * - * ide0-hd0 (/path/to/volume) is encrypted. - * Password: - * - */ - pathStart = strstr(data, DISK_ENCRYPTION_PREFIX); - pathEnd = strstr(data, DISK_ENCRYPTION_POSTFIX); - if (!pathStart || !pathEnd || pathStart >= pathEnd) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unable to extract disk path from %s"), - data); - return -1; - } - - /* Extra the path */ - pathStart += strlen(DISK_ENCRYPTION_PREFIX); - if (VIR_STRNDUP(path, pathStart, pathEnd - pathStart) < 0) - return -1; - - /* Fetch the disk password if possible */ - res = qemuMonitorGetDiskSecret(mon, - path, - &passphrase, - &passphrase_len); - VIR_FREE(path); - if (res < 0) - return -1; - - /* Enlarge transmit buffer to allow for the extra data - * to be sent back */ - if (VIR_REALLOC_N(msg->txBuffer, - msg->txLength + passphrase_len + 1 + 1) < 0) { - memset(passphrase, 0, passphrase_len); - VIR_FREE(passphrase); - return -1; - } - - /* Queue the password for sending */ - memcpy(msg->txBuffer + msg->txLength, - passphrase, passphrase_len); - msg->txLength += passphrase_len; - msg->txBuffer[msg->txLength] = '\r'; - msg->txLength++; - msg->txBuffer[msg->txLength] = '\0'; - - memset(passphrase, 0, passphrase_len); - VIR_FREE(passphrase); - - return 0; -} - -int -qemuMonitorTextStartCPUs(qemuMonitorPtr mon) -{ - char *reply; - - if (qemuMonitorTextCommandWithHandler(mon, "cont", - qemuMonitorSendDiskPassphrase, - NULL, - -1, &reply) < 0) - return -1; - - VIR_FREE(reply); - return 0; -} - - -int -qemuMonitorTextStopCPUs(qemuMonitorPtr mon) -{ - char *info; - int ret; - - ret = qemuMonitorHMPCommand(mon, "stop", &info); - VIR_FREE(info); - return ret; -} - - -int -qemuMonitorTextGetStatus(qemuMonitorPtr mon, - bool *running, - virDomainPausedReason *reason) -{ - char *reply; - int ret = -1; - - if (reason) - *reason = VIR_DOMAIN_PAUSED_UNKNOWN; - - if (qemuMonitorHMPCommand(mon, "info status", &reply) < 0) - return -1; - - if (strstr(reply, "running")) { - *running = true; - } else if (strstr(reply, "paused")) { - char *status; - - if ((status = strchr(reply, '('))) { - char *end = strchr(status, ')'); - if (end) - *end = '\0'; - else - status = NULL; - } - if (!status) - VIR_DEBUG("info status was missing status details"); - else if (reason) - *reason = qemuMonitorVMStatusToPausedReason(status); - *running = false; - } else { - virReportError(VIR_ERR_OPERATION_FAILED, - _("unexpected reply from info status: %s"), reply); - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(reply); - return ret; -} - - -int qemuMonitorTextSystemPowerdown(qemuMonitorPtr mon) -{ - char *info; - int ret; - - ret = qemuMonitorHMPCommand(mon, "system_powerdown", &info); - - VIR_FREE(info); - return ret; -} - -int -qemuMonitorTextSetLink(qemuMonitorPtr mon, - const char *name, - virDomainNetInterfaceLinkState state) -{ - char *info = NULL; - char *cmd = NULL; - const char *st_str = NULL; - - /* determine state */ - if (state == VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DOWN) - st_str = "off"; - else - st_str = "on"; - - if (virAsprintf(&cmd, "set_link %s %s", name, st_str) < 0) - goto error; - if (qemuMonitorHMPCommand(mon, cmd, &info) < 0) - goto error; - - /* check if set_link command is supported */ - if (strstr(info, "\nunknown ")) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, - "%s", - _("\'set_link\' not supported by this qemu")); - goto error; - } - - /* check if qemu didn't reject device name */ - if (strstr(info, "\nDevice ")) { - virReportError(VIR_ERR_OPERATION_FAILED, - "%s", _("device name rejected")); - goto error; - } - - VIR_FREE(info); - VIR_FREE(cmd); - return 0; - - error: - VIR_FREE(info); - VIR_FREE(cmd); - - return -1; -} - -int qemuMonitorTextSystemReset(qemuMonitorPtr mon) -{ - char *info; - int ret; - - ret = qemuMonitorHMPCommand(mon, "system_reset", &info); - - VIR_FREE(info); - return ret; -} - - -int -qemuMonitorTextQueryCPUs(qemuMonitorPtr mon, - struct qemuMonitorQueryCpusEntry **entries, - size_t *nentries) -{ - char *qemucpus = NULL; - char *line; - struct qemuMonitorQueryCpusEntry *cpus = NULL; - size_t ncpus = 0; - struct qemuMonitorQueryCpusEntry cpu = {0}; - int ret = -2; /* -2 denotes a non-fatal error to get the data */ - - if (qemuMonitorHMPCommand(mon, "info cpus", &qemucpus) < 0) - return -1; - - /* - * This is the gross format we're about to parse :-{ - * - * (qemu) info cpus - * * CPU #0: pc=0x00000000000f0c4a thread_id=30019 - * CPU #1: pc=0x00000000fffffff0 thread_id=30020 - * CPU #2: pc=0x00000000fffffff0 (halted) thread_id=30021 - * - */ - line = qemucpus; - do { - char *offset = NULL; - char *end = NULL; - int cpuid = -1; - int tid = 0; - - /* extract cpu number */ - if ((offset = strstr(line, "#")) == NULL) - goto cleanup; - - if (virStrToLong_i(offset + strlen("#"), &end, 10, &cpuid) < 0) - goto cleanup; - if (end == NULL || *end != ':') - goto cleanup; - - /* Extract host Thread ID */ - if ((offset = strstr(line, "thread_id=")) == NULL) - goto cleanup; - - if (virStrToLong_i(offset + strlen("thread_id="), &end, 10, &tid) < 0) - goto cleanup; - if (end == NULL || !c_isspace(*end)) - goto cleanup; - - cpu.qemu_id = cpuid; - cpu.tid = tid; - - if (VIR_APPEND_ELEMENT_COPY(cpus, ncpus, cpu) < 0) { - ret = -1; - goto cleanup; - } - - VIR_DEBUG("tid=%d", tid); - - /* Skip to next data line */ - line = strchr(offset, '\r'); - if (line == NULL) - line = strchr(offset, '\n'); - } while (line != NULL); - - VIR_STEAL_PTR(*entries, cpus); - *nentries = ncpus; - ret = 0; - - cleanup: - qemuMonitorQueryCpusFree(cpus, ncpus); - VIR_FREE(qemucpus); - return ret; -} - - -int qemuMonitorTextGetVirtType(qemuMonitorPtr mon, - virDomainVirtType *virtType) -{ - char *reply = NULL; - - *virtType = VIR_DOMAIN_VIRT_QEMU; - - if (qemuMonitorHMPCommand(mon, "info kvm", &reply) < 0) - return -1; - - if (strstr(reply, "enabled")) - *virtType = VIR_DOMAIN_VIRT_KVM; - - VIR_FREE(reply); - return 0; -} - - -static int parseMemoryStat(char **text, unsigned int tag, - const char *search, virDomainMemoryStatPtr mstat) -{ - char *dummy; - unsigned long long value; - - if (STRPREFIX(*text, search)) { - *text += strlen(search); - if (virStrToLong_ull(*text, &dummy, 10, &value)) { - VIR_DEBUG("error reading %s: %s", search, *text); - return 0; - } - - switch (tag) { - /* Convert megabytes to kilobytes for libvirt */ - case VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON: - value <<= 10; - break; - /* Convert bytes to kilobytes for libvirt */ - case VIR_DOMAIN_MEMORY_STAT_SWAP_IN: - case VIR_DOMAIN_MEMORY_STAT_SWAP_OUT: - case VIR_DOMAIN_MEMORY_STAT_UNUSED: - case VIR_DOMAIN_MEMORY_STAT_AVAILABLE: - value >>= 10; - } - mstat->tag = tag; - mstat->val = value; - return 1; - } - return 0; -} - -/* The reply from the 'info balloon' command may contain additional memory - * statistics in the form: 'actual=<val> [,<tag>=<val>]*' - */ -static int qemuMonitorParseBalloonInfo(char *text, - virDomainMemoryStatPtr stats, - unsigned int nr_stats) -{ - char *p = text; - unsigned int nr_stats_found = 0; - - /* Since "actual=" always comes first in the returned string, - * and sometime we only care about the value of "actual", such - * as qemuMonitorGetBalloonInfo, we parse it outside of the - * loop. - */ - if (parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON, - "actual=", &stats[nr_stats_found]) == 1) { - nr_stats_found++; - } - - while (*p && nr_stats_found < nr_stats) { - if (parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_SWAP_IN, - ",mem_swapped_in=", &stats[nr_stats_found]) || - parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_SWAP_OUT, - ",mem_swapped_out=", &stats[nr_stats_found]) || - parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_MAJOR_FAULT, - ",major_page_faults=", &stats[nr_stats_found]) || - parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_MINOR_FAULT, - ",minor_page_faults=", &stats[nr_stats_found]) || - parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_UNUSED, - ",free_mem=", &stats[nr_stats_found]) || - parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_AVAILABLE, - ",total_mem=", &stats[nr_stats_found])) - nr_stats_found++; - - /* Skip to the next label. When *p is ',' the last match attempt - * failed so try to match the next ','. - */ - if (*p == ',') - p++; - p = strchr(p, ','); - if (!p) break; - } - return nr_stats_found; -} - - -/* The reply from QEMU contains 'ballon: actual=421' where value is in MB */ -#define BALLOON_PREFIX "balloon: " - -int -qemuMonitorTextGetBalloonInfo(qemuMonitorPtr mon, - unsigned long long *currmem) -{ - char *reply = NULL; - int ret = -1; - char *offset; - - if (qemuMonitorHMPCommand(mon, "info balloon", &reply) < 0) - return -1; - - if ((offset = strstr(reply, BALLOON_PREFIX)) != NULL) { - offset += strlen(BALLOON_PREFIX); - virDomainMemoryStatStruct stats[1]; - - if (qemuMonitorParseBalloonInfo(offset, stats, 1) == 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected balloon information '%s'"), reply); - goto cleanup; - } - - if (stats[0].tag != VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected balloon information '%s'"), reply); - goto cleanup; - } - - *currmem = stats[0].val; - ret = 1; - } else { - /* We don't raise an error here, since its to be expected that - * many QEMU's don't support ballooning - */ - ret = 0; - } - - cleanup: - VIR_FREE(reply); - return ret; -} - -int qemuMonitorTextGetMemoryStats(qemuMonitorPtr mon, - virDomainMemoryStatPtr stats, - unsigned int nr_stats) -{ - char *reply = NULL; - int ret = 0; - char *offset; - - if (qemuMonitorHMPCommand(mon, "info balloon", &reply) < 0) - return -1; - - if ((offset = strstr(reply, BALLOON_PREFIX)) != NULL) { - offset += strlen(BALLOON_PREFIX); - ret = qemuMonitorParseBalloonInfo(offset, stats, nr_stats); - } - - VIR_FREE(reply); - return ret; -} - - -int qemuMonitorTextGetBlockInfo(qemuMonitorPtr mon, - virHashTablePtr table) -{ - struct qemuDomainDiskInfo *info = NULL; - char *reply = NULL; - int ret = -1; - char *dummy; - char *p, *eol; - char *dev; - int tmp; - - if (qemuMonitorHMPCommand(mon, "info block", &reply) < 0) - goto cleanup; - - if (strstr(reply, "\ninfo ")) { - virReportError(VIR_ERR_OPERATION_INVALID, - "%s", - _("info block not supported by this qemu")); - goto cleanup; - } - - /* The output looks like this: - * drive-ide0-0-0: removable=0 file=<path> ro=0 drv=raw encrypted=0 - * drive-ide0-1-0: removable=1 locked=0 file=<path> ro=1 drv=raw encrypted=0 - */ - p = reply; - - while (*p) { - p = (char *)qemuAliasDiskDriveSkipPrefix(p); - - eol = strchr(p, '\n'); - if (!eol) - eol = p + strlen(p) - 1; - - dev = p; - p = strchr(p, ':'); - if (p && p < eol && *(p + 1) == ' ') { - if (VIR_ALLOC(info) < 0) - goto cleanup; - - *p = '\0'; - p += 2; - - while (p < eol) { - if (STRPREFIX(p, "removable=")) { - p += strlen("removable="); - if (virStrToLong_i(p, &dummy, 10, &tmp) == -1) - VIR_DEBUG("error reading removable: %s", p); - else - info->removable = (tmp != 0); - } else if (STRPREFIX(p, "locked=")) { - p += strlen("locked="); - if (virStrToLong_i(p, &dummy, 10, &tmp) == -1) - VIR_DEBUG("error reading locked: %s", p); - else - info->locked = (tmp != 0); - } else if (STRPREFIX(p, "tray-open=")) { - p += strlen("tray-open="); - if (virStrToLong_i(p, &dummy, 10, &tmp) == -1) - VIR_DEBUG("error reading tray-open: %s", p); - else - info->tray_open = (tmp != 0); - } else if (STRPREFIX(p, "io-status=")) { - char *end; - char c; - - p += strlen("io-status="); - end = strchr(p, ' '); - if (!end || end > eol) - end = eol; - - c = *end; - *end = '\0'; - info->io_status = qemuMonitorBlockIOStatusToError(p); - *end = c; - if (info->io_status < 0) - goto cleanup; - } else { - /* ignore because we don't parse all options */ - } - - /* skip to next label */ - p = strchr(p, ' '); - if (!p) - break; - p++; - } - - if (virHashAddEntry(table, dev, info) < 0) - goto cleanup; - else - info = NULL; - } - - /* skip to the next line */ - p = eol + 1; - } - - ret = 0; - - cleanup: - VIR_FREE(info); - VIR_FREE(reply); - return ret; -} - - -int -qemuMonitorTextGetAllBlockStatsInfo(qemuMonitorPtr mon, - virHashTablePtr hash) -{ - qemuBlockStatsPtr stats = NULL; - char *info = NULL; - const char *dev_name; - char **lines = NULL; - char **values = NULL; - char *line; - char *value; - char *key; - size_t i; - size_t j; - int ret = -1; - int nstats; - int maxstats = 0; - - if (qemuMonitorHMPCommand(mon, "info blockstats", &info) < 0) - goto cleanup; - - /* If the command isn't supported then qemu prints the supported info - * commands, so the output starts "info ". Since this is unlikely to be - * the name of a block device, we can use this to detect if qemu supports - * the command. */ - if (strstr(info, "\ninfo ")) { - virReportError(VIR_ERR_OPERATION_INVALID, "%s", - _("'info blockstats' not supported by this qemu")); - goto cleanup; - } - - /* The output format for both qemu & KVM is: - * blockdevice: rd_bytes=% wr_bytes=% rd_operations=% wr_operations=% - * (repeated for each block device) - * where '%' is a 64 bit number. - */ - if (!(lines = virStringSplit(info, "\n", 0))) - goto cleanup; - - for (i = 0; lines[i] && *lines[i]; i++) { - line = lines[i]; - - if (VIR_ALLOC(stats) < 0) - goto cleanup; - - /* set the entries to -1, the JSON monitor enforces them, but it would - * be overly complex to achieve this here */ - stats->rd_req = -1; - stats->rd_bytes = -1; - stats->wr_req = -1; - stats->wr_bytes = -1; - stats->rd_total_times = -1; - stats->wr_total_times = -1; - stats->flush_req = -1; - stats->flush_total_times = -1; - - /* extract device name and make sure that it's followed by - * a colon and space */ - dev_name = line; - if (!(line = strchr(line, ':')) || line[1] != ' ') { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("info blockstats reply was malformed")); - goto cleanup; - } - - *line = '\0'; - line += 2; - - dev_name = qemuAliasDiskDriveSkipPrefix(dev_name); - - if (!(values = virStringSplit(line, " ", 0))) - goto cleanup; - - nstats = 0; - - for (j = 0; values[j] && *values[j]; j++) { - key = values[j]; - - if (!(value = strchr(key, '='))) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("info blockstats entry was malformed")); - goto cleanup; - } - - *value = '\0'; - value++; - -#define QEMU_MONITOR_TEXT_READ_BLOCK_STAT(NAME, VAR) \ - if (STREQ(key, NAME)) { \ - nstats++; \ - if (virStrToLong_ll(value, NULL, 10, &VAR) < 0) { \ - virReportError(VIR_ERR_INTERNAL_ERROR, \ - _("'info blockstats' contains malformed " \ - "parameter '%s' value '%s'"), NAME, value);\ - goto cleanup; \ - } \ - continue; \ - } - - QEMU_MONITOR_TEXT_READ_BLOCK_STAT("rd_bytes", stats->rd_bytes); - QEMU_MONITOR_TEXT_READ_BLOCK_STAT("wr_bytes", stats->wr_bytes); - QEMU_MONITOR_TEXT_READ_BLOCK_STAT("rd_operations", stats->rd_req); - QEMU_MONITOR_TEXT_READ_BLOCK_STAT("wr_operations", stats->wr_req); - QEMU_MONITOR_TEXT_READ_BLOCK_STAT("rd_total_time_ns", stats->rd_total_times); - QEMU_MONITOR_TEXT_READ_BLOCK_STAT("wr_total_time_ns", stats->wr_total_times); - QEMU_MONITOR_TEXT_READ_BLOCK_STAT("flush_operations", stats->flush_req); - QEMU_MONITOR_TEXT_READ_BLOCK_STAT("flush_total_time_ns", stats->flush_total_times); -#undef QEMU_MONITOR_TEXT_READ_BLOCK_STAT - - /* log if we get statistic element different from the above */ - VIR_DEBUG("unknown block stat field '%s'", key); - } - - if (nstats > maxstats) - maxstats = nstats; - - if (virHashAddEntry(hash, dev_name, stats) < 0) - goto cleanup; - stats = NULL; - - virStringListFree(values); - values = NULL; - } - - ret = maxstats; - - cleanup: - virStringListFree(lines); - virStringListFree(values); - VIR_FREE(stats); - VIR_FREE(info); - return ret; -} - -/* Return 0 on success, -1 on failure, or -2 if not supported. Size - * is in bytes. */ -int qemuMonitorTextBlockResize(qemuMonitorPtr mon, - const char *device, - unsigned long long size) -{ - char *cmd = NULL; - char *reply = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "block_resize %s %lluB", device, size) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - if (strstr(reply, "unknown command:")) { - ret = -2; - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(cmd); - VIR_FREE(reply); - return ret; -} - -static int -qemuMonitorSendVNCPassphrase(qemuMonitorPtr mon ATTRIBUTE_UNUSED, - qemuMonitorMessagePtr msg, - const char *data ATTRIBUTE_UNUSED, - size_t len ATTRIBUTE_UNUSED, - void *opaque) -{ - char *passphrase = opaque; - size_t passphrase_len = strlen(passphrase); - - /* Enlarge transmit buffer to allow for the extra data - * to be sent back */ - if (VIR_REALLOC_N(msg->txBuffer, - msg->txLength + passphrase_len + 1 + 1) < 0) - return -1; - - /* Queue the password for sending */ - memcpy(msg->txBuffer + msg->txLength, - passphrase, passphrase_len); - msg->txLength += passphrase_len; - msg->txBuffer[msg->txLength] = '\r'; - msg->txLength++; - msg->txBuffer[msg->txLength] = '\0'; - - return 0; -} - -int qemuMonitorTextSetVNCPassword(qemuMonitorPtr mon, - const char *password) -{ - char *info = NULL; - - if (qemuMonitorTextCommandWithHandler(mon, "change vnc password", - qemuMonitorSendVNCPassphrase, - (char *)password, - -1, &info) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("setting VNC password failed")); - return -1; - } - VIR_FREE(info); - return 0; -} - -/* Returns -1 on error, -2 if not supported */ -int qemuMonitorTextSetPassword(qemuMonitorPtr mon, - const char *protocol, - const char *password, - const char *action_if_connected) -{ - char *cmd = NULL; - char *reply = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "set_password %s \"%s\" %s", - protocol, password, action_if_connected) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - if (strstr(reply, "unknown command:")) { - ret = -2; - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(reply); - VIR_FREE(cmd); - return ret; -} - -/* Returns -1 on error, -2 if not supported */ -int qemuMonitorTextExpirePassword(qemuMonitorPtr mon, - const char *protocol, - const char *expire_time) -{ - char *cmd = NULL; - char *reply = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "expire_password %s %s", - protocol, expire_time) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - if (strstr(reply, "unknown command:")) { - ret = -2; - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(reply); - VIR_FREE(cmd); - return ret; -} - - -int -qemuMonitorTextSetBalloon(qemuMonitorPtr mon, - unsigned long long newmem) -{ - char *cmd; - char *reply = NULL; - int ret = -1; - - /* - * 'newmem' is in KB, QEMU monitor works in MB, and we all wish - * we just worked in bytes with unsigned long long everywhere. - */ - if (virAsprintf(&cmd, "balloon %llu", VIR_DIV_UP(newmem, 1024)) < 0) - return -1; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) { - VIR_FREE(cmd); - return -1; - } - VIR_FREE(cmd); - - /* If the command failed qemu prints: 'unknown command' - * No message is printed on success it seems */ - if (strstr(reply, "unknown command:")) { - /* Don't set error - it is expected memory balloon fails on many qemu */ - ret = 0; - } else { - ret = 1; - } - - VIR_FREE(reply); - return ret; -} - - int qemuMonitorTextSetCPU(qemuMonitorPtr mon, int cpu, bool online) { char *cmd; @@ -1174,696 +65,6 @@ int qemuMonitorTextSetCPU(qemuMonitorPtr mon, int cpu, bool online) } -/** - * Run HMP command to eject a media from ejectable device. - * - * Returns: - * -1 on error - * 0 on success - */ -int qemuMonitorTextEjectMedia(qemuMonitorPtr mon, - const char *dev_name, - bool force) -{ - char *cmd = NULL; - char *reply = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "eject %s%s", force ? "-f " : "", dev_name) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - /* If the command failed qemu prints: - * device not found, device is locked ... - * No message is printed on success it seems */ - if (c_strcasestr(reply, "device ")) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("could not eject media on %s: %s"), dev_name, reply); - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(reply); - VIR_FREE(cmd); - return ret; -} - - -int qemuMonitorTextChangeMedia(qemuMonitorPtr mon, - const char *dev_name, - const char *newmedia, - const char *format ATTRIBUTE_UNUSED) -{ - char *cmd = NULL; - char *reply = NULL; - char *safepath = NULL; - int ret = -1; - - if (!(safepath = qemuMonitorEscapeArg(newmedia))) - goto cleanup; - - if (virAsprintf(&cmd, "change %s \"%s\"", dev_name, safepath) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - /* If the command failed qemu prints: - * device not found, device is locked ... - * No message is printed on success it seems */ - if (c_strcasestr(reply, "device ")) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("could not change media on %s: %s"), dev_name, reply); - goto cleanup; - } - - /* Could not open message indicates bad filename */ - if (strstr(reply, "Could not open ")) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("could not change media on %s: %s"), dev_name, reply); - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(reply); - VIR_FREE(cmd); - VIR_FREE(safepath); - return ret; -} - -static int qemuMonitorTextSaveMemory(qemuMonitorPtr mon, - const char *cmdtype, - unsigned long long offset, - size_t length, - const char *path) -{ - char *cmd = NULL; - char *reply = NULL; - char *safepath = NULL; - int ret = -1; - - if (!(safepath = qemuMonitorEscapeArg(path))) - goto cleanup; - - if (virAsprintf(&cmd, "%s %llu %zi \"%s\"", cmdtype, offset, length, safepath) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - /* XXX what is printed on failure ? */ - - ret = 0; - - cleanup: - VIR_FREE(cmd); - VIR_FREE(reply); - VIR_FREE(safepath); - return ret; -} - - -int qemuMonitorTextSaveVirtualMemory(qemuMonitorPtr mon, - unsigned long long offset, - size_t length, - const char *path) -{ - return qemuMonitorTextSaveMemory(mon, "memsave", offset, length, path); -} - -int qemuMonitorTextSavePhysicalMemory(qemuMonitorPtr mon, - unsigned long long offset, - size_t length, - const char *path) -{ - return qemuMonitorTextSaveMemory(mon, "pmemsave", offset, length, path); -} - - -int qemuMonitorTextSetMigrationSpeed(qemuMonitorPtr mon, - unsigned long bandwidth) -{ - char *cmd = NULL; - char *info = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "migrate_set_speed %lum", bandwidth) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &info) < 0) - goto cleanup; - - ret = 0; - - cleanup: - VIR_FREE(info); - VIR_FREE(cmd); - return ret; -} - - -int qemuMonitorTextSetMigrationDowntime(qemuMonitorPtr mon, - unsigned long long downtime) -{ - char *cmd = NULL; - char *info = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "migrate_set_downtime %llums", downtime) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &info) < 0) - goto cleanup; - - ret = 0; - - cleanup: - VIR_FREE(info); - VIR_FREE(cmd); - return ret; -} - - -#define MIGRATION_PREFIX "Migration status: " -#define MIGRATION_TRANSFER_PREFIX "transferred ram: " -#define MIGRATION_REMAINING_PREFIX "remaining ram: " -#define MIGRATION_TOTAL_PREFIX "total ram: " -#define MIGRATION_DISK_TRANSFER_PREFIX "transferred disk: " -#define MIGRATION_DISK_REMAINING_PREFIX "remaining disk: " -#define MIGRATION_DISK_TOTAL_PREFIX "total disk: " - -int qemuMonitorTextGetMigrationStats(qemuMonitorPtr mon, - qemuMonitorMigrationStatsPtr stats) -{ - char *reply; - char *tmp; - char *end; - int ret = -1; - - memset(stats, 0, sizeof(*stats)); - - if (qemuMonitorHMPCommand(mon, "info migrate", &reply) < 0) - return -1; - - if ((tmp = strstr(reply, MIGRATION_PREFIX)) != NULL) { - tmp += strlen(MIGRATION_PREFIX); - end = strchr(tmp, '\r'); - if (end == NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected migration status in %s"), reply); - goto cleanup; - } - *end = '\0'; - - stats->status = qemuMonitorMigrationStatusTypeFromString(tmp); - if (stats->status < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected migration status in %s"), reply); - goto cleanup; - } - - if (stats->status == QEMU_MONITOR_MIGRATION_STATUS_ACTIVE) { - tmp = end + 1; - - if (!(tmp = strstr(tmp, MIGRATION_TRANSFER_PREFIX))) - goto done; - tmp += strlen(MIGRATION_TRANSFER_PREFIX); - - if (virStrToLong_ull(tmp, &end, 10, - &stats->ram_transferred) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse migration data transferred " - "statistic %s"), tmp); - goto cleanup; - } - stats->ram_transferred *= 1024; - tmp = end; - - if (!(tmp = strstr(tmp, MIGRATION_REMAINING_PREFIX))) - goto done; - tmp += strlen(MIGRATION_REMAINING_PREFIX); - - if (virStrToLong_ull(tmp, &end, 10, &stats->ram_remaining) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse migration data remaining " - "statistic %s"), tmp); - goto cleanup; - } - stats->ram_remaining *= 1024; - tmp = end; - - if (!(tmp = strstr(tmp, MIGRATION_TOTAL_PREFIX))) - goto done; - tmp += strlen(MIGRATION_TOTAL_PREFIX); - - if (virStrToLong_ull(tmp, &end, 10, &stats->ram_total) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse migration data total " - "statistic %s"), tmp); - goto cleanup; - } - stats->ram_total *= 1024; - tmp = end; - - /* - * Check for Optional Disk Migration stats - */ - if (!(tmp = strstr(tmp, MIGRATION_DISK_TRANSFER_PREFIX))) - goto done; - tmp += strlen(MIGRATION_DISK_TRANSFER_PREFIX); - - if (virStrToLong_ull(tmp, &end, 10, - &stats->disk_transferred) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse disk migration data " - "transferred statistic %s"), tmp); - goto cleanup; - } - stats->disk_transferred *= 1024; - tmp = end; - - if (!(tmp = strstr(tmp, MIGRATION_DISK_REMAINING_PREFIX))) - goto done; - tmp += strlen(MIGRATION_DISK_REMAINING_PREFIX); - - if (virStrToLong_ull(tmp, &end, 10, &stats->disk_remaining) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse disk migration data remaining " - "statistic %s"), tmp); - goto cleanup; - } - stats->disk_remaining *= 1024; - tmp = end; - - if (!(tmp = strstr(tmp, MIGRATION_DISK_TOTAL_PREFIX))) - goto done; - tmp += strlen(MIGRATION_DISK_TOTAL_PREFIX); - - if (virStrToLong_ull(tmp, &end, 10, &stats->disk_total) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse disk migration data total " - "statistic %s"), tmp); - goto cleanup; - } - stats->disk_total *= 1024; - } - } - - done: - ret = 0; - - cleanup: - VIR_FREE(reply); - if (ret < 0) - memset(stats, 0, sizeof(*stats)); - return ret; -} - - -int qemuMonitorTextMigrate(qemuMonitorPtr mon, - unsigned int flags, - const char *dest) -{ - char *cmd = NULL; - char *info = NULL; - int ret = -1; - char *safedest = qemuMonitorEscapeArg(dest); - virBuffer extra = VIR_BUFFER_INITIALIZER; - char *extrastr = NULL; - - if (!safedest) - return -1; - - if (flags & QEMU_MONITOR_MIGRATE_BACKGROUND) - virBufferAddLit(&extra, " -d"); - if (flags & QEMU_MONITOR_MIGRATE_NON_SHARED_DISK) - virBufferAddLit(&extra, " -b"); - if (flags & QEMU_MONITOR_MIGRATE_NON_SHARED_INC) - virBufferAddLit(&extra, " -i"); - if (virBufferCheckError(&extra) < 0) - goto cleanup; - - extrastr = virBufferContentAndReset(&extra); - if (virAsprintf(&cmd, "migrate %s\"%s\"", extrastr ? extrastr : "", - safedest) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &info) < 0) - goto cleanup; - - /* Now check for "fail" in the output string */ - if (strstr(info, "fail") != NULL) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("migration to '%s' failed: %s"), dest, info); - goto cleanup; - } - /* If the command isn't supported then qemu prints: - * unknown command: migrate" */ - if (strstr(info, "unknown command:")) { - virReportError(VIR_ERR_OPERATION_INVALID, - _("migration to '%s' not supported by this qemu: %s"), dest, info); - goto cleanup; - } - - - ret = 0; - - cleanup: - VIR_FREE(extrastr); - VIR_FREE(safedest); - VIR_FREE(info); - VIR_FREE(cmd); - return ret; -} - -int qemuMonitorTextMigrateCancel(qemuMonitorPtr mon) -{ - char *info = NULL; - int ret; - - ret = qemuMonitorHMPCommand(mon, "migrate_cancel", &info); - - VIR_FREE(info); - return ret; -} - - -int qemuMonitorTextGraphicsRelocate(qemuMonitorPtr mon, - int type, - const char *hostname, - int port, - int tlsPort, - const char *tlsSubject) -{ - char *cmd; - char *info = NULL; - - if (virAsprintf(&cmd, "client_migrate_info %s %s %d %d %s", - type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE ? "spice" : "vnc", - hostname, port, tlsPort, tlsSubject ? tlsSubject : "") < 0) - return -1; - - if (qemuMonitorHMPCommand(mon, cmd, &info) < 0) { - VIR_FREE(cmd); - return -1; - } - VIR_FREE(cmd); - VIR_FREE(info); - - return 0; -} - - -int qemuMonitorTextSendFileHandle(qemuMonitorPtr mon, - const char *fdname, - int fd) -{ - char *cmd; - char *reply = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "getfd %s", fdname) < 0) - return -1; - - if (qemuMonitorHMPCommandWithFd(mon, cmd, fd, &reply) < 0) - goto cleanup; - - /* If the command isn't supported then qemu prints: - * unknown command: getfd" */ - if (strstr(reply, "unknown command:")) { - virReportError(VIR_ERR_OPERATION_INVALID, - _("qemu does not support sending of file handles: %s"), - reply); - goto cleanup; - } - - if (STRNEQ(reply, "")) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unable to send file handle '%s': %s"), - fdname, reply); - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(cmd); - VIR_FREE(reply); - return ret; -} - - -int qemuMonitorTextCloseFileHandle(qemuMonitorPtr mon, - const char *fdname) -{ - char *cmd; - char *reply = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "closefd %s", fdname) < 0) - return -1; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - /* If the command isn't supported then qemu prints: - * unknown command: getfd" */ - if (strstr(reply, "unknown command:")) { - virReportError(VIR_ERR_OPERATION_INVALID, - _("qemu does not support closing of file handles: %s"), - reply); - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(cmd); - VIR_FREE(reply); - return ret; -} - - -int qemuMonitorTextAddNetdev(qemuMonitorPtr mon, - const char *netdevstr) -{ - char *cmd; - char *reply = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "netdev_add %s", netdevstr) < 0) - return -1; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - /* XXX error messages here ? */ - - ret = 0; - - cleanup: - VIR_FREE(cmd); - VIR_FREE(reply); - return ret; -} - - -int qemuMonitorTextRemoveNetdev(qemuMonitorPtr mon, - const char *alias) -{ - char *cmd; - char *reply = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "netdev_del %s", alias) < 0) - return -1; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - /* XXX error messages here ? */ - - ret = 0; - - cleanup: - VIR_FREE(cmd); - VIR_FREE(reply); - return ret; -} - - -/* Parse the output of "info chardev" and return a hash of pty paths. - * - * Output is: - * foo: filename=pty:/dev/pts/7 - * monitor: filename=stdio - * serial0: filename=vc - * parallel0: filename=vc - * - * Non-pty lines are ignored. In the above example, key is 'foo', value is - * '/dev/pty/7'. The hash will contain only a single value. - */ - -int qemuMonitorTextGetChardevInfo(qemuMonitorPtr mon, - virHashTablePtr info) -{ - char *reply = NULL; - qemuMonitorChardevInfoPtr entry = NULL; - int ret = -1; - - if (qemuMonitorHMPCommand(mon, "info chardev", &reply) < 0) - return -1; - - char *pos; /* The current start of searching */ - char *next = reply; /* The start of the next line */ - char *eol; /* The character which ends the current line */ - char *end = reply + strlen(reply); /* The end of the reply string */ - - while (next) { - pos = next; - - /* Split the output into lines */ - eol = memchr(pos, '\n', end - pos); - if (eol == NULL) { - eol = end; - next = NULL; - } else { - next = eol + 1; - } - - /* Ignore all whitespace immediately before eol */ - while (eol > pos && c_isspace(*(eol-1))) - eol -= 1; - - /* Look for 'filename=pty:' */ -#define NEEDLE "filename=pty:" - char *needle = memmem(pos, eol - pos, NEEDLE, strlen(NEEDLE)); - - /* If it's not there we can ignore this line */ - if (!needle) - continue; - - /* id is everything from the beginning of the line to the ':' - * find ':' and turn it into a terminator */ - char *colon = memchr(pos, ':', needle - pos); - if (colon == NULL) - continue; - *colon = '\0'; - char *id = pos; - - /* Path is everything after needle to the end of the line */ - *eol = '\0'; - - if (VIR_ALLOC(entry) < 0) - goto cleanup; - - if (VIR_STRDUP(entry->ptyPath, needle + strlen(NEEDLE)) < 0) - goto cleanup; - - if (virHashAddEntry(info, id, entry) < 0) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("failed to save chardev path '%s'"), - entry->ptyPath); - VIR_FREE(entry->ptyPath); - goto cleanup; - } - - entry = NULL; -#undef NEEDLE - } - - ret = 0; - - cleanup: - VIR_FREE(reply); - VIR_FREE(entry); - return ret; -} - - -int qemuMonitorTextDelDevice(qemuMonitorPtr mon, - const char *devalias) -{ - char *cmd = NULL; - char *reply = NULL; - char *safedev; - int ret = -1; - - if (!(safedev = qemuMonitorEscapeArg(devalias))) - goto cleanup; - - if (virAsprintf(&cmd, "device_del %s", safedev) < 0) - goto cleanup; - - VIR_DEBUG("TextDelDevice devalias=%s", devalias); - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - if (STRNEQ(reply, "")) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("detaching %s device failed: %s"), devalias, reply); - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(cmd); - VIR_FREE(reply); - VIR_FREE(safedev); - return ret; -} - - -int qemuMonitorTextAddDevice(qemuMonitorPtr mon, - const char *devicestr) -{ - char *cmd = NULL; - char *reply = NULL; - char *safedev; - int ret = -1; - - if (!(safedev = qemuMonitorEscapeArg(devicestr))) - goto cleanup; - - if (virAsprintf(&cmd, "device_add %s", safedev) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - /* If the host device is hotpluged first time, qemu will output - * husb: using %s file-system with %s if the command succeeds. - */ - if (STRPREFIX(reply, "husb: using")) { - ret = 0; - goto cleanup; - } - - /* Otherwise, if the command succeeds, no output is sent. So - * any non-empty string shows an error */ - if (STRNEQ(reply, "")) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("adding %s device failed: %s"), devicestr, reply); - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(cmd); - VIR_FREE(reply); - VIR_FREE(safedev); - return ret; -} - - int qemuMonitorTextAddDrive(qemuMonitorPtr mon, const char *drivestr) { @@ -1965,45 +166,6 @@ int qemuMonitorTextDriveDel(qemuMonitorPtr mon, return ret; } -int qemuMonitorTextSetDrivePassphrase(qemuMonitorPtr mon, - const char *alias, - const char *passphrase) -{ - char *cmd = NULL; - char *reply = NULL; - int ret = -1; - char *safe_str; - - safe_str = qemuMonitorEscapeArg(passphrase); - if (!safe_str) - return -1; - - if (virAsprintf(&cmd, "block_passwd %s \"%s\"", alias, safe_str) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - if (strstr(reply, "unknown command:")) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("setting disk password is not supported")); - goto cleanup; - } else if (strstr(reply, "The entered password is invalid")) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("the disk password is incorrect")); - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(cmd); - VIR_FREE(reply); - VIR_FREE(safe_str); - return ret; -} - - int qemuMonitorTextCreateSnapshot(qemuMonitorPtr mon, const char *name) @@ -2124,277 +286,3 @@ int qemuMonitorTextDeleteSnapshot(qemuMonitorPtr mon, const char *name) VIR_FREE(reply); return ret; } - - -int qemuMonitorTextArbitraryCommand(qemuMonitorPtr mon, const char *cmd, - char **reply) -{ - char *safecmd = NULL; - int ret; - - if (!(safecmd = qemuMonitorEscapeArg(cmd))) - return -1; - - ret = qemuMonitorHMPCommand(mon, safecmd, reply); - - VIR_FREE(safecmd); - - return ret; -} - -int qemuMonitorTextInjectNMI(qemuMonitorPtr mon) -{ - char *reply = NULL; - - if (qemuMonitorHMPCommand(mon, "inject-nmi", &reply) < 0) - return -1; - - if (strstr(reply, "unknown command") != NULL) { - VIR_FREE(reply); - - /* fallback to 'nmi' if qemu has not supported "inject-nmi" yet. */ - if (qemuMonitorHMPCommand(mon, "nmi 0", &reply) < 0) - return -1; - } - - VIR_FREE(reply); - return 0; -} - -int qemuMonitorTextSendKey(qemuMonitorPtr mon, - unsigned int holdtime, - unsigned int *keycodes, - unsigned int nkeycodes) -{ - size_t i; - virBuffer buf = VIR_BUFFER_INITIALIZER; - char *cmd, *reply = NULL; - int ret = -1; - - if (nkeycodes > VIR_DOMAIN_SEND_KEY_MAX_KEYS || nkeycodes == 0) - return -1; - - virBufferAddLit(&buf, "sendkey "); - for (i = 0; i < nkeycodes; i++) { - if (keycodes[i] > 0xffff) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("keycode %zu is invalid: 0x%X"), - i, keycodes[i]); - virBufferFreeAndReset(&buf); - return -1; - } - - if (i) - virBufferAddChar(&buf, '-'); - virBufferAsprintf(&buf, "0x%02X", keycodes[i]); - } - - if (holdtime) - virBufferAsprintf(&buf, " %u", holdtime); - - if (virBufferCheckError(&buf) < 0) - return -1; - - cmd = virBufferContentAndReset(&buf); - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - if (STRNEQ(reply, "")) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("failed to send key '%s'"), reply); - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(cmd); - VIR_FREE(reply); - return ret; -} - -/* Returns -1 on error, -2 if not supported */ -int qemuMonitorTextScreendump(qemuMonitorPtr mon, const char *file) -{ - char *cmd = NULL; - char *reply = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "screendump %s", file) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - if (strstr(reply, "unknown command:")) { - ret = -2; - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(reply); - VIR_FREE(cmd); - return ret; -} - - -int qemuMonitorTextOpenGraphics(qemuMonitorPtr mon, - const char *protocol, - const char *fdname, - bool skipauth) -{ - char *cmd = NULL; - char *reply = NULL; - int ret = -1; - - if (virAsprintf(&cmd, "add_client %s %s %d", protocol, fdname, skipauth ? 0 : 1) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &reply) < 0) - goto cleanup; - - if (STRNEQ(reply, "")) - goto cleanup; - - ret = 0; - - cleanup: - VIR_FREE(reply); - VIR_FREE(cmd); - return ret; -} - - -int qemuMonitorTextSetBlockIoThrottle(qemuMonitorPtr mon, - const char *device, - virDomainBlockIoTuneInfoPtr info) -{ - char *cmd = NULL; - char *result = NULL; - int ret = -1; - const char *cmd_name = NULL; - - /* For the not specified fields, 0 by default */ - cmd_name = "block_set_io_throttle"; - if (virAsprintf(&cmd, "%s %s %llu %llu %llu %llu %llu %llu", cmd_name, - device, info->total_bytes_sec, info->read_bytes_sec, - info->write_bytes_sec, info->total_iops_sec, - info->read_iops_sec, info->write_iops_sec) < 0) - goto cleanup; - - if (qemuMonitorHMPCommand(mon, cmd, &result) < 0) - goto cleanup; - - if (qemuMonitorTextCommandNotFound(cmd_name, result)) { - virReportError(VIR_ERR_OPERATION_INVALID, - _("Command '%s' is not found"), cmd_name); - goto cleanup; - } - ret = 0; - - cleanup: - VIR_FREE(cmd); - VIR_FREE(result); - return ret; -} - -static int -qemuMonitorTextParseBlockIoThrottle(const char *result, - const char *device, - virDomainBlockIoTuneInfoPtr reply) -{ - char *dummy = NULL; - int ret = -1; - const char *p, *eol; - int devnamelen = strlen(device); - - p = result; - - while (*p) { - if (STREQLEN(p, device, devnamelen) && - p[devnamelen] == ':' && p[devnamelen+1] == ' ') { - - eol = strchr(p, '\n'); - if (!eol) - eol = p + strlen(p); - - p += devnamelen + 2; /* Skip to first label. */ - - while (*p) { - if (STRPREFIX(p, "bps=")) { - p += strlen("bps="); - if (virStrToLong_ull(p, &dummy, 10, &reply->total_bytes_sec) == -1) - VIR_DEBUG("error reading total_bytes_sec: %s", p); - } else if (STRPREFIX(p, "bps_rd=")) { - p += strlen("bps_rd="); - if (virStrToLong_ull(p, &dummy, 10, &reply->read_bytes_sec) == -1) - VIR_DEBUG("error reading read_bytes_sec: %s", p); - } else if (STRPREFIX(p, "bps_wr=")) { - p += strlen("bps_wr="); - if (virStrToLong_ull(p, &dummy, 10, &reply->write_bytes_sec) == -1) - VIR_DEBUG("error reading write_bytes_sec: %s", p); - } else if (STRPREFIX(p, "iops=")) { - p += strlen("iops="); - if (virStrToLong_ull(p, &dummy, 10, &reply->total_iops_sec) == -1) - VIR_DEBUG("error reading total_iops_sec: %s", p); - } else if (STRPREFIX(p, "iops_rd=")) { - p += strlen("iops_rd="); - if (virStrToLong_ull(p, &dummy, 10, &reply->read_iops_sec) == -1) - VIR_DEBUG("error reading read_iops_sec: %s", p); - } else if (STRPREFIX(p, "iops_wr=")) { - p += strlen("iops_wr="); - if (virStrToLong_ull(p, &dummy, 10, &reply->write_iops_sec) == -1) - VIR_DEBUG("error reading write_iops_sec: %s", p); - } else { - VIR_DEBUG(" unknown block info %s", p); - } - - /* Skip to next label. */ - p = strchr(p, ' '); - if (!p || p >= eol) - break; - p++; - } - ret = 0; - goto cleanup; - } - - /* Skip to next line. */ - p = strchr(p, '\n'); - if (!p) - break; - p++; - } - - virReportError(VIR_ERR_INVALID_ARG, - _("No info for device '%s'"), device); - - cleanup: - return ret; -} - -int qemuMonitorTextGetBlockIoThrottle(qemuMonitorPtr mon, - const char *device, - virDomainBlockIoTuneInfoPtr reply) -{ - char *result = NULL; - int ret = -1; - const char *cmd_name = "info block"; - - if (qemuMonitorHMPCommand(mon, cmd_name, &result) < 0) - goto cleanup; - - if (qemuMonitorTextCommandNotFound(cmd_name, result)) { - virReportError(VIR_ERR_OPERATION_INVALID, - _("Command '%s' is not found"), cmd_name); - goto cleanup; - } - - ret = qemuMonitorTextParseBlockIoThrottle(result, device, reply); - - cleanup: - VIR_FREE(result); - return ret; -} diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h index a9cdce5f61..5cb5dba441 100644 --- a/src/qemu/qemu_monitor_text.h +++ b/src/qemu/qemu_monitor_text.h @@ -29,159 +29,16 @@ # include "qemu_monitor.h" -int qemuMonitorTextIOProcess(qemuMonitorPtr mon, - const char *data, - size_t len, - qemuMonitorMessagePtr msg); - -int qemuMonitorTextCommandWithFd(qemuMonitorPtr mon, - const char *cmd, - int scm_fd, - char **reply); - -int qemuMonitorTextStartCPUs(qemuMonitorPtr mon); -int qemuMonitorTextStopCPUs(qemuMonitorPtr mon); -int qemuMonitorTextGetStatus(qemuMonitorPtr mon, - bool *running, - virDomainPausedReason *reason); - -int qemuMonitorTextSystemPowerdown(qemuMonitorPtr mon); -int qemuMonitorTextSystemReset(qemuMonitorPtr mon); - -int qemuMonitorTextQueryCPUs(qemuMonitorPtr mon, - struct qemuMonitorQueryCpusEntry **entries, - size_t *nentries); -int qemuMonitorTextGetVirtType(qemuMonitorPtr mon, - virDomainVirtType *virtType); -int qemuMonitorTextGetBalloonInfo(qemuMonitorPtr mon, - unsigned long long *currmem); -int qemuMonitorTextGetMemoryStats(qemuMonitorPtr mon, - virDomainMemoryStatPtr stats, - unsigned int nr_stats); -int qemuMonitorTextGetBlockInfo(qemuMonitorPtr mon, - virHashTablePtr table); - -int qemuMonitorTextGetAllBlockStatsInfo(qemuMonitorPtr mon, - virHashTablePtr hash); -int qemuMonitorTextBlockResize(qemuMonitorPtr mon, - const char *device, - unsigned long long size); -int qemuMonitorTextSetVNCPassword(qemuMonitorPtr mon, - const char *password); -int qemuMonitorTextSetPassword(qemuMonitorPtr mon, - const char *protocol, - const char *password, - const char *action_if_connected); -int qemuMonitorTextExpirePassword(qemuMonitorPtr mon, - const char *protocol, - const char *expire_time); -int qemuMonitorTextSetBalloon(qemuMonitorPtr mon, - unsigned long long newmem); int qemuMonitorTextSetCPU(qemuMonitorPtr mon, int cpu, bool online); -int qemuMonitorTextEjectMedia(qemuMonitorPtr mon, - const char *dev_name, - bool force); -int qemuMonitorTextChangeMedia(qemuMonitorPtr mon, - const char *dev_name, - const char *newmedia, - const char *format); - - -int qemuMonitorTextSaveVirtualMemory(qemuMonitorPtr mon, - unsigned long long offset, - size_t length, - const char *path); -int qemuMonitorTextSavePhysicalMemory(qemuMonitorPtr mon, - unsigned long long offset, - size_t length, - const char *path); - -int qemuMonitorTextSetMigrationSpeed(qemuMonitorPtr mon, - unsigned long bandwidth); - -int qemuMonitorTextSetMigrationDowntime(qemuMonitorPtr mon, - unsigned long long downtime); - -int qemuMonitorTextGetMigrationStats(qemuMonitorPtr mon, - qemuMonitorMigrationStatsPtr stats); - -int qemuMonitorTextMigrate(qemuMonitorPtr mon, - unsigned int flags, - const char *uri); - -int qemuMonitorTextMigrateCancel(qemuMonitorPtr mon); - -int qemuMonitorTextGraphicsRelocate(qemuMonitorPtr mon, - int type, - const char *hostname, - int port, - int tlsPort, - const char *tlsSubject); - -int qemuMonitorTextSendFileHandle(qemuMonitorPtr mon, - const char *fdname, - int fd); - -int qemuMonitorTextCloseFileHandle(qemuMonitorPtr mon, - const char *fdname); - -int qemuMonitorTextAddNetdev(qemuMonitorPtr mon, - const char *netdevstr); - -int qemuMonitorTextRemoveNetdev(qemuMonitorPtr mon, - const char *alias); - -int qemuMonitorTextGetChardevInfo(qemuMonitorPtr mon, - virHashTablePtr info); - -int qemuMonitorTextAddDevice(qemuMonitorPtr mon, - const char *devicestr); - -int qemuMonitorTextDelDevice(qemuMonitorPtr mon, - const char *devalias); - int qemuMonitorTextAddDrive(qemuMonitorPtr mon, const char *drivestr); int qemuMonitorTextDriveDel(qemuMonitorPtr mon, const char *drivestr); -int qemuMonitorTextSetDrivePassphrase(qemuMonitorPtr mon, - const char *alias, - const char *passphrase); - int qemuMonitorTextCreateSnapshot(qemuMonitorPtr mon, const char *name); int qemuMonitorTextLoadSnapshot(qemuMonitorPtr mon, const char *name); int qemuMonitorTextDeleteSnapshot(qemuMonitorPtr mon, const char *name); -int qemuMonitorTextArbitraryCommand(qemuMonitorPtr mon, const char *cmd, - char **reply); - -int qemuMonitorTextInjectNMI(qemuMonitorPtr mon); - -int qemuMonitorTextSendKey(qemuMonitorPtr mon, - unsigned int holdtime, - unsigned int *keycodes, - unsigned int nkeycodes); - -int qemuMonitorTextScreendump(qemuMonitorPtr mon, const char *file); - -int qemuMonitorTextSetLink(qemuMonitorPtr mon, - const char *name, - virDomainNetInterfaceLinkState state); - -int qemuMonitorTextOpenGraphics(qemuMonitorPtr mon, - const char *protocol, - const char *fdname, - bool skipauth); - -int qemuMonitorTextSetBlockIoThrottle(qemuMonitorPtr mon, - const char *device, - virDomainBlockIoTuneInfoPtr info); - -int qemuMonitorTextGetBlockIoThrottle(qemuMonitorPtr mon, - const char *device, - virDomainBlockIoTuneInfoPtr reply); - #endif /* QEMU_MONITOR_TEXT_H */ -- 2.16.2

On Tue, May 22, 2018 at 02:35:48PM +0200, Peter Krempa wrote:
Remove all unused functions and cleanup headers.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor_text.c | 2112 ------------------------------------------ src/qemu/qemu_monitor_text.h | 143 --- 2 files changed, 2255 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (2)
-
Ján Tomko
-
Peter Krempa