]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Add function to get FDPass object from monitor
authorJim Fehlig <jfehlig@suse.com>
Thu, 6 Feb 2025 22:20:27 +0000 (15:20 -0700)
committerJim Fehlig <jfehlig@suse.com>
Thu, 20 Mar 2025 17:17:47 +0000 (11:17 -0600)
Add new function qemuFDPassNewFromMonitor to get an fdset previously
passed to qemu, based on the 'prefix' provided when the qemuFDPass
object was initially created.

Signed-off-by: Jim Fehlig <jfehlig@suse.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
src/qemu/qemu_fd.c
src/qemu/qemu_fd.h

index e847056573e708e1efedf7813ca349ba645512ae..333f9b128e164797f23346e4d5cb39ed26289f3c 100644 (file)
@@ -115,6 +115,52 @@ qemuFDPassNewPassed(unsigned int fdSetID)
 }
 
 
+/**
+ * qemuFDPassNewFromMonitor:
+ * @prefix: Prefix of an FDset which was already passed to qemu
+ * @mon: monitor object
+ *
+ * Query the monitor for already passed FDsets and return a new qemuFDPass
+ * object if one is found to contain an fd with associated @prefix. Returns
+ * NULL on failure or if no matching FDset is found. Similar to
+ * qemuFDPassNewPassed, this is useful along with qemuFDPassTransferMonitorRollback
+ * when only knowing the qemuFDPass prefix.
+ */
+qemuFDPass *
+qemuFDPassNewFromMonitor(const char *prefix, qemuMonitor *mon)
+{
+    g_autoptr(qemuMonitorFdsets) fdsets = NULL;
+    qemuFDPass *fdpass = NULL;
+    size_t i;
+
+    VIR_DEBUG("prefix = %s", prefix);
+
+    if (qemuMonitorQueryFdsets(mon, &fdsets) < 0)
+        return NULL;
+
+    for (i = 0; i < fdsets->nfdsets; i++) {
+        qemuMonitorFdsetInfo fdset = fdsets->fdsets[i];
+        size_t j;
+
+        for (j = 0; j < fdset.nfds; j++) {
+            qemuMonitorFdsetFdInfo fdinfo = fdset.fds[j];
+
+            VIR_DEBUG("fdinfo opaque = %s", fdinfo.opaque);
+            if (STRPREFIX(prefix, fdinfo.opaque)) {
+                fdpass = g_new0(qemuFDPass, 1);
+
+                fdpass->fdSetID = fdset.id;
+                fdpass->prefix = g_strdup(prefix);
+                fdpass->path = g_strdup_printf("/dev/fdset/%u", fdset.id);
+                fdpass->passed = true;
+            }
+        }
+    }
+
+    return fdpass;
+}
+
+
 /**
  * qemuFDPassIsPassed:
  * @fdpass: The fd passing helper struct
index cd0ff2c690c0eb4844c4ad448a2397f045e538fd..d873e110a874a5b9b896a4424292d39da3fba0c0 100644 (file)
@@ -34,6 +34,10 @@ qemuFDPassNew(const char *prefix,
 qemuFDPass *
 qemuFDPassNewPassed(unsigned int fdSetID);
 
+qemuFDPass *
+qemuFDPassNewFromMonitor(const char *prefix, qemuMonitor *mon)
+    ATTRIBUTE_NONNULL(1);
+
 bool
 qemuFDPassIsPassed(qemuFDPass *fdpass,
                    unsigned *id);