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>
---
src/qemu/qemu_fd.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_fd.h | 4 ++++
2 files changed, 50 insertions(+)
diff --git a/src/qemu/qemu_fd.c b/src/qemu/qemu_fd.c
index e847056573..333f9b128e 100644
--- a/src/qemu/qemu_fd.c
+++ b/src/qemu/qemu_fd.c
@@ -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
diff --git a/src/qemu/qemu_fd.h b/src/qemu/qemu_fd.h
index cd0ff2c690..d873e110a8 100644
--- a/src/qemu/qemu_fd.h
+++ b/src/qemu/qemu_fd.h
@@ -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);
--
2.43.0