On 12/12/2014 04:04 AM, Chunyan Liu wrote:
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.
+ *
Try to be more descriptive here - having ellipses (...) in the
description is perhaps helpful if you know what the end result is.
Treat it like you don't know what it does. If it's going to be an enum,
then be sure the enum values are listed somewhere in the docs.
Based on the list of possible values - it's useful to list each one and
what each is expected to do on the target driver.
+ * 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;
If/when 'key' is changed to some int/enum value - does a
virCheckNonZeroArgGoto() on it make sense? Or any sort of range check?
John
+
+ 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 ....