diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 2349ce0a29..b5505072ce 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2567,6 +2567,7 @@ virSystemdCanHybridSleep; virSystemdCanSuspend; virSystemdCreateMachine; virSystemdGetMachineNameByPID; +virSystemdHasMachinedResetCachedValue; virSystemdMakeMachineName; virSystemdMakeScopeName; virSystemdMakeSliceName; diff --git a/src/util/virsystemd.c b/src/util/virsystemd.c index 90dd68afaf..ceb1c1a958 100644 --- a/src/util/virsystemd.c +++ b/src/util/virsystemd.c @@ -26,6 +26,9 @@ # include #endif +#define __VIR_SYSTEMD_PRIV_H_ALLOW__ 1 +#include "virsystemdpriv.h" + #include "virsystemd.h" #include "viratomic.h" #include "virbuffer.h" @@ -182,6 +185,15 @@ virSystemdMakeMachineName(const char *drivername, return machinename; } +static int virSystemdHasMachinedCachedValue = -1; + +/* Reset the cache from tests for testing the underlying dbus calls + * as well */ +void virSystemdHasMachinedResetCachedValue(void) +{ + virSystemdHasMachinedCachedValue = -1; +} + /* -2 = machine1 is not supported on this machine * -1 = error * 0 = machine1 is available @@ -190,10 +202,22 @@ static int virSystemdHasMachined(void) { int ret; - if ((ret = virDBusIsServiceEnabled("org.freedesktop.machine1")) < 0) - return ret; + int val; - return virDBusIsServiceRegistered("org.freedesktop.systemd1"); + val = virAtomicIntGet(&virSystemdHasMachinedCachedValue); + if (val != -1) + return val; + + if ((ret = virDBusIsServiceEnabled("org.freedesktop.machine1")) < 0) { + if (ret == -2) + virAtomicIntSet(&virSystemdHasMachinedCachedValue, -2); + return ret; + } + + if ((ret = virDBusIsServiceRegistered("org.freedesktop.systemd1")) == -1) + return ret; + virAtomicIntSet(&virSystemdHasMachinedCachedValue, ret); + return ret; } diff --git a/src/util/virsystemdpriv.h b/src/util/virsystemdpriv.h new file mode 100644 index 0000000000..4f4058b35f --- /dev/null +++ b/src/util/virsystemdpriv.h @@ -0,0 +1,33 @@ +/* + * virsystemdpriv.h: Functions for testing virSystemd APIs + * + * Copyright (C) 2016 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + * + */ + +#ifndef __VIR_SYSTEMD_PRIV_H_ALLOW__ +# error "virsystemdpriv.h may only be included by virsystemd.c or test suites" +#endif + +#ifndef __VIR_SYSTEMD_PRIV_H__ +# define __VIR_SYSTEMD_PRIV_H__ + +# include "virsystemd.h" + +void virSystemdHasMachinedResetCachedValue(void); + +#endif /* __VIR_SYSTEMD_PRIV_H__ */ diff --git a/tests/virsystemdtest.c b/tests/virsystemdtest.c index 177cccc2f9..d1f8e6f608 100644 --- a/tests/virsystemdtest.c +++ b/tests/virsystemdtest.c @@ -27,6 +27,9 @@ # include # include +# define __VIR_SYSTEMD_PRIV_H_ALLOW__ 1 +# include "virsystemdpriv.h" + # include "virsystemd.h" # include "virdbus.h" # include "virlog.h" @@ -522,6 +525,7 @@ mymain(void) do { \ if (virTestRun(_name, func, NULL) < 0) \ ret = -1; \ + virSystemdHasMachinedResetCachedValue(); \ } while (0) DO_TEST("Test create container ", testCreateContainer);