Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
tools/virsh-host.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
tools/virsh.pod | 9 +++++++
2 files changed, 84 insertions(+)
diff --git a/tools/virsh-host.c b/tools/virsh-host.c
index 80ac4bd..8635386 100644
--- a/tools/virsh-host.c
+++ b/tools/virsh-host.c
@@ -1137,6 +1137,75 @@ cmdCPUModelNames(vshControl *ctl, const vshCmd *cmd)
}
/*
+ * "crash" command
+ */
+static const vshCmdInfo info_crash[] = {
+ {.name = "help",
+ .data = N_("Crash either daemon or client")
+ },
+ {.name = "desc",
+ .data = N_("Crash either daemon or client")
+ },
+ {.name = NULL}
+};
+
+static const vshCmdOptDef opts_crash[] = {
+ {.name = "mode",
+ .type = VSH_OT_STRING,
+ .help = N_("mode of crash (write, null, stack)")
+ },
+ {.name = "side",
+ .type = VSH_OT_STRING,
+ .help = N_("side of crash (client, server)")
+ },
+ {.name = NULL}
+};
+
+static bool
+cmdCrash(vshControl *ctl, const vshCmd *cmd)
+{
+ const char *modeStr = NULL, *sideStr = NULL;
+ int mode = VIR_CONNECT_CRASH_NULL_DEREF;
+ int side = VIR_CONNECT_CRASH_SERVER;
+ virshControlPtr priv = ctl->privData;
+ const unsigned int flags = 0;
+
+ if (vshCommandOptStringReq(ctl, cmd, "mode", &modeStr) < 0 ||
+ vshCommandOptStringReq(ctl, cmd, "side", &sideStr) < 0)
+ return false;
+
+ if (modeStr) {
+ if (STREQ(modeStr, "write")) {
+ mode = VIR_CONNECT_CRASH_WRITE_RO;
+ } else if (STREQ(modeStr, "null")) {
+ mode = VIR_CONNECT_CRASH_NULL_DEREF;
+ } else if (STREQ(modeStr, "stack")) {
+ mode = VIR_CONNECT_CRASH_STACK_OVERFLOW;
+ } else {
+ vshError(ctl, _("Unknown crash mode: %s"), modeStr);
+ return false;
+ }
+ }
+
+ if (sideStr) {
+ if (STREQ(sideStr, "server")) {
+ side = VIR_CONNECT_CRASH_SERVER;
+ } else if (STREQ(sideStr, "client")) {
+ side = VIR_CONNECT_CRASH_CLIENT;
+ } else {
+ vshError(ctl, _("Unknown crash side: %s"), sideStr);
+ return false;
+ }
+ }
+
+ if (virConnectCrash(priv->conn, side, mode, flags) < 0)
+ return false;
+
+ return true;
+}
+
+
+/*
* "version" command
*/
static const vshCmdInfo info_version[] = {
@@ -1372,6 +1441,12 @@ const vshCmdDef hostAndHypervisorCmds[] = {
.info = info_cpu_models,
.flags = 0
},
+ {.name = "crash",
+ .handler = cmdCrash,
+ .opts = opts_crash,
+ .info = info_crash,
+ .flags = 0
+ },
{.name = "domcapabilities",
.handler = cmdDomCapabilities,
.opts = opts_domcapabilities,
diff --git a/tools/virsh.pod b/tools/virsh.pod
index d2cc5b2..bc28d3a 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -243,6 +243,15 @@ This command is only available in interactive mode.
Will print the current directory.
+=item B<crash> [I<mode>] [I<side>]
+
+Crash either daemon or client. Depending on I<mode> selected
+preferred way of crashing can be performed: "write" for
+attempting to write to read-only memory, "null" for dereferencing
+a NULL pointer, or "stack" for stack overflow. Moreover, I<side>
+on which the crash occurs can be chosen from "server" and
+"client". B<Use this command with extreme caution!>
+
=item B<connect> [I<URI>] [I<--readonly>]
(Re)-Connect to the hypervisor. When the shell is first started, this
--
2.7.3