On Mon, Sep 09, 2019 at 12:38:25PM +0200, Pavel Hrdina wrote:
On Thu, Sep 05, 2019 at 11:52:09AM +0100, Daniel P. Berrangé wrote:
> 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.
>
> Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
> ---
> Changed in v2:
>
> - Use a separate function for env var override
>
> run.in | 7 ++++++
> src/libvirt.c | 2 ++
> src/libvirt_private.syms | 3 ++-
> src/locking/lock_daemon.c | 2 +-
> src/logging/log_daemon.c | 2 +-
> src/remote/remote_daemon.c | 2 +-
> src/security/virt-aa-helper.c | 2 +-
> src/util/virfile.c | 40 ++++++++++++++++++++++++++---------
> src/util/virfile.h | 3 ++-
> tests/testutils.c | 2 +-
> tools/virsh.c | 2 +-
> tools/virt-admin.c | 2 +-
> 12 files changed, 50 insertions(+), 19 deletions(-)
>
> diff --git a/run.in b/run.in
> index 9a1c6ea11a..ed946a0899 100644
> --- a/run.in
> +++ b/run.in
> @@ -60,6 +60,13 @@ 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 line wrapping looks a bit to aggressive :).
> # 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)"
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 9650aaa453..a1ecd8bacc 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -247,6 +247,8 @@ virGlobalInit(void)
> virErrorInitialize() < 0)
> goto error;
>
> + virFileActivateDirOverrideForLib();
> +
> if (getuid() != geteuid() ||
> getgid() != getegid()) {
> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index a34d92f5ef..21cd6a8ef7 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1917,7 +1917,8 @@ virDirOpenQuiet;
> virDirRead;
> virFileAbsPath;
> virFileAccessibleAs;
> -virFileActivateDirOverride;
> +virFileActivateDirOverrideForLib;
> +virFileActivateDirOverrideForProg;
> virFileBindMountDevice;
> virFileBuildPath;
> virFileCanonicalizePath;
> diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c
> index ac242bf65c..edb61d74c0 100644
> --- a/src/locking/lock_daemon.c
> +++ b/src/locking/lock_daemon.c
> @@ -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"));
> diff --git a/src/logging/log_daemon.c b/src/logging/log_daemon.c
> index f74e900aea..85c58aaa7b 100644
> --- a/src/logging/log_daemon.c
> +++ b/src/logging/log_daemon.c
> @@ -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"));
> diff --git a/src/remote/remote_daemon.c b/src/remote/remote_daemon.c
> index 546328b24d..8cf9412128 100644
> --- a/src/remote/remote_daemon.c
> +++ b/src/remote/remote_daemon.c
> @@ -1034,7 +1034,7 @@ int main(int argc, char **argv) {
>
> virUpdateSelfLastChanged(argv[0]);
>
> - virFileActivateDirOverride(argv[0]);
> + virFileActivateDirOverrideForProg(argv[0]);
>
> while (1) {
> int optidx = 0;
> diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c
> index 3f9d775acc..326cfaf52a 100644
> --- a/src/security/virt-aa-helper.c
> +++ b/src/security/virt-aa-helper.c
> @@ -1427,7 +1427,7 @@ main(int argc, char **argv)
> exit(EXIT_FAILURE);
> }
>
> - virFileActivateDirOverride(argv[0]);
> + virFileActivateDirOverrideForProg(argv[0]);
>
> /* Initialize the log system */
> virLogSetFromEnv();
> diff --git a/src/util/virfile.c b/src/util/virfile.c
> index 81a3c096eb..d9ac482435 100644
> --- a/src/util/virfile.c
> +++ b/src/util/virfile.c
> @@ -1766,7 +1766,7 @@ virFileFindResource(const char *filename,
>
>
> /**
> - * virFileActivateDirOverride:
> + * virFileActivateDirOverrideForProg:
> * @argv0: argv[0] of the calling program
> *
> * Look at @argv0 and try to detect if running from
> @@ -1774,20 +1774,40 @@ 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')
> - return;
> - file++;
> - if (STRPREFIX(file, "lt-") ||
> - strstr(argv0, "/.libs/")) {
> - useDirOverride = true;
> - VIR_DEBUG("Activating build dir override for %s", argv0);
> + if (argv0 == NULL) {
> + if (getenv("LIBVIRT_DIR_OVERRIDE") != NULL)
> + useDirOverride = true;
> + } else {
> + char *file = strrchr(argv0, '/');
> + if (!file || file[1] == '\0')
> + return;
> + file++;
> + if (STRPREFIX(file, "lt-") ||
> + strstr(argv0, "/.libs/")) {
> + useDirOverride = true;
> + VIR_DEBUG("Activating build dir override for %s", argv0);
> + }
This doesn't look right, probably leftover from V1 as this function
should not be modified now with a new separate function for Lib.
Yes, of course. Dunno how I missed that :-(
Regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|