]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: activate directory override when used from library
authorDaniel P. Berrangé <berrange@redhat.com>
Thu, 29 Aug 2019 10:52:08 +0000 (11:52 +0100)
committerDaniel P. Berrangé <berrange@redhat.com>
Tue, 10 Sep 2019 10:03:35 +0000 (11:03 +0100)
The Perl bindings for libvirt use the test driver for unit tests. This
tries to load the cpu_map/index.xml file, and when run from an
uninstalled build will fail.

The problem is that virFileActivateDirOverride is called by our various
binaries like libvirtd, virsh, but is not called when a 3rd party app
uses libvirt.so

To deal with this we allow the LIBVIRT_DIR_OVERRIDE=1 env variable to be
set and make virInitialize look for this. The 'run' script will set it,
so now build using this script to run against an uninstalled tree we
will correctly resolve files to the source tree.

Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
12 files changed:
run.in
src/libvirt.c
src/libvirt_private.syms
src/locking/lock_daemon.c
src/logging/log_daemon.c
src/remote/remote_daemon.c
src/security/virt-aa-helper.c
src/util/virfile.c
src/util/virfile.h
tests/testutils.c
tools/virsh.c
tools/virt-admin.c

diff --git a/run.in b/run.in
index 9a1c6ea11a94b64ea196eff2b56741838ca6dcb1..8574f81463bf1a50c1ea1e6207eda119fd90f2ce 100644 (file)
--- a/run.in
+++ b/run.in
@@ -60,6 +60,12 @@ else
 fi
 export PKG_CONFIG_PATH
 
+# Ensure that any 3rd party apps using libvirt.so from the build tree get
+# files resolved to the build/source tree too. Typically useful for language
+# bindings running tests against non-installed libvirt.
+LIBVIRT_DIR_OVERRIDE=1
+export LIBVIRT_DIR_OVERRIDE
+
 # This is a cheap way to find some use-after-free and uninitialized
 # read problems when using glibc.
 random_val="$(awk 'BEGIN{srand(); print 1+int(255*rand())}' < /dev/null)"
index 19bc05638f27eed7034d168eb7d66b0f7de7b101..15917cba6faac2ea0c22060bc09801d62571d011 100644 (file)
@@ -247,6 +247,8 @@ virGlobalInit(void)
         virErrorInitialize() < 0)
         goto error;
 
+    virFileActivateDirOverrideForLib();
+
     if (getuid() != geteuid() ||
         getgid() != getegid()) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
index 0ee2014beb8ca2fcc8dba2a60f62c5d013bb3589..918f81470be69674cd851b533560a78240a63118 100644 (file)
@@ -1918,7 +1918,8 @@ virDirOpenQuiet;
 virDirRead;
 virFileAbsPath;
 virFileAccessibleAs;
-virFileActivateDirOverride;
+virFileActivateDirOverrideForLib;
+virFileActivateDirOverrideForProg;
 virFileBindMountDevice;
 virFileBuildPath;
 virFileCanonicalizePath;
index ac242bf65cf47d0e394758065d57a0af9eba03b1..edb61d74c08e61408e6d98414f1232294934b950 100644 (file)
@@ -1188,7 +1188,7 @@ int main(int argc, char **argv) {
         }
     }
 
-    virFileActivateDirOverride(argv[0]);
+    virFileActivateDirOverrideForProg(argv[0]);
 
     if (!(config = virLockDaemonConfigNew(privileged))) {
         VIR_ERROR(_("Can't create initial configuration"));
index f74e900aea740b98d8b26ac78a861ef0897daec2..85c58aaa7b88ecb4d45360b48f5ffcc7a8682ff1 100644 (file)
@@ -960,7 +960,7 @@ int main(int argc, char **argv) {
         }
     }
 
