]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Implement autostart for XM driver
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 25 Nov 2008 11:04:34 +0000 (11:04 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 25 Nov 2008 11:04:34 +0000 (11:04 +0000)
ChangeLog
src/Makefile.am
src/xen_unified.c
src/xm_internal.c
src/xm_internal.h

index 29076aab79428645a6be77e86481b1e8207f8f55..25aeb170bd5ff8f4f152843efbe30950f68ba783 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Tue Nov 25 10:49:40 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
+
+       * src/Makefile.am: Remove unneccessary $(builddir) usage which
+       breaks on older automake. Remove duplicate CFLAGS from merge
+       error
+       * src/xen_unified.c: Wire up XM driver for autostart
+       * src/xm_internal.h, src/xm_internal.c: Implement domain
+       autostart functions for /etc/xen/auto
+
 Tue Nov 25 10:43:40 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
 
        Xen domain lifecycle events (Ben Guthro & Daniel Berrange)
index 4cf1a3426b62282bcfbf8752a57eee9edbbda519..c32a1d47c600a2c0f42baaf5c590a1c56c443900 100644 (file)
@@ -192,8 +192,6 @@ libvirt_driver_la_SOURCES =                                 \
 libvirt_driver_la_CFLAGS = $(XEN_CFLAGS)
 libvirt_driver_la_LDFLAGS = $(XEN_LIBS)
 
-libvirt_driver_la_CFLAGS = $(XEN_CFLAGS)
-
 if WITH_TEST
 if WITH_DRIVER_MODULES
 mod_LTLIBRARIES += libvirt_driver_test.la
@@ -397,14 +395,14 @@ EXTRA_DIST +=                                                     \
 libvirt_la_SOURCES =
 libvirt_la_LIBADD += \
                    @CYGWIN_EXTRA_LIBADD@ ../gnulib/lib/libgnu.la
-libvirt_la_LDFLAGS = -Wl,--version-script=$(builddir)/libvirt_sym.version \
+libvirt_la_LDFLAGS = -Wl,--version-script=libvirt_sym.version \
                      -version-info @LIBVIRT_VERSION_INFO@ \
                     $(COVERAGE_CFLAGS:-f%=-Wc,-f%) \
                     $(LIBXML_LIBS) $(SELINUX_LIBS) \
                    $(XEN_LIBS) $(DRIVER_MODULE_LIBS) \
                    @CYGWIN_EXTRA_LDFLAGS@ @MINGW_EXTRA_LDFLAGS@
 libvirt_la_CFLAGS = $(COVERAGE_CFLAGS) -DIN_LIBVIRT
-libvirt_la_DEPENDENCIES = $(libvirt_la_LIBADD) $(builddir)/libvirt_sym.version
+libvirt_la_DEPENDENCIES = $(libvirt_la_LIBADD) libvirt_sym.version
 
 # Create an automake "convenience library" version of libvirt_la,
 # just for testing, since the test harness requires access to internal
index 89cfc25a0ede08aa76989e7f8108cc2f0ed96c0f..cce608c05b44e629d94a08bd42cd86e01042551e 100644 (file)
@@ -1159,13 +1159,16 @@ static int
 xenUnifiedDomainGetAutostart (virDomainPtr dom, int *autostart)
 {
     GET_PRIVATE(dom->conn);
-    int i;
 
-    for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
-        if (priv->opened[i] && drivers[i]->domainGetAutostart &&
-            drivers[i]->domainGetAutostart (dom, autostart) == 0)
-            return 0;
+    if (priv->xendConfigVersion < 3) {
+        if (priv->opened[XEN_UNIFIED_XM_OFFSET])
+            return xenXMDomainGetAutostart(dom, autostart);
+    } else {
+        if (priv->opened[XEN_UNIFIED_XEND_OFFSET])
+            return xenDaemonDomainGetAutostart(dom, autostart);
+    }
 
+    xenUnifiedError (dom->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
     return -1;
 }
 
@@ -1173,13 +1176,16 @@ static int
 xenUnifiedDomainSetAutostart (virDomainPtr dom, int autostart)
 {
     GET_PRIVATE(dom->conn);
-    int i;
 
-    for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
-        if (priv->opened[i] && drivers[i]->domainSetAutostart &&
-            drivers[i]->domainSetAutostart (dom, autostart) == 0)
-            return 0;
+    if (priv->xendConfigVersion < 3) {
+        if (priv->opened[XEN_UNIFIED_XM_OFFSET])
+            return xenXMDomainSetAutostart(dom, autostart);
+    } else {
+        if (priv->opened[XEN_UNIFIED_XEND_OFFSET])
+            return xenDaemonDomainSetAutostart(dom, autostart);
+    }
 
+    xenUnifiedError (dom->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
     return -1;
 }
 
index 18e88a120cb22d41b50b66daff087a8ea1dfeb24..72d30da92471db261c4cb6b155a783a4acd74e73 100644 (file)
@@ -2669,3 +2669,84 @@ xenXMDomainBlockPeek (virDomainPtr dom,
     return -1;
 }
 
+
+static char *xenXMAutostartLinkName(virDomainPtr dom)
+{
+    char *ret;
+    if (asprintf(&ret, "/etc/xen/auto/%s", dom->name) < 0)
+        return NULL;
+    return ret;
+}
+
+static char *xenXMDomainConfigName(virDomainPtr dom)
+{
+    char *ret;
+    if (asprintf(&ret, "/etc/xen/%s", dom->name) < 0)
+        return NULL;
+    return ret;
+}
+
+int xenXMDomainGetAutostart(virDomainPtr dom, int *autostart)
+{
+    char *linkname = xenXMAutostartLinkName(dom);
+    char *config = xenXMDomainConfigName(dom);
+    int ret = -1;
+
+    if (!linkname || !config) {
+        xenXMError(dom->conn, VIR_ERR_NO_MEMORY, NULL);
+        goto cleanup;
+    }
+
+    *autostart = virFileLinkPointsTo(linkname, config);
+    if (*autostart < 0) {
+        xenXMError(dom->conn, VIR_ERR_INTERNAL_ERROR,
+                   _("failed to check autostart link %s: %s"),
+                   linkname, strerror(errno));
+        goto cleanup;
+    }
+
+    ret = 0;
+
+cleanup:
+    VIR_FREE(linkname);
+    VIR_FREE(config);
+    return ret;
+}
+
+
+int xenXMDomainSetAutostart(virDomainPtr dom, int autostart)
+{
+    char *linkname = xenXMAutostartLinkName(dom);
+    char *config = xenXMDomainConfigName(dom);
+    int ret = -1;
+
+    if (!linkname || !config) {
+        xenXMError(dom->conn, VIR_ERR_NO_MEMORY, NULL);
+        goto cleanup;
+    }
+
+    if (autostart) {
+        if (symlink(config, linkname) < 0 &&
+            errno != EEXIST) {
+            xenXMError(dom->conn, VIR_ERR_INTERNAL_ERROR,
+                       "failed to create link %s: %s",
+                       linkname, strerror(errno));
+            goto cleanup;
+        }
+    } else {
+        if (unlink(linkname)  < 0 &&
+            errno != ENOENT) {
+            xenXMError(dom->conn, VIR_ERR_INTERNAL_ERROR,
+                       "failed to remove link %s: %s",
+                       linkname, strerror(errno));
+            goto cleanup;
+        }
+    }
+    ret = 0;
+
+cleanup:
+    VIR_FREE(linkname);
+    VIR_FREE(config);
+
+    return ret;
+}
index 1d14b79c189f5373be0aed7a721f65bdbe1d3b70..7db799fe884762533b28a2a122465ebce73ae50d 100644 (file)
@@ -65,4 +65,7 @@ virDomainDefPtr xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf);
 
 int xenXMDomainBlockPeek (virDomainPtr dom, const char *path, unsigned long long offset, size_t size, void *buffer);
 
+int xenXMDomainGetAutostart(virDomainPtr dom, int *autostart);
+int xenXMDomainSetAutostart(virDomainPtr dom, int autostart);
+
 #endif