diff --git a/libvirt-0.2.2-disable-xm.patch b/libvirt-0.2.2-disable-xm.patch
new file mode 100644
index 0000000..51a9b68
--- /dev/null
+++ b/libvirt-0.2.2-disable-xm.patch
@@ -0,0 +1,15 @@
+diff -rup libvirt-0.2.2/src/xen_unified.c libvirt-0.2.2.new/src/xen_unified.c
+--- libvirt-0.2.2/src/xen_unified.c 2007-04-17 04:38:52.000000000 -0400
++++ libvirt-0.2.2.new/src/xen_unified.c 2007-05-01 16:49:54.000000000 -0400
+@@ -112,6 +112,11 @@ xenUnifiedOpen (virConnectPtr conn, cons
+ for (i = 0; i < nb_drivers; ++i) {
+ int failed_to_open = 1;
+
++ /* Only use XM driver for Xen <= 3.0.3 (ie xendConfigVersion <= 2) */
++ if (drivers[i] == &xenXMDriver &&
++ priv->xendConfigVersion > 2)
++ continue;
++
+ /* Ignore proxy for root */
+ if (i == proxy_offset && getuid() == 0)
+ continue;
diff --git a/libvirt-0.2.2-dnsmasq-order.patch b/libvirt-0.2.2-dnsmasq-order.patch
new file mode 100644
index 0000000..372a3f9
--- /dev/null
+++ b/libvirt-0.2.2-dnsmasq-order.patch
@@ -0,0 +1,23 @@
+diff -rup libvirt-0.2.2/qemud/qemud.c libvirt-0.2.2.new/qemud/qemud.c
+--- libvirt-0.2.2/qemud/qemud.c 2007-04-11 10:13:36.000000000 -0400
++++ libvirt-0.2.2.new/qemud/qemud.c 2007-05-01 16:51:15.000000000 -0400
+@@ -1110,6 +1110,7 @@ qemudBuildDnsmasqArgv(struct qemud_serve
+ len =
+ 1 + /* dnsmasq */
+ 1 + /* --keep-in-foreground */
++ 1 + /* --strict-order */
+ 1 + /* --bind-interfaces */
+ 2 + /* --pid-file "" */
+ 2 + /* --conf-file "" */
+@@ -1133,6 +1134,11 @@ qemudBuildDnsmasqArgv(struct qemud_serve
+ APPEND_ARG(*argv, i++, "dnsmasq");
+
+ APPEND_ARG(*argv, i++, "--keep-in-foreground");
++ /*
++ * Needed to ensure dnsmasq uses same algorithm for processing
++ * multiple nameserver entries in /etc/resolv.conf as GLibC.
++ */
++ APPEND_ARG(*argv, i++, "--strict-order");
+ APPEND_ARG(*argv, i++, "--bind-interfaces");
+
+ APPEND_ARG(*argv, i++, "--pid-file");
diff --git a/libvirt-0.2.2-graphics-hvm.patch b/libvirt-0.2.2-graphics-hvm.patch
new file mode 100644
index 0000000..b0b80e7
--- /dev/null
+++ b/libvirt-0.2.2-graphics-hvm.patch
@@ -0,0 +1,70 @@
+diff -rup libvirt-0.2.2.new/src/xend_internal.c libvirt-0.2.2/src/xend_internal.c
+--- libvirt-0.2.2.new/src/xend_internal.c 2007-04-15 16:09:10.000000000 -0400
++++ libvirt-0.2.2/src/xend_internal.c 2007-05-03 14:52:42.000000000 -0400
+@@ -1676,35 +1676,38 @@ xend_parse_sexp_desc(virConnectPtr conn,
+ }
+ }
+
+- /* Graphics device (HVM <= 3.0.4, or PV <= 3.0.4) vnc config */
+- tmp = sexpr_fmt_node(root, "domain/image/%s/vnc", hvm ? "hvm" : "linux");
+- if (tmp != NULL) {
+- if (tmp[0] == '1') {
+- int port = xenStoreDomainGetVNCPort(conn, domid);
+- const char *listenAddr = sexpr_fmt_node(root, "domain/image/%s/vnclisten", hvm ? "hvm" : "linux");
+- const char *keymap = sexpr_fmt_node(root, "domain/image/%s/keymap", hvm ? "hvm" : "linux");
+- /* For Xen >= 3.0.3, don't generate a fixed port mapping
+- * because it will almost certainly be wrong ! Just leave
+- * it as -1 which lets caller see that the VNC server isn't
+- * present yet. Subsquent dumps of the XML will eventually
+- * find the port in XenStore once VNC server has started
+- */
+- if (port == -1 && xendConfigVersion < 2)
+- port = 5900 + domid;
+- virBufferVSprintf(&buf, " \n", 3);
++ /* Graphics device (HVM <= 3.0.4, or PV <= 3.0.3) vnc config */
++ if ((hvm && xendConfigVersion < 4) ||
++ (!hvm && xendConfigVersion < 3)) {
++ tmp = sexpr_fmt_node(root, "domain/image/%s/vnc", hvm ? "hvm" : "linux");
++ if (tmp != NULL) {
++ if (tmp[0] == '1') {
++ int port = xenStoreDomainGetVNCPort(conn, domid);
++ const char *listenAddr = sexpr_fmt_node(root, "domain/image/%s/vnclisten", hvm ? "hvm" : "linux");
++ const char *keymap = sexpr_fmt_node(root, "domain/image/%s/keymap", hvm ? "hvm" : "linux");
++ /* For Xen >= 3.0.3, don't generate a fixed port mapping
++ * because it will almost certainly be wrong ! Just leave
++ * it as -1 which lets caller see that the VNC server isn't
++ * present yet. Subsquent dumps of the XML will eventually
++ * find the port in XenStore once VNC server has started
++ */
++ if (port == -1 && xendConfigVersion < 2)
++ port = 5900 + domid;
++ virBufferVSprintf(&buf, " \n", 3);
++ }
+ }
+- }
+
+- /* Graphics device (HVM, or old (pre-3.0.4) style PV sdl config) */
+- tmp = sexpr_fmt_node(root, "domain/image/%s/sdl", hvm ? "hvm" : "linux");
+- if (tmp != NULL) {
+- if (tmp[0] == '1')
+- virBufferAdd(&buf, " \n", 27 );
++ /* Graphics device (HVM, or old (pre-3.0.4) style PV sdl config) */
++ tmp = sexpr_fmt_node(root, "domain/image/%s/sdl", hvm ? "hvm" : "linux");
++ if (tmp != NULL) {
++ if (tmp[0] == '1')
++ virBufferAdd(&buf, " \n", 27 );
++ }
+ }
+
+ tty = xenStoreDomainGetConsolePath(conn, domid);
+Only in libvirt-0.2.2/src: xend_internal.c.orig
diff --git a/libvirt-0.2.2-qemu-noreboot.patch b/libvirt-0.2.2-qemu-noreboot.patch
new file mode 100644
index 0000000..ff2caa3
--- /dev/null
+++ b/libvirt-0.2.2-qemu-noreboot.patch
@@ -0,0 +1,128 @@
+diff -rup libvirt-0.2.2/qemud/conf.c libvirt-0.2.2.new/qemud/conf.c
+--- libvirt-0.2.2/qemud/conf.c 2007-04-17 04:34:42.000000000 -0400
++++ libvirt-0.2.2.new/qemud/conf.c 2007-05-01 18:16:46.000000000 -0400
+@@ -245,21 +245,25 @@ static int qemudExtractVersionInfo(const
+ 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';
+-
+ if (sscanf(help, "QEMU PC emulator version %d.%d.%d", &major,&minor, µ) != 3) {
+ goto cleanup2;
+ }
+@@ -267,6 +271,8 @@ static int qemudExtractVersionInfo(const
+ *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 +864,22 @@ static struct qemud_vm_def *qemudParseXM
+ }
+ 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 +1242,8 @@ int qemudBuildCommandLine(struct qemud_s
+ 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 */
+@@ -1255,6 +1279,11 @@ int qemudBuildCommandLine(struct qemud_s
+ goto no_memory;
+ 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")))
+@@ -2517,6 +2546,17 @@ char *qemudGenerateXML(struct qemud_serv
+ goto no_memory;
+ }
+
++ if (bufferAdd(buf, " destroy\n", -1) < 0)
++ goto no_memory;
++ if (def->noReboot) {
++ if (bufferAdd(buf, " destroy\n", -1) < 0)
++ goto no_memory;
++ } else {
++ if (bufferAdd(buf, " restart\n", -1) < 0)
++ goto no_memory;
++ }
++ if (bufferAdd(buf, " destroy\n", -1) < 0)
++ goto no_memory;
+
+ if (bufferAdd(buf, " \n", -1) < 0)
+ goto no_memory;
+diff -rup libvirt-0.2.2/qemud/internal.h libvirt-0.2.2.new/qemud/internal.h
+--- libvirt-0.2.2/qemud/internal.h 2007-04-11 10:13:36.000000000 -0400
++++ libvirt-0.2.2.new/qemud/internal.h 2007-05-01 17:53:42.000000000 -0400
+@@ -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;
+Only in libvirt-0.2.2.new/qemud: libvirt-0.2.2-qemu-noreboot.patch
diff --git a/libvirt-0.2.2-sync-daemon-restart.patch b/libvirt-0.2.2-sync-daemon-restart.patch
new file mode 100644
index 0000000..efddd13
--- /dev/null
+++ b/libvirt-0.2.2-sync-daemon-restart.patch
@@ -0,0 +1,19 @@
+--- libvirt-0.2.2/ChangeLog.sync-restart 2007-05-02 13:07:21.719425000 -0400
++++ libvirt-0.2.2/ChangeLog 2007-05-02 13:08:23.204879000 -0400
+@@ -0,0 +1,5 @@
++Wed May 2 17:55:12 IST 2007 Mark McLoughlin
++
++ * qemud/libvirtd.in: synchronously restart the daemon in
++ order to avoid https://bugzilla.redhat.com/238492
++
+--- libvirt-0.2.2/qemud/libvirtd.in.sync-restart 2007-02-23 07:50:58.000000000 -0500
++++ libvirt-0.2.2/qemud/libvirtd.in 2007-05-02 13:08:23.209868000 -0400
+@@ -34,7 +34,7 @@
+ stop() {
+ echo -n $"Stopping $SERVICE daemon: "
+
+- killproc $PROCESS -TERM
++ killproc $PROCESS
+ RETVAL=$?
+ echo
+ if [ $RETVAL -eq 0 ]; then
diff --git a/libvirt.spec b/libvirt.spec
index 86b0de4..174338c 100644
--- a/libvirt.spec
+++ b/libvirt.spec
@@ -9,10 +9,15 @@
Summary: Library providing a simple API virtualization
Name: libvirt
Version: 0.2.2
-Release: 2%{?_extra_release}
+Release: 3%{?_extra_release}
License: LGPL
Group: Development/Libraries
Source: libvirt-%{version}.tar.gz
+Patch1: libvirt-0.2.2-disable-xm.patch
+Patch2: libvirt-0.2.2-dnsmasq-order.patch
+Patch3: libvirt-0.2.2-qemu-noreboot.patch
+Patch4: libvirt-0.2.2-sync-daemon-restart.patch
+Patch5: libvirt-0.2.2-graphics-hvm.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-root
URL: http://libvirt.org/
BuildRequires: python python-devel
@@ -54,11 +59,16 @@ Obsoletes: libvir-python
%description python
The libvirt-python package contains a module that permits applications
written in the Python programming language to use the interface
-supplied by the libvirt library to use the the virtualization capabilities
+supplied by the libvirt library to use the the virtualization capabilities
of recent versions of Linux (and other OSes).
%prep
%setup -q
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
%build
%configure --with-init-script=redhat --with-qemud-pid-file=%{_localstatedir}/run/libvirt_qemud.pid
@@ -170,6 +180,13 @@ fi
%doc docs/examples/python
%changelog
+* Thu May 3 2007 Daniel P. Berrange - 0.2.2-3.fc7
+- Fixed init script restart race
+- Remove duplicate tag for HVM
+- Support -no-reboot in qemu for installs
+- Disable xm config file driver for 3.0.5
+- Force dnsmasq ordering for resolv.conf
+
* Fri Apr 21 2007 Daniel P. Berrange - 0.2.2-2.fc7
- Added Requires on dnsmasq for virtual networking