From nobody Wed May 14 16:19:52 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1520871738909941.7128840736914; Mon, 12 Mar 2018 09:22:18 -0700 (PDT) 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 mx1.redhat.com (Postfix) with ESMTPS id 73B0C28213; Mon, 12 Mar 2018 16:22:17 +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 4536C60C80; Mon, 12 Mar 2018 16:22:17 +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 0DBF84CAAC; Mon, 12 Mar 2018 16:22:17 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w2CGM0m7025079 for ; Mon, 12 Mar 2018 12:22:00 -0400 Received: by smtp.corp.redhat.com (Postfix) id 2F195215CDAC; Mon, 12 Mar 2018 16:22:00 +0000 (UTC) Received: from antique-work.brq.redhat.com (unknown [10.43.2.152]) by smtp.corp.redhat.com (Postfix) with ESMTP id AC0D6215CDAE for ; Mon, 12 Mar 2018 16:21:59 +0000 (UTC) From: Pavel Hrdina To: libvir-list@redhat.com Date: Mon, 12 Mar 2018 17:21:47 +0100 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Subject: [libvirt] [dbus PATCH 17/18] switch from sd-bus to libdbus 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 12 Mar 2018 16:22:18 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This removes all the systemd sd-bus code. Signed-off-by: Pavel Hrdina --- README | 1 - configure.ac | 3 - data/Makefile.am | 4 +- data/org.libvirt.Connect.xml | 56 +++++ data/org.libvirt.Domain.xml | 51 +++++ libvirt-dbus.spec.in | 4 +- src/Makefile.am | 3 - src/connect.c | 221 ++++++++----------- src/connect.h | 16 +- src/domain.c | 513 +++++++++++++++++++--------------------= ---- src/domain.h | 4 +- src/events.c | 133 +++++------ src/main.c | 100 +++------ src/util.c | 87 ++++---- src/util.h | 15 +- test/travis-run | 2 +- 16 files changed, 586 insertions(+), 627 deletions(-) create mode 100644 data/org.libvirt.Connect.xml create mode 100644 data/org.libvirt.Domain.xml diff --git a/README b/README index 242c9ba..518217f 100644 --- a/README +++ b/README @@ -56,7 +56,6 @@ raised in future releases based on this distro build targ= et policy. =20 The packages required to build libvirt-dbus are =20 - - systemd-211 - dbus - libvirt =20 diff --git a/configure.ac b/configure.ac index c8dcf04..8836c6f 100644 --- a/configure.ac +++ b/configure.ac @@ -12,10 +12,8 @@ AC_USE_SYSTEM_EXTENSIONS AM_SILENT_RULES([yes]) =20 LIBVIRT_REQUIRED=3D1.2.8 -SYSTEMD_REQUIRED=3D211 DBUS_REQUIRED=3D1.10.24 AC_SUBST([LIBVIRT_REQUIRED]) dnl used in the .spec file -AC_SUBST([SYSTEMD_REQUIRED]) dnl used in the .spec file AC_SUBST([DBUS_REQUIRED]) dnl used in the .spec file =20 LIBVIRT_DBUS_MAJOR_VERSION=3D`echo $VERSION | awk -F. '{print $1}'` @@ -36,7 +34,6 @@ AC_PROG_MKDIR_P AM_PROG_CC_C_O =20 PKG_CHECK_MODULES(LIBVIRT, libvirt >=3D $LIBVIRT_REQUIRED) -PKG_CHECK_MODULES(SYSTEMD, libsystemd >=3D $SYSTEMD_REQUIRED) PKG_CHECK_MODULES(DBUS, dbus-1 >=3D $DBUS_REQUIRED) =20 LIBVIRT_COMPILE_WARNINGS diff --git a/data/Makefile.am b/data/Makefile.am index a886687..dd60713 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -18,7 +18,9 @@ polkit_files =3D \ polkitdir =3D $(sysconfdir)/polkit-1/rules.d polkit_DATA =3D $(polkit_files:.rules.in=3D.rules) =20 -interfaces_files =3D +interfaces_files =3D \ + org.libvirt.Connect.xml \ + org.libvirt.Domain.xml interfacesdir =3D $(DBUS_INTERFACES_DIR) interfaces_DATA =3D $(interfaces_files) =20 diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml new file mode 100644 index 0000000..a40ce1d --- /dev/null +++ b/data/org.libvirt.Connect.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/org.libvirt.Domain.xml b/data/org.libvirt.Domain.xml new file mode 100644 index 0000000..48bf40f --- /dev/null +++ b/data/org.libvirt.Domain.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libvirt-dbus.spec.in b/libvirt-dbus.spec.in index 512f4fc..d458d71 100644 --- a/libvirt-dbus.spec.in +++ b/libvirt-dbus.spec.in @@ -1,7 +1,6 @@ # -*- rpm-spec -*- =20 %define libvirt_version @LIBVIRT_REQUIRED@ -%define systemd_version @SYSTEMD_REQUIRED@ %define dbus_version @DBUS_REQUIRED@ %define system_user @SYSTEM_USER@ =20 @@ -16,11 +15,9 @@ Source0: ftp://libvirt.org/libvirt/dbus/%{name}-%{versio= n}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) =20 BuildRequires: libvirt-devel >=3D %{libvirt_version} -BuildRequires: systemd-devel >=3D %{systemd_version} BuildRequires: dbus-devel >=3D %{dbus_version} =20 Requires: libvirt-libs >=3D %{libvirt_version} -Requires: systemd-libs >=3D %{systemd_version} Requires: dbus-libs >=3D %{dbus_version} =20 Requires(pre): shadow-utils @@ -57,5 +54,6 @@ exit 0 %{_datadir}/dbus-1/services/org.libvirt.service %{_datadir}/dbus-1/system-services/org.libvirt.service %{_datadir}/dbus-1/system.d/org.libvirt.conf +%{_datadir}/dbus-1/interfaces/org.libvirt.*.xml =20 %changelog diff --git a/src/Makefile.am b/src/Makefile.am index 1f0d990..9e23f1b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -21,7 +21,6 @@ bin_PROGRAMS =3D libvirt-dbus libvirt_dbus_SOURCES =3D $(DAEMON_SOURCES) =20 libvirt_dbus_CFLAGS =3D \ - $(SYSTEMD_CFLAGS) \ $(LIBVIRT_CFLAGS) \ $(DBUS_CFLAGS) \ $(WARN_CFLAGS) \ @@ -29,7 +28,6 @@ libvirt_dbus_CFLAGS =3D \ $(NULL) =20 libvirt_dbus_LDFLAGS =3D \ - $(SYSTEMD_LDFLAGS) \ $(LIBVIRT_LDFLAGS) \ $(DBUS_LDFLAGS) \ $(RELRO_LDFLAGS) \ @@ -37,6 +35,5 @@ libvirt_dbus_LDFLAGS =3D \ $(NULL) =20 libvirt_dbus_LDADD =3D \ - $(SYSTEMD_LIBS) \ $(LIBVIRT_LIBS) \ $(DBUS_LIBS) diff --git a/src/connect.c b/src/connect.c index 695fc0d..2fe305f 100644 --- a/src/connect.c +++ b/src/connect.c @@ -1,9 +1,11 @@ +#include "dbus.h" #include "domain.h" #include "events.h" #include "connect.h" #include "util.h" =20 #include +#include #include =20 static int virtDBusConnectCredType[] =3D { @@ -15,16 +17,18 @@ static int virtDBusConnectCredType[] =3D { VIR_CRED_EXTERNAL, }; =20 +static const char *introspectXML =3D NULL; + static int virtDBusConnectAuthCallback(virConnectCredentialPtr cred VIRT_ATTR_UNUSED, unsigned int ncred VIRT_ATTR_UNUSED, void *cbdata) { - sd_bus_error *error =3D cbdata; + virtDBusMessage *msg =3D cbdata; =20 - return virtDBusUtilSetError(error, - "Interactive authentication is not support= ed. " - "Use client configuration file for libvirt= ."); + return virtDBusMessageSetError(msg, VIRT_DBUS_ERROR_INTERFACE, + "Interactive authentication is not supp= orted. " + "Use client configuration file for libv= irt."); } =20 static virConnectAuth virtDBusConnectAuth =3D { @@ -38,7 +42,6 @@ static void virtDBusConnectClose(virtDBusConnect *connect, bool deregisterEvents) { - for (int i =3D 0; i < VIR_DOMAIN_EVENT_ID_LAST; i +=3D 1) { if (connect->callback_ids[i] >=3D 0) { if (deregisterEvents) { @@ -55,7 +58,7 @@ virtDBusConnectClose(virtDBusConnect *connect, =20 int virtDBusConnectOpen(virtDBusConnect *connect, - sd_bus_error *error) + virtDBusMessage *msg) { if (connect->connection) { if (virConnectIsAlive(connect->connection)) @@ -64,12 +67,12 @@ virtDBusConnectOpen(virtDBusConnect *connect, virtDBusConnectClose(connect, false); } =20 - virtDBusConnectAuth.cbdata =3D error; + virtDBusConnectAuth.cbdata =3D msg; =20 connect->connection =3D virConnectOpenAuth(connect->uri, &virtDBusConnectAuth, 0); if (!connect->connection) - return virtDBusUtilSetLastVirtError(error); + return virtDBusUtilSetLastVirtError(msg); =20 virtDBusEventsRegister(connect); =20 @@ -77,68 +80,29 @@ virtDBusConnectOpen(virtDBusConnect *connect, } =20 static int -virtDBusConnectEnumarateDomains(sd_bus *bus VIRT_ATTR_UNUSED, - const char *path VIRT_ATTR_UNUSED, - void *userdata, - char ***nodes, - sd_bus_error *error) -{ - virtDBusConnect *connect =3D userdata; - _cleanup_(virtDBusUtilVirDomainListFreep) virDomainPtr *domains =3D NU= LL; - _cleanup_(virtDBusUtilStrvFreep) char **paths =3D NULL; - int n_domains; - int r; - - r =3D virtDBusConnectOpen(connect, error); - if (r < 0) - return r; - - n_domains =3D virConnectListAllDomains(connect->connection, &domains, = 0); - if (n_domains < 0) - return virtDBusUtilSetLastVirtError(error); - - paths =3D calloc(n_domains + 1, sizeof(char *)); - - for (int i =3D 0; i < n_domains; i +=3D 1) - paths[i] =3D virtDBusUtilBusPathForVirDomain(domains[i], - connect->domainPath); - - *nodes =3D paths; - paths =3D NULL; - - return 0; -} - -static int -virtDBusConnectListDomains(sd_bus_message *message, - void *userdata, - sd_bus_error *error) +virtDBusConnectListDomains(virtDBusMessage *msg, + void *data) { - virtDBusConnect *connect =3D userdata; - _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply =3D NULL; + virtDBusConnect *connect =3D data; + _cleanup_(virtDBusMessageFreep) virtDBusMessage *reply =3D NULL; _cleanup_(virtDBusUtilVirDomainListFreep) virDomainPtr *domains =3D NU= LL; uint32_t flags; - int r; =20 - r =3D sd_bus_message_read(message, "u", &flags); - if (r < 0) - return r; + if (virtDBusMessageReadBasic(msg, DBUS_TYPE_UINT32, &flags) < 0) + return -1; =20 - r =3D virtDBusConnectOpen(connect, error); - if (r < 0) - return r; + if (virtDBusConnectOpen(connect, msg) < 0) + return -1; =20 - r =3D virConnectListAllDomains(connect->connection, &domains, flags); - if (r < 0) - return virtDBusUtilSetLastVirtError(error); + if (virConnectListAllDomains(connect->connection, &domains, flags) < 0) + return virtDBusUtilSetLastVirtError(msg); =20 - r =3D sd_bus_message_new_method_return(message, &reply); - if (r < 0) - return r; + reply =3D virtDBusMessageMethodReturn(msg); + if (!reply) + return -1; =20 - r =3D sd_bus_message_open_container(reply, 'a', "o"); - if (r < 0) - return r; + if (virtDBusMessageOpenContainer(reply, DBUS_TYPE_ARRAY, "o") < 0) + return -1; =20 for (int i =3D 0; domains[i] !=3D NULL; i +=3D 1) { _cleanup_(virtDBusUtilFreep) char *path =3D NULL; @@ -146,125 +110,120 @@ virtDBusConnectListDomains(sd_bus_message *message, path =3D virtDBusUtilBusPathForVirDomain(domains[i], connect->domainPath); =20 - r =3D sd_bus_message_append(reply, "o", path); - if (r < 0) - return r; + if (virtDBusMessageAppendBasic(reply, DBUS_TYPE_OBJECT_PATH, &path= ) < 0) + return -1; } =20 - r =3D sd_bus_message_close_container(reply); - if (r < 0) - return r; + if (virtDBusMessageCloseContainer(reply) < 0) + return -1; =20 - return sd_bus_send(NULL, reply, NULL); + return virtDBusSendMessage(reply); } =20 static int -virtDBusConnectCreateXML(sd_bus_message *message, - void *userdata, - sd_bus_error *error) +virtDBusConnectCreateXML(virtDBusMessage *msg, + void *data) { - virtDBusConnect *connect =3D userdata; - const char *xml; - uint32_t flags; + virtDBusConnect *connect =3D data; + _cleanup_(virtDBusMessageFreep) virtDBusMessage *reply =3D NULL; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; _cleanup_(virtDBusUtilFreep) char *path =3D NULL; - int r; + const char *xml; + uint32_t flags; =20 - r =3D sd_bus_message_read(message, "su", &xml, &flags); - if (r < 0) - return r; + if (virtDBusMessageReadBasic(msg, DBUS_TYPE_STRING, &xml) < 0) + return -1; =20 - r =3D virtDBusConnectOpen(connect, error); - if (r < 0) - return r; + if (virtDBusMessageReadBasic(msg, DBUS_TYPE_UINT32, &flags) < 0) + return -1; + + if (virtDBusConnectOpen(connect, msg) < 0) + return -1; =20 domain =3D virDomainCreateXML(connect->connection, xml, flags); if (!domain) - return virtDBusUtilSetLastVirtError(error); + return virtDBusUtilSetLastVirtError(msg); =20 path =3D virtDBusUtilBusPathForVirDomain(domain, connect->domainPath); =20 - return sd_bus_reply_method_return(message, "o", path); + reply =3D virtDBusMessageMethodReturn(msg); + if (!reply) + return -1; + + if (virtDBusMessageAppendBasic(reply, DBUS_TYPE_OBJECT_PATH, &path) < = 0) + return -1; + + return virtDBusSendMessage(reply); } =20 static int -virtDBusConnectDefineXML(sd_bus_message *message, - void *userdata, - sd_bus_error *error) +virtDBusConnectDefineXML(virtDBusMessage *msg, + void *data) { - virtDBusConnect *connect =3D userdata; - const char *xml; + virtDBusConnect *connect =3D data; + _cleanup_(virtDBusMessageFreep) virtDBusMessage *reply =3D NULL; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; _cleanup_(virtDBusUtilFreep) char *path =3D NULL; - int r; + const char *xml; =20 - r =3D sd_bus_message_read(message, "s", &xml); - if (r < 0) - return r; + if (virtDBusMessageReadBasic(msg, DBUS_TYPE_STRING, &xml) < 0) + return -1; =20 - r =3D virtDBusConnectOpen(connect, error); - if (r < 0) - return r; + if (virtDBusConnectOpen(connect, msg) < 0) + return -1; =20 domain =3D virDomainDefineXML(connect->connection, xml); if (!domain) - return virtDBusUtilSetLastVirtError(error); + return virtDBusUtilSetLastVirtError(msg); =20 path =3D virtDBusUtilBusPathForVirDomain(domain, connect->domainPath); =20 - return sd_bus_reply_method_return(message, "o", path); -} - -static const sd_bus_vtable virt_connect_vtable[] =3D { - SD_BUS_VTABLE_START(0), + reply =3D virtDBusMessageMethodReturn(msg); + if (!reply) + return -1; =20 - SD_BUS_METHOD("ListDomains", "u", "ao", virtDBusConnectListDomains, SD= _BUS_VTABLE_UNPRIVILEGED), - SD_BUS_METHOD("CreateXML", "su", "o", virtDBusConnectCreateXML, SD_BUS= _VTABLE_UNPRIVILEGED), - SD_BUS_METHOD("DefineXML", "s", "o", virtDBusConnectDefineXML, SD_BUS_= VTABLE_UNPRIVILEGED), + if (virtDBusMessageAppendBasic(reply, DBUS_TYPE_OBJECT_PATH, &path) < = 0) + return -1; =20 - SD_BUS_SIGNAL("DomainDefined", "so", 0), - SD_BUS_SIGNAL("DomainUndefined", "so", 0), - SD_BUS_SIGNAL("DomainStarted", "so", 0), - SD_BUS_SIGNAL("DomainSuspended", "so", 0), - SD_BUS_SIGNAL("DomainResumed", "so", 0), - SD_BUS_SIGNAL("DomainStopped", "so", 0), - SD_BUS_SIGNAL("DomainShutdown", "so", 0), - SD_BUS_SIGNAL("DomainPMSuspended", "so", 0), - SD_BUS_SIGNAL("DomainCrashed", "so", 0), + return virtDBusSendMessage(reply); +} =20 - SD_BUS_VTABLE_END +static virtDBusMethodHandlers virtDBusConnectMethods[] =3D { + { "CreateXML", "su", virtDBusConnectCreateXML }, + { "DefineXML", "s", virtDBusConnectDefineXML }, + { "ListDomains", "u", virtDBusConnectListDomains }, + { NULL, NULL, NULL }, }; =20 int virtDBusConnectNew(virtDBusConnect **connectp, - sd_bus *bus, + virtDBusObjectList *objectList, + DBusConnection *bus, const char *uri, const char *connectPath) { _cleanup_(virtDBusConnectFreep) virtDBusConnect *connect =3D NULL; - int r; =20 connect =3D calloc(1, sizeof(virtDBusConnect)); for (int i =3D 0; i < VIR_DOMAIN_EVENT_ID_LAST; i +=3D 1) connect->callback_ids[i] =3D -1; =20 - connect->bus =3D sd_bus_ref(bus); + connect->bus =3D dbus_connection_ref(bus); connect->uri =3D uri; connect->connectPath =3D connectPath; =20 - connect->enumerateDomains =3D virtDBusConnectEnumarateDomains; - - r =3D sd_bus_add_object_vtable(connect->bus, - NULL, - connect->connectPath, - VIRT_DBUS_CONNECT_INTERFACE, - virt_connect_vtable, - connect); - if (r < 0) - return r; + if (virtDBusObjectListRegister(objectList, + connect->connectPath, + &introspectXML, + VIRT_DBUS_CONNECT_INTERFACE, + VIRT_DBUS_OBJECT_TYPE_MATCH, + NULL, + virtDBusConnectMethods, + connect) < 0) + return -1; =20 - if ((r =3D virtDBusDomainRegister(connect, bus) < 0)) - return r; + if (virtDBusDomainRegister(connect, objectList) < 0) + return -1; =20 *connectp =3D connect; connect =3D NULL; @@ -276,7 +235,7 @@ virtDBusConnect * virtDBusConnectFree(virtDBusConnect *connect) { if (connect->bus) - sd_bus_unref(connect->bus); + dbus_connection_unref(connect->bus); =20 if (connect->connection) virtDBusConnectClose(connect, true); diff --git a/src/connect.h b/src/connect.h index 9e5f533..e685b41 100644 --- a/src/connect.h +++ b/src/connect.h @@ -2,37 +2,37 @@ =20 #define VIR_ENUM_SENTINELS =20 +#include #include -#include =20 #define VIRT_DBUS_CONNECT_INTERFACE "org.libvirt.Connect" =20 -struct virtDBusConnect { - sd_bus *bus; +struct _virtDBusConnect { + DBusConnection *bus; const char *uri; const char *connectPath; char *domainPath; virConnectPtr connection; =20 - sd_bus_node_enumerator_t enumerateDomains; - int callback_ids[VIR_DOMAIN_EVENT_ID_LAST]; }; -typedef struct virtDBusConnect virtDBusConnect; +typedef struct _virtDBusConnect virtDBusConnect; =20 int virtDBusConnectNew(virtDBusConnect **connectp, - sd_bus *bus, + virtDBusObjectList *objectList, + DBusConnection *bus, const char *uri, const char *connectPath); =20 int virtDBusConnectOpen(virtDBusConnect *connect, - sd_bus_error *error); + virtDBusMessage *msg); =20 virtDBusConnect * virtDBusConnectFree(virtDBusConnect *connect); =20 + void virtDBusConnectFreep(virtDBusConnect **connectp); =20 diff --git a/src/domain.c b/src/domain.c index daff32d..394be33 100644 --- a/src/domain.c +++ b/src/domain.c @@ -1,27 +1,31 @@ #define _GNU_SOURCE =20 +#include "dbus.h" #include "domain.h" #include "util.h" =20 #include #include +#include +#include + +static const char *introspectXML =3D NULL; =20 static virDomainPtr virtDBusDomainGetVirDomain(virtDBusConnect *connect, - const char *path, - sd_bus_error *error) + virtDBusMessage *msg) { virDomainPtr domain; + const char *path =3D virtDBusMessageGetPath(msg); =20 - if (virtDBusConnectOpen(connect, error) < 0) + if (virtDBusConnectOpen(connect, msg) < 0) return NULL; =20 domain =3D virtDBusUtilVirDomainFromBusPath(connect->connection, path, connect->domainPath); - if (domain =3D=3D NULL) { - sd_bus_error_setf(error, - SD_BUS_ERROR_UNKNOWN_OBJECT, - "Unknown object '%s'.", path); + if (!domain) { + virtDBusMessageSetError(msg, DBUS_ERROR_UNKNOWN_OBJECT, + "invalid domain object '%s'", path); return NULL; } =20 @@ -29,177 +33,177 @@ virtDBusDomainGetVirDomain(virtDBusConnect *connect, } =20 static int -virtDBusDomainGetName(sd_bus *bus VIRT_ATTR_UNUSED, - const char *path, +virtDBusDomainGetName(virtDBusMessage *reply, + virtDBusMessage *msg, const char *interface VIRT_ATTR_UNUSED, const char *property VIRT_ATTR_UNUSED, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error VIRT_ATTR_UNUSED) + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; - const char *name =3D ""; + const char *name =3D NULL; =20 - domain =3D virtDBusDomainGetVirDomain(connect, path, error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 name =3D virDomainGetName(domain); - if (name =3D=3D NULL) - return sd_bus_message_append(reply, "s", ""); + if (!name) + name =3D ""; =20 - return sd_bus_message_append(reply, "s", name); + return virtDBusMessageAppendVariant(reply, DBUS_TYPE_STRING, + "s", &name); } =20 static int -virtDBusDomainGetUUID(sd_bus *bus VIRT_ATTR_UNUSED, - const char *path, +virtDBusDomainGetUUID(virtDBusMessage *reply, + virtDBusMessage *msg, const char *interface VIRT_ATTR_UNUSED, const char *property VIRT_ATTR_UNUSED, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error VIRT_ATTR_UNUSED) + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; char uuid[VIR_UUID_STRING_BUFLEN] =3D ""; + char *tmp; =20 - domain =3D virtDBusDomainGetVirDomain(connect, path, error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 virDomainGetUUIDString(domain, uuid); + tmp =3D uuid; =20 - return sd_bus_message_append(reply, "s", uuid); + return virtDBusMessageAppendVariant(reply, DBUS_TYPE_STRING, + "s", &tmp); } =20 static int -virtDBusDomainGetId(sd_bus *bus VIRT_ATTR_UNUSED, - const char *path, +virtDBusDomainGetId(virtDBusMessage *reply, + virtDBusMessage *msg, const char *interface VIRT_ATTR_UNUSED, const char *property VIRT_ATTR_UNUSED, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error VIRT_ATTR_UNUSED) + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; + unsigned int id; =20 - domain =3D virtDBusDomainGetVirDomain(connect, path, error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 - return sd_bus_message_append(reply, "u", virDomainGetID(domain)); + id =3D virDomainGetID(domain); + + return virtDBusMessageAppendVariant(reply, DBUS_TYPE_UINT32, + "u", &id); } =20 static int -virtDBusDomainGetVcpus(sd_bus *bus VIRT_ATTR_UNUSED, - const char *path, +virtDBusDomainGetVcpus(virtDBusMessage *reply, + virtDBusMessage *msg, const char *interface VIRT_ATTR_UNUSED, const char *property VIRT_ATTR_UNUSED, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error VIRT_ATTR_UNUSED) + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; + int vcpus; =20 - domain =3D virtDBusDomainGetVirDomain(connect, path, error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 - return sd_bus_message_append(reply, "u", virDomainGetVcpusFlags(domain= , VIR_DOMAIN_VCPU_CURRENT)); + vcpus =3D virDomainGetVcpusFlags(domain, VIR_DOMAIN_VCPU_CURRENT); + + return virtDBusMessageAppendVariant(reply, DBUS_TYPE_UINT32, + "u", &vcpus); } =20 static int -virtDBusDomainGetOsType(sd_bus *bus VIRT_ATTR_UNUSED, - const char *path, +virtDBusDomainGetOsType(virtDBusMessage *reply, + virtDBusMessage *msg, const char *interface VIRT_ATTR_UNUSED, const char *property VIRT_ATTR_UNUSED, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error VIRT_ATTR_UNUSED) + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; _cleanup_(virtDBusUtilFreep) char *os_type =3D NULL; =20 - domain =3D virtDBusDomainGetVirDomain(connect, path, error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 os_type =3D virDomainGetOSType(domain); - if (os_type =3D=3D NULL) - return sd_bus_message_append(reply, "s", ""); + if (!os_type) + return virtDBusMessageAppendVariant(reply, DBUS_TYPE_STRING, + "s", &""); =20 - return sd_bus_message_append(reply, "s", os_type); + return virtDBusMessageAppendVariant(reply, DBUS_TYPE_STRING, + "s", &os_type); } =20 static int -virtDBusDomainGetActive(sd_bus *bus VIRT_ATTR_UNUSED, - const char *path, +virtDBusDomainGetActive(virtDBusMessage *reply, + virtDBusMessage *msg, const char *interface VIRT_ATTR_UNUSED, const char *property VIRT_ATTR_UNUSED, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error VIRT_ATTR_UNUSED) + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; int active; =20 - domain =3D virtDBusDomainGetVirDomain(connect, path, error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 active =3D virDomainIsActive(domain); if (active < 0) - return sd_bus_message_append(reply, "b", 0); + active =3D 0; =20 - return sd_bus_message_append(reply, "b", active); + return virtDBusMessageAppendVariant(reply, DBUS_TYPE_BOOLEAN, + "b", &active); } =20 static int -virtDBusDomainGetPersistent(sd_bus *bus VIRT_ATTR_UNUSED, - const char *path, +virtDBusDomainGetPersistent(virtDBusMessage *reply, + virtDBusMessage *msg, const char *interface VIRT_ATTR_UNUSED, const char *property VIRT_ATTR_UNUSED, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error VIRT_ATTR_UNUSED) + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; int persistent; =20 - domain =3D virtDBusDomainGetVirDomain(connect, path, error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 persistent =3D virDomainIsPersistent(domain); if (persistent < 0) - return sd_bus_message_append(reply, "b", 0); + persistent =3D 0; =20 - return sd_bus_message_append(reply, "b", persistent); + return virtDBusMessageAppendVariant(reply, DBUS_TYPE_BOOLEAN, + "b", &persistent); } =20 static int -virtDBusDomainGetState(sd_bus *bus VIRT_ATTR_UNUSED, - const char *path, +virtDBusDomainGetState(virtDBusMessage *reply, + virtDBusMessage *msg, const char *interface VIRT_ATTR_UNUSED, const char *property VIRT_ATTR_UNUSED, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error VIRT_ATTR_UNUSED) + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; int state =3D 0; const char *string; =20 - domain =3D virtDBusDomainGetVirDomain(connect, path, error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 virDomainGetState(domain, &state, NULL, 0); @@ -232,57 +236,60 @@ virtDBusDomainGetState(sd_bus *bus VIRT_ATTR_UNUSED, break; } =20 - return sd_bus_message_append(reply, "s", string); + return virtDBusMessageAppendVariant(reply, DBUS_TYPE_STRING, + "s", &string); } =20 static int -virtDBusDomainGetAutostart(sd_bus *bus VIRT_ATTR_UNUSED, - const char *path, +virtDBusDomainGetAutostart(virtDBusMessage *reply, + virtDBusMessage *msg, const char *interface VIRT_ATTR_UNUSED, const char *property VIRT_ATTR_UNUSED, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error VIRT_ATTR_UNUSED) + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; int autostart =3D 0; =20 - domain =3D virtDBusDomainGetVirDomain(connect, path, error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 virDomainGetAutostart(domain, &autostart); =20 - return sd_bus_message_append(reply, "b", autostart); + return virtDBusMessageAppendVariant(reply, DBUS_TYPE_BOOLEAN, + "b", &autostart); } =20 static int -virtDBusDomainGetXMLDesc(sd_bus_message *message, - void *userdata, - sd_bus_error *error) +virtDBusDomainGetXMLDesc(virtDBusMessage *msg, + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; + _cleanup_(virtDBusMessageFreep) virtDBusMessage *reply =3D NULL; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; _cleanup_(virtDBusUtilFreep) char *description =3D NULL; uint32_t flags; - int r; =20 - r =3D sd_bus_message_read(message, "u", &flags); - if (r < 0) - return r; + if (virtDBusMessageReadBasic(msg, DBUS_TYPE_UINT32, &flags) < 0) + return -1; =20 - domain =3D virtDBusDomainGetVirDomain(connect, - sd_bus_message_get_path(message), - error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 description =3D virDomainGetXMLDesc(domain, flags); if (!description) - return virtDBusUtilSetLastVirtError(error); + return virtDBusUtilSetLastVirtError(msg); + + reply =3D virtDBusMessageMethodReturn(msg); + if (!reply) + return -1; + + if (virtDBusMessageAppendBasic(reply, DBUS_TYPE_STRING, &description) = < 0) + return -1; =20 - return sd_bus_reply_method_return(message, "s", description); + return virtDBusSendMessage(reply); } =20 static void @@ -293,263 +300,195 @@ virtDBusDomainStatsRecordListFreep(virDomainStatsRe= cordPtr **statsp) } =20 static int -virtDBusDomainGetStats(sd_bus_message *message, - void *userdata, - sd_bus_error *error) +virtDBusDomainGetStats(virtDBusMessage *msg, + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; + _cleanup_(virtDBusMessageFreep) virtDBusMessage *reply =3D NULL; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; - virDomainPtr domains[2]; _cleanup_(virtDBusDomainStatsRecordListFreep) virDomainStatsRecordPtr = *records =3D NULL; - _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply =3D NULL; + virDomainPtr domains[2]; uint32_t flags, stats; - int r; =20 - r =3D sd_bus_message_read(message, "uu", &stats, &flags); - if (r < 0) - return r; + if (virtDBusMessageReadBasic(msg, DBUS_TYPE_UINT32, &stats) < 0) + return -1; + + if (virtDBusMessageReadBasic(msg, DBUS_TYPE_UINT32, &flags) < 0) + return -1; =20 - domain =3D virtDBusDomainGetVirDomain(connect, - sd_bus_message_get_path(message), - error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 domains[0] =3D domain; domains[1] =3D NULL; =20 if (virDomainListGetStats(domains, stats, &records, flags) !=3D 1) - return virtDBusUtilSetLastVirtError(error); + return virtDBusUtilSetLastVirtError(msg); =20 - r =3D sd_bus_message_new_method_return(message, &reply); - if (r < 0) - return r; + reply =3D virtDBusMessageMethodReturn(msg); + if (!reply) + return -1; =20 - r =3D virtDBusUtilMessageAppendTypedParameters(reply, records[0]->para= ms, records[0]->nparams); - if (r < 0) - return r; + if (virtDBusUtilMessageAppendTypedParameters(reply, + records[0]->params, + records[0]->nparams) < 0) + return -1; =20 - return sd_bus_send(NULL, reply, NULL); + return virtDBusSendMessage(reply); } =20 static int -virtDBusDomainShutdown(sd_bus_message *message, - void *userdata, - sd_bus_error *error) +virtDBusDomainShutdown(virtDBusMessage *msg, + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; - int r; =20 - domain =3D virtDBusDomainGetVirDomain(connect, - sd_bus_message_get_path(message), - error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 - r =3D virDomainShutdown(domain); - if (r < 0) - return virtDBusUtilSetLastVirtError(error); + if (virDomainShutdown(domain) < 0) + return virtDBusUtilSetLastVirtError(msg); =20 - return sd_bus_reply_method_return(message, ""); + return virtDBusSendEmptyMessage(msg); } =20 static int -virtDBusDomainDestroy(sd_bus_message *message, - void *userdata, - sd_bus_error *error) +virtDBusDomainDestroy(virtDBusMessage *msg, + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; - int r; =20 - domain =3D virtDBusDomainGetVirDomain(connect, - sd_bus_message_get_path(message), - error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 - r =3D virDomainDestroy(domain); - if (r < 0) - return virtDBusUtilSetLastVirtError(error); + if (virDomainDestroy(domain) < 0) + return virtDBusUtilSetLastVirtError(msg); =20 - return sd_bus_reply_method_return(message, ""); + return virtDBusSendEmptyMessage(msg); } =20 static int -virtDBusDomainReboot(sd_bus_message *message, - void *userdata, - sd_bus_error *error) +virtDBusDomainReboot(virtDBusMessage *msg, + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; uint32_t flags; - int r; =20 - r =3D sd_bus_message_read(message, "u", &flags); - if (r < 0) - return r; + if (virtDBusMessageReadBasic(msg, DBUS_TYPE_UINT32, &flags) < 0) + return -1; =20 - domain =3D virtDBusDomainGetVirDomain(connect, - sd_bus_message_get_path(message), - error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 - r =3D virDomainReboot(domain, flags); - if (r < 0) - return virtDBusUtilSetLastVirtError(error); + if (virDomainReboot(domain, flags) < 0) + return virtDBusUtilSetLastVirtError(msg); =20 - return sd_bus_reply_method_return(message, ""); + return virtDBusSendEmptyMessage(msg); } =20 static int -virtDBusDomainReset(sd_bus_message *message, - void *userdata, - sd_bus_error *error) +virtDBusDomainReset(virtDBusMessage *msg, + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; uint32_t flags; - int r; =20 - r =3D sd_bus_message_read(message, "u", &flags); - if (r < 0) - return r; + if (virtDBusMessageReadBasic(msg, DBUS_TYPE_UINT32, &flags) < 0) + return -1; =20 - domain =3D virtDBusDomainGetVirDomain(connect, - sd_bus_message_get_path(message), - error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 - r =3D virDomainReset(domain, flags); - if (r < 0) - return virtDBusUtilSetLastVirtError(error); + if (virDomainReset(domain, flags) < 0) + return virtDBusUtilSetLastVirtError(msg); =20 - return sd_bus_reply_method_return(message, ""); + return virtDBusSendEmptyMessage(msg); } =20 static int -virtDBusDomainCreate(sd_bus_message *message, - void *userdata, - sd_bus_error *error) +virtDBusDomainCreate(virtDBusMessage *msg, + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; - int r; =20 - domain =3D virtDBusDomainGetVirDomain(connect, - sd_bus_message_get_path(message), - error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 - r =3D virDomainCreate(domain); - if (r < 0) - return virtDBusUtilSetLastVirtError(error); + if (virDomainCreate(domain) < 0) + return virtDBusUtilSetLastVirtError(msg); =20 - return sd_bus_reply_method_return(message, ""); + return virtDBusSendEmptyMessage(msg); } =20 static int -virtDBusDomainUndefine(sd_bus_message *message, - void *userdata, - sd_bus_error *error) +virtDBusDomainUndefine(virtDBusMessage *msg, + void *data) { - virtDBusConnect *connect =3D userdata; + virtDBusConnect *connect =3D data; _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; - int r; =20 - domain =3D virtDBusDomainGetVirDomain(connect, - sd_bus_message_get_path(message), - error); - if (domain =3D=3D NULL) + domain =3D virtDBusDomainGetVirDomain(connect, msg); + if (!domain) return -1; =20 - r =3D virDomainUndefine(domain); - if (r < 0) - return virtDBusUtilSetLastVirtError(error); + if (virDomainUndefine(domain) < 0) + return virtDBusUtilSetLastVirtError(msg); =20 - return sd_bus_reply_method_return(message, ""); + return virtDBusSendEmptyMessage(msg); } =20 -static const sd_bus_vtable virt_domain_vtable[] =3D { - SD_BUS_VTABLE_START(0), - - SD_BUS_PROPERTY("Name", "s", virtDBusDomainGetName, 0, 0), - SD_BUS_PROPERTY("UUID", "s", virtDBusDomainGetUUID, 0, 0), - SD_BUS_PROPERTY("Id", "u", virtDBusDomainGetId, 0, 0), - SD_BUS_PROPERTY("Vcpus", "u", virtDBusDomainGetVcpus, 0, 0), - SD_BUS_PROPERTY("OSType", "s", virtDBusDomainGetOsType, 0, 0), - SD_BUS_PROPERTY("Active", "b", virtDBusDomainGetActive, 0, 0), - SD_BUS_PROPERTY("Persistent", "b", virtDBusDomainGetPersistent, 0, 0), - SD_BUS_PROPERTY("State", "s", virtDBusDomainGetState, 0, 0), - SD_BUS_PROPERTY("Autostart", "b", virtDBusDomainGetAutostart, 0, 0), - - SD_BUS_METHOD("GetXMLDesc", "u", "s", virtDBusDomainGetXMLDesc, SD_BUS= _VTABLE_UNPRIVILEGED), - SD_BUS_METHOD("GetStats", "uu", "a{sv}", virtDBusDomainGetStats, SD_BU= S_VTABLE_UNPRIVILEGED), - SD_BUS_METHOD("Shutdown", "", "", virtDBusDomainShutdown, SD_BUS_VTABL= E_UNPRIVILEGED), - SD_BUS_METHOD("Destroy", "", "", virtDBusDomainDestroy, SD_BUS_VTABLE_= UNPRIVILEGED), - SD_BUS_METHOD("Reboot", "u", "", virtDBusDomainReboot, SD_BUS_VTABLE_U= NPRIVILEGED), - SD_BUS_METHOD("Reset", "u", "", virtDBusDomainReset, SD_BUS_VTABLE_UNP= RIVILEGED), - SD_BUS_METHOD("Create", "", "", virtDBusDomainCreate, SD_BUS_VTABLE_UN= PRIVILEGED), - SD_BUS_METHOD("Undefine", "", "", virtDBusDomainUndefine, SD_BUS_VTABL= E_UNPRIVILEGED), - - SD_BUS_SIGNAL("DeviceAdded", "s", 0), - SD_BUS_SIGNAL("DeviceRemoved", "s", 0), - SD_BUS_SIGNAL("DiskChange", "ssss", 0), - SD_BUS_SIGNAL("TrayChange", "ss", 0), - - SD_BUS_VTABLE_END +static virtDBusPropertyHandlers virtDBusDomainProperties[] =3D { + { "Name", virtDBusDomainGetName, NULL }, + { "UUID", virtDBusDomainGetUUID, NULL }, + { "Id", virtDBusDomainGetId, NULL }, + { "Vcpus", virtDBusDomainGetVcpus, NULL }, + { "OSType", virtDBusDomainGetOsType, NULL }, + { "Active", virtDBusDomainGetActive, NULL }, + { "Persistent", virtDBusDomainGetPersistent, NULL }, + { "State", virtDBusDomainGetState, NULL }, + { "Autostart", virtDBusDomainGetAutostart, NULL }, + { NULL, NULL, NULL }, }; =20 -static int -virtDBusDomainLookup(sd_bus *bus VIRT_ATTR_UNUSED, - const char *path, - const char *interface VIRT_ATTR_UNUSED, - void *userdata, - void **found, - sd_bus_error *error VIRT_ATTR_UNUSED) -{ - virtDBusConnect *connect =3D userdata; - _cleanup_(virtDBusUtilFreep) char *name =3D NULL; - _cleanup_(virtDBusUtilVirDomainFreep) virDomainPtr domain =3D NULL; - - domain =3D virtDBusDomainGetVirDomain(connect, path, error); - if (!domain) - return 0; - - /* - * There's no way to unref the pointer we're returning here. So, - * return the connect object and look up the domain again in the - * domain_* callbacks. - */ - *found =3D connect; - - return 1; -} +static virtDBusMethodHandlers virtDBusDomainMethods[] =3D { + { "GetXMLDesc", "u", virtDBusDomainGetXMLDesc }, + { "GetStats", "u", virtDBusDomainGetStats }, + { "Shutdown", "", virtDBusDomainShutdown }, + { "Destroy", "", virtDBusDomainDestroy }, + { "Reboot", "u", virtDBusDomainReboot }, + { "Reset", "u", virtDBusDomainReset }, + { "Create", "", virtDBusDomainCreate }, + { "Undefine", "", virtDBusDomainUndefine }, + { NULL, NULL, NULL }, +}; =20 int virtDBusDomainRegister(virtDBusConnect *connect, - sd_bus *bus) + virtDBusObjectList *objectList) { - int r; - - r =3D asprintf(&connect->domainPath, "%s/domain", connect->connectPath= ); - if (r < 0) - return r; - - r =3D sd_bus_add_node_enumerator(bus, NULL, connect->domainPath, - connect->enumerateDomains, connect); - if (r < 0) - return r; - - return sd_bus_add_fallback_vtable(bus, - NULL, - connect->domainPath, - VIRT_DBUS_DOMAIN_INTERFACE, - virt_domain_vtable, - virtDBusDomainLookup, - connect); + if (asprintf(&connect->domainPath, "%s/domain", connect->connectPath) = < 0) + return -1; + + if (virtDBusObjectListRegister(objectList, + connect->domainPath, + &introspectXML, + VIRT_DBUS_DOMAIN_INTERFACE, + VIRT_DBUS_OBJECT_TYPE_PREFIX, + virtDBusDomainProperties, + virtDBusDomainMethods, + connect) < 0) + return -1; + + return 0; } diff --git a/src/domain.h b/src/domain.h index 03a29ed..45db0f5 100644 --- a/src/domain.h +++ b/src/domain.h @@ -2,10 +2,8 @@ =20 #include "connect.h" =20 -#include - #define VIRT_DBUS_DOMAIN_INTERFACE "org.libvirt.Domain" =20 int virtDBusDomainRegister(virtDBusConnect *connect, - sd_bus *bus); + virtDBusObjectList *objectList); diff --git a/src/events.c b/src/events.c index c45acd7..8368a30 100644 --- a/src/events.c +++ b/src/events.c @@ -1,10 +1,10 @@ +#include "dbus.h" #include "domain.h" #include "events.h" #include "util.h" =20 #include #include -#include =20 static int virtDBusEventsDomainLifecycle(virConnectPtr connection VIRT_ATTR_UNUSED, @@ -14,11 +14,10 @@ virtDBusEventsDomainLifecycle(virConnectPtr connection = VIRT_ATTR_UNUSED, void *opaque) { virtDBusConnect *connect =3D opaque; - _cleanup_(sd_bus_message_unrefp) sd_bus_message *message =3D NULL; + _cleanup_(virtDBusMessageFreep) virtDBusMessage *msg =3D NULL; const char *signal =3D NULL; const char *name; _cleanup_(virtDBusUtilFreep) char *path =3D NULL; - int r; =20 switch (event) { case VIR_DOMAIN_EVENT_DEFINED: @@ -52,22 +51,23 @@ virtDBusEventsDomainLifecycle(virConnectPtr connection = VIRT_ATTR_UNUSED, return 0; } =20 - r =3D sd_bus_message_new_signal(connect->bus, - &message, - connect->connectPath, - VIRT_DBUS_CONNECT_INTERFACE, - signal); - if (r < 0) - return r; + msg =3D virtDBusMessageNewSignal(connect->bus, + connect->connectPath, + VIRT_DBUS_CONNECT_INTERFACE, + signal); + if (!msg) + return -1; =20 name =3D virDomainGetName(domain); path =3D virtDBusUtilBusPathForVirDomain(domain, connect->domainPath); =20 - r =3D sd_bus_message_append(message, "so", name ? : "", path); - if (r < 0) - return r; + if (virtDBusMessageAppendBasic(msg, DBUS_TYPE_STRING, &name) < 0) + return -1; =20 - return sd_bus_send(connect->bus, message, NULL); + if (virtDBusMessageAppendBasic(msg, DBUS_TYPE_OBJECT_PATH, &path) < 0) + return -1; + + return virtDBusSendMessage(msg); } =20 static int @@ -77,25 +77,22 @@ virtDBusEventsDomainDeviceAdded(virConnectPtr connectio= n VIRT_ATTR_UNUSED, void *opaque) { virtDBusConnect *connect =3D opaque; - _cleanup_(sd_bus_message_unrefp) sd_bus_message *message =3D NULL; + _cleanup_(virtDBusMessageFreep) virtDBusMessage *msg =3D NULL; _cleanup_(virtDBusUtilFreep) char *path =3D NULL; - int r; =20 path =3D virtDBusUtilBusPathForVirDomain(domain, connect->domainPath); =20 - r =3D sd_bus_message_new_signal(connect->bus, - &message, - path, - VIRT_DBUS_DOMAIN_INTERFACE, - "DeviceAdded"); - if (r < 0) - return r; + msg =3D virtDBusMessageNewSignal(connect->bus, + path, + VIRT_DBUS_DOMAIN_INTERFACE, + "DeviceAdded"); + if (!msg) + return -1; =20 - r =3D sd_bus_message_append(message, "s", device); - if (r < 0) - return r; + if (virtDBusMessageAppendBasic(msg, DBUS_TYPE_STRING, &device) < 0) + return -1; =20 - return sd_bus_send(connect->bus, message, NULL); + return virtDBusSendMessage(msg); } =20 static int @@ -105,25 +102,23 @@ virtDBusEventsDomainDeviceRemoved(virConnectPtr conne= ction VIRT_ATTR_UNUSED, void *opaque) { virtDBusConnect *connect =3D opaque; - _cleanup_(sd_bus_message_unrefp) sd_bus_message *message =3D NULL; + _cleanup_(virtDBusMessageFreep) virtDBusMessage *msg =3D NULL; _cleanup_(virtDBusUtilFreep) char *path =3D NULL; - int r; =20 path =3D virtDBusUtilBusPathForVirDomain(domain, connect->domainPath); =20 - r =3D sd_bus_message_new_signal(connect->bus, - &message, - path, - VIRT_DBUS_DOMAIN_INTERFACE, - "DeviceRemoved"); - if (r < 0) - return r; + msg =3D virtDBusMessageNewSignal(connect->bus, + path, + VIRT_DBUS_DOMAIN_INTERFACE, + "DeviceRemoved"); + + if (!msg) + return -1; =20 - r =3D sd_bus_message_append(message, "s", device); - if (r < 0) - return r; + if (virtDBusMessageAppendBasic(msg, DBUS_TYPE_STRING, &device) < 0) + return -1; =20 - return sd_bus_send(connect->bus, message, NULL); + return virtDBusSendMessage(msg); } =20 static int @@ -134,20 +129,18 @@ virtDBusEventsDomainTrayChange(virConnectPtr connecti= on VIRT_ATTR_UNUSED, void *opaque) { virtDBusConnect *connect =3D opaque; - _cleanup_(sd_bus_message_unrefp) sd_bus_message *message =3D NULL; + _cleanup_(virtDBusMessageFreep) virtDBusMessage *msg =3D NULL; _cleanup_(virtDBusUtilFreep) char *path =3D NULL; const char *reasonstr; - int r; =20 path =3D virtDBusUtilBusPathForVirDomain(domain, connect->domainPath); =20 - r =3D sd_bus_message_new_signal(connect->bus, - &message, - path, - VIRT_DBUS_DOMAIN_INTERFACE, - "TrayChange"); - if (r < 0) - return r; + msg =3D virtDBusMessageNewSignal(connect->bus, + path, + VIRT_DBUS_DOMAIN_INTERFACE, + "TrayChange"); + if (!msg) + return -1; =20 switch (reason) { case VIR_DOMAIN_EVENT_TRAY_CHANGE_OPEN: @@ -161,11 +154,13 @@ virtDBusEventsDomainTrayChange(virConnectPtr connecti= on VIRT_ATTR_UNUSED, break; } =20 - r =3D sd_bus_message_append(message, "ss", device, reasonstr); - if (r < 0) - return r; + if (virtDBusMessageAppendBasic(msg, DBUS_TYPE_STRING, &device) < 0) + return -1; + + if (virtDBusMessageAppendBasic(msg, DBUS_TYPE_STRING, &reasonstr) < 0) + return -1; =20 - return sd_bus_send(connect->bus, message, NULL); + return virtDBusSendMessage(msg); } =20 static int @@ -178,20 +173,18 @@ virtDBusEventsDomainDiskChange(virConnectPtr connecti= on VIRT_ATTR_UNUSED, void *opaque) { virtDBusConnect *connect =3D opaque; - _cleanup_(sd_bus_message_unrefp) sd_bus_message *message =3D NULL; + _cleanup_(virtDBusMessageFreep) virtDBusMessage *msg =3D NULL; _cleanup_(virtDBusUtilFreep) char *path =3D NULL; const char *reasonstr; - int r; =20 path =3D virtDBusUtilBusPathForVirDomain(domain, connect->domainPath); =20 - r =3D sd_bus_message_new_signal(connect->bus, - &message, - path, - VIRT_DBUS_DOMAIN_INTERFACE, - "DiskChange"); - if (r < 0) - return r; + msg =3D virtDBusMessageNewSignal(connect->bus, + path, + VIRT_DBUS_DOMAIN_INTERFACE, + "DiskChange"); + if (!msg) + return -1; =20 switch (reason) { case VIR_DOMAIN_EVENT_DISK_CHANGE_MISSING_ON_START: @@ -205,11 +198,19 @@ virtDBusEventsDomainDiskChange(virConnectPtr connecti= on VIRT_ATTR_UNUSED, break; } =20 - r =3D sd_bus_message_append(message, "ssss", old_src_path, new_src_pat= h, device, reasonstr); - if (r < 0) - return r; + if (virtDBusMessageAppendBasic(msg, DBUS_TYPE_STRING, &old_src_path) <= 0) + return -1; + + if (virtDBusMessageAppendBasic(msg, DBUS_TYPE_STRING, &new_src_path) <= 0) + return -1; + + if (virtDBusMessageAppendBasic(msg, DBUS_TYPE_STRING, &device) < 0) + return -1; + + if (virtDBusMessageAppendBasic(msg, DBUS_TYPE_STRING, &reasonstr) < 0) + return -1; =20 - return sd_bus_send(connect->bus, message, NULL); + return virtDBusSendMessage(msg); } =20 static void diff --git a/src/main.c b/src/main.c index 6f11aab..bef5dcc 100644 --- a/src/main.c +++ b/src/main.c @@ -1,44 +1,31 @@ #include "config.h" =20 +#include "dbus.h" #include "connect.h" +#include "domain.h" #include "util.h" =20 #include #include #include +#include #include #include #include +#include #include -#include #include =20 -static int loop_status; +static int loop_status =3D 0; =20 static int -virtDBusGetLibvirtEvents(sd_bus *bus) -{ - int events; - int virt_events =3D 0; - - events =3D sd_bus_get_events(bus); - - if (events & POLLIN) - virt_events |=3D VIR_EVENT_HANDLE_READABLE; - - if (events & POLLOUT) - virt_events |=3D VIR_EVENT_HANDLE_WRITABLE; - - return virt_events; -} - -static int -virtDBusProcessEvents(sd_bus *bus) +virtDBusProcessEvents(DBusConnection *bus, + virtDBusObjectList *objectList) { for (;;) { int r; =20 - r =3D sd_bus_process(bus, NULL); + r =3D virtDBusDispatchMessage(bus, objectList); if (r < 0) return r; =20 @@ -65,22 +52,6 @@ virtDBusHandleSignal(int watch VIRT_ATTR_UNUSED, loop_status =3D -ECANCELED; } =20 -static void -virtDBusHandleBusEvent(int watch, - int fd VIRT_ATTR_UNUSED, - int events VIRT_ATTR_UNUSED, - void *opaque) -{ - sd_bus *bus =3D opaque; - - loop_status =3D virtDBusProcessEvents(bus); - - if (loop_status < 0) - return; - - virEventUpdateHandle(watch, virtDBusGetLibvirtEvents(bus)); -} - struct virtDBusDriver { const char *uri; const char *object; @@ -123,23 +94,23 @@ main(int argc, char *argv[]) {} }; =20 - bool system_bus; + DBusBusType busType; const struct virtDBusDriver *drivers =3D NULL; int ndrivers =3D 0; =20 - _cleanup_(virtDBusConnectListFree) virtDBusConnect **connect =3D NULL; - _cleanup_(sd_bus_unrefp) sd_bus *bus =3D NULL; + _cleanup_(virtDBusConnectListFree) virtDBusConnect **connectList =3D N= ULL; + _cleanup_(virtDBusObjectListFree) virtDBusObjectList objectList =3D { = 0 }; + _cleanup_(virtDBusConnectionClose) DBusConnection *bus =3D NULL; _cleanup_(virtDBusUtilClosep) int signal_fd =3D -1; - _cleanup_(virtDBusVirEventRemoveHandlep) int bus_watch =3D -1; _cleanup_(virtDBusVirEventRemoveHandlep) int signal_watch =3D -1; sigset_t mask; int c; int r; =20 if (geteuid() =3D=3D 0) { - system_bus =3D true; + busType =3D DBUS_BUS_SYSTEM; } else { - system_bus =3D false; + busType =3D DBUS_BUS_SESSION; } =20 while ((c =3D getopt_long(argc, argv, "hc:", options, NULL)) >=3D 0) { @@ -155,11 +126,11 @@ main(int argc, char *argv[]) return 0; =20 case ARG_SYSTEM: - system_bus =3D true; + busType =3D DBUS_BUS_SYSTEM; break; =20 case ARG_SESSION: - system_bus =3D false; + busType =3D DBUS_BUS_SESSION; break; =20 default: @@ -174,19 +145,11 @@ main(int argc, char *argv[]) =20 virEventRegisterDefaultImpl(); =20 - r =3D system_bus ? sd_bus_open_system(&bus) : sd_bus_open_user(&bus); - if (r < 0) { - fprintf(stderr, "Failed to connect to session bus: %s\n", strerror= (-r)); + bus =3D virtDBusConnectionOpen(busType, "org.libvirt"); + if (!bus) return EXIT_FAILURE; - } - - r =3D sd_bus_request_name(bus, "org.libvirt", 0); - if (r < 0) { - fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-= r)); - return EXIT_FAILURE; - } =20 - if (system_bus) { + if (busType =3D=3D DBUS_BUS_SYSTEM) { drivers =3D systemDrivers; ndrivers =3D VIRT_N_ELEMENTS(systemDrivers); } else { @@ -194,10 +157,10 @@ main(int argc, char *argv[]) ndrivers =3D VIRT_N_ELEMENTS(sessionDrivers); } =20 - connect =3D calloc(ndrivers + 1, sizeof(virtDBusConnect *)); + connectList =3D calloc(ndrivers + 1, sizeof(virtDBusConnect *)); =20 for (int i =3D 0; i < ndrivers; i +=3D 1) { - r =3D virtDBusConnectNew(&connect[i], bus, + r =3D virtDBusConnectNew(&connectList[i], &objectList, bus, drivers[i].uri, drivers[i].object); if (r < 0) { fprintf(stderr, "Failed to register libvirt connection.\n"); @@ -205,16 +168,6 @@ main(int argc, char *argv[]) } } =20 - r =3D virtDBusProcessEvents(bus); - if (r < 0) - return EXIT_FAILURE; - - bus_watch =3D virEventAddHandle(sd_bus_get_fd(bus), - virtDBusGetLibvirtEvents(bus), - virtDBusHandleBusEvent, - bus, - NULL); - signal_fd =3D signalfd(-1, &mask, SFD_NONBLOCK | SFD_CLOEXEC); signal_watch =3D virEventAddHandle(signal_fd, VIR_EVENT_HANDLE_READABLE, @@ -226,9 +179,18 @@ main(int argc, char *argv[]) return EXIT_FAILURE; } =20 - while (loop_status >=3D 0) + r =3D virtDBusProcessEvents(bus, &objectList); + if (r < 0) + return EXIT_FAILURE; + + while (loop_status >=3D 0) { virEventRunDefaultImpl(); =20 + r =3D virtDBusProcessEvents(bus, &objectList); + if (r < 0) + return EXIT_FAILURE; + } + if (loop_status < 0 && loop_status !=3D -ECANCELED) { fprintf(stderr, "Error: %s\n", strerror(-loop_status)); return EXIT_FAILURE; diff --git a/src/util.c b/src/util.c index b6919fb..6f8b7be 100644 --- a/src/util.c +++ b/src/util.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -14,77 +15,79 @@ #define VIRT_UTIL_FILE_LIMIT 1024 * 1024 =20 int -virtDBusUtilMessageAppendTypedParameters(sd_bus_message *message, - virTypedParameterPtr parameters, - int n_parameters) +virtDBusUtilMessageAppendTypedParameters(virtDBusMessage *msg, + virTypedParameterPtr params, + int nparams) { - int r; + if (virtDBusMessageOpenContainer(msg, DBUS_TYPE_ARRAY, "{sv}") < 0) + return -1; =20 - r =3D sd_bus_message_open_container(message, 'a', "{sv}"); - if (r < 0) - return r; + for (int i =3D 0; i < nparams; i +=3D 1) { + if (virtDBusMessageOpenContainer(msg, DBUS_TYPE_DICT_ENTRY, NULL) = < 0) + return -1; =20 - for (int i =3D 0; i < n_parameters; i +=3D 1) { - r =3D sd_bus_message_open_container(message, SD_BUS_TYPE_DICT_ENTR= Y, "sv"); - if (r < 0) - return r; + if (virtDBusMessageAppendBasic(msg, DBUS_TYPE_STRING, ¶ms[i].f= ield) < 0) + return -1; =20 - r =3D sd_bus_message_append(message, "s", parameters[i].field); - if (r < 0) - return r; - - switch (parameters[i].type) { + switch (params[i].type) { case VIR_TYPED_PARAM_INT: - r =3D sd_bus_message_append(message, "v", "i", parameters[i].v= alue.i); + if (virtDBusMessageAppendVariant(msg, DBUS_TYPE_INT32, + "i", ¶ms[i].value.i) < 0) + return -1; break; case VIR_TYPED_PARAM_UINT: - r =3D sd_bus_message_append(message, "v", "u", parameters[i].v= alue.ui); + if (virtDBusMessageAppendVariant(msg, DBUS_TYPE_UINT32, + "u", ¶ms[i].value.ui) < 0) + return -1; break; case VIR_TYPED_PARAM_LLONG: - r =3D sd_bus_message_append(message, "v", "x", parameters[i].v= alue.l); + if (virtDBusMessageAppendVariant(msg, DBUS_TYPE_INT64, + "x", ¶ms[i].value.l) < 0) + return -1; break; case VIR_TYPED_PARAM_ULLONG: - r =3D sd_bus_message_append(message, "v", "t", parameters[i].v= alue.ul); + if (virtDBusMessageAppendVariant(msg, DBUS_TYPE_UINT64, + "t", ¶ms[i].value.ul) < 0) + return -1; break; case VIR_TYPED_PARAM_DOUBLE: - r =3D sd_bus_message_append(message, "v", "d", parameters[i].v= alue.d); + if (virtDBusMessageAppendVariant(msg, DBUS_TYPE_DOUBLE, + "d", ¶ms[i].value.d) < 0) + return -1; break; case VIR_TYPED_PARAM_BOOLEAN: - r =3D sd_bus_message_append(message, "v", "b", parameters[i].v= alue.b); + if (virtDBusMessageAppendVariant(msg, DBUS_TYPE_BOOLEAN, + "b", ¶ms[i].value.b) < 0) + return -1; break; case VIR_TYPED_PARAM_STRING: - r =3D sd_bus_message_append(message, "v", "s", parameters[i].v= alue.s); + if (virtDBusMessageAppendVariant(msg, DBUS_TYPE_STRING, + "s", ¶ms[i].value.s) < 0) + return -1; break; } =20 - if (r < 0) - return r; - - r =3D sd_bus_message_close_container(message); - if (r < 0) - return r; + if (virtDBusMessageCloseContainer(msg) < 0) + return -1; } =20 - return sd_bus_message_close_container(message); + return virtDBusMessageCloseContainer(msg); } =20 int -virtDBusUtilSetLastVirtError(sd_bus_error *error) +virtDBusUtilSetLastVirtError(virtDBusMessage *msg) { - virErrorPtr vir_error; + virErrorPtr virError; =20 - vir_error =3D virGetLastError(); - if (!vir_error) - return 0; + virError =3D virGetLastError(); =20 - return sd_bus_error_set(error, VIRT_DBUS_ERROR_INTERFACE, vir_error->m= essage); -} + if (!virError) { + return virtDBusMessageSetError(msg, VIRT_DBUS_ERROR_INTERFACE, + "unknown error"); + } =20 -int -virtDBusUtilSetError(sd_bus_error *error, - const char *message) -{ - return sd_bus_error_set(error, VIRT_DBUS_ERROR_INTERFACE, message); + return virtDBusMessageSetError(msg, VIRT_DBUS_ERROR_INTERFACE, "%s", + virError->message); } =20 char * diff --git a/src/util.h b/src/util.h index c42d2cc..16c54df 100644 --- a/src/util.h +++ b/src/util.h @@ -1,7 +1,8 @@ #pragma once =20 +#include "dbus.h" + #include -#include =20 #define VIRT_DBUS_ERROR_INTERFACE "org.libvirt.Error" =20 @@ -18,16 +19,12 @@ } while(0) =20 int -virtDBusUtilMessageAppendTypedParameters(sd_bus_message *message, - virTypedParameterPtr parameters, - int n_parameters); - -int -virtDBusUtilSetLastVirtError(sd_bus_error *error); +virtDBusUtilMessageAppendTypedParameters(virtDBusMessage *msg, + virTypedParameterPtr params, + int nparams); =20 int -virtDBusUtilSetError(sd_bus_error *error, - const char *message); +virtDBusUtilSetLastVirtError(virtDBusMessage *msg); =20 char * virtDBusUtilReadFile(const char *filename); diff --git a/test/travis-run b/test/travis-run index 47fe70c..7c96609 100755 --- a/test/travis-run +++ b/test/travis-run @@ -22,7 +22,7 @@ sudo chroot "$CHROOT" << EOF set -ex # install build deps apt-get update -apt-get install -y dh-autoreconf pkg-config libvirt-dev libsystemd-dev lib= dbus-1-dev libtool python3-gi python3-dbus dbus +apt-get install -y dh-autoreconf pkg-config libvirt-dev libdbus-1-dev libt= ool python3-gi python3-dbus dbus =20 # run build and tests as user chown -R buildd:buildd /build --=20 2.14.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list