xref: /openbmc/qemu/util/dbus.c (revision 973d306d)
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