virJSONValue *
-qemuBuildHostNetProps(virDomainNetDef *net,
- const char *slirpfd)
+qemuBuildHostNetProps(virDomainNetDef *net)
{
virDomainNetType netType = virDomainNetGetActualType(net);
size_t i;
break;
case VIR_DOMAIN_NET_TYPE_USER:
- if (slirpfd) {
- if (virJSONValueObjectAdd(&netprops, "s:type", "socket", NULL) < 0 ||
- virJSONValueObjectAppendString(netprops, "fd", slirpfd) < 0)
+ if (netpriv->slirpfd) {
+ if (virJSONValueObjectAdd(&netprops,
+ "s:type", "socket",
+ "s:fd", qemuFDPassGetPath(netpriv->slirpfd),
+ NULL) < 0)
return NULL;
} else {
if (virJSONValueObjectAdd(&netprops, "s:type", "user", NULL) < 0)
int ret = -1;
g_autoptr(virJSONValue) nicprops = NULL;
g_autofree char *nic = NULL;
- g_autofree char *slirpfdName = NULL;
virDomainNetType actualType = virDomainNetGetActualType(net);
const virNetDevBandwidth *actualBandwidth;
bool requireNicdev = false;
- qemuSlirp *slirp;
g_autoptr(virJSONValue) hostnetprops = NULL;
qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
GSList *n;
virNetDevSetMTU(net->ifname, net->mtu) < 0)
goto cleanup;
- slirp = QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp;
- if (slirp && !standalone) {
- int slirpfd = qemuSlirpGetFD(slirp);
- virCommandPassFD(cmd, slirpfd,
- VIR_COMMAND_PASS_FD_CLOSE_PARENT);
- slirpfdName = g_strdup_printf("%d", slirpfd);
- }
-
for (n = netpriv->tapfds; n; n = n->next) {
if (qemuFDPassTransferCommand(n->data, cmd) < 0)
return -1;
return -1;
}
- if (qemuFDPassTransferCommand(netpriv->vdpafd, cmd) < 0)
+ if (qemuFDPassTransferCommand(netpriv->slirpfd, cmd) < 0 ||
+ qemuFDPassTransferCommand(netpriv->vdpafd, cmd) < 0)
return -1;
- if (!(hostnetprops = qemuBuildHostNetProps(net,
- slirpfdName)))
+ if (!(hostnetprops = qemuBuildHostNetProps(net)))
goto cleanup;
if (qemuBuildNetdevCommandlineFromJSON(cmd, hostnetprops, qemuCaps) < 0)
"%s", _("Failed to start slirp"));
goto cleanup;
}
-
- slirpfd = qemuSlirpGetFD(slirp);
- slirpfdName = g_strdup_printf("slirpfd-%s", net->info.alias);
}
break;
virNetDevSetMTU(net->ifname, net->mtu) < 0)
goto cleanup;
- if (!(netprops = qemuBuildHostNetProps(net,
- slirpfdName)))
+ if (!(netprops = qemuBuildHostNetProps(net)))
goto cleanup;
qemuDomainObjEnterMonitor(driver, vm);
}
}
- if (qemuFDPassTransferMonitor(netpriv->vdpafd, priv->mon) < 0) {
+ if (qemuFDPassTransferMonitor(netpriv->slirpfd, priv->mon) < 0 ||
+ qemuFDPassTransferMonitor(netpriv->vdpafd, priv->mon) < 0) {
qemuDomainObjExitMonitor(vm);
goto cleanup;
}
{
qemuDomainObjPrivate *priv = vm->privateData;
virQEMUDriver *driver = priv->driver;
- qemuSlirp *slirp = QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp;
+ qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
+ qemuSlirp *slirp = netpriv->slirp;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
g_autoptr(virCommand) cmd = NULL;
g_autofree char *pidfile = NULL;
int cmdret = 0;
VIR_AUTOCLOSE errfd = -1;
bool killDBusDaemon = false;
+ g_autofree char *fdname = g_strdup_printf("slirpfd-%s", net->info.alias);
if (!slirp)
return 0;
slirp->pid = pid;
+ netpriv->slirpfd = qemuFDPassNewDirect(fdname, priv);
+
+ qemuFDPassAddFD(netpriv->slirpfd, &slirp->fd[0], NULL);
+
return 0;
error: