1*a5021d69SMarc-André Lureau /*
2*a5021d69SMarc-André Lureau * Helpers for using D-Bus
3*a5021d69SMarc-André Lureau *
4*a5021d69SMarc-André Lureau * Copyright (C) 2019 Red Hat, Inc.
5*a5021d69SMarc-André Lureau *
6*a5021d69SMarc-André Lureau * This work is licensed under the terms of the GNU GPL, version 2. See
7*a5021d69SMarc-André Lureau * the COPYING file in the top-level directory.
8*a5021d69SMarc-André Lureau */
9*a5021d69SMarc-André Lureau
10*a5021d69SMarc-André Lureau #include "qemu/osdep.h"
11*a5021d69SMarc-André Lureau #include "qemu/dbus.h"
12*a5021d69SMarc-André Lureau #include "qemu/error-report.h"
13*a5021d69SMarc-André Lureau #include "qapi/error.h"
14*a5021d69SMarc-André Lureau
15*a5021d69SMarc-André Lureau /*
16*a5021d69SMarc-André Lureau * qemu_dbus_get_queued_owners() - return the list of queued unique names
17*a5021d69SMarc-André Lureau * @connection: A GDBusConnection
18*a5021d69SMarc-André Lureau * @name: a service name
19*a5021d69SMarc-André Lureau *
20*a5021d69SMarc-André Lureau * Return: a GStrv of unique names, or NULL on failure.
21*a5021d69SMarc-André Lureau */
22*a5021d69SMarc-André Lureau GStrv
qemu_dbus_get_queued_owners(GDBusConnection * connection,const char * name,Error ** errp)23*a5021d69SMarc-André Lureau qemu_dbus_get_queued_owners(GDBusConnection *connection, const char *name,
24*a5021d69SMarc-André Lureau Error **errp)
25*a5021d69SMarc-André Lureau {
26*a5021d69SMarc-André Lureau g_autoptr(GDBusProxy) proxy = NULL;
27*a5021d69SMarc-André Lureau g_autoptr(GVariant) result = NULL;
28*a5021d69SMarc-André Lureau g_autoptr(GVariant) child = NULL;
29*a5021d69SMarc-André Lureau g_autoptr(GError) err = NULL;
30*a5021d69SMarc-André Lureau
31*a5021d69SMarc-André Lureau proxy = g_dbus_proxy_new_sync(connection, G_DBUS_PROXY_FLAGS_NONE, NULL,
32*a5021d69SMarc-André Lureau "org.freedesktop.DBus",
33*a5021d69SMarc-André Lureau "/org/freedesktop/DBus",
34*a5021d69SMarc-André Lureau "org.freedesktop.DBus",
35*a5021d69SMarc-André Lureau NULL, &err);
36*a5021d69SMarc-André Lureau if (!proxy) {
37*a5021d69SMarc-André Lureau error_setg(errp, "Failed to create DBus proxy: %s", err->message);
38*a5021d69SMarc-André Lureau return NULL;
39*a5021d69SMarc-André Lureau }
40*a5021d69SMarc-André Lureau
41*a5021d69SMarc-André Lureau result = g_dbus_proxy_call_sync(proxy, "ListQueuedOwners",
42*a5021d69SMarc-André Lureau g_variant_new("(s)", name),
43*a5021d69SMarc-André Lureau G_DBUS_CALL_FLAGS_NO_AUTO_START,
44*a5021d69SMarc-André Lureau -1, NULL, &err);
45*a5021d69SMarc-André Lureau if (!result) {
46*a5021d69SMarc-André Lureau if (g_error_matches(err,
47*a5021d69SMarc-André Lureau G_DBUS_ERROR,
48*a5021d69SMarc-André Lureau G_DBUS_ERROR_NAME_HAS_NO_OWNER)) {
49*a5021d69SMarc-André Lureau return g_new0(char *, 1);
50*a5021d69SMarc-André Lureau }
51*a5021d69SMarc-André Lureau error_setg(errp, "Failed to call ListQueuedOwners: %s", err->message);
52*a5021d69SMarc-André Lureau return NULL;
53*a5021d69SMarc-André Lureau }
54*a5021d69SMarc-André Lureau
55*a5021d69SMarc-André Lureau child = g_variant_get_child_value(result, 0);
56*a5021d69SMarc-André Lureau return g_variant_dup_strv(child, NULL);
57*a5021d69SMarc-André Lureau }
58