Add public API virDomainSendSysrq for sending SysRequest key.
Signed-off-by: Chunyan Liu <cyliu(a)suse.com>
---
include/libvirt/libvirt-domain.h | 3 +++
src/driver-hypervisor.h | 4 ++++
src/libvirt-domain.c | 38 ++++++++++++++++++++++++++++++++++++++
src/libvirt_public.syms | 1 +
4 files changed, 46 insertions(+)
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index ae2c49c..73ef6c8 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -3519,6 +3519,9 @@ int virDomainGetFSInfo(virDomainPtr dom,
virDomainFSInfoPtr **info,
unsigned int flags);
+/* virDomainSendSysrq */
+int virDomainSendSysrq(virDomainPtr dom, const char *key);
+
int virDomainGetTime(virDomainPtr dom,
long long *seconds,
unsigned int *nseconds,
diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
index 9f26b13..79558c3 100644
--- a/src/driver-hypervisor.h
+++ b/src/driver-hypervisor.h
@@ -1170,6 +1170,9 @@ typedef int
unsigned int cellCount,
unsigned int flags);
+typedef int
+(*virDrvDomainSendSysrq)(virDomainPtr dom, const char *key);
+
typedef struct _virHypervisorDriver virHypervisorDriver;
typedef virHypervisorDriver *virHypervisorDriverPtr;
@@ -1396,6 +1399,7 @@ struct _virHypervisorDriver {
virDrvConnectGetAllDomainStats connectGetAllDomainStats;
virDrvNodeAllocPages nodeAllocPages;
virDrvDomainGetFSInfo domainGetFSInfo;
+ virDrvDomainSendSysrq domainSendSysrq;
};
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index cb76d8c..4658fd7 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -11192,3 +11192,41 @@ virDomainFSInfoFree(virDomainFSInfoPtr info)
VIR_FREE(info->devAlias[i]);
VIR_FREE(info->devAlias);
}
+
+
+/**
+ * virDomainSendSysrq:
+ * @domain: pointer to domain object, or NULL for Domain0
+ * @key: SysRq key, like h, c, ...
+ *
+ * Send SysRq key to the guest.
+ *
+ * Returns 0 in case of success, -1 in case of failure.
+ */
+int
+virDomainSendSysrq(virDomainPtr domain, const char *key)
+{
+ virConnectPtr conn;
+ VIR_DOMAIN_DEBUG(domain, "key=%s", key);
+
+ virResetLastError();
+
+ virCheckDomainReturn(domain, -1);
+ conn = domain->conn;
+
+ virCheckReadOnlyGoto(conn->flags, error);
+
+ if (conn->driver->domainSendSysrq) {
+ int ret;
+ ret = conn->driver->domainSendSysrq(domain, key);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virReportUnsupportedError();
+
+ error:
+ virDispatchError(domain->conn);
+ return -1;
+}
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index e4c2df1..80d1dd2 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -688,6 +688,7 @@ LIBVIRT_1.2.11 {
global:
virDomainFSInfoFree;
virDomainGetFSInfo;
+ virDomainSendSysrq;
} LIBVIRT_1.2.9;
# .... define new API here using predicted next version number ....
--
1.8.4.5