[libvirt] [PATCH 1/5] Introduce virConnectCrash

Michal Privoznik mprivozn at redhat.com
Fri Apr 1 07:08:06 UTC 2016


Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 cfg.mk                         |  2 ++
 include/libvirt/libvirt-host.h | 15 ++++++++++++++
 src/driver-hypervisor.h        |  7 +++++++
 src/libvirt-host.c             | 45 ++++++++++++++++++++++++++++++++++++++++++
 src/libvirt_public.syms        |  1 +
 5 files changed, 70 insertions(+)

diff --git a/cfg.mk b/cfg.mk
index 8e8586f..6ff97e3 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -1133,6 +1133,8 @@ _test1=shunloadtest|virnettlscontexttest|virnettlssessiontest|vircgroupmock
 exclude_file_name_regexp--sc_avoid_write = \
   ^(src/($(_src1))|daemon/libvirtd|tools/virsh-console|tests/($(_test1)))\.c$$
 
+exclude_file_name_regexp--sc_flags_debug = ^src/libvirt-host\.c$$
+
 exclude_file_name_regexp--sc_bindtextdomain = ^(tests|examples)/
 
 exclude_file_name_regexp--sc_copyright_usage = \
diff --git a/include/libvirt/libvirt-host.h b/include/libvirt/libvirt-host.h
index 8786fbb..80b27aa 100644
--- a/include/libvirt/libvirt-host.h
+++ b/include/libvirt/libvirt-host.h
@@ -872,5 +872,20 @@ int virNodeAllocPages(virConnectPtr conn,
                       unsigned int cellCount,
                       unsigned int flags);
 
+typedef enum {
+    VIR_CONNECT_CRASH_SERVER = 0,
+    VIR_CONNECT_CRASH_CLIENT,
+} virConnectCrashSide;
+
+typedef enum {
+    VIR_CONNECT_CRASH_WRITE_RO = 0,
+    VIR_CONNECT_CRASH_NULL_DEREF,
+    VIR_CONNECT_CRASH_STACK_OVERFLOW,
+} virConnectCrashMode;
+
+int virConnectCrash(virConnectPtr conn,
+                    int side,
+                    int mode,
+                    unsigned int flags);
 
 #endif /* __VIR_LIBVIRT_HOST_H__ */
diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
index d11ff7f..03e7689 100644
--- a/src/driver-hypervisor.h
+++ b/src/driver-hypervisor.h
@@ -1238,6 +1238,12 @@ typedef int
 (*virDrvConnectUnregisterCloseCallback)(virConnectPtr conn,
                                         virConnectCloseFunc cb);
 
+typedef int
+(*virDrvConnectCrash)(virConnectPtr conn,
+                      int side,
+                      int mode,
+                      unsigned int flags);
+
 typedef struct _virHypervisorDriver virHypervisorDriver;
 typedef virHypervisorDriver *virHypervisorDriverPtr;
 
@@ -1474,6 +1480,7 @@ struct _virHypervisorDriver {
     virDrvConnectRegisterCloseCallback connectRegisterCloseCallback;
     virDrvConnectUnregisterCloseCallback connectUnregisterCloseCallback;
     virDrvDomainMigrateStartPostCopy domainMigrateStartPostCopy;
+    virDrvConnectCrash connectCrash;
 };
 
 
diff --git a/src/libvirt-host.c b/src/libvirt-host.c
index 24277b7..c458087 100644
--- a/src/libvirt-host.c
+++ b/src/libvirt-host.c
@@ -1478,3 +1478,48 @@ virNodeAllocPages(virConnectPtr conn,
     virDispatchError(conn);
     return -1;
 }
+
+
+/**
+ * virConnectCrash:
+ * @conn: pointer to the hypervisor connection
+ * @side: which side should the crash occur on (see virConnectCrashSide)
+ * @mode: which technique should be used to crash (see virConnectCrashMode)
+ * @flags: extra flags; not used yet, so callers should always pass 0
+ *
+ * Invoke a crash in either client or daemon.
+ *
+ * USE THIS API WITH EXTREME CAUTION AS IT MAY CRASH YOUR APPLICATION OR THE DAEMON.
+ *
+ * Returns: 0 on success,
+ *         -1 otherwise
+ */
+int
+virConnectCrash(virConnectPtr conn,
+                int side,
+                int mode,
+                unsigned int flags)
+{
+    VIR_DEBUG("conn=%p side=%d mode=%d flags=%x",
+              conn, side, mode, flags);
+
+    virResetLastError();
+
+    virCheckConnectReturn(conn, -1);
+    virCheckReadOnlyGoto(conn->flags, error);
+
+    if (conn->driver->connectCrash) {
+        int ret;
+
+        ret = conn->driver->connectCrash(conn, side, mode, flags);
+
+        if (ret < 0)
+            goto error;
+        return ret;
+    }
+
+    virReportUnsupportedError();
+ error:
+    virDispatchError(conn);
+    return -1;
+}
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index 1e920d6..2f73e3e 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -730,6 +730,7 @@ LIBVIRT_1.3.3 {
         virDomainMigrateStartPostCopy;
         virDomainGetPerfEvents;
         virDomainSetPerfEvents;
+        virConnectCrash;
 } LIBVIRT_1.2.19;
 
 # .... define new API here using predicted next version number ....
-- 
2.7.3




More information about the libvir-list mailing list