qemuSlirp *slirp;
size_t i;
g_autoptr(virJSONValue) hostnetprops = NULL;
+ qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
if (qemuDomainValidateActualNetDef(net, qemuCaps) < 0)
return -1;
ret = 0;
cleanup:
+ qemuDomainNetworkPrivateClearFDs(netpriv);
+
if (ret < 0) {
virErrorPtr saved_err;
}
+void
+qemuDomainNetworkPrivateClearFDs(qemuDomainNetworkPrivate *priv)
+{
+ if (!priv)
+ return;
+
+ g_clear_pointer(&priv->slirpfd, qemuFDPassFree);
+ g_clear_pointer(&priv->vdpafd, qemuFDPassFree);
+ g_slist_free_full(g_steal_pointer(&priv->vhostfds), (GDestroyNotify) qemuFDPassFree);
+ g_slist_free_full(g_steal_pointer(&priv->tapfds), (GDestroyNotify) qemuFDPassFree);
+}
+
+
static void
qemuDomainNetworkPrivateDispose(void *obj G_GNUC_UNUSED)
{
qemuDomainNetworkPrivate *priv = obj;
qemuSlirpFree(priv->slirp);
+
+ qemuDomainNetworkPrivateClearFDs(priv);
}
virObject parent;
qemuSlirp *slirp;
+
+ /* file descriptor transfer helpers */
+ qemuFDPass *slirpfd;
+ GSList *tapfds;
+ GSList *vhostfds;
+ qemuFDPass *vdpafd;
};
+void
+qemuDomainNetworkPrivateClearFDs(qemuDomainNetworkPrivate *priv);
typedef enum {
QEMU_PROCESS_EVENT_WATCHDOG = 0,
{
qemuDomainObjPrivate *priv = vm->privateData;
virDomainDeviceDef dev = { VIR_DOMAIN_DEVICE_NET, { .net = net } };
+ qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
virErrorPtr originalError = NULL;
g_autofree char *slirpfdName = NULL;
int slirpfd = -1;
ret = 0;
cleanup:
+ qemuDomainNetworkPrivateClearFDs(netpriv);
+
if (ret < 0) {
virErrorPreserveLast(&save_err);
if (releaseaddr)