Check whether previously found executables were updated and if
so look for them again. This helps to use updated features of
swtpm and its tools upon updating them.
Signed-off-by: Stefan Berger <stefanb(a)linux.ibm.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau(a)redhat.com>
---
src/qemu/qemu_tpm.c | 1 +
src/util/virtpm.c | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 35 insertions(+)
diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c
index 7282b01bfe..9f1e7e20ba 100644
--- a/src/qemu/qemu_tpm.c
+++ b/src/qemu/qemu_tpm.c
@@ -20,6 +20,7 @@
#include <config.h>
+#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
diff --git a/src/util/virtpm.c b/src/util/virtpm.c
index 6df225f4e4..bef6cff3dd 100644
--- a/src/util/virtpm.c
+++ b/src/util/virtpm.c
@@ -78,8 +78,13 @@ virTPMCreateCancelPath(const char *devpath)
*/
static virMutex swtpm_tools_lock = VIR_MUTEX_INITIALIZER;
static char *swtpm_path;
+static struct stat swtpm_stat;
+
static char *swtpm_setup;
+static struct stat swtpm_setup_stat;
+
static char *swtpm_ioctl;
+static struct stat swtpm_ioctl_stat;
char *
virTPMGetSwtpm(void)
@@ -139,18 +144,22 @@ virTPMEmulatorInit(void)
static const struct {
const char *name;
char **path;
+ struct stat *stat;
} prgs[] = {
{
.name = "swtpm",
.path = &swtpm_path,
+ .stat = &swtpm_stat,
},
{
.name = "swtpm_setup",
.path = &swtpm_setup,
+ .stat = &swtpm_setup_stat,
},
{
.name = "swtpm_ioctl",
.path = &swtpm_ioctl,
+ .stat = &swtpm_ioctl_stat,
}
};
size_t i;
@@ -160,8 +169,27 @@ virTPMEmulatorInit(void)
for (i = 0; i < ARRAY_CARDINALITY(prgs); i++) {
VIR_AUTOFREE(char *) path = NULL;
bool findit = *prgs[i].path == NULL;
+ struct stat statbuf;
+ char *tmp;
+
+ if (!findit) {
+ /* has executables changed? */
+ if (stat(*prgs[i].path, &statbuf) < 0)
+ findit = true;
+
+ if (!findit &&
+ memcmp(&statbuf.st_mtim,
+ &prgs[i].stat->st_mtime,
+ sizeof(statbuf.st_mtim))) {
+ findit = true;
+ }
+ }
if (findit) {
+ tmp = *prgs[i].path;
+ VIR_FREE(tmp);
+ *prgs[i].path = NULL;
+
path = virFindFileInPath(prgs[i].name);
if (!path) {
virReportSystemError(ENOENT,
@@ -175,7 +203,13 @@ virTPMEmulatorInit(void)
path);
goto cleanup;
}
+ if (stat(path, prgs[i].stat) < 0) {
+ virReportSystemError(errno,
+ _("Could not stat %s"), path);
+ goto cleanup;
+ }
*prgs[i].path = path;
+ path = NULL;
}
}
--
2.20.1