From nobody Sat May 30 14:34:24 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1776867646; cv=none; d=zohomail.com; s=zohoarc; b=TYDTryc3fNckdLa62D7RdM2hP5nXqfqSGuM3kDuZDeK/ykB/7ubMzN9SuFQ0Q08gQo031KOAxqEtXYQ5R36SgdDGXdX/dA9sO5FpvZU9rxPgEtsaZmoy5Nj0JwB4j/SqLTaXhpZV3vTSVnuTX0yH/GMKlvOQAzzuVnbhwfs5kFo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1776867646; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=+XyeXeXfAqY/q5C2aLDjSKAIfzm8qPliWsKlGPPAvok=; b=OaRO2Vpgmyrlla7m2yud3O0NuwCS8/JDuX60K7ZYxnLjTAi86zm/OMhuDgceq53DU5V0GBx87wrDntbmsHmJEa+i4NFCh0OWw9PbmS6lcTF4YAsdwVxZIi6P2vxTHp0ozzBM346Tw2QttjGcZBlqQfBihbfaST0xco3aK4KBHAA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1776867646180903.4145819164125; Wed, 22 Apr 2026 07:20:46 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id B133041983; Wed, 22 Apr 2026 10:20:44 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 872DD41ADC; Wed, 22 Apr 2026 10:15:05 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 93C4341853; Wed, 22 Apr 2026 10:14:55 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id AC2FD41866 for ; Wed, 22 Apr 2026 10:14:50 -0400 (EDT) Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-503-BElhoxgNNe686SjQ_ffF9w-1; Wed, 22 Apr 2026 10:14:48 -0400 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 3EAA0180061E for ; Wed, 22 Apr 2026 14:14:48 +0000 (UTC) Received: from localhost (unknown [10.44.22.21]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id DB71B1800446; Wed, 22 Apr 2026 14:14:46 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1776867290; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+XyeXeXfAqY/q5C2aLDjSKAIfzm8qPliWsKlGPPAvok=; b=R2i/VX0Rp0qVuFcOMkWPxdiPZRRKwL+UT6c0NSVAmMlDc4IrGiBFcgBWvjiAmhXRdUDsx9 oY7ZXAv5F0Z9xzahWkebKHUuieDV9G7uRkHKBmzCgAULVh85RUrkGEESD6Y8GOfVO673mf njQu/5teknbpG/Ptcv7ao6Je7BIJQDc= X-MC-Unique: BElhoxgNNe686SjQ_ffF9w-1 X-Mimecast-MFC-AGG-ID: BElhoxgNNe686SjQ_ffF9w_1776867288 To: devel@lists.libvirt.org Subject: [PATCH RFC 1/6] qemu: add standalone VNC state directory Date: Wed, 22 Apr 2026 18:14:32 +0400 Message-ID: <20260422141437.4120522-2-marcandre.lureau@redhat.com> In-Reply-To: <20260422141437.4120522-1-marcandre.lureau@redhat.com> References: <20260422141437.4120522-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: zdB-K2-lc5hzwQOe688bhUjwKYfOrcjph8VK1OBoJLI_1776867288 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID-Hash: PQWHOHWYYFFD3GFJNN4QVWNFKYA7RZJ3 X-Message-ID-Hash: PQWHOHWYYFFD3GFJNN4QVWNFKYA7RZJ3 X-MailFrom: marcandre.lureau@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "marcandre.lureau--- via Devel" Reply-To: marcandre.lureau@redhat.com X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1776867646682158500 From: Marc-Andr=C3=A9 Lureau Add a state directory for the standalone qemu-vnc process, following the same pattern used for the RDP state directory. Signed-off-by: Marc-Andr=C3=A9 Lureau --- src/qemu/qemu_conf.c | 2 ++ src/qemu/qemu_conf.h | 1 + src/qemu/qemu_driver.c | 12 ++++++++++++ 3 files changed, 15 insertions(+) diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index f2f9cc8a21..724617ee8b 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -242,6 +242,7 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privil= eged, cfg->autostartDir =3D g_strdup_printf("%s/qemu/autostart", cfg->config= BaseDir); cfg->slirpStateDir =3D g_strdup_printf("%s/slirp", cfg->stateDir); cfg->rdpStateDir =3D g_strdup_printf("%s/rdp", cfg->stateDir); + cfg->vncStateDir =3D g_strdup_printf("%s/vnc", cfg->stateDir); cfg->passtStateDir =3D g_strdup_printf("%s/passt", cfg->stateDir); cfg->dbusStateDir =3D g_strdup_printf("%s/dbus", cfg->stateDir); =20 @@ -368,6 +369,7 @@ static void virQEMUDriverConfigDispose(void *obj) g_free(cfg->passtStateDir); g_free(cfg->dbusStateDir); g_free(cfg->rdpStateDir); + g_free(cfg->vncStateDir); =20 g_free(cfg->libDir); g_free(cfg->cacheDir); diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 511ab77f71..d558f3ab19 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -112,6 +112,7 @@ struct _virQEMUDriverConfig { char *passtStateDir; char *dbusStateDir; char *rdpStateDir; + char *vncStateDir; /* These two directories are ones QEMU processes use (so must match * the QEMU user/group */ char *libDir; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d227ac58cd..83d0bab126 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -658,6 +658,11 @@ qemuStateInitialize(bool privileged, cfg->rdpStateDir); goto error; } + if (g_mkdir_with_parents(cfg->vncStateDir, 0777) < 0) { + virReportSystemError(errno, _("Failed to create vnc state dir %1$s= "), + cfg->vncStateDir); + goto error; + } =20 qemu_driver->inhibitor =3D virInhibitorNew( VIR_INHIBITOR_WHAT_SHUTDOWN, @@ -830,6 +835,13 @@ qemuStateInitialize(bool privileged, (int)cfg->group); goto error; } + if (chown(cfg->vncStateDir, cfg->user, cfg->group) < 0) { + virReportSystemError(errno, + _("unable to set ownership of '%1$s' to %= 2$d:%3$d"), + cfg->vncStateDir, (int)cfg->user, + (int)cfg->group); + goto error; + } =20 run_uid =3D cfg->user; run_gid =3D cfg->group; --=20 2.53.0 From nobody Sat May 30 14:34:24 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1776867795; cv=none; d=zohomail.com; s=zohoarc; b=Js9K0ZkYTO6sA0y8n1Noqeo5jRL7LXy/rRBhu9SheccYxRdxDu9ifaONjRiQ5MA3J9jo2XhJaQIrs8x3szdIJ5bgk6b9rNr33gpBXDOU61QP8C8NsdKwBrg0us0cJwu79lWjJEYysa+n8N9lxHMxoUqsZBzA38inbrNEigrOk74= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1776867795; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=zaxkYfsKVY8URfbGturD/ylg3WlOAAJ2vwrqq6UJjFA=; b=R8JEIyJMSwq3zwnSt2j2id+Ff2yWtzQiSh3UOk3vF7mQ+zlLgvNQEZlN0mFaItHK3+4hE4/g1DMRQVRXDW1LdFhWDwQ/edWzjz25onxDVpd/5hAKlFhh+la+HpjyP+fJwtI6sF5PNIVwaPc5X+sbM0RKAcBbTk29/WxByaAHN1g= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1776867795532689.9634518202301; Wed, 22 Apr 2026 07:23:15 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 9103541966; Wed, 22 Apr 2026 10:23:14 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 292D841B28; Wed, 22 Apr 2026 10:15:24 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 9DC5E418FD; Wed, 22 Apr 2026 10:15:17 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id AEC1541941 for ; Wed, 22 Apr 2026 10:14:56 -0400 (EDT) Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-518-FBfNC6fhPP-jLyXYjywvIg-1; Wed, 22 Apr 2026 10:14:54 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 096B819560AF for ; Wed, 22 Apr 2026 14:14:54 +0000 (UTC) Received: from localhost (unknown [10.44.22.21]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id B73981956095; Wed, 22 Apr 2026 14:14:52 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1776867296; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zaxkYfsKVY8URfbGturD/ylg3WlOAAJ2vwrqq6UJjFA=; b=Yn0wuEyr50JIJXcDluiYO1C8q3bX8fhqSUPxsGcWgXfNemS4whUns4MJvF7qaFJmewsWGw CuicctS+2fAI1JV+XZ82ldd87fl70Vtp+Io3CtifX6yvPRkMmtrSxHhdaID1z1g2ZCg95K orXCHmB42pV5sRM7tcMLsuK4x8+vskc= X-MC-Unique: FBfNC6fhPP-jLyXYjywvIg-1 X-Mimecast-MFC-AGG-ID: FBfNC6fhPP-jLyXYjywvIg_1776867294 To: devel@lists.libvirt.org Subject: [PATCH RFC 2/6] qemu: add qemu-vnc configuration Date: Wed, 22 Apr 2026 18:14:33 +0400 Message-ID: <20260422141437.4120522-3-marcandre.lureau@redhat.com> In-Reply-To: <20260422141437.4120522-1-marcandre.lureau@redhat.com> References: <20260422141437.4120522-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: SS1FRIldehVBmlG4yrdjRIR8VCb-XrUq_9ZJqEecWBU_1776867294 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID-Hash: SMMPIVMB7MH5HWQLL5OE5Y6ACNEKRJMK X-Message-ID-Hash: SMMPIVMB7MH5HWQLL5OE5Y6ACNEKRJMK X-MailFrom: marcandre.lureau@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "marcandre.lureau--- via Devel" Reply-To: marcandre.lureau@redhat.com X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1776867798889154100 From: Marc-Andr=C3=A9 Lureau Add qemu_vnc configuration entry to specify the path to the standalone qemu-vnc binary. Signed-off-by: Marc-Andr=C3=A9 Lureau --- src/qemu/libvirtd_qemu.aug | 1 + src/qemu/qemu.conf.in | 8 ++++++++ src/qemu/qemu_conf.c | 6 ++++++ src/qemu/qemu_conf.h | 1 + src/qemu/test_libvirtd_qemu.aug.in | 1 + 5 files changed, 17 insertions(+) diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug index eb790d48be..311992e441 100644 --- a/src/qemu/libvirtd_qemu.aug +++ b/src/qemu/libvirtd_qemu.aug @@ -123,6 +123,7 @@ module Libvirtd_qemu =3D | str_entry "pr_helper" | str_entry "slirp_helper" | str_entry "qemu_rdp" + | str_entry "qemu_vnc" | str_entry "dbus_daemon" | bool_entry "set_process_name" | int_entry "max_processes" diff --git a/src/qemu/qemu.conf.in b/src/qemu/qemu.conf.in index 5eacd70022..97b0141cf6 100644 --- a/src/qemu/qemu.conf.in +++ b/src/qemu/qemu.conf.in @@ -1094,6 +1094,14 @@ #qemu_rdp =3D "qemu-rdp" =20 =20 +# Path to the standalone qemu-vnc VNC server. +# When available and both and +# are configured, libvirt will use qemu-vnc instead of QEMU's built-in VNC. +# If this is not an absolute path, the program will be searched for +# in $PATH. +#qemu_vnc =3D "qemu-vnc" + + # Path to the dbus-daemon # If this is not an absolute path, the program will be searched for # in $PATH. diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 724617ee8b..6981edda18 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -116,6 +116,7 @@ VIR_ONCE_GLOBAL_INIT(virQEMUConfig); #define QEMU_BRIDGE_HELPER "qemu-bridge-helper" #define QEMU_PR_HELPER "qemu-pr-helper" #define QEMU_RDP "qemu-rdp" +#define QEMU_VNC "qemu-vnc" #define QEMU_DBUS_DAEMON "dbus-daemon" =20 =20 @@ -290,6 +291,7 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool privil= eged, cfg->slirpHelperName =3D g_strdup(QEMU_SLIRP_HELPER); cfg->dbusDaemonName =3D g_strdup(QEMU_DBUS_DAEMON); cfg->qemuRdpName =3D g_strdup(QEMU_RDP); + cfg->qemuVncName =3D g_strdup(QEMU_VNC); =20 cfg->securityDefaultConfined =3D true; cfg->securityRequireConfined =3D false; @@ -421,6 +423,7 @@ static void virQEMUDriverConfigDispose(void *obj) g_free(cfg->slirpHelperName); g_free(cfg->dbusDaemonName); g_free(cfg->qemuRdpName); + g_free(cfg->qemuVncName); =20 g_free(cfg->autoDumpPath); =20 @@ -858,6 +861,9 @@ virQEMUDriverConfigLoadProcessEntry(virQEMUDriverConfig= *cfg, if (virConfGetValueString(conf, "qemu_rdp", &cfg->qemuRdpName) < 0) return -1; =20 + if (virConfGetValueString(conf, "qemu_vnc", &cfg->qemuVncName) < 0) + return -1; + if (virConfGetValueBool(conf, "set_process_name", &cfg->setProcessName= ) < 0) return -1; if (virConfGetValueUInt(conf, "max_processes", &cfg->maxProcesses) < 0) diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index d558f3ab19..5ea1b28f3e 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -199,6 +199,7 @@ struct _virQEMUDriverConfig { char *slirpHelperName; char *dbusDaemonName; char *qemuRdpName; + char *qemuVncName; =20 bool macFilter; =20 diff --git a/src/qemu/test_libvirtd_qemu.aug.in b/src/qemu/test_libvirtd_qe= mu.aug.in index 2582c6a09c..c4cf9cf634 100644 --- a/src/qemu/test_libvirtd_qemu.aug.in +++ b/src/qemu/test_libvirtd_qemu.aug.in @@ -129,6 +129,7 @@ module Test_libvirtd_qemu =3D { "pr_helper" =3D "qemu-pr-helper" } { "slirp_helper" =3D "/usr/bin/slirp-helper" } { "qemu_rdp" =3D "qemu-rdp" } +{ "qemu_vnc" =3D "qemu-vnc" } { "dbus_daemon" =3D "dbus-daemon" } { "swtpm_user" =3D "tss" } { "swtpm_group" =3D "tss" } --=20 2.53.0 From nobody Sat May 30 14:34:24 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1776867923; cv=none; d=zohomail.com; s=zohoarc; b=lx5bufCqAVzdeHnS5h1oKLejjvBf7kMwHO38UZguzupxpUP85tGNBXngRnsv99+R6EaSWDNRzXlsxq9a1wlE5t/eRdYAC14r/U+uClOYy17YrQ1Nh+OUI8xREvV4nbUUkr6gmaRDe2jnY7eHyI4NB9arsVQhJuK4bbW2bGTmvac= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1776867923; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=6hpNAM1MaLhARe+JsLnqUcX4ER+DpJ5zB19PqDaioDM=; b=jPHpq4+KKkia0OIKRLgZeh3G7MDubuD0pYVOxtHOLdQW/TF3+omYDEMYno1Wr3MBdZ+/Qjas1ZfTl8jZtm/aYGeVpFKA9s9kHf5sTWMi39rWoPIQjeBJJciLvWM9+uRtUIxqHfgeBPTg3NkNFTg5Njib5RdUC731DoF8Xb1uAUc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1776867923743386.012463251417; Wed, 22 Apr 2026 07:25:23 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 401D241953; Wed, 22 Apr 2026 10:25:22 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 8744741B0F; Wed, 22 Apr 2026 10:18:49 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 1689541962; Wed, 22 Apr 2026 10:18:43 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 2A18B41AA0 for ; Wed, 22 Apr 2026 10:15:03 -0400 (EDT) Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-184-MZZYoDa4Pye9NtMXmZKSSg-1; Wed, 22 Apr 2026 10:15:00 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2DF3F195609D for ; Wed, 22 Apr 2026 14:15:00 +0000 (UTC) Received: from localhost (unknown [10.44.22.21]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 7CBA11956095; Wed, 22 Apr 2026 14:14:58 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1776867302; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6hpNAM1MaLhARe+JsLnqUcX4ER+DpJ5zB19PqDaioDM=; b=cKJ6xrkJZOHtY8hKGJjiwPW7hKYLNhmO83Y1sn0c6vddUiDvClHdM5WmtH0cSU7qH7Zkrq 7G7Bj2LLeh9h1CryPryUpaOl4QZ5cY3Ur4KV0w+jtP1fErLHnEJpbH1HmOezGgysNBFYhc rEnaRcVqPHnbj1gJT4DGWQmeyy5CgSc= X-MC-Unique: MZZYoDa4Pye9NtMXmZKSSg-1 X-Mimecast-MFC-AGG-ID: MZZYoDa4Pye9NtMXmZKSSg_1776867300 To: devel@lists.libvirt.org Subject: [PATCH RFC 3/6] qemu: add qemu-vnc helper unit Date: Wed, 22 Apr 2026 18:14:34 +0400 Message-ID: <20260422141437.4120522-4-marcandre.lureau@redhat.com> In-Reply-To: <20260422141437.4120522-1-marcandre.lureau@redhat.com> References: <20260422141437.4120522-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: AmzjGsrBSAm_8-gl9wXi5DqPofk_7b5jJ8NJU3oZA4E_1776867300 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 72XX7W6CMAOEOLRXHQAKDC664REBXSQN X-Message-ID-Hash: 72XX7W6CMAOEOLRXHQAKDC664REBXSQN X-MailFrom: marcandre.lureau@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "marcandre.lureau--- via Devel" Reply-To: marcandre.lureau@redhat.com X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1776867924458158500 From: Marc-Andr=C3=A9 Lureau Add helpers to manage the standalone qemu-vnc VNC server process. The qemu-vnc server connects to QEMU via the D-Bus display interface, providing VNC access decoupled from the QEMU process. The helper handles process lifecycle (start/stop), D-Bus name watching, and provides D-Bus methods for password management, certificate reloading, and client connections. Signed-off-by: Marc-Andr=C3=A9 Lureau --- po/POTFILES | 1 + src/qemu/meson.build | 1 + src/qemu/qemu_vnc.c | 407 +++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_vnc.h | 41 +++++ 4 files changed, 450 insertions(+) create mode 100644 src/qemu/qemu_vnc.c create mode 100644 src/qemu/qemu_vnc.h diff --git a/po/POTFILES b/po/POTFILES index a5f8705eb8..a4e3ed6f25 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -208,6 +208,7 @@ src/qemu/qemu_validate.c src/qemu/qemu_vhost_user.c src/qemu/qemu_vhost_user_gpu.c src/qemu/qemu_virtiofs.c +src/qemu/qemu_vnc.c src/remote/libvirtd.policy.in src/remote/remote_daemon.c src/remote/remote_daemon_config.c diff --git a/src/qemu/meson.build b/src/qemu/meson.build index b4fb62f14f..9737e50734 100644 --- a/src/qemu/meson.build +++ b/src/qemu/meson.build @@ -43,6 +43,7 @@ qemu_driver_sources =3D [ 'qemu_vhost_user.c', 'qemu_vhost_user_gpu.c', 'qemu_virtiofs.c', + 'qemu_vnc.c', ] =20 driver_source_files +=3D files(qemu_driver_sources) diff --git a/src/qemu/qemu_vnc.c b/src/qemu/qemu_vnc.c new file mode 100644 index 0000000000..4afdf6aa79 --- /dev/null +++ b/src/qemu/qemu_vnc.c @@ -0,0 +1,407 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include + +#include + +#include "qemu_dbus.h" +#include "qemu_extdevice.h" +#include "qemu_security.h" +#include "qemu_vnc.h" +#include "virerror.h" +#include "virlog.h" +#include "virpidfile.h" +#include "virgdbus.h" + +#define VIR_FROM_THIS VIR_FROM_NONE + +VIR_LOG_INIT("qemu.vnc"); + +#define ORG_QEMU_VNC "org.qemu.vnc" +#define ORG_QEMU_VNC_PATH "/org/qemu/Vnc1/Server" +#define ORG_QEMU_VNC_IFACE "org.qemu.Vnc1.Server" + + +void +qemuVncFree(qemuVnc *vnc) +{ + if (!vnc) + return; + + g_free(vnc); +} + + +qemuVnc * +qemuVncNew(void) +{ + g_autoptr(qemuVnc) vnc =3D g_new0(qemuVnc, 1); + + vnc->pid =3D -1; + + return g_steal_pointer(&vnc); +} + + +static char * +qemuVncCreatePidFilename(virDomainObj *vm) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + virQEMUDriver *driver =3D priv->driver; + g_autofree char *shortName =3D virDomainDefGetShortName(vm->def); + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + g_autofree char *name =3D NULL; + + name =3D g_strdup_printf("%s-vnc", shortName); + + return virPidFileBuildPath(cfg->vncStateDir, name); +} + + +void +qemuVncStop(virDomainObj *vm, virDomainGraphicsDef *gfx) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + qemuDomainGraphicsPrivate *gfxpriv =3D QEMU_DOMAIN_GRAPHICS_PRIVATE(gf= x); + qemuVnc *vnc =3D gfxpriv->vnc; + g_autofree char *pidfile =3D qemuVncCreatePidFilename(vm); + virErrorPtr orig_err; + + if (!vnc) + return; + + if (vnc->leaving_id) { + g_dbus_connection_signal_unsubscribe(priv->dbusConnection, vnc->le= aving_id); + vnc->leaving_id =3D 0; + } + g_clear_handle_id(&vnc->name_watch, g_bus_unwatch_name); + + virErrorPreserveLast(&orig_err); + + if (virPidFileForceCleanupPath(pidfile) < 0) { + VIR_WARN("Unable to kill qemu-vnc process"); + } else { + vnc->pid =3D -1; + } + + virErrorRestore(&orig_err); +} + + +int +qemuVncSetupCgroup(qemuVnc *vnc, + virCgroup *cgroup) +{ + return virCgroupAddProcess(cgroup, vnc->pid); +} + + +static void +on_leaving_signal(GDBusConnection *connection, + const gchar *sender_name G_GNUC_UNUSED, + const gchar *object_path G_GNUC_UNUSED, + const gchar *interface_name G_GNUC_UNUSED, + const gchar *signal_name G_GNUC_UNUSED, + GVariant *parameters, + gpointer user_data) +{ + qemuVnc *vnc =3D user_data; + const gchar *reason; + + g_variant_get(parameters, "(&s)", &reason); + VIR_DEBUG("%s.Leaving reason: '%s'", ORG_QEMU_VNC_IFACE, reason); + g_dbus_connection_signal_unsubscribe(connection, vnc->leaving_id); + vnc->leaving_id =3D 0; +} + + +static void +name_appeared_cb(GDBusConnection *connection, + const gchar *name G_GNUC_UNUSED, + const gchar *name_owner G_GNUC_UNUSED, + gpointer user_data) +{ + qemuVnc *vnc =3D user_data; + + VIR_DEBUG("'%s' appeared", name); + vnc->name_appeared =3D true; + + if (!vnc->leaving_id) { + vnc->leaving_id =3D g_dbus_connection_signal_subscribe( + connection, + ORG_QEMU_VNC, + ORG_QEMU_VNC_IFACE, + "Leaving", + ORG_QEMU_VNC_PATH, + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + on_leaving_signal, + vnc, + NULL); + } +} + + +static void +name_vanished_cb(GDBusConnection *connection G_GNUC_UNUSED, + const gchar *name, + gpointer user_data) +{ + qemuVnc *vnc =3D user_data; + + if (vnc->name_appeared && vnc->leaving_id) { + virReportError(VIR_ERR_INTERNAL_ERROR, _("'%1$s' vanished unexpect= edly"), name); + } +} + + +int +qemuVncStart(virDomainObj *vm, virDomainGraphicsDef *gfx) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + virQEMUDriver *driver =3D priv->driver; + qemuDomainGraphicsPrivate *gfxpriv =3D QEMU_DOMAIN_GRAPHICS_PRIVATE(gf= x); + qemuVnc *vnc =3D gfxpriv->vnc; + virDomainGraphicsListenDef *glisten =3D NULL; + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + g_autoptr(virCommand) cmd =3D NULL; + g_autofree char *shortName =3D virDomainDefGetShortName(vm->def); + g_autofree char *pidfile =3D NULL; + g_autofree char *logname =3D NULL; + g_autofree char *dbus_addr =3D qemuDBusGetAddress(driver, vm); + g_auto(virBuffer) vnc_addr =3D VIR_BUFFER_INITIALIZER; + pid_t pid =3D -1; + int logfd =3D -1; + g_autoptr(domainLogContext) logContext =3D NULL; + + if (vnc->pid !=3D -1) { + return 0; + } + + if (!dbus_addr) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("no D-Bus address")= ); + return -1; + } + + if (!(pidfile =3D qemuVncCreatePidFilename(vm))) + return -1; + + logname =3D g_strdup_printf("%s-qemu-vnc", shortName); + if (!(logContext =3D domainLogContextNew(cfg->stdioLogD, cfg->logDir, + QEMU_DRIVER_NAME, + vm, driver->privileged, + logname))) { + virLastErrorPrefixMessage("%s", _("can't open log context")); + return -1; + } + + logfd =3D domainLogContextGetWriteFD(logContext); + + cmd =3D virCommandNew(cfg->qemuVncName); + virCommandClearCaps(cmd); + virCommandSetPidFile(cmd, pidfile); + virCommandSetOutputFD(cmd, &logfd); + virCommandSetErrorFD(cmd, &logfd); + virCommandDaemonize(cmd); + virCommandAddArgPair(cmd, "--dbus-address", dbus_addr); + virCommandAddArgPair(cmd, "--bus-name", "org.qemu"); + virCommandAddArg(cmd, "--wait"); + + /* Build VNC listen address */ + if ((glisten =3D virDomainGraphicsGetListen(gfx, 0))) { + switch (glisten->type) { + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS: + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK: + if (glisten->address) { + bool escapeAddr =3D strchr(glisten->address, ':') !=3D NUL= L; + if (escapeAddr) + virBufferAsprintf(&vnc_addr, "[%s]", glisten->address); + else + virBufferAdd(&vnc_addr, glisten->address, -1); + } else { + virBufferAddLit(&vnc_addr, "localhost"); + } + virBufferAsprintf(&vnc_addr, ":%d", + gfx->data.vnc.port > 0 + ? gfx->data.vnc.port - 5900 : 0); + break; + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET: + virBufferAsprintf(&vnc_addr, "unix:%s", glisten->socket); + break; + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE: + virBufferAddLit(&vnc_addr, "none"); + break; + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: + default: + virBufferAddLit(&vnc_addr, "localhost:0"); + break; + } + + virCommandAddArg(cmd, "--vnc-addr"); + virCommandAddArgBuffer(cmd, &vnc_addr); + } + + if (gfx->data.vnc.websocket > 0) { + g_autofree char *ws =3D g_strdup_printf("%d", gfx->data.vnc.websoc= ket); + virCommandAddArgPair(cmd, "--websocket", ws); + } + + if (gfx->data.vnc.sharePolicy !=3D VIR_DOMAIN_GRAPHICS_VNC_SHARE_DEFAU= LT) { + virCommandAddArgPair(cmd, "--share", + virDomainGraphicsVNCSharePolicyTypeToString( + gfx->data.vnc.sharePolicy)); + } + + if (gfx->data.vnc.keymap) + virCommandAddArgPair(cmd, "--keyboard-layout", gfx->data.vnc.keyma= p); + + if (gfx->data.vnc.auth.passwd || cfg->vncPassword) + virCommandAddArg(cmd, "--password"); + + if (cfg->vncTLS && cfg->vncTLSx509certdir) + virCommandAddArgPair(cmd, "--tls-creds", cfg->vncTLSx509certdir); + + if (cfg->vncSASL) { + virCommandAddArg(cmd, "--sasl"); + + if (cfg->vncSASLdir) + virCommandAddEnvPair(cmd, "SASL_CONF_PATH", cfg->vncSASLdir); + } + + vnc->name_watch =3D g_bus_watch_name_on_connection(priv->dbusConnectio= n, + ORG_QEMU_VNC, + G_BUS_NAME_WATCHER_FL= AGS_NONE, + name_appeared_cb, + name_vanished_cb, + vnc, + NULL); + + if (qemuExtDeviceLogCommand(driver, vm, cmd, "qemu-vnc") < 0) + goto error; + + if (qemuSecurityCommandRun(driver, vm, cmd, -1, -1, false, NULL) < 0) + goto error; + + if (virPidFileReadPath(pidfile, &pid) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unable to read qemu-vnc pidfile '%1$s'"), + pidfile); + goto error; + } + + if (virProcessKill(pid, 0) !=3D 0) { + g_autofree char *msg =3D NULL; + + if (domainLogContextReadFiltered(logContext, &msg, 1024) < 0) + VIR_WARN("Unable to read from qemu-vnc log"); + + virReportError(VIR_ERR_OPERATION_FAILED, + _("qemu-vnc died and reported:\n%1$s"), + NULLSTR(msg)); + goto error; + } + + vnc->pid =3D pid; + + return 0; + + error: + g_clear_handle_id(&vnc->name_watch, g_bus_unwatch_name); + qemuVncStop(vm, gfx); + return -1; +} + + +int +qemuVncSetPassword(virDomainObj *vm, + const char *password) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + g_autoptr(GVariant) args =3D NULL; + + args =3D g_variant_new("(s)", password); + + return virGDBusCallMethod(priv->dbusConnection, + NULL, + G_VARIANT_TYPE("()"), + NULL, + ORG_QEMU_VNC, + ORG_QEMU_VNC_PATH, + ORG_QEMU_VNC_IFACE, + "SetPassword", + args); +} + + +int +qemuVncReloadCertificates(virDomainObj *vm) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + + return virGDBusCallMethod(priv->dbusConnection, + NULL, + G_VARIANT_TYPE("()"), + NULL, + ORG_QEMU_VNC, + ORG_QEMU_VNC_PATH, + ORG_QEMU_VNC_IFACE, + "ReloadCertificates", + NULL); +} + + +int +qemuVncAddClient(virDomainObj *vm, + int fd, + bool skipauth) +{ + qemuDomainObjPrivate *priv =3D vm->privateData; + g_autoptr(GUnixFDList) fdlist =3D NULL; + g_autoptr(GVariant) args =3D NULL; + gint fd_idx; + + fdlist =3D g_unix_fd_list_new(); + fd_idx =3D g_unix_fd_list_append(fdlist, fd, NULL); + if (fd_idx < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("failed to append FD to list")); + return -1; + } + + args =3D g_variant_new("(hb)", fd_idx, skipauth); + + return virGDBusCallMethodWithFD(priv->dbusConnection, + NULL, + G_VARIANT_TYPE("()"), + NULL, + NULL, + ORG_QEMU_VNC, + ORG_QEMU_VNC_PATH, + ORG_QEMU_VNC_IFACE, + "AddClient", + args, + fdlist); +} + + +/** + * qemuVncAvailable: + * @helper: name (or path to) 'qemu-vnc' binary + * + * Returns whether 'qemu-vnc' is available. + * + * Important: + * This function is called from 'virQEMUDriverGetDomainCapabilities'. It m= ust + * not report any errors and must not add any additional checks. + * + * This function is mocked from 'tests/testutilsqemu.c' + */ +bool +qemuVncAvailable(const char *helper) +{ + g_autofree char *helperPath =3D NULL; + + return !!(helperPath =3D virFindFileInPath(helper)); +} diff --git a/src/qemu/qemu_vnc.h b/src/qemu/qemu_vnc.h new file mode 100644 index 0000000000..6a0d2124c5 --- /dev/null +++ b/src/qemu/qemu_vnc.h @@ -0,0 +1,41 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#pragma once + +#include "qemu_conf.h" + +typedef struct _qemuVnc qemuVnc; +struct _qemuVnc { + pid_t pid; + guint name_watch; + bool name_appeared; + guint leaving_id; +}; + +bool qemuVncAvailable(const char *helper); + +qemuVnc *qemuVncNew(void); + +void qemuVncFree(qemuVnc *vnc); + +int qemuVncStart(virDomainObj *vm, + virDomainGraphicsDef *gfx); + +void qemuVncStop(virDomainObj *vm, + virDomainGraphicsDef *gfx); + +int qemuVncSetupCgroup(qemuVnc *vnc, + virCgroup *cgroup); + +int qemuVncSetPassword(virDomainObj *vm, + const char *password); + +int qemuVncReloadCertificates(virDomainObj *vm); + +int qemuVncAddClient(virDomainObj *vm, + int fd, + bool skipauth); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuVnc, qemuVncFree); --=20 2.53.0 From nobody Sat May 30 14:34:24 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1776868034; cv=none; d=zohomail.com; s=zohoarc; b=VyoQZMY/zj7/TldpnUNWvF4GZ2QJHs9kHCsbhPMVbQ92/s+6vDufWNKNurGKRFqs1pNWXsxFBvsQAokOwoNabQYG0aMu4j5NRIl3sWfN/VV489qh2mdRtxz935MBLyRcgVMHlgNUSLz5OHDnuee45+JhLeYmE8IKA3bDOsBpHd4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1776868034; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=1rx8AqAX/4a2zRdokO4zOwzK6IlBinHjifiWZB7R6HI=; b=j9nOZzJLdBGIhu2bOPZZBlilQWUR75HASDSecPUuSDXN+91VWs0A/4c+/9eIqlom2osopU6u+adOTKq8wqWmhH6KtI52oZzlucIAGHhtj9Ge0bMylZ9bDBWbC2kZ8eNRlfpHUtOQeAXx/5NN36AiGa0NYzZVet+8e8pCP6kIrvs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1776868034484135.81257993505494; Wed, 22 Apr 2026 07:27:14 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id DD5DC419AA; Wed, 22 Apr 2026 10:27:13 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 7671541979; Wed, 22 Apr 2026 10:21:06 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 3122241A24; Wed, 22 Apr 2026 10:20:58 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 9C72341942 for ; Wed, 22 Apr 2026 10:15:10 -0400 (EDT) Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-693-9iihYwCDO8CszU6oNOIU5g-1; Wed, 22 Apr 2026 10:15:07 -0400 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id B66181956089 for ; Wed, 22 Apr 2026 14:15:06 +0000 (UTC) Received: from localhost (unknown [10.44.22.21]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 0E870180047F; Wed, 22 Apr 2026 14:15:04 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1776867310; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1rx8AqAX/4a2zRdokO4zOwzK6IlBinHjifiWZB7R6HI=; b=HTezdL1FIoAH0EcB1cOQwx3KXs44dcuZKeQJGqJ6WFb5CZsZuskQi+jYnBXRohQsRggqMy JtGXKEvskKjtRlQQqtStR2nFNCtcGJc8zNbQSkuDI1lSehwUSglrgV0d//1adtg8t7LV/8 /9uSf2g8J3jUKsIzzxuZRY57qTxohfc= X-MC-Unique: 9iihYwCDO8CszU6oNOIU5g-1 X-Mimecast-MFC-AGG-ID: 9iihYwCDO8CszU6oNOIU5g_1776867306 To: devel@lists.libvirt.org Subject: [PATCH RFC 4/6] qemu: integrate standalone VNC in domain lifecycle Date: Wed, 22 Apr 2026 18:14:35 +0400 Message-ID: <20260422141437.4120522-5-marcandre.lureau@redhat.com> In-Reply-To: <20260422141437.4120522-1-marcandre.lureau@redhat.com> References: <20260422141437.4120522-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 4sNMs0vWj0UPAv9ogBvbShHfxEBbZulQN5SM04jc0Y8_1776867306 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID-Hash: WQUT2ND6AMUO4Q6GQIBKZ56DQVP3INTF X-Message-ID-Hash: WQUT2ND6AMUO4Q6GQIBKZ56DQVP3INTF X-MailFrom: marcandre.lureau@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "marcandre.lureau--- via Devel" Reply-To: marcandre.lureau@redhat.com X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1776868036507154100 From: Marc-Andr=C3=A9 Lureau When both a D-Bus display and a VNC graphics device are configured and the qemu-vnc binary is available, use the standalone VNC server instead of QEMU's built-in VNC. During domain preparation, detect whether the standalone VNC path applies and allocate the qemuVnc context. Skip the built-in -vnc command line argument when standalone VNC is active. Start and stop the qemu-vnc process through the external device hooks. Signed-off-by: Marc-Andr=C3=A9 Lureau --- src/qemu/qemu_command.c | 2 ++ src/qemu/qemu_domain.c | 1 + src/qemu/qemu_domain.h | 2 ++ src/qemu/qemu_extdevice.c | 13 +++++++++++-- src/qemu/qemu_process.c | 40 ++++++++++++++++++++++++++++++++++++++- 5 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 5b7423e354..a35205bd25 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8806,6 +8806,8 @@ qemuBuildGraphicsCommandLine(virQEMUDriverConfig *cfg, =20 break; case VIR_DOMAIN_GRAPHICS_TYPE_VNC: + if (QEMU_DOMAIN_GRAPHICS_PRIVATE(graphics)->vnc) + break; if (qemuBuildGraphicsVNCCommandLine(cfg, def, cmd, graphics) < 0) return -1; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 91d57ee60b..dc6282d811 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1040,6 +1040,7 @@ qemuDomainGraphicsPrivateDispose(void *obj) g_free(priv->tlsAlias); g_clear_pointer(&priv->secinfo, qemuDomainSecretInfoFree); g_clear_pointer(&priv->rdp, qemuRdpFree); + g_clear_pointer(&priv->vnc, qemuVncFree); } =20 =20 diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index b321a64e96..24e62dd2e7 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -36,6 +36,7 @@ #include "qemu_migration_params.h" #include "qemu_nbdkit.h" #include "qemu_rdp.h" +#include "qemu_vnc.h" #include "qemu_slirp.h" #include "qemu_fd.h" #include "virchrdev.h" @@ -417,6 +418,7 @@ struct _qemuDomainGraphicsPrivate { char *tlsAlias; qemuDomainSecretInfo *secinfo; qemuRdp *rdp; + qemuVnc *vnc; }; =20 =20 diff --git a/src/qemu/qemu_extdevice.c b/src/qemu/qemu_extdevice.c index 6e16c6be29..93a070f892 100644 --- a/src/qemu/qemu_extdevice.c +++ b/src/qemu/qemu_extdevice.c @@ -247,8 +247,14 @@ qemuExtDevicesStart(virQEMUDriver *driver, return -1; continue; } + case VIR_DOMAIN_GRAPHICS_TYPE_VNC: { + if (QEMU_DOMAIN_GRAPHICS_PRIVATE(graphics)->vnc) { + if (qemuVncStart(vm, graphics) < 0) + return -1; + } + continue; + } case VIR_DOMAIN_GRAPHICS_TYPE_SDL: - case VIR_DOMAIN_GRAPHICS_TYPE_VNC: case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS: @@ -327,9 +333,12 @@ qemuExtDevicesStop(virQEMUDriver *driver, qemuRdpStop(vm, graphics); continue; } + case VIR_DOMAIN_GRAPHICS_TYPE_VNC: { + qemuVncStop(vm, graphics); + continue; + } case VIR_DOMAIN_GRAPHICS_TYPE_DBUS: case VIR_DOMAIN_GRAPHICS_TYPE_SDL: - case VIR_DOMAIN_GRAPHICS_TYPE_VNC: case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS: diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 7ebc038e54..40db4fabbd 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5589,6 +5589,41 @@ qemuProcessGraphicsSetupRenderNode(virDomainGraphics= Def *graphics, } =20 =20 +static bool +qemuHasNonP2PDbusGraphics(virDomainDef *def) +{ + size_t i; + + for (i =3D 0; i < def->ngraphics; i++) { + virDomainGraphicsDef *g =3D def->graphics[i]; + + if (g->type =3D=3D VIR_DOMAIN_GRAPHICS_TYPE_DBUS && !g->data.dbus.= p2p) + return true; + } + + return false; +} + + +static int +qemuPrepareGraphicsVnc(virQEMUDriver *driver, + virDomainDef *def, + virDomainGraphicsDef *gfx) +{ + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + + if (!qemuHasNonP2PDbusGraphics(def)) + return 0; + + if (!qemuVncAvailable(cfg->qemuVncName)) + return 0; + + QEMU_DOMAIN_GRAPHICS_PRIVATE(gfx)->vnc =3D qemuVncNew(); + + return 0; +} + + static int qemuProcessSetupGraphics(virQEMUDriver *driver, virDomainObj *vm, @@ -5610,6 +5645,10 @@ qemuProcessSetupGraphics(virQEMUDriver *driver, =20 if (qemuProcessGraphicsSetupDBus(driver, graphics, vm) < 0) return -1; + + if (graphics->type =3D=3D VIR_DOMAIN_GRAPHICS_TYPE_VNC && + qemuPrepareGraphicsVnc(driver, vm->def, graphics) < 0) + return -1; } =20 if (allocate) { @@ -6174,7 +6213,6 @@ qemuProcessPrepareGraphics(virDomainObj *vm) if (gfx->type =3D=3D VIR_DOMAIN_GRAPHICS_TYPE_RDP && qemuPrepareGraphicsRdp(priv->driver, gfx) < 0) return -1; - } =20 return 0; --=20 2.53.0 From nobody Sat May 30 14:34:24 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1776868105; cv=none; d=zohomail.com; s=zohoarc; b=SqIp2uTjGPExOC/Q3DyGXxwrrSTXLJSnaMh8tcYupvn4fxl7XDPTBupI6VCDIr/6F0yKKx/pcGRIScGdM+kDc/CuH+K2QaAsWoATGJWk1Z59snABpuiyG9hbpcdzA57ejcUTRiGFod1nERJqNTXeRY7yy3eJOQIJBwTTeuTljyQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1776868105; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=YEg6BMRDF5SFoykpAWvF+WCwNA6FiGbF85r4mF7JV18=; b=Cyuk2OScKmn0wC0QQuSaQJ8qSyMhbYzwZ3yfnDIeScHTwSKymwNnYTt6by89uXZTBzn3dMe/wFpQqXUhROwPr5lu81HdalBlUJVb8i4zuO3VRgoRgmw9mzozddYfkjsLZXkRF/eZwNrye7IsjyjF0Aq+zftNcdEakWFrEOoNM7o= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1776868105050485.5194230225949; Wed, 22 Apr 2026 07:28:25 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id B061241998; Wed, 22 Apr 2026 10:28:23 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 953C141BA4; Wed, 22 Apr 2026 10:21:09 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id E2294419DD; Wed, 22 Apr 2026 10:20:58 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 556324194F for ; Wed, 22 Apr 2026 10:15:16 -0400 (EDT) Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-155-zVEIoJ5CPtaL_XvGw8II-g-1; Wed, 22 Apr 2026 10:15:14 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 7A92619560BB for ; Wed, 22 Apr 2026 14:15:13 +0000 (UTC) Received: from localhost (unknown [10.44.22.21]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 287E63000C15; Wed, 22 Apr 2026 14:15:11 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1776867315; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YEg6BMRDF5SFoykpAWvF+WCwNA6FiGbF85r4mF7JV18=; b=Z33VtyRgh8OrH14mAsJ7z6Z1BSNCrYE8Lgqz//ZgIruk5rf7G2MnRhNmOIq2AUsoK9mWrk gf/AbFQUYuGnNetWDQC/16yFUmY4OI2sTm3VruBSeyx+pzb7YlETY6KfviZSzWmLG5MEaT KYh+itmgcJuMzTCDYc8ZtCDBKqF+SAo= X-MC-Unique: zVEIoJ5CPtaL_XvGw8II-g-1 X-Mimecast-MFC-AGG-ID: zVEIoJ5CPtaL_XvGw8II-g_1776867313 To: devel@lists.libvirt.org Subject: [PATCH RFC 5/6] qemu: wire up standalone VNC in driver APIs Date: Wed, 22 Apr 2026 18:14:36 +0400 Message-ID: <20260422141437.4120522-6-marcandre.lureau@redhat.com> In-Reply-To: <20260422141437.4120522-1-marcandre.lureau@redhat.com> References: <20260422141437.4120522-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: qeQqyalgUNi8Pm4k6r2mV1B4UPgPhp-FS1r3Zr3tzFs_1776867313 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 7NQ4NAEAT7FLNMQJBNRWUZJNZVKQ43X4 X-Message-ID-Hash: 7NQ4NAEAT7FLNMQJBNRWUZJNZVKQ43X4 X-MailFrom: marcandre.lureau@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "marcandre.lureau--- via Devel" Reply-To: marcandre.lureau@redhat.com X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1776868105718158501 From: Marc-Andr=C3=A9 Lureau Route the OpenGraphics, OpenGraphicsFD, and GraphicsReload driver APIs through the standalone qemu-vnc D-Bus interface when active. Client connections are passed via D-Bus fd-passing (AddClient), certificate reloading uses the ReloadCertificates method, and password changes use SetPassword. Signed-off-by: Marc-Andr=C3=A9 Lureau --- src/qemu/qemu_driver.c | 56 +++++++++++++++++++++++++++++++++++------ src/qemu/qemu_hotplug.c | 12 +++++++++ 2 files changed, 61 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 83d0bab126..d79d68001f 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -41,6 +41,7 @@ #include "qemu_hotplug.h" #include "qemu_monitor.h" #include "qemu_passt.h" +#include "qemu_vnc.h" #include "qemu_process.h" #include "qemu_migration.h" #include "qemu_migration_params.h" @@ -14946,6 +14947,11 @@ qemuDomainOpenGraphics(virDomainPtr dom, } switch (vm->def->graphics[idx]->type) { case VIR_DOMAIN_GRAPHICS_TYPE_VNC: + if (QEMU_DOMAIN_GRAPHICS_PRIVATE(vm->def->graphics[idx])->vnc) { + ret =3D qemuVncAddClient(vm, fd, + (flags & VIR_DOMAIN_OPEN_GRAPHICS_SKIPA= UTH) !=3D 0); + goto endjob; + } protocol =3D "vnc"; break; case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: @@ -14985,6 +14991,25 @@ qemuDomainOpenGraphics(virDomainPtr dom, return ret; } =20 + +static int +qemuSocketPair(int pair[2], + virSecurityManager *mgr, + virDomainDef *vm) +{ + if (qemuSecuritySetSocketLabel(mgr, vm) < 0) + return -1; + + if (socketpair(AF_UNIX, SOCK_STREAM, 0, pair) < 0) + return -1; + + if (qemuSecurityClearSocketLabel(mgr, vm) < 0) + return -1; + + return 0; +} + + static int qemuDomainOpenGraphicsFD(virDomainPtr dom, unsigned int idx, @@ -15017,6 +15042,18 @@ qemuDomainOpenGraphicsFD(virDomainPtr dom, } switch (vm->def->graphics[idx]->type) { case VIR_DOMAIN_GRAPHICS_TYPE_VNC: + if (QEMU_DOMAIN_GRAPHICS_PRIVATE(vm->def->graphics[idx])->vnc) { + if (qemuSocketPair(pair, driver->securityManager, vm->def) < 0) + goto cleanup; + + if (qemuVncAddClient(vm, pair[1], + (flags & VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUT= H) !=3D 0) < 0) + goto cleanup; + + ret =3D pair[0]; + pair[0] =3D -1; + goto cleanup; + } protocol =3D "vnc"; break; case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: @@ -15040,13 +15077,7 @@ qemuDomainOpenGraphicsFD(virDomainPtr dom, goto cleanup; } =20 - if (qemuSecuritySetSocketLabel(driver->securityManager, vm->def) < 0) - goto cleanup; - - if (socketpair(PF_UNIX, SOCK_STREAM, 0, pair) < 0) - goto cleanup; - - if (qemuSecurityClearSocketLabel(driver->securityManager, vm->def) < 0) + if (qemuSocketPair(pair, driver->securityManager, vm->def) < 0) goto cleanup; =20 if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0) @@ -20445,6 +20476,7 @@ qemuDomainGraphicsReload(virDomainPtr domain, int ret =3D -1; virDomainObj *vm =3D NULL; qemuDomainObjPrivate *priv; + size_t j; =20 virCheckFlagsGoto(0, cleanup); =20 @@ -20486,6 +20518,16 @@ qemuDomainGraphicsReload(virDomainPtr domain, =20 priv =3D vm->privateData; =20 + for (j =3D 0; j < vm->def->ngraphics; j++) { + virDomainGraphicsDef *gfx =3D vm->def->graphics[j]; + + if (gfx->type =3D=3D VIR_DOMAIN_GRAPHICS_TYPE_VNC && + QEMU_DOMAIN_GRAPHICS_PRIVATE(gfx)->vnc) { + ret =3D qemuVncReloadCertificates(vm); + goto endjob; + } + } + qemuDomainObjEnterMonitor(vm); =20 ret =3D qemuMonitorDisplayReload(priv->mon, "vnc", true); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index b7a282b96e..404cec4a94 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -4543,6 +4543,18 @@ qemuDomainChangeGraphicsPasswords(virDomainObj *vm, return qemuRdpSetCredentials(vm, username, password, ""); } =20 + if (type =3D=3D VIR_DOMAIN_GRAPHICS_TYPE_VNC) { + size_t i; + + for (i =3D 0; i < vm->def->ngraphics; i++) { + virDomainGraphicsDef *gfx =3D vm->def->graphics[i]; + + if (gfx->type =3D=3D VIR_DOMAIN_GRAPHICS_TYPE_VNC && + QEMU_DOMAIN_GRAPHICS_PRIVATE(gfx)->vnc) + return qemuVncSetPassword(vm, password); + } + } + if (auth->connected) connected =3D virDomainGraphicsAuthConnectedTypeToString(auth->con= nected); =20 --=20 2.53.0 From nobody Sat May 30 14:34:24 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1776868275; cv=none; d=zohomail.com; s=zohoarc; b=k1utY+iRWgB7Idx2RrcWhdxqYKE4ibGVnaWBlorw1S6jMq+FOBXHam1DX9Gaxk3kc71AytYlH/RCZbltJpSerp17UTpgKWDcFYOdA92EVTSozAfNQFdnwswQznb8FNv6EPgRGUeD4afb95jQFspfGX9kBLmXsG0LUoHz7W7aedM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1776868275; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=nSA+t58C2R2eOaA2ZSpoDnhEteGm3DVIBv0NcOJ2zE4=; b=W0MB9TQFKPaZvZW52DR7aGh/sRv1TZ/EKAOzsp+52obpJzzoHcX2KwyWGpsIZCHOYeBYOBPH722B3xcCh8VylDHxGURnSshFHN+f8oiucjeA+j/YOou3kFnnDho6xSr8jkKaEZXygVCpf30vQPtbN+Dga8+0ykSzb6k4Lq80krQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1776868275579569.3062097750415; Wed, 22 Apr 2026 07:31:15 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id E7CD6418FA; Wed, 22 Apr 2026 10:31:14 -0400 (EDT) Received: from [172.19.199.9] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 7FD5641BC6; Wed, 22 Apr 2026 10:22:27 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 9C54F4195D; Wed, 22 Apr 2026 10:22:20 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 6969841B01 for ; Wed, 22 Apr 2026 10:15:22 -0400 (EDT) Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-582-sCqF7J_YNoq3TX7lJj2Xnw-1; Wed, 22 Apr 2026 10:15:20 -0400 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id C35AB18001FA for ; Wed, 22 Apr 2026 14:15:19 +0000 (UTC) Received: from localhost (unknown [10.44.22.21]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 83D1D1800370; Wed, 22 Apr 2026 14:15:18 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1776867322; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nSA+t58C2R2eOaA2ZSpoDnhEteGm3DVIBv0NcOJ2zE4=; b=CBPiPtsYhOkYHE7JhChpxPzZPZXg8Bj5mCC6QjM9dwyX8xYNFpYRboLySRGmjgR8lDrSSX zUSyUMavL4SBrbIsKN1ZZAd2ntNsr/nTc27O7Kb424GKLeBIlYqaYd90IloFFtGeVaLdNp BogQv69Oo3nGkpQ3xTEM2P1OqDLuwjE= X-MC-Unique: sCqF7J_YNoq3TX7lJj2Xnw-1 X-Mimecast-MFC-AGG-ID: sCqF7J_YNoq3TX7lJj2Xnw_1776867319 To: devel@lists.libvirt.org Subject: [PATCH RFC 6/6] qemu: add tests for standalone VNC graphics Date: Wed, 22 Apr 2026 18:14:37 +0400 Message-ID: <20260422141437.4120522-7-marcandre.lureau@redhat.com> In-Reply-To: <20260422141437.4120522-1-marcandre.lureau@redhat.com> References: <20260422141437.4120522-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 9cZuzqILDezwf7tDBHqumITPGnrGYOcwSW7a9vMSC1g_1776867319 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID-Hash: MRR4KXMJLEUABL4XCZV7VLM2BLDEMH3S X-Message-ID-Hash: MRR4KXMJLEUABL4XCZV7VLM2BLDEMH3S X-MailFrom: marcandre.lureau@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: "marcandre.lureau--- via Devel" Reply-To: marcandre.lureau@redhat.com X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1776868281018154100 From: Marc-Andr=C3=A9 Lureau Add xml2argv tests verifying the standalone VNC feature: - graphics-vnc-standalone: when both and are present, the -vnc QEMU argument is omitted since qemu-vnc handles VNC externally via D-Bus. - graphics-vnc-standalone-socket: same behavior with a Unix socket listen address. - graphics-vnc-standalone-p2p: when dbus is p2p mode, standalone VNC is NOT triggered and the built-in -vnc argument is preserved. Signed-off-by: Marc-Andr=C3=A9 Lureau --- ...hics-vnc-standalone-p2p.x86_64-latest.args | 34 ++++++++++++++++ ...phics-vnc-standalone-p2p.x86_64-latest.xml | 40 +++++++++++++++++++ .../graphics-vnc-standalone-p2p.xml | 39 ++++++++++++++++++ ...s-vnc-standalone-socket.x86_64-latest.args | 33 +++++++++++++++ ...cs-vnc-standalone-socket.x86_64-latest.xml | 40 +++++++++++++++++++ .../graphics-vnc-standalone-socket.xml | 40 +++++++++++++++++++ ...graphics-vnc-standalone.x86_64-latest.args | 33 +++++++++++++++ .../graphics-vnc-standalone.x86_64-latest.xml | 40 +++++++++++++++++++ .../graphics-vnc-standalone.xml | 40 +++++++++++++++++++ tests/qemuxmlconftest.c | 4 ++ tests/testutilsqemu.c | 9 +++++ 11 files changed, 352 insertions(+) create mode 100644 tests/qemuxmlconfdata/graphics-vnc-standalone-p2p.x86_6= 4-latest.args create mode 100644 tests/qemuxmlconfdata/graphics-vnc-standalone-p2p.x86_6= 4-latest.xml create mode 100644 tests/qemuxmlconfdata/graphics-vnc-standalone-p2p.xml create mode 100644 tests/qemuxmlconfdata/graphics-vnc-standalone-socket.x8= 6_64-latest.args create mode 100644 tests/qemuxmlconfdata/graphics-vnc-standalone-socket.x8= 6_64-latest.xml create mode 100644 tests/qemuxmlconfdata/graphics-vnc-standalone-socket.xml create mode 100644 tests/qemuxmlconfdata/graphics-vnc-standalone.x86_64-la= test.args create mode 100644 tests/qemuxmlconfdata/graphics-vnc-standalone.x86_64-la= test.xml create mode 100644 tests/qemuxmlconfdata/graphics-vnc-standalone.xml diff --git a/tests/qemuxmlconfdata/graphics-vnc-standalone-p2p.x86_64-lates= t.args b/tests/qemuxmlconfdata/graphics-vnc-standalone-p2p.x86_64-latest.ar= gs new file mode 100644 index 0000000000..081219b757 --- /dev/null +++ b/tests/qemuxmlconfdata/graphics-vnc-standalone-p2p.x86_64-latest.args @@ -0,0 +1,34 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \ +USER=3Dtest \ +LOGNAME=3Dtest \ +XDG_DATA_HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=3D/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=3DQEMUGuest1,debug-threads=3Don \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/va= r/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=3Doff,dump-guest-core=3Doff,memory-backend=3Dpc.ram,acpi= =3Doff \ +-accel tcg \ +-cpu qemu64 \ +-m size=3D219136k \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}'= \ +-overcommit mem-lock=3Doff \ +-smp 1,sockets=3D1,cores=3D1,threads=3D1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=3Dcharmonitor,fd=3D1729,server=3Don,wait=3Doff \ +-mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dcontrol \ +-rtc base=3Dutc \ +-no-shutdown \ +-boot strict=3Don \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0= x2"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-display dbus,p2p=3Don \ +-vnc 127.0.0.1:3,audiodev=3Daudio1 \ +-device '{"driver":"cirrus-vga","id":"video0","bus":"pci.0","addr":"0x2"}'= \ +-sandbox on,obsolete=3Ddeny,elevateprivileges=3Ddeny,spawn=3Ddeny,resource= control=3Ddeny \ +-msg timestamp=3Don diff --git a/tests/qemuxmlconfdata/graphics-vnc-standalone-p2p.x86_64-lates= t.xml b/tests/qemuxmlconfdata/graphics-vnc-standalone-p2p.x86_64-latest.xml new file mode 100644 index 0000000000..d07187e525 --- /dev/null +++ b/tests/qemuxmlconfdata/graphics-vnc-standalone-p2p.x86_64-latest.xml @@ -0,0 +1,40 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 1 + + hvm + + + + qemu64 + + + destroy + restart + destroy + + /usr/bin/qemu-system-x86_64 + +
+ + +
+ + + + + + + + +