From: Marc-André Lureau <marcandre.lureau(a)redhat.com>
---
src/qemu/qemu_monitor.c | 77 ++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_monitor.h | 7 ++++
src/qemu/qemu_monitor_json.c | 56 ++++++++++++++++++++++++++++++
src/qemu/qemu_monitor_json.h | 7 ++++
src/qemu/qemu_monitor_text.c | 69 +++++++++++++++++++++++++++++++++++++
src/qemu/qemu_monitor_text.h | 7 ++++
6 files changed, 223 insertions(+), 0 deletions(-)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 85d0d0f..4830e98 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -1097,6 +1097,83 @@ int qemuMonitorSetVNCPassword(qemuMonitorPtr mon,
return ret;
}
+static const char* qemuMonitorTypeToProtocol(int type)
+{
+ switch (type) {
+ case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
+ return "vnc";
+ case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
+ return "spice";
+ default:
+ qemuReportError(VIR_ERR_INVALID_ARG,
+ _("unsupported protocol type %s"),
+ virDomainGraphicsTypeToString(type));
+ return NULL;
+ }
+}
+
+/* Returns -2 if not supported with this monitor connection */
+int qemuMonitorSetPassword(qemuMonitorPtr mon,
+ int type,
+ const char *password,
+ const char *action_if_connected)
+{
+ const char *protocol = qemuMonitorTypeToProtocol(type);
+ int ret;
+
+ if (!protocol)
+ return -1;
+
+ DEBUG("mon=%p, protocol=%s, password=%p, action_if_connected=%s",
+ mon, protocol, password, action_if_connected);
+
+ if (!mon) {
+ qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("monitor must not be NULL"));
+ return -1;
+ }
+
+ if (!password)
+ password = "";
+
+ if (!action_if_connected)
+ action_if_connected = "keep";
+
+ if (mon->json)
+ ret = qemuMonitorJSONSetPassword(mon, protocol, password, action_if_connected);
+ else
+ ret = qemuMonitorTextSetPassword(mon, protocol, password, action_if_connected);
+ return ret;
+}
+
+int qemuMonitorExpirePassword(qemuMonitorPtr mon,
+ int type,
+ const char *expire_time)
+{
+ const char *protocol = qemuMonitorTypeToProtocol(type);
+ int ret;
+
+ if (!protocol)
+ return -1;
+
+ DEBUG("mon=%p, protocol=%s, expire_time=%s",
+ mon, protocol, expire_time);
+
+ if (!mon) {
+ qemuReportError(VIR_ERR_INVALID_ARG, "%s",
+ _("monitor must not be NULL"));
+ return -1;
+ }
+
+ if (!expire_time)
+ expire_time = "now";
+
+ if (mon->json)
+ ret = qemuMonitorJSONExpirePassword(mon, protocol, expire_time);
+ else
+ ret = qemuMonitorTextExpirePassword(mon, protocol, expire_time);
+ return ret;
+}
int qemuMonitorSetBalloon(qemuMonitorPtr mon,
unsigned long newmem)
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 41b3135..6b0320d 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -195,6 +195,13 @@ int qemuMonitorGetBlockExtent(qemuMonitorPtr mon,
int qemuMonitorSetVNCPassword(qemuMonitorPtr mon,
const char *password);
+int qemuMonitorSetPassword(qemuMonitorPtr mon,
+ int type,
+ const char *password,
+ const char *action_if_connected);
+int qemuMonitorExpirePassword(qemuMonitorPtr mon,
+ int type,
+ const char *expire_time);
int qemuMonitorSetBalloon(qemuMonitorPtr mon,
unsigned long newmem);
int qemuMonitorSetCPU(qemuMonitorPtr mon, int cpu, int online);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index ec6b720..ff7c0c2 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -1265,6 +1265,62 @@ int qemuMonitorJSONSetVNCPassword(qemuMonitorPtr mon,
return ret;
}
+/* Returns -1 on error, -2 if not supported */
+int qemuMonitorJSONSetPassword(qemuMonitorPtr mon,
+ const char *protocol,
+ const char *password,
+ const char *action_if_connected)
+{
+ int ret;
+ virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("set_password",
+ "s:protocol", protocol,
+ "s:password", password,
+ "s:connected",
action_if_connected,
+ NULL);
+ virJSONValuePtr reply = NULL;
+ if (!cmd)
+ return -1;
+
+ ret = qemuMonitorJSONCommand(mon, cmd, &reply);
+
+ if (ret == 0) {
+ if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
+ ret = -2;
+ goto cleanup;
+ }
+
+ ret = qemuMonitorJSONCheckError(cmd, reply);
+ }
+
+cleanup:
+ virJSONValueFree(cmd);
+ virJSONValueFree(reply);
+ return ret;
+}
+
+int qemuMonitorJSONExpirePassword(qemuMonitorPtr mon,
+ const char *protocol,
+ const char *expire_time)
+{
+ int ret;
+ virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("expire_password",
+ "s:protocol", protocol,
+ "s:time", expire_time,
+ NULL);
+ virJSONValuePtr reply = NULL;
+ if (!cmd)
+ return -1;
+
+ ret = qemuMonitorJSONCommand(mon, cmd, &reply);
+
+ if (ret == 0)
+ ret = qemuMonitorJSONCheckError(cmd, reply);
+
+ virJSONValueFree(cmd);
+ virJSONValueFree(reply);
+ return ret;
+}
+
/*
* Returns: 0 if balloon not supported, +1 if balloon adjust worked
* or -1 on failure
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index c78ee24..e4e1ec5 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -63,6 +63,13 @@ int qemuMonitorJSONGetBlockExtent(qemuMonitorPtr mon,
int qemuMonitorJSONSetVNCPassword(qemuMonitorPtr mon,
const char *password);
+int qemuMonitorJSONSetPassword(qemuMonitorPtr mon,
+ const char *protocol,
+ const char *password,
+ const char *action_if_connected);
+int qemuMonitorJSONExpirePassword(qemuMonitorPtr mon,
+ const char *protocol,
+ const char *expire_time);
int qemuMonitorJSONSetBalloon(qemuMonitorPtr mon,
unsigned long newmem);
int qemuMonitorJSONSetCPU(qemuMonitorPtr mon, int cpu, int online);
diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
index 64ec57b..5dcb443 100644
--- a/src/qemu/qemu_monitor_text.c
+++ b/src/qemu/qemu_monitor_text.c
@@ -768,6 +768,75 @@ int qemuMonitorTextSetVNCPassword(qemuMonitorPtr mon,
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) {
+ virReportOOMError();
+ goto cleanup;
+ }
+
+ if (qemuMonitorCommand(mon, cmd, &reply) < 0) {
+ qemuReportError(VIR_ERR_OPERATION_FAILED,
+ "%s", _("setting password failed"));
+ goto cleanup;
+ }
+
+ if (strstr(reply, "unknown command:")) {
+ ret = -2;
+ goto cleanup;
+ }
+
+ ret = 0;
+
+cleanup:
+ VIR_FREE(reply);
+ VIR_FREE(cmd);
+ return ret;
+}
+
+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) {
+ virReportOOMError();
+ goto cleanup;
+ }
+
+ if (qemuMonitorCommand(mon, cmd, &reply) < 0) {
+ qemuReportError(VIR_ERR_OPERATION_FAILED,
+ "%s", _("expiring password failed"));
+ goto cleanup;
+ }
+
+ if (strstr(reply, "unknown command:")) {
+ qemuReportError(VIR_ERR_NO_SUPPORT,
+ _("expiring password not supported by this qemu: %s"),
reply);
+ goto cleanup;
+ }
+
+ ret = 0;
+
+cleanup:
+ VIR_FREE(reply);
+ VIR_FREE(cmd);
+ return ret;
+}
+
/*
* Returns: 0 if balloon not supported, +1 if balloon adjust worked
* or -1 on failure
diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h
index 983f402..f4c863f 100644
--- a/src/qemu/qemu_monitor_text.h
+++ b/src/qemu/qemu_monitor_text.h
@@ -61,6 +61,13 @@ int qemuMonitorTextGetBlockExtent(qemuMonitorPtr mon,
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 newmem);
int qemuMonitorTextSetCPU(qemuMonitorPtr mon, int cpu, int online);
--
1.7.3.4