The QEMU domain capabilities code wants to quietly know whether swtpm is
available on the host.

Signed-off-by: Daniel P. Berrangé <berra...@redhat.com>
---
 src/libvirt_private.syms |  1 +
 src/util/virtpm.c        | 45 +++++++++++++++++++++++++++++-----------
 src/util/virtpm.h        |  2 ++
 3 files changed, 36 insertions(+), 12 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 6b179a61b9..6aa57abad4 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -3450,6 +3450,7 @@ virTPMCreateCancelPath;
 virTPMGetSwtpm;
 virTPMGetSwtpmIoctl;
 virTPMGetSwtpmSetup;
+virTPMHasSwtpm;
 virTPMSwtpmCapsGet;
 virTPMSwtpmFeatureTypeFromString;
 virTPMSwtpmSetupCapsGet;
diff --git a/src/util/virtpm.c b/src/util/virtpm.c
index ec51c0efb3..63579b8e69 100644
--- a/src/util/virtpm.c
+++ b/src/util/virtpm.c
@@ -132,7 +132,7 @@ static virTPMBinaryInfo swtpmBinaries[VIR_TPM_BINARY_LAST] 
= {
     },
 };
 
-static int virTPMEmulatorInit(void);
+static int virTPMEmulatorInit(bool quiet);
 
 static char *
 virTPMBinaryGetPath(virTPMBinary binary)
@@ -141,7 +141,7 @@ virTPMBinaryGetPath(virTPMBinary binary)
 
     virMutexLock(&swtpm_tools_lock);
 
-    if (virTPMEmulatorInit() < 0)
+    if (virTPMEmulatorInit(false) < 0)
         goto cleanup;
 
     s = g_strdup(swtpmBinaries[binary].path);
@@ -169,6 +169,24 @@ virTPMGetSwtpmIoctl(void)
     return virTPMBinaryGetPath(VIR_TPM_BINARY_SWTPM_IOCTL);
 }
 
+bool virTPMHasSwtpm(void)
+{
+    bool ret = false;
+
+    virMutexLock(&swtpm_tools_lock);
+
+    if (virTPMEmulatorInit(true) < 0)
+        goto cleanup;
+
+    ret = swtpmBinaries[VIR_TPM_BINARY_SWTPM].path != NULL &&
+        swtpmBinaries[VIR_TPM_BINARY_SWTPM_SETUP].path != NULL &&
+        swtpmBinaries[VIR_TPM_BINARY_SWTPM_IOCTL].path != NULL;
+
+ cleanup:
+    virMutexUnlock(&swtpm_tools_lock);
+    return ret;
+}
+
 /* virTPMExecGetCaps
  *
  * Execute the prepared command and parse the returned JSON object
@@ -269,7 +287,7 @@ virTPMGetCaps(virTPMBinaryCapsParse capsParse,
  * executables that we will use to start and setup the swtpm
  */
 static int
-virTPMEmulatorInit(void)
+virTPMEmulatorInit(bool quiet)
 {
     size_t i;
 
@@ -293,20 +311,23 @@ virTPMEmulatorInit(void)
 
             path = virFindFileInPath(virTPMBinaryTypeToString(i));
             if (!path) {
-                virReportSystemError(ENOENT,
-                                     _("Unable to find '%s' binary in $PATH"),
-                                     virTPMBinaryTypeToString(i));
+                if (!quiet)
+                    virReportSystemError(ENOENT,
+                                         _("Unable to find '%s' binary in 
$PATH"),
+                                         virTPMBinaryTypeToString(i));
                 return -1;
             }
             if (!virFileIsExecutable(path)) {
-                virReportError(VIR_ERR_INTERNAL_ERROR,
-                               _("%s is not an executable"),
-                               path);
+                if (!quiet)
+                    virReportError(VIR_ERR_INTERNAL_ERROR,
+                                   _("%s is not an executable"),
+                                   path);
                 return -1;
             }
             if (stat(path, &swtpmBinaries[i].stat) < 0) {
-                virReportSystemError(errno,
-                                     _("Could not stat %s"), path);
+                if (!quiet)
+                    virReportSystemError(errno,
+                                         _("Could not stat %s"), path);
                 return -1;
             }
             swtpmBinaries[i].path = g_steal_pointer(&path);
@@ -326,7 +347,7 @@ virTPMBinaryGetCaps(virTPMBinary binary,
 
     virMutexLock(&swtpm_tools_lock);
 
-    if (virTPMEmulatorInit() < 0)
+    if (virTPMEmulatorInit(false) < 0)
         goto cleanup;
 
     if (!swtpmBinaries[binary].caps &&
diff --git a/src/util/virtpm.h b/src/util/virtpm.h
index 4c16332f9b..0a82a03b69 100644
--- a/src/util/virtpm.h
+++ b/src/util/virtpm.h
@@ -26,6 +26,8 @@ char *virTPMGetSwtpm(void);
 char *virTPMGetSwtpmSetup(void);
 char *virTPMGetSwtpmIoctl(void);
 
+bool virTPMHasSwtpm(void);
+
 bool virTPMSwtpmCapsGet(unsigned int cap);
 bool virTPMSwtpmSetupCapsGet(unsigned int cap);
 
-- 
2.33.1

Reply via email to