When qmp protocol is available, the libvirt will use this protocol to communicates with qemu. And when we use "virsh qemu-monitor-command", we need: virsh qemu-monitor-command dom '{ "execute": "eject", \ "arguments": { "device": "ide1-cd0" } }'
But virsh is typical a human command line interface, it is not comfortable that a human user has to construct such commands. This patch makes human user can use virsh qemu-monitor-command dom 'eject ide1-cd0' in any time(qmp protocol is available or not). The result string is also converted to the same as non-qmp-protocol version. The user do not need to concern about the low level protocol now. Signed-off-by: Lai Jiangshan <la...@cn.fujitsu.com> --- diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 7877731..0f11a78 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2381,9 +2381,12 @@ int qemuMonitorJSONArbitraryCommand(qemuMonitorPtr mon, { virJSONValuePtr cmd = NULL; virJSONValuePtr reply = NULL; + char *p, *q; int ret = -1; - cmd = virJSONValueFromString(cmd_str); + cmd = qemuMonitorJSONMakeCommand("human-monitor-command", + "s:command-line", cmd_str, + NULL); if (!cmd) return -1; @@ -2394,6 +2397,37 @@ int qemuMonitorJSONArbitraryCommand(qemuMonitorPtr mon, if (!(*reply_str)) goto cleanup; + q = *reply_str; + + /* strip the head and tail */ + p= q + strlen("{\"return\":\""); + *(q + strlen(q) - strlen("\"}")) = 0; + + /* inplace copy and convert escapes */ + while (*p) { + if (*p == '\\') { + char c = 0; + + switch (*(p + 1)) { + case 'r': c = '\r'; break; + case 'n': c = '\n'; break; + case 't': c = '\t'; break; + case '\'': c = '\''; break; + case '\\': c = '\\'; break; + case '\"': c = '\"'; break; + default: break; + } + + if (c) { + p += 2; + *(q++) = c; + continue; + } + } + *(q++) = *(p++); + } + *q = 0; + ret = 0; cleanup: -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list