From nobody Mon Feb 9 01:43:14 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1639053244; cv=none; d=zohomail.com; s=zohoarc; b=D8Ufe/GHVxnN84a0ihjxZMOyglrIoY7dkqjJ4ZvyWOr7NS2sc+DgEmxJVHd0l0x4vYzXKBx7LEvc5o9VUEyHOOJ1Pf/kTzmLZeRa8VDBwqwr2CJFwju8DeQ24PeLf6gX6RLfbOHAGGy/ZzhNu2MdFwpo9xXUSnm6xlETJxjrXU8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1639053244; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=70SAtufOPdGjg44BPzS4K0qEFqtbGUKXGDErI5Vvozs=; b=YQ+VGI9mPRBLcZnYzkS76JHZisCgrXiJ7Njn4Zn+Mn8tf3ai0SqyyxlrD2h82y45zZ9fb0/lHPwcystPdRBRNV5GdEDwtkMClAyvw0DL+X9eoqV6Uyrv4egjo8xyFzTlmTAlutYaOQAZGcdZwMsAXRu1wDvBlUxTliiyK38vyW0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1639053244466238.30967206757714; Thu, 9 Dec 2021 04:34:04 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-592-npQOtkboMyefk8o3xGtNbQ-1; Thu, 09 Dec 2021 07:33:59 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 800D6760DA; Thu, 9 Dec 2021 12:33:55 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6036160BF1; Thu, 9 Dec 2021 12:33:55 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 06DEF4A709; Thu, 9 Dec 2021 12:33:55 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 1B9CVGow017739 for ; Thu, 9 Dec 2021 07:31:16 -0500 Received: by smtp.corp.redhat.com (Postfix) id A1A161B472; Thu, 9 Dec 2021 12:31:16 +0000 (UTC) Received: from speedmetal.redhat.com (unknown [10.40.208.10]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0391C60C25 for ; Thu, 9 Dec 2021 12:31:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1639053243; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=70SAtufOPdGjg44BPzS4K0qEFqtbGUKXGDErI5Vvozs=; b=Z77AUABfgdpjBTHoVH0Awe7LMdbcGU+9Rbb/0SYB2UcC2y9xw722Yh3iVtuOQiVymFsrQg 7vR0fKq/cCAQKJjSXnibotyvWGf0/QnrBCg61nsIX72ArTrFHh1lViSlqNhPvsXEtlgJKu Q/RFvoWH8zHL9reQkBQRY5lAL/J7jRA= X-MC-Unique: npQOtkboMyefk8o3xGtNbQ-1 From: Peter Krempa To: libvir-list@redhat.com Subject: [PATCH 14/24] qemuBuildChardevCommand: Move earlier Date: Thu, 9 Dec 2021 13:30:49 +0100 Message-Id: <2a36e31369ffb34dc1c6c0e1037f5ecb3695a676.1639052639.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1639053245854100001 Content-Type: text/plain; charset="utf-8" Make it accessible sooner inside qemu_command.c Signed-off-by: Peter Krempa --- src/qemu/qemu_command.c | 442 ++++++++++++++++++++-------------------- 1 file changed, 221 insertions(+), 221 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f6aab6a52c..874f875c5a 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1306,6 +1306,227 @@ qemuBuildTLSx509CommandLine(virCommand *cmd, } +static void +qemuBuildChrChardevReconnectStr(virBuffer *buf, + const virDomainChrSourceReconnectDef *def) +{ + if (def->enabled =3D=3D VIR_TRISTATE_BOOL_YES) { + virBufferAsprintf(buf, ",reconnect=3D%u", def->timeout); + } else if (def->enabled =3D=3D VIR_TRISTATE_BOOL_NO) { + virBufferAddLit(buf, ",reconnect=3D0"); + } +} + + +static int +qemuBuildChardevCommand(virCommand *cmd, + virQEMUDriverConfig *cfg, + const virDomainChrSourceDef *dev, + const char *alias, + virQEMUCaps *qemuCaps) +{ + qemuDomainChrSourcePrivate *chrSourcePriv =3D QEMU_DOMAIN_CHR_SOURCE_P= RIVATE(dev); + g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; + bool telnet; + g_autofree char *charAlias =3D NULL; + + if (!(charAlias =3D qemuAliasChardevFromDevAlias(alias))) + return -1; + + switch ((virDomainChrType) dev->type) { + case VIR_DOMAIN_CHR_TYPE_NULL: + virBufferAsprintf(&buf, "null,id=3D%s", charAlias); + break; + + case VIR_DOMAIN_CHR_TYPE_VC: + virBufferAsprintf(&buf, "vc,id=3D%s", charAlias); + break; + + case VIR_DOMAIN_CHR_TYPE_PTY: + virBufferAsprintf(&buf, "pty,id=3D%s", charAlias); + break; + + case VIR_DOMAIN_CHR_TYPE_DEV: + virBufferAsprintf(&buf, "%s,id=3D%s,path=3D", + STRPREFIX(alias, "parallel") ? "parport" : "tty", + charAlias); + virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); + break; + + case VIR_DOMAIN_CHR_TYPE_FILE: + virBufferAsprintf(&buf, "file,id=3D%s", charAlias); + + if (chrSourcePriv->fd !=3D -1) { + g_autofree char *fdset =3D NULL; + size_t idx; + + virCommandPassFDIndex(cmd, chrSourcePriv->fd, + VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); + fdset =3D qemuBuildFDSet(chrSourcePriv->fd, idx); + chrSourcePriv->fd =3D -1; + + virCommandAddArg(cmd, "-add-fd"); + virCommandAddArg(cmd, fdset); + + virBufferAsprintf(&buf, ",path=3D/dev/fdset/%zu,append=3Don", = idx); + } else { + virBufferAddLit(&buf, ",path=3D"); + virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); + if (dev->data.file.append !=3D VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&buf, ",append=3D%s", + virTristateSwitchTypeToString(dev->data.= file.append)); + } + } + break; + + case VIR_DOMAIN_CHR_TYPE_PIPE: + virBufferAsprintf(&buf, "pipe,id=3D%s,path=3D", charAlias); + virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); + break; + + case VIR_DOMAIN_CHR_TYPE_STDIO: + virBufferAsprintf(&buf, "stdio,id=3D%s", charAlias); + break; + + case VIR_DOMAIN_CHR_TYPE_UDP: { + const char *connectHost =3D dev->data.udp.connectHost; + const char *bindHost =3D dev->data.udp.bindHost; + const char *bindService =3D dev->data.udp.bindService; + + if (connectHost =3D=3D NULL) + connectHost =3D ""; + if (bindHost =3D=3D NULL) + bindHost =3D ""; + if (bindService =3D=3D NULL) + bindService =3D "0"; + + virBufferAsprintf(&buf, + "udp,id=3D%s,host=3D%s,port=3D%s,localaddr=3D%s," + "localport=3D%s", + charAlias, + connectHost, + dev->data.udp.connectService, + bindHost, bindService); + break; + } + case VIR_DOMAIN_CHR_TYPE_TCP: + telnet =3D dev->data.tcp.protocol =3D=3D VIR_DOMAIN_CHR_TCP_PROTOC= OL_TELNET; + virBufferAsprintf(&buf, + "socket,id=3D%s,host=3D%s,port=3D%s%s", + charAlias, + dev->data.tcp.host, + dev->data.tcp.service, + telnet ? ",telnet=3Don" : ""); + + if (dev->data.tcp.listen) { + virBufferAddLit(&buf, ",server=3Don"); + if (!chrSourcePriv->wait) + virBufferAddLit(&buf, ",wait=3Doff"); + } + + qemuBuildChrChardevReconnectStr(&buf, &dev->data.tcp.reconnect); + + if (dev->data.tcp.haveTLS =3D=3D VIR_TRISTATE_BOOL_YES) { + g_autofree char *objalias =3D NULL; + const char *tlsCertEncSecAlias =3D NULL; + + /* Add the secret object first if necessary. The + * secinfo is added only to a TCP serial device during + * qemuDomainSecretChardevPrepare. Subsequently called + * functions can just check the config fields */ + if (chrSourcePriv && chrSourcePriv->secinfo) { + if (qemuBuildObjectSecretCommandLine(cmd, + chrSourcePriv->secinf= o, + qemuCaps) < 0) + return -1; + + tlsCertEncSecAlias =3D chrSourcePriv->secinfo->alias; + } + + if (!(objalias =3D qemuAliasTLSObjFromSrcAlias(charAlias))) + return -1; + + if (qemuBuildTLSx509CommandLine(cmd, cfg->chardevTLSx509certdi= r, + dev->data.tcp.listen, + cfg->chardevTLSx509verify, + tlsCertEncSecAlias, + objalias, qemuCaps) < 0) { + return -1; + } + + virBufferAsprintf(&buf, ",tls-creds=3D%s", objalias); + } + break; + + case VIR_DOMAIN_CHR_TYPE_UNIX: + virBufferAsprintf(&buf, "socket,id=3D%s", charAlias); + if (chrSourcePriv->fd !=3D -1) { + virBufferAsprintf(&buf, ",fd=3D%d", chrSourcePriv->fd); + + virCommandPassFD(cmd, chrSourcePriv->fd, VIR_COMMAND_PASS_FD_C= LOSE_PARENT); + chrSourcePriv->fd =3D -1; + } else { + virBufferAddLit(&buf, ",path=3D"); + virQEMUBuildBufferEscapeComma(&buf, dev->data.nix.path); + } + if (dev->data.nix.listen) { + virBufferAddLit(&buf, ",server=3Don"); + if (!chrSourcePriv->wait) + virBufferAddLit(&buf, ",wait=3Doff"); + } + + qemuBuildChrChardevReconnectStr(&buf, &dev->data.nix.reconnect); + break; + + case VIR_DOMAIN_CHR_TYPE_SPICEVMC: + virBufferAsprintf(&buf, "spicevmc,id=3D%s,name=3D%s", charAlias, + virDomainChrSpicevmcTypeToString(dev->data.spice= vmc)); + break; + + case VIR_DOMAIN_CHR_TYPE_SPICEPORT: + virBufferAsprintf(&buf, "spiceport,id=3D%s,name=3D%s", charAlias, + dev->data.spiceport.channel); + break; + + case VIR_DOMAIN_CHR_TYPE_NMDM: + case VIR_DOMAIN_CHR_TYPE_LAST: + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported chardev '%s'"), + virDomainChrTypeToString(dev->type)); + return -1; + } + + if (dev->logfile) { + if (chrSourcePriv->logfd !=3D -1) { + g_autofree char *fdset =3D NULL; + size_t idx; + + virCommandPassFDIndex(cmd, chrSourcePriv->logfd, + VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); + fdset =3D qemuBuildFDSet(chrSourcePriv->logfd, idx); + chrSourcePriv->logfd =3D -1; + + virCommandAddArg(cmd, "-add-fd"); + virCommandAddArg(cmd, fdset); + + virBufferAsprintf(&buf, ",logfile=3D/dev/fdset/%zu,logappend= =3Don", idx); + } else { + virBufferAddLit(&buf, ",logfile=3D"); + virQEMUBuildBufferEscapeComma(&buf, dev->logfile); + if (dev->logappend !=3D VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&buf, ",logappend=3D%s", + virTristateSwitchTypeToString(dev->logap= pend)); + } + } + } + + virCommandAddArgList(cmd, "-chardev", virBufferCurrentContent(&buf), N= ULL); + + return 0; +} + + static char * qemuBuildNetworkDriveURI(virStorageSource *src) { @@ -4967,18 +5188,6 @@ qemuBuildSCSIHostdevDevProps(const virDomainDef *def, return g_steal_pointer(&props); } -static void -qemuBuildChrChardevReconnectStr(virBuffer *buf, - const virDomainChrSourceReconnectDef *def) -{ - if (def->enabled =3D=3D VIR_TRISTATE_BOOL_YES) { - virBufferAsprintf(buf, ",reconnect=3D%u", def->timeout); - } else if (def->enabled =3D=3D VIR_TRISTATE_BOOL_NO) { - virBufferAddLit(buf, ",reconnect=3D0"); - } -} - - int qemuOpenChrChardevUNIXSocket(const virDomainChrSourceDef *dev) { @@ -5036,215 +5245,6 @@ qemuOpenChrChardevUNIXSocket(const virDomainChrSour= ceDef *dev) } -static int -qemuBuildChardevCommand(virCommand *cmd, - virQEMUDriverConfig *cfg, - const virDomainChrSourceDef *dev, - const char *alias, - virQEMUCaps *qemuCaps) -{ - qemuDomainChrSourcePrivate *chrSourcePriv =3D QEMU_DOMAIN_CHR_SOURCE_P= RIVATE(dev); - g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; - bool telnet; - g_autofree char *charAlias =3D NULL; - - if (!(charAlias =3D qemuAliasChardevFromDevAlias(alias))) - return -1; - - switch ((virDomainChrType) dev->type) { - case VIR_DOMAIN_CHR_TYPE_NULL: - virBufferAsprintf(&buf, "null,id=3D%s", charAlias); - break; - - case VIR_DOMAIN_CHR_TYPE_VC: - virBufferAsprintf(&buf, "vc,id=3D%s", charAlias); - break; - - case VIR_DOMAIN_CHR_TYPE_PTY: - virBufferAsprintf(&buf, "pty,id=3D%s", charAlias); - break; - - case VIR_DOMAIN_CHR_TYPE_DEV: - virBufferAsprintf(&buf, "%s,id=3D%s,path=3D", - STRPREFIX(alias, "parallel") ? "parport" : "tty", - charAlias); - virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); - break; - - case VIR_DOMAIN_CHR_TYPE_FILE: - virBufferAsprintf(&buf, "file,id=3D%s", charAlias); - - if (chrSourcePriv->fd !=3D -1) { - g_autofree char *fdset =3D NULL; - size_t idx; - - virCommandPassFDIndex(cmd, chrSourcePriv->fd, - VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); - fdset =3D qemuBuildFDSet(chrSourcePriv->fd, idx); - chrSourcePriv->fd =3D -1; - - virCommandAddArg(cmd, "-add-fd"); - virCommandAddArg(cmd, fdset); - - virBufferAsprintf(&buf, ",path=3D/dev/fdset/%zu,append=3Don", = idx); - } else { - virBufferAddLit(&buf, ",path=3D"); - virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); - if (dev->data.file.append !=3D VIR_TRISTATE_SWITCH_ABSENT) { - virBufferAsprintf(&buf, ",append=3D%s", - virTristateSwitchTypeToString(dev->data.= file.append)); - } - } - break; - - case VIR_DOMAIN_CHR_TYPE_PIPE: - virBufferAsprintf(&buf, "pipe,id=3D%s,path=3D", charAlias); - virQEMUBuildBufferEscapeComma(&buf, dev->data.file.path); - break; - - case VIR_DOMAIN_CHR_TYPE_STDIO: - virBufferAsprintf(&buf, "stdio,id=3D%s", charAlias); - break; - - case VIR_DOMAIN_CHR_TYPE_UDP: { - const char *connectHost =3D dev->data.udp.connectHost; - const char *bindHost =3D dev->data.udp.bindHost; - const char *bindService =3D dev->data.udp.bindService; - - if (connectHost =3D=3D NULL) - connectHost =3D ""; - if (bindHost =3D=3D NULL) - bindHost =3D ""; - if (bindService =3D=3D NULL) - bindService =3D "0"; - - virBufferAsprintf(&buf, - "udp,id=3D%s,host=3D%s,port=3D%s,localaddr=3D%s," - "localport=3D%s", - charAlias, - connectHost, - dev->data.udp.connectService, - bindHost, bindService); - break; - } - case VIR_DOMAIN_CHR_TYPE_TCP: - telnet =3D dev->data.tcp.protocol =3D=3D VIR_DOMAIN_CHR_TCP_PROTOC= OL_TELNET; - virBufferAsprintf(&buf, - "socket,id=3D%s,host=3D%s,port=3D%s%s", - charAlias, - dev->data.tcp.host, - dev->data.tcp.service, - telnet ? ",telnet=3Don" : ""); - - if (dev->data.tcp.listen) { - virBufferAddLit(&buf, ",server=3Don"); - if (!chrSourcePriv->wait) - virBufferAddLit(&buf, ",wait=3Doff"); - } - - qemuBuildChrChardevReconnectStr(&buf, &dev->data.tcp.reconnect); - - if (dev->data.tcp.haveTLS =3D=3D VIR_TRISTATE_BOOL_YES) { - g_autofree char *objalias =3D NULL; - const char *tlsCertEncSecAlias =3D NULL; - - /* Add the secret object first if necessary. The - * secinfo is added only to a TCP serial device during - * qemuDomainSecretChardevPrepare. Subsequently called - * functions can just check the config fields */ - if (chrSourcePriv && chrSourcePriv->secinfo) { - if (qemuBuildObjectSecretCommandLine(cmd, - chrSourcePriv->secinf= o, - qemuCaps) < 0) - return -1; - - tlsCertEncSecAlias =3D chrSourcePriv->secinfo->alias; - } - - if (!(objalias =3D qemuAliasTLSObjFromSrcAlias(charAlias))) - return -1; - - if (qemuBuildTLSx509CommandLine(cmd, cfg->chardevTLSx509certdi= r, - dev->data.tcp.listen, - cfg->chardevTLSx509verify, - tlsCertEncSecAlias, - objalias, qemuCaps) < 0) { - return -1; - } - - virBufferAsprintf(&buf, ",tls-creds=3D%s", objalias); - } - break; - - case VIR_DOMAIN_CHR_TYPE_UNIX: - virBufferAsprintf(&buf, "socket,id=3D%s", charAlias); - if (chrSourcePriv->fd !=3D -1) { - virBufferAsprintf(&buf, ",fd=3D%d", chrSourcePriv->fd); - - virCommandPassFD(cmd, chrSourcePriv->fd, VIR_COMMAND_PASS_FD_C= LOSE_PARENT); - chrSourcePriv->fd =3D -1; - } else { - virBufferAddLit(&buf, ",path=3D"); - virQEMUBuildBufferEscapeComma(&buf, dev->data.nix.path); - } - if (dev->data.nix.listen) { - virBufferAddLit(&buf, ",server=3Don"); - if (!chrSourcePriv->wait) - virBufferAddLit(&buf, ",wait=3Doff"); - } - - qemuBuildChrChardevReconnectStr(&buf, &dev->data.nix.reconnect); - break; - - case VIR_DOMAIN_CHR_TYPE_SPICEVMC: - virBufferAsprintf(&buf, "spicevmc,id=3D%s,name=3D%s", charAlias, - virDomainChrSpicevmcTypeToString(dev->data.spice= vmc)); - break; - - case VIR_DOMAIN_CHR_TYPE_SPICEPORT: - virBufferAsprintf(&buf, "spiceport,id=3D%s,name=3D%s", charAlias, - dev->data.spiceport.channel); - break; - - case VIR_DOMAIN_CHR_TYPE_NMDM: - case VIR_DOMAIN_CHR_TYPE_LAST: - default: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unsupported chardev '%s'"), - virDomainChrTypeToString(dev->type)); - return -1; - } - - if (dev->logfile) { - if (chrSourcePriv->logfd !=3D -1) { - g_autofree char *fdset =3D NULL; - size_t idx; - - virCommandPassFDIndex(cmd, chrSourcePriv->logfd, - VIR_COMMAND_PASS_FD_CLOSE_PARENT, &idx); - fdset =3D qemuBuildFDSet(chrSourcePriv->logfd, idx); - chrSourcePriv->logfd =3D -1; - - virCommandAddArg(cmd, "-add-fd"); - virCommandAddArg(cmd, fdset); - - virBufferAsprintf(&buf, ",logfile=3D/dev/fdset/%zu,logappend= =3Don", idx); - } else { - virBufferAddLit(&buf, ",logfile=3D"); - virQEMUBuildBufferEscapeComma(&buf, dev->logfile); - if (dev->logappend !=3D VIR_TRISTATE_SWITCH_ABSENT) { - virBufferAsprintf(&buf, ",logappend=3D%s", - virTristateSwitchTypeToString(dev->logap= pend)); - } - } - } - - virCommandAddArgList(cmd, "-chardev", virBufferCurrentContent(&buf), N= ULL); - - return 0; -} - - static const char * qemuBuildHostdevMdevModelTypeString(virDomainHostdevSubsysMediatedDev *mde= v) { --=20 2.31.1