case VIR_DOMAIN_CHR_TYPE_UNIX:
virBufferAsprintf(&buf, "socket,id=%s", charAlias);
- if (chrSourcePriv->sourcefd) {
- virBufferAsprintf(&buf, ",fd=%s", qemuFDPassGetPath(chrSourcePriv->sourcefd));
+ if (chrSourcePriv->directfd) {
+ virBufferAsprintf(&buf, ",fd=%s", qemuFDPassDirectGetPath(chrSourcePriv->directfd));
} else {
virBufferAddLit(&buf, ",path=");
virQEMUBuildBufferEscapeComma(&buf, dev->data.nix.path);
break;
case VIR_DOMAIN_CHR_TYPE_FILE:
- case VIR_DOMAIN_CHR_TYPE_UNIX:
if (qemuFDPassTransferCommand(chrSourcePriv->sourcefd, cmd) < 0)
return -1;
+
+ break;
+
+ case VIR_DOMAIN_CHR_TYPE_UNIX:
+ qemuFDPassDirectTransferCommand(chrSourcePriv->directfd, cmd);
break;
case VIR_DOMAIN_CHR_TYPE_NULL:
qemuDomainVideoPrivate *videopriv = QEMU_DOMAIN_VIDEO_PRIVATE(video);
g_autoptr(virDomainChrSourceDef) chrsrc = virDomainChrSourceDefNew(priv->driver->xmlopt);
g_autofree char *chrAlias = qemuDomainGetVhostUserChrAlias(video->info.alias);
+ g_autofree char *name = g_strdup_printf("%s-vhost-user", video->info.alias);
qemuDomainChrSourcePrivate *chrsrcpriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(chrsrc);
chrsrc->type = VIR_DOMAIN_CHR_TYPE_UNIX;
- chrsrcpriv->sourcefd = qemuFDPassNewDirect(video->info.alias, priv);
-
- qemuFDPassAddFD(chrsrcpriv->sourcefd, &videopriv->vhost_user_fd, "-vhost-user");
+ chrsrcpriv->directfd = qemuFDPassDirectNew(name, &videopriv->vhost_user_fd);
if (qemuBuildChardevCommand(cmd, chrsrc, chrAlias, priv->qemuCaps) < 0)
return -1;
g_clear_pointer(&priv->sourcefd, qemuFDPassFree);
g_clear_pointer(&priv->logfd, qemuFDPassFree);
+ g_clear_pointer(&priv->directfd, qemuFDPassDirectFree);
}
qemuFDPass *sourcefd;
qemuFDPass *logfd;
+ qemuFDPassDirect *directfd;
bool wait; /* wait for incoming connections on chardev */
char *tlsCertPath; /* path to certificates if TLS is requested */
if (qemuProcessPrepareHostBackendChardevHotplug(vm, dev) < 0)
goto cleanup;
- if (charpriv->sourcefd || charpriv->logfd) {
+ if (charpriv->sourcefd || charpriv->logfd || charpriv->directfd) {
qemuDomainObjEnterMonitor(driver, vm);
if (qemuFDPassTransferMonitor(charpriv->sourcefd, priv->mon) < 0 ||
- qemuFDPassTransferMonitor(charpriv->logfd, priv->mon) < 0)
+ qemuFDPassTransferMonitor(charpriv->logfd, priv->mon) < 0 ||
+ qemuFDPassDirectTransferMonitor(charpriv->directfd, priv->mon) < 0)
goto exit_monitor;
qemuDomainObjExitMonitor(vm);
waitval = VIR_TRISTATE_BOOL_NO;
}
- if (chrSourcePriv->sourcefd) {
- if (!(addr = qemuMonitorJSONBuildFDSocketAddress(qemuFDPassGetPath(chrSourcePriv->sourcefd))))
+ if (chrSourcePriv->directfd) {
+ if (!(addr = qemuMonitorJSONBuildFDSocketAddress(qemuFDPassDirectGetPath(chrSourcePriv->directfd))))
return NULL;
} else {
if (!(addr = qemuMonitorJSONBuildUnixSocketAddress(chr->data.nix.path)))
case VIR_DOMAIN_CHR_TYPE_UNIX:
if (chardev->data.nix.listen) {
+ g_autofree char *name = g_strdup_printf("%s-source", devalias);
VIR_AUTOCLOSE sourcefd = -1;
if (qemuSecuritySetSocketLabel(data->priv->driver->securityManager, data->def) < 0)
sourcefd < 0)
return -1;
- charpriv->sourcefd = qemuFDPassNewDirect(devalias, data->priv);
-
- qemuFDPassAddFD(charpriv->sourcefd, &sourcefd, "-source");
+ charpriv->directfd = qemuFDPassDirectNew(name, &sourcefd);
}
break;
qemuDomainChrSourcePrivate *charpriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(chardev);
int fakesourcefd = -1;
const char *devalias = NULL;
- bool usefdset = true;
if (vm)
priv = vm->privateData;
case VIR_DOMAIN_CHR_TYPE_FILE:
fakesourcefd = 1750;
+
+ if (fcntl(fakesourcefd, F_GETFD) != -1)
+ abort();
+
+ charpriv->sourcefd = qemuFDPassNew(devalias, priv);
+ qemuFDPassAddFD(charpriv->sourcefd, &fakesourcefd, "-source");
break;
case VIR_DOMAIN_CHR_TYPE_UNIX:
- if (chardev->data.nix.listen)
+ if (chardev->data.nix.listen) {
+ g_autofree char *name = g_strdup_printf("%s-source", devalias);
fakesourcefd = 1729;
- usefdset = false;
+ charpriv->directfd = qemuFDPassDirectNew(name, &fakesourcefd);
+ }
+
break;
case VIR_DOMAIN_CHR_TYPE_NMDM:
break;
}
- if (fakesourcefd != -1) {
- if (fcntl(fakesourcefd, F_GETFD) != -1)
- abort();
-
- if (usefdset)
- charpriv->sourcefd = qemuFDPassNew(devalias, priv);
- else
- charpriv->sourcefd = qemuFDPassNewDirect(devalias, priv);
-
- qemuFDPassAddFD(charpriv->sourcefd, &fakesourcefd, "-source");
- }
-
if (chardev->logfile) {
int fd = 1751;