]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Support <on_reboot> action
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 3 May 2007 16:10:40 +0000 (16:10 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 3 May 2007 16:10:40 +0000 (16:10 +0000)
ChangeLog
qemud/conf.c
qemud/internal.h

index 9512256e8c10d77c7824a7ad5c13e562807028e1..29c4e4f7af92ff8c18252dd5f6d3f486a549a3b6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,10 @@
-Thu May  3 18:00:41 CEST 2007 Daiel Veillard <veillard@redhat.com>
+Thu May  3 12:09:41 EST 2007 Daniel P. Berange <berrange@redhat.com>
+
+       * qemud/conf.c, qemud/internal.c: Read upto 8k from QEMU
+       help output. Support the <on_reboot> attribute to set the
+       -no-reboot flag in QEMU
+
+Thu May  3 18:00:41 CEST 2007 Daniel Veillard <veillard@redhat.com>
 
        * src/virsh.c: fix help for dumpxml and net-dumpxml commands
          based on Chris Wright feedback
index 0a724a9486e9815b33c76a4261994838f3f435b7..ceecf95ce7896743ee562df821be058b55b55260 100644 (file)
@@ -245,18 +245,23 @@ static int qemudExtractVersionInfo(const char *qemu, int *version, int *flags) {
     cleanup1:
         _exit(-1); /* Just in case */
     } else { /* Parent */
-        char help[4096]; /* Ought to be enough to hold QEMU help screen */
+        char help[8192]; /* Ought to be enough to hold QEMU help screen */
         int got, ret = -1;
         int major, minor, micro;
 
         if (close(newstdout[1]) < 0)
             goto cleanup2;
 
-    reread:
-        if ((got = read(newstdout[0], help, sizeof(help)-1)) < 0) {
-            if (errno == EINTR)
-                goto reread;
-            goto cleanup2;
+        while (got < (sizeof(help)-1)) {
+            int len;
+            if ((len = read(newstdout[0], help+got, sizeof(help)-got-1)) <= 0) {
+                if (!len)
+                    break;
+                if (errno == EINTR)
+                    continue;
+                goto cleanup2;
+            }
+            got += len;
         }
         help[got] = '\0';
 
@@ -267,6 +272,8 @@ static int qemudExtractVersionInfo(const char *qemu, int *version, int *flags) {
         *version = (major * 1000 * 1000) + (minor * 1000) + micro;
         if (strstr(help, "-no-kqemu"))
             *flags |= QEMUD_CMD_FLAG_KQEMU;
+        if (strstr(help, "-no-reboot"))
+            *flags |= QEMUD_CMD_FLAG_NO_REBOOT;
         if (*version >= 9000)
             *flags |= QEMUD_CMD_FLAG_VNC_COLON;
         ret = 0;
@@ -858,6 +865,22 @@ static struct qemud_vm_def *qemudParseXML(struct qemud_server *server,
     }
     xmlXPathFreeObject(obj);
 
+
+    /* See if we disable reboots */
+    obj = xmlXPathEval(BAD_CAST "string(/domain/on_reboot)", ctxt);
+    if ((obj == NULL) || (obj->type != XPATH_STRING) ||
+        (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
+        def->noReboot = 0;
+    } else {
+        if (!strcmp((char*)obj->stringval, "destroy"))
+            def->noReboot = 1;
+        else
+            def->noReboot = 0;
+    }
+    if (obj)
+        xmlXPathFreeObject(obj);
+
+
     /* Extract OS type info */
     obj = xmlXPathEval(BAD_CAST "string(/domain/os/type[1])", ctxt);
     if ((obj == NULL) || (obj->type != XPATH_STRING) ||
@@ -1220,6 +1243,8 @@ int qemudBuildCommandLine(struct qemud_server *server,
         2 + /* cpus */
         2 + /* boot device */
         2 + /* monitor */
+        (server->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT &&
+         vm->def->noReboot ? 1 : 0) + /* no-reboot */
         (vm->def->features & QEMUD_FEATURE_ACPI ? 0 : 1) + /* acpi */
         (vm->def->os.kernel[0] ? 2 : 0) + /* kernel */
         (vm->def->os.initrd[0] ? 2 : 0) + /* initrd */
@@ -1256,6 +1281,12 @@ int qemudBuildCommandLine(struct qemud_server *server,
     if (!((*argv)[++n] = strdup("pty")))
         goto no_memory;
 
+    if (server->qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT &&
+        vm->def->noReboot) {
+        if (!((*argv)[++n] = strdup("-no-reboot")))
+            goto no_memory;
+    }
+
     if (!(vm->def->features & QEMUD_FEATURE_ACPI)) {
         if (!((*argv)[++n] = strdup("-no-acpi")))
             goto no_memory;
@@ -2517,6 +2548,17 @@ char *qemudGenerateXML(struct qemud_server *server,
             goto no_memory;
     }
 
+    if (bufferAdd(buf, "  <on_poweroff>destroy</on_poweroff>\n", -1) < 0)
+        goto no_memory;
+    if (def->noReboot) {
+        if (bufferAdd(buf, "  <on_reboot>destroy</on_reboot>\n", -1) < 0)
+            goto no_memory;
+    } else {
+        if (bufferAdd(buf, "  <on_reboot>restart</on_reboot>\n", -1) < 0)
+            goto no_memory;
+    }
+    if (bufferAdd(buf, "  <on_crash>destroy</on_crash>\n", -1) < 0)
+        goto no_memory;
 
     if (bufferAdd(buf, "  <devices>\n", -1) < 0)
         goto no_memory;
index 3b453820ee5560e5a347739efed351a2f5176d11..c406752830a2ea7d823ff7fa2efd22692e09a7ba 100644 (file)
@@ -161,6 +161,7 @@ enum qemud_vm_grapics_type {
 enum qemud_cmd_flags {
     QEMUD_CMD_FLAG_KQEMU = 1,
     QEMUD_CMD_FLAG_VNC_COLON = 2,
+    QEMUD_CMD_FLAG_NO_REBOOT = 4,
 };
 
 
@@ -191,6 +192,8 @@ struct qemud_vm_def {
     int maxmem;
     int vcpus;
 
+    int noReboot;
+
     struct qemud_vm_os_def os;
 
     int features;