Hi
On Fri, Mar 7, 2025 at 6:40 PM Martin Kletzander <mkletzan(a)redhat.com> wrote:
On Tue, Feb 18, 2025 at 02:16:22PM +0400, marcandre.lureau(a)redhat.com wrote:
>From: Marc-André Lureau <marcandre.lureau(a)redhat.com>
>
>Helpers to start the qemu-rdp server and set it up.
>
>Signed-off-by: Marc-André Lureau <marcandre.lureau(a)redhat.com>
>---
> po/POTFILES | 1 +
> src/qemu/meson.build | 1 +
> src/qemu/qemu_domain.c | 1 +
> src/qemu/qemu_domain.h | 2 +
> src/qemu/qemu_rdp.c | 405 +++++++++++++++++++++++++++++++++++++++++
> src/qemu/qemu_rdp.h | 71 ++++++++
> 6 files changed, 481 insertions(+)
> create mode 100644 src/qemu/qemu_rdp.c
> create mode 100644 src/qemu/qemu_rdp.h
>
>diff --git a/src/qemu/qemu_rdp.c b/src/qemu/qemu_rdp.c
>new file mode 100644
>index 0000000000..e881b74ee3
>--- /dev/null
>+++ b/src/qemu/qemu_rdp.c
>@@ -0,0 +1,405 @@
>+/*
>+ * qemu_rdp.c: QEMU Rdp support
>+ *
>+ * This library is free software; you can redistribute it and/or
>+ * modify it under the terms of the GNU Lesser General Public
>+ * License as published by the Free Software Foundation; either
>+ * version 2.1 of the License, or (at your option) any later version.
>+ *
>+ * This library is distributed in the hope that it will be useful,
>+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
>+ * Lesser General Public License for more details.
>+ *
>+ * You should have received a copy of the GNU Lesser General Public
>+ * License along with this library. If not, see
>+ * <
http://www.gnu.org/licenses/>.
>+ */
>+
>+#include <config.h>
>+
>+#include <gio/gio.h>
>+
>+#include "qemu_dbus.h"
>+#include "qemu_extdevice.h"
>+#include "qemu_security.h"
>+#include "qemu_rdp.h"
>+#include "virenum.h"
>+#include "virerror.h"
>+#include "virjson.h"
>+#include "virlog.h"
>+#include "virpidfile.h"
>+#include "virutil.h"
>+#include "virgdbus.h"
>+
>+#define VIR_FROM_THIS VIR_FROM_NONE
>+
>+VIR_LOG_INIT("qemu.rdp");
>+
>+VIR_ENUM_IMPL(qemuRdpFeature,
>+ QEMU_RDP_FEATURE_LAST,
>+ "",
>+ "dbus-address",
>+ "remotefx"
>+);
>+
>+#define ORG_QEMUDISPLAY_RDP "org.QemuDisplay.RDP"
>+#define ORG_QEMUDISPLAY_RDP_PATH "/org/qemu_display/rdp"
>+#define ORG_QEMUDISPLAY_RDP_IFACE "org.QemuDisplay.RDP"
>+
>+
>+void
>+qemuRdpFree(qemuRdp *rdp)
>+{
>+ if (!rdp)
>+ return;
>+
>+ virBitmapFree(rdp->features);
>+ g_free(rdp);
>+}
>+
>+
>+void
>+qemuRdpSetFeature(qemuRdp *rdp,
>+ qemuRdpFeature feature)
>+{
>+ ignore_value(virBitmapSetBit(rdp->features, feature));
>+}
>+
>+
>+bool
>+qemuRdpHasFeature(const qemuRdp *rdp,
>+ qemuRdpFeature feature)
>+{
>+ return virBitmapIsBitSet(rdp->features, feature);
>+}
>+
>+
>+qemuRdp *
>+qemuRdpNew(void)
>+{
>+ g_autoptr(qemuRdp) rdp = g_new0(qemuRdp, 1);
>+
>+ rdp->features = virBitmapNew(QEMU_RDP_FEATURE_LAST);
>+ rdp->pid = -1;
>+
>+ return g_steal_pointer(&rdp);
>+}
>+
>+
>+qemuRdp *
>+qemuRdpNewForHelper(const char *helper)
>+{
>+ g_autoptr(qemuRdp) rdp = NULL;
>+ g_autoptr(virCommand) cmd = NULL;
>+ g_autofree char *output = NULL;
>+ g_autoptr(virJSONValue) doc = NULL;
>+ virJSONValue *featuresJSON;
>+ g_autofree char *helperPath = NULL;
>+ size_t i, nfeatures;
>+
>+ helperPath = virFindFileInPath(helper);
>+ if (!helperPath) {
>+ virReportSystemError(errno,
>+ _("'%1$s' is not a suitable qemu-rdp
helper name"),
>+ helper);
>+ return NULL;
>+ }
>+
>+ rdp = qemuRdpNew();
>+ cmd = virCommandNewArgList(helperPath, "--print-capabilities", NULL);
>+ virCommandSetOutputBuffer(cmd, &output);
>+ if (virCommandRun(cmd, NULL) < 0)
>+ return NULL;
>+
>+ if (!(doc = virJSONValueFromString(output)) ||
>+ !(featuresJSON = virJSONValueObjectGetArray(doc, "features"))) {
>+ virReportError(VIR_ERR_INTERNAL_ERROR,
>+ _("unable to parse json capabilities
'%1$s'"),
It feels to me like this needs a "from" or "for" in order to
disambiguate the meaning of the string, just:
s/capabilities/capabilities for/
s/capabilities/capabilities from/
would be sufficient.
The same error already exists in qemu_vhost_user.c and qemu_slirp.c.
Should I touch that too?