]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu/dbus: keep a connection to the VM D-Bus
authorMarc-André Lureau <marcandre.lureau@redhat.com>
Sun, 16 Mar 2025 08:18:34 +0000 (12:18 +0400)
committerMartin Kletzander <mkletzan@redhat.com>
Tue, 18 Mar 2025 13:15:56 +0000 (14:15 +0100)
The following changes are going to communicate with the qemu-rdp server
through the VM D-Bus bus, keep a connection for that and further usage.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
src/qemu/qemu_dbus.c
src/qemu/qemu_dbus.h
src/qemu/qemu_domain.h
src/qemu/qemu_process.c

index 06b655d870883c25d067132e7ad3f5e02645893f..c9e99ea27bcf0ad1e26bd1f730592d05ee73b795 100644 (file)
@@ -84,6 +84,36 @@ qemuDBusGetAddress(virQEMUDriver *driver,
 }
 
 
+bool
+qemuDBusConnect(virQEMUDriver *driver,
+                virDomainObj *vm)
+{
+    qemuDomainObjPrivate *priv = vm->privateData;
+    g_autoptr(GError) gerr = NULL;
+    g_autofree char *address = NULL;
+
+    if (priv->dbusConnection)
+        return true;
+
+    address = qemuDBusGetAddress(driver, vm);
+    if (!address)
+        return false;
+
+    priv->dbusConnection =
+        g_dbus_connection_new_for_address_sync(address,
+                                               G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT|
+                                               G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION,
+                                               NULL, NULL, &gerr);
+    if (!priv->dbusConnection) {
+        virReportError(VIR_ERR_OPERATION_FAILED,
+                      _("Failed to connect to dbus-daemon: %1$s"), gerr->message);
+        return false;
+    }
+
+    return true;
+}
+
+
 static int
 qemuDBusWriteConfig(const char *filename, const char *path)
 {
@@ -140,6 +170,8 @@ qemuDBusStop(virQEMUDriver *driver,
     } else {
         priv->dbusDaemonRunning = false;
     }
+
+    g_clear_object(&priv->dbusConnection);
 }
 
 
@@ -264,6 +296,9 @@ qemuDBusStart(virQEMUDriver *driver,
     if (qemuSecurityDomainSetPathLabel(driver, vm, sockpath, false) < 0)
         goto cleanup;
 
+    if (!qemuDBusConnect(driver, vm))
+        goto cleanup;
+
     priv->dbusDaemonRunning = true;
     ret = 0;
  cleanup:
index b27f38a59116d2712399842894e0214eafb5dead..2d97c6df2d8e39d8aa18b512d39791cce0f68611 100644 (file)
@@ -24,6 +24,9 @@
 char *qemuDBusGetAddress(virQEMUDriver *driver,
                          virDomainObj *vm);
 
+bool qemuDBusConnect(virQEMUDriver *driver,
+                     virDomainObj *vm);
+
 int qemuDBusStart(virQEMUDriver *driver,
                   virDomainObj *vm);
 
index 8e53a270a78964407b551dabfb34ec97508eab53..a70617f3c056b293ffa5c383a22fabe155013f73 100644 (file)
@@ -39,6 +39,7 @@
 #include "qemu_fd.h"
 #include "virchrdev.h"
 #include "virobject.h"
+#include "virgdbus.h"
 #include "virdomainmomentobjlist.h"
 #include "virenum.h"
 #include "vireventthread.h"
@@ -240,6 +241,7 @@ struct _qemuDomainObjPrivate {
     /* running backup job */
     virDomainBackupDef *backup;
 
+    GDBusConnection *dbusConnection;
     bool dbusDaemonRunning;
 
     /* list of Ids to migrate */
index 0173fbe3be937c8bbdf89a112944f4f26a05f3d8..1eb670e6bac4419c1d4913bbe7a344ce05395867 100644 (file)
@@ -9405,6 +9405,9 @@ qemuProcessReconnect(void *opaque)
     if (qemuDomainObjStartWorker(obj) < 0)
         goto error;
 
+    if (priv->dbusDaemonRunning && !qemuDBusConnect(driver, obj))
+        goto error;
+
     VIR_DEBUG("Reconnect monitor to def=%p name='%s'", obj, obj->def->name);
 
     tryMonReconn = true;