-    virFileActivateDirOverride(argv[0]);
+    virFileActivateDirOverrideForProg(argv[0]);
 
     if (!(config = virLogDaemonConfigNew(privileged))) {
         VIR_ERROR(_("Can't create initial configuration"));
index 5d643970621aad0d73b70a7700eb0ac54ee24ed6..966f3da2d062d2594e659e83f316e1294757807f 100644 (file)
@@ -1034,7 +1034,7 @@ int main(int argc, char **argv) {
 
     virUpdateSelfLastChanged(argv[0]);
 
-    virFileActivateDirOverride(argv[0]);
+    virFileActivateDirOverrideForProg(argv[0]);
 
     while (1) {
         int optidx = 0;
index 3f9d775acce5e367eda9b23947e109eb2c32a00d..326cfaf52a04c4c408b5c8f572abe5b713c43715 100644 (file)
@@ -1427,7 +1427,7 @@ main(int argc, char **argv)
         exit(EXIT_FAILURE);
     }
 
-    virFileActivateDirOverride(argv[0]);
+    virFileActivateDirOverrideForProg(argv[0]);
 
     /* Initialize the log system */
     virLogSetFromEnv();
index dbfe74e24f434a3e8aedf0c7ff90da880f5eea0d..bb844c64e5f24c67bcec852589a2657611284fab 100644 (file)
@@ -1774,7 +1774,7 @@ virFileFindResource(const char *filename,
 
 
 /**
- * virFileActivateDirOverride:
+ * virFileActivateDirOverrideForProg:
  * @argv0: argv[0] of the calling program
  *
  * Look at @argv0 and try to detect if running from
@@ -1782,7 +1782,7 @@ virFileFindResource(const char *filename,
  * on the binary name, or '/.libs/' in the path
  */
 void
-virFileActivateDirOverride(const char *argv0)
+virFileActivateDirOverrideForProg(const char *argv0)
 {
     char *file = strrchr(argv0, '/');
     if (!file || file[1] == '\0')
@@ -1796,6 +1796,20 @@ virFileActivateDirOverride(const char *argv0)
 }
 
 
+/**
+ * virFileActivateDirOverrideForLib:
+ *
+ * Look for LIBVIRT_DIR_OVERRIDE env var to see if we should find files from
+ * the build/src tree instead of install tree.
+ */
+void
+virFileActivateDirOverrideForLib(void)
+{
+    if (getenv("LIBVIRT_DIR_OVERRIDE") != NULL)
+        useDirOverride = true;
+}
+
+
 /**
  * virFileLength:
  * @path: full path of the file
index a8a5dd8074048f184270c1fd724caf85386b3261..2b037b00aaa76e51d30c6debbd43cc8e583a7e44 100644 (file)
@@ -193,8 +193,9 @@ char *virFileFindResourceFull(const char *filename,
                               const char *installdir,
                               const char *envname)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5);
-void virFileActivateDirOverride(const char *argv0)
+void virFileActivateDirOverrideForProg(const char *argv0)
     ATTRIBUTE_NONNULL(1);
+void virFileActivateDirOverrideForLib(void);
 
 off_t virFileLength(const char *path, int fd) ATTRIBUTE_NONNULL(1);
 bool virFileIsDir (const char *file) ATTRIBUTE_NONNULL(1);
index 8b2c51044e750d4c2912fa2ce26e0dd355d4c57e..003893dc442d3ca7ded09a8d10b6edcbeee1d8d8 100644 (file)
@@ -992,7 +992,7 @@ int virTestMain(int argc,
 
     setenv("VIR_TEST_MOCK_PROGNAME", progname, 1);
 
-    virFileActivateDirOverride(argv[0]);
+    virFileActivateDirOverrideForProg(argv[0]);
 
     if (virTestSetEnvPath() < 0)
         return EXIT_AM_HARDFAIL;
index e76d242ec89fda2e178d21e765efcf20c2027f02..ec20f35a77a45ec201607e03e4ed2de5dd07e9ef 100644 (file)
@@ -897,7 +897,7 @@ main(int argc, char **argv)
         return EXIT_FAILURE;
     }
 
-    virFileActivateDirOverride(argv[0]);
+    virFileActivateDirOverrideForProg(argv[0]);
 
     if (!vshInit(ctl, cmdGroups, NULL))
         exit(EXIT_FAILURE);
index 4ff006ffcb5ea3a58a70aa10a0785dc849183bc8..e549ec1f8331b690b76ae219d23f5e374680cf06 100644 (file)
@@ -1552,7 +1552,7 @@ main(int argc, char **argv)
         return EXIT_FAILURE;
     }
 
-    virFileActivateDirOverride(argv[0]);
+    virFileActivateDirOverrideForProg(argv[0]);
 
     if (!vshInit(ctl, cmdGroups, NULL))
         exit(EXIT_FAILURE);