From nobody Fri May 16 00:40:40 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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 150090363605733.240203965095475; Mon, 24 Jul 2017 06:40:36 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 63C11C00DB96; Mon, 24 Jul 2017 13:40:33 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3F4376DA99; Mon, 24 Jul 2017 13:40:33 +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 E28201805981; Mon, 24 Jul 2017 13:40:32 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v6ODdA0I001769 for ; Mon, 24 Jul 2017 09:39:10 -0400 Received: by smtp.corp.redhat.com (Postfix) id 35ED74DA74; Mon, 24 Jul 2017 13:39:10 +0000 (UTC) Received: from antique-work.brq.redhat.com (unknown [10.43.2.41]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6055217AF7 for ; Mon, 24 Jul 2017 13:39:09 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 63C11C00DB96 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 63C11C00DB96 From: Pavel Hrdina To: libvir-list@redhat.com Date: Mon, 24 Jul 2017 15:38:56 +0200 Message-Id: <58ee79da0ad9283d246e4f74f526d7901947e175.1500647204.git.phrdina@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [dbus PATCH 3/9] domain: split domain code into separate file 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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 24 Jul 2017 13:40:34 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Instead of having all code only in one file split it logically to have one file for D-Bus object. Signed-off-by: Pavel Hrdina --- src/Makefile.am | 3 +- src/domain.c | 549 ++++++++++++++++++++++++++++++++++++++++++++++++++++= +++ src/domain.h | 9 + src/manager.c | 551 +---------------------------------------------------= ---- src/manager.h | 6 + 5 files changed, 568 insertions(+), 550 deletions(-) create mode 100644 src/domain.c create mode 100644 src/domain.h diff --git a/src/Makefile.am b/src/Makefile.am index e60f250..f066ed3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -4,7 +4,8 @@ AM_CPPFLAGS =3D \ DAEMON_SOURCES =3D \ main.c \ manager.c manager.h \ - util.c util.h + util.c util.h \ + domain.c domain.h =20 EXTRA_DIST =3D \ $(DAEMON_SOURCES) diff --git a/src/domain.c b/src/domain.c new file mode 100644 index 0000000..1bda3b8 --- /dev/null +++ b/src/domain.c @@ -0,0 +1,549 @@ +#include "domain.h" +#include "util.h" + +static int +domain_get_name(sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + const char *name =3D ""; + + domain =3D domain_from_bus_path(manager->connection, path); + if (domain =3D=3D NULL) + return sd_bus_message_append(reply, "s", ""); + + name =3D virDomainGetName(domain); + if (name =3D=3D NULL) + return sd_bus_message_append(reply, "s", ""); + + return sd_bus_message_append(reply, "s", name); +} + +static int +domain_get_uuid(sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + char uuid[VIR_UUID_STRING_BUFLEN] =3D ""; + + domain =3D domain_from_bus_path(manager->connection, path); + if (domain =3D=3D NULL) + return sd_bus_message_append(reply, "s", ""); + + virDomainGetUUIDString(domain, uuid); + + return sd_bus_message_append(reply, "s", uuid); +} + +static int +domain_get_id(sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + + domain =3D domain_from_bus_path(manager->connection, path); + if (domain =3D=3D NULL) + return sd_bus_message_append(reply, "u", 0); + + return sd_bus_message_append(reply, "u", virDomainGetID(domain)); +} + +static int +domain_get_vcpus(sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + + domain =3D domain_from_bus_path(manager->connection, path); + if (domain =3D=3D NULL) + return sd_bus_message_append(reply, "u", 0); + + return sd_bus_message_append(reply, "u", virDomainGetVcpusFlags(domain= , VIR_DOMAIN_VCPU_CURRENT)); +} + +static int +domain_get_os_type(sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + _cleanup_(freep) char *os_type =3D NULL; + + domain =3D domain_from_bus_path(manager->connection, path); + if (domain =3D=3D NULL) + return sd_bus_message_append(reply, "s", ""); + + os_type =3D virDomainGetOSType(domain); + if (os_type =3D=3D NULL) + return sd_bus_message_append(reply, "s", ""); + + return sd_bus_message_append(reply, "s", os_type); +} + +static int +domain_get_active(sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + int active; + + domain =3D domain_from_bus_path(manager->connection, path); + if (domain =3D=3D NULL) + return sd_bus_message_append(reply, "b", 0); + + active =3D virDomainIsActive(domain); + if (active < 0) + return sd_bus_message_append(reply, "b", 0); + + return sd_bus_message_append(reply, "b", active); +} + +static int +domain_get_persistent(sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + int persistent; + + domain =3D domain_from_bus_path(manager->connection, path); + if (domain =3D=3D NULL) + return sd_bus_message_append(reply, "b", 0); + + persistent =3D virDomainIsPersistent(domain); + if (persistent < 0) + return sd_bus_message_append(reply, "b", 0); + + return sd_bus_message_append(reply, "b", persistent); +} + +static int +domain_get_state(sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + int state =3D 0; + const char *string; + + domain =3D domain_from_bus_path(manager->connection, path); + if (domain =3D=3D NULL) + return sd_bus_message_append(reply, "s", ""); + + virDomainGetState(domain, &state, NULL, 0); + + switch (state) { + case VIR_DOMAIN_NOSTATE: + default: + string =3D "nostate"; + break; + case VIR_DOMAIN_RUNNING: + string =3D "running"; + break; + case VIR_DOMAIN_BLOCKED: + string =3D "blocked"; + break; + case VIR_DOMAIN_PAUSED: + string =3D "paused"; + break; + case VIR_DOMAIN_SHUTDOWN: + string =3D "shutdown"; + break; + case VIR_DOMAIN_SHUTOFF: + string =3D "shutoff"; + break; + case VIR_DOMAIN_CRASHED: + string =3D "crashed"; + break; + case VIR_DOMAIN_PMSUSPENDED: + string =3D "pmsuspended"; + break; + } + + return sd_bus_message_append(reply, "s", string); +} + +static int +domain_get_autostart(sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + int autostart =3D 0; + + domain =3D domain_from_bus_path(manager->connection, path); + if (domain =3D=3D NULL) + return sd_bus_message_append(reply, "b", 0); + + virDomainGetAutostart(domain, &autostart); + + return sd_bus_message_append(reply, "b", autostart); +} + +static int +domain_get_xml_desc(sd_bus_message *message, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + _cleanup_(freep) char *description =3D NULL; + uint32_t flags; + int r; + + domain =3D domain_from_bus_path(manager->connection, + sd_bus_message_get_path(message)); + if (domain =3D=3D NULL) { + return sd_bus_reply_method_errorf(message, + SD_BUS_ERROR_UNKNOWN_OBJECT, + "Unknown object '%s'.", + sd_bus_message_get_path(message)= ); + } + + r =3D sd_bus_message_read(message, "u", &flags); + if (r < 0) + return r; + + description =3D virDomainGetXMLDesc(domain, flags); + if (!description) + return bus_error_set_last_virt_error(error); + + return sd_bus_reply_method_return(message, "s", description); +} + +static void +virDomainStatsRecordListFreep(virDomainStatsRecordPtr **statsp) +{ + if (*statsp) + virDomainStatsRecordListFree(*statsp); +} + +static int +domain_get_stats(sd_bus_message *message, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + virDomainPtr domains[2]; + _cleanup_(virDomainStatsRecordListFreep) virDomainStatsRecordPtr *reco= rds =3D NULL; + _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply =3D NULL; + uint32_t flags, stats; + int r; + + r =3D sd_bus_message_read(message, "uu", &stats, &flags); + if (r < 0) + return r; + + domain =3D domain_from_bus_path(manager->connection, + sd_bus_message_get_path(message)); + if (domain =3D=3D NULL) { + return sd_bus_reply_method_errorf(message, + SD_BUS_ERROR_UNKNOWN_OBJECT, + "Unknown object '%s'.", + sd_bus_message_get_path(message)= ); + } + + domains[0] =3D domain; + domains[1] =3D NULL; + + if (virDomainListGetStats(domains, stats, &records, flags) !=3D 1) + return bus_error_set_last_virt_error(error); + + r =3D sd_bus_message_new_method_return(message, &reply); + if (r < 0) + return r; + + r =3D bus_message_append_typed_parameters(reply, records[0]->params, r= ecords[0]->nparams); + if (r < 0) + return r; + + return sd_bus_send(NULL, reply, NULL); +} + +static int +domain_shutdown(sd_bus_message *message, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + int r; + + domain =3D domain_from_bus_path(manager->connection, + sd_bus_message_get_path(message)); + if (domain =3D=3D NULL) { + return sd_bus_reply_method_errorf(message, + SD_BUS_ERROR_UNKNOWN_OBJECT, + "Unknown object '%s'.", + sd_bus_message_get_path(message)= ); + } + + r =3D virDomainShutdown(domain); + if (r < 0) + return bus_error_set_last_virt_error(error); + + return sd_bus_reply_method_return(message, ""); +} + +static int +domain_destroy(sd_bus_message *message, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + int r; + + domain =3D domain_from_bus_path(manager->connection, + sd_bus_message_get_path(message)); + if (domain =3D=3D NULL) { + return sd_bus_reply_method_errorf(message, + SD_BUS_ERROR_UNKNOWN_OBJECT, + "Unknown object '%s'.", + sd_bus_message_get_path(message)= ); + } + + r =3D virDomainDestroy(domain); + if (r < 0) + return bus_error_set_last_virt_error(error); + + return sd_bus_reply_method_return(message, ""); +} + +static int +domain_reboot(sd_bus_message *message, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + uint32_t flags; + int r; + + r =3D sd_bus_message_read(message, "u", &flags); + if (r < 0) + return r; + + domain =3D domain_from_bus_path(manager->connection, + sd_bus_message_get_path(message)); + if (domain =3D=3D NULL) { + return sd_bus_reply_method_errorf(message, + SD_BUS_ERROR_UNKNOWN_OBJECT, + "Unknown object '%s'.", + sd_bus_message_get_path(message)= ); + } + + r =3D virDomainReboot(domain, flags); + if (r < 0) + return bus_error_set_last_virt_error(error); + + return sd_bus_reply_method_return(message, ""); +} + +static int +domain_reset(sd_bus_message *message, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + uint32_t flags; + int r; + + r =3D sd_bus_message_read(message, "u", &flags); + if (r < 0) + return r; + + domain =3D domain_from_bus_path(manager->connection, + sd_bus_message_get_path(message)); + if (domain =3D=3D NULL) { + return sd_bus_reply_method_errorf(message, + SD_BUS_ERROR_UNKNOWN_OBJECT, + "Unknown object '%s'.", + sd_bus_message_get_path(message)= ); + } + + r =3D virDomainReset(domain, flags); + if (r < 0) + return bus_error_set_last_virt_error(error); + + return sd_bus_reply_method_return(message, ""); +} + +static int +domain_create(sd_bus_message *message, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + int r; + + domain =3D domain_from_bus_path(manager->connection, + sd_bus_message_get_path(message)); + if (domain =3D=3D NULL) { + return sd_bus_reply_method_errorf(message, + SD_BUS_ERROR_UNKNOWN_OBJECT, + "Unknown object '%s'.", + sd_bus_message_get_path(message)= ); + } + + r =3D virDomainCreate(domain); + if (r < 0) + return bus_error_set_last_virt_error(error); + + return sd_bus_reply_method_return(message, ""); +} + +static int +domain_undefine(sd_bus_message *message, + void *userdata, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + int r; + + domain =3D domain_from_bus_path(manager->connection, + sd_bus_message_get_path(message)); + if (domain =3D=3D NULL) { + return sd_bus_reply_method_errorf(message, + SD_BUS_ERROR_UNKNOWN_OBJECT, + "Unknown object '%s'.", + sd_bus_message_get_path(message)= ); + } + + r =3D virDomainUndefine(domain); + if (r < 0) + return bus_error_set_last_virt_error(error); + + return sd_bus_reply_method_return(message, ""); +} + +static const sd_bus_vtable virt_domain_vtable[] =3D { + SD_BUS_VTABLE_START(0), + + SD_BUS_PROPERTY("Name", "s", domain_get_name, 0, 0), + SD_BUS_PROPERTY("UUID", "s", domain_get_uuid, 0, 0), + SD_BUS_PROPERTY("Id", "u", domain_get_id, 0, 0), + SD_BUS_PROPERTY("Vcpus", "u", domain_get_vcpus, 0, 0), + SD_BUS_PROPERTY("OSType", "s", domain_get_os_type, 0, 0), + SD_BUS_PROPERTY("Active", "b", domain_get_active, 0, 0), + SD_BUS_PROPERTY("Persistent", "b", domain_get_persistent, 0, 0), + SD_BUS_PROPERTY("State", "s", domain_get_state, 0, 0), + SD_BUS_PROPERTY("Autostart", "b", domain_get_autostart, 0, 0), + + SD_BUS_METHOD("GetXMLDesc", "u", "s", domain_get_xml_desc, SD_BUS_VTAB= LE_UNPRIVILEGED), + SD_BUS_METHOD("GetStats", "uu", "a{sv}", domain_get_stats, SD_BUS_VTAB= LE_UNPRIVILEGED), + SD_BUS_METHOD("Shutdown", "", "", domain_shutdown, SD_BUS_VTABLE_UNPRI= VILEGED), + SD_BUS_METHOD("Destroy", "", "", domain_destroy, SD_BUS_VTABLE_UNPRIVI= LEGED), + SD_BUS_METHOD("Reboot", "u", "", domain_reboot, SD_BUS_VTABLE_UNPRIVIL= EGED), + SD_BUS_METHOD("Reset", "u", "", domain_reset, SD_BUS_VTABLE_UNPRIVILEG= ED), + SD_BUS_METHOD("Create", "", "", domain_create, SD_BUS_VTABLE_UNPRIVILE= GED), + SD_BUS_METHOD("Undefine", "", "", domain_undefine, SD_BUS_VTABLE_UNPRI= VILEGED), + + 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 int +lookup_domain(sd_bus *bus, + const char *path, + const char *interface, + void *userdata, + void **found, + sd_bus_error *error) +{ + VirtManager *manager =3D userdata; + _cleanup_(freep) char *name =3D NULL; + _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; + int r; + + r =3D sd_bus_path_decode(path, "/org/libvirt/domain", &name); + if (r < 0) + return r; + + if (*name =3D=3D '\0') + return 0; + + domain =3D virDomainLookupByUUIDString(manager->connection, name); + if (!domain) + return 0; + + /* + * There's no way to unref the pointer we're returning here. So, + * return the manager object and look up the domain again in the + * domain_* callbacks. + */ + *found =3D manager; + + return 1; +} + +int +domain_register(VirtManager *manager, + sd_bus *bus) +{ + return sd_bus_add_fallback_vtable(bus, + NULL, + "/org/libvirt/domain", + "org.libvirt.Domain", + virt_domain_vtable, + lookup_domain, + manager); +} diff --git a/src/domain.h b/src/domain.h new file mode 100644 index 0000000..3f347e8 --- /dev/null +++ b/src/domain.h @@ -0,0 +1,9 @@ +#pragma once + +#include "manager.h" + +#include +#include + +int domain_register(VirtManager *manager, + sd_bus *bus); diff --git a/src/manager.c b/src/manager.c index 0cf0f8e..a2709b4 100644 --- a/src/manager.c +++ b/src/manager.c @@ -1,3 +1,4 @@ +#include "domain.h" #include "manager.h" #include "util.h" =20 @@ -5,483 +6,6 @@ #include #include =20 -struct VirtManager { - sd_bus *bus; - virConnectPtr connection; - - int callback_ids[VIR_DOMAIN_EVENT_ID_LAST]; -}; - -static int -domain_get_name(sd_bus *bus, - const char *path, - const char *interface, - const char *property, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - const char *name =3D ""; - - domain =3D domain_from_bus_path(manager->connection, path); - if (domain =3D=3D NULL) - return sd_bus_message_append(reply, "s", ""); - - name =3D virDomainGetName(domain); - if (name =3D=3D NULL) - return sd_bus_message_append(reply, "s", ""); - - return sd_bus_message_append(reply, "s", name); -} - -static int -domain_get_uuid(sd_bus *bus, - const char *path, - const char *interface, - const char *property, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - char uuid[VIR_UUID_STRING_BUFLEN] =3D ""; - - domain =3D domain_from_bus_path(manager->connection, path); - if (domain =3D=3D NULL) - return sd_bus_message_append(reply, "s", ""); - - virDomainGetUUIDString(domain, uuid); - - return sd_bus_message_append(reply, "s", uuid); -} - -static int -domain_get_id(sd_bus *bus, - const char *path, - const char *interface, - const char *property, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - - domain =3D domain_from_bus_path(manager->connection, path); - if (domain =3D=3D NULL) - return sd_bus_message_append(reply, "u", 0); - - return sd_bus_message_append(reply, "u", virDomainGetID(domain)); -} - -static int -domain_get_vcpus(sd_bus *bus, - const char *path, - const char *interface, - const char *property, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - - domain =3D domain_from_bus_path(manager->connection, path); - if (domain =3D=3D NULL) - return sd_bus_message_append(reply, "u", 0); - - return sd_bus_message_append(reply, "u", virDomainGetVcpusFlags(domain= , VIR_DOMAIN_VCPU_CURRENT)); -} - -static int -domain_get_os_type(sd_bus *bus, - const char *path, - const char *interface, - const char *property, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - _cleanup_(freep) char *os_type =3D NULL; - - domain =3D domain_from_bus_path(manager->connection, path); - if (domain =3D=3D NULL) - return sd_bus_message_append(reply, "s", ""); - - os_type =3D virDomainGetOSType(domain); - if (os_type =3D=3D NULL) - return sd_bus_message_append(reply, "s", ""); - - return sd_bus_message_append(reply, "s", os_type); -} - -static int -domain_get_active(sd_bus *bus, - const char *path, - const char *interface, - const char *property, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - int active; - - domain =3D domain_from_bus_path(manager->connection, path); - if (domain =3D=3D NULL) - return sd_bus_message_append(reply, "b", 0); - - active =3D virDomainIsActive(domain); - if (active < 0) - return sd_bus_message_append(reply, "b", 0); - - return sd_bus_message_append(reply, "b", active); -} - -static int -domain_get_persistent(sd_bus *bus, - const char *path, - const char *interface, - const char *property, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - int persistent; - - domain =3D domain_from_bus_path(manager->connection, path); - if (domain =3D=3D NULL) - return sd_bus_message_append(reply, "b", 0); - - persistent =3D virDomainIsPersistent(domain); - if (persistent < 0) - return sd_bus_message_append(reply, "b", 0); - - return sd_bus_message_append(reply, "b", persistent); -} - -static int -domain_get_state(sd_bus *bus, - const char *path, - const char *interface, - const char *property, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - int state =3D 0; - const char *string; - - domain =3D domain_from_bus_path(manager->connection, path); - if (domain =3D=3D NULL) - return sd_bus_message_append(reply, "s", ""); - - virDomainGetState(domain, &state, NULL, 0); - - switch (state) { - case VIR_DOMAIN_NOSTATE: - default: - string =3D "nostate"; - break; - case VIR_DOMAIN_RUNNING: - string =3D "running"; - break; - case VIR_DOMAIN_BLOCKED: - string =3D "blocked"; - break; - case VIR_DOMAIN_PAUSED: - string =3D "paused"; - break; - case VIR_DOMAIN_SHUTDOWN: - string =3D "shutdown"; - break; - case VIR_DOMAIN_SHUTOFF: - string =3D "shutoff"; - break; - case VIR_DOMAIN_CRASHED: - string =3D "crashed"; - break; - case VIR_DOMAIN_PMSUSPENDED: - string =3D "pmsuspended"; - break; - } - - return sd_bus_message_append(reply, "s", string); -} - -static int -domain_get_autostart(sd_bus *bus, - const char *path, - const char *interface, - const char *property, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - int autostart =3D 0; - - domain =3D domain_from_bus_path(manager->connection, path); - if (domain =3D=3D NULL) - return sd_bus_message_append(reply, "b", 0); - - virDomainGetAutostart(domain, &autostart); - - return sd_bus_message_append(reply, "b", autostart); -} - -static int -domain_get_xml_desc(sd_bus_message *message, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - _cleanup_(freep) char *description =3D NULL; - uint32_t flags; - int r; - - domain =3D domain_from_bus_path(manager->connection, - sd_bus_message_get_path(message)); - if (domain =3D=3D NULL) { - return sd_bus_reply_method_errorf(message, - SD_BUS_ERROR_UNKNOWN_OBJECT, - "Unknown object '%s'.", - sd_bus_message_get_path(message)= ); - } - - r =3D sd_bus_message_read(message, "u", &flags); - if (r < 0) - return r; - - description =3D virDomainGetXMLDesc(domain, flags); - if (!description) - return bus_error_set_last_virt_error(error); - - return sd_bus_reply_method_return(message, "s", description); -} - -static void -virDomainStatsRecordListFreep(virDomainStatsRecordPtr **statsp) -{ - if (*statsp) - virDomainStatsRecordListFree(*statsp); -} - -static int -domain_get_stats(sd_bus_message *message, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - virDomainPtr domains[2]; - _cleanup_(virDomainStatsRecordListFreep) virDomainStatsRecordPtr *reco= rds =3D NULL; - _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply =3D NULL; - uint32_t flags, stats; - int r; - - r =3D sd_bus_message_read(message, "uu", &stats, &flags); - if (r < 0) - return r; - - domain =3D domain_from_bus_path(manager->connection, - sd_bus_message_get_path(message)); - if (domain =3D=3D NULL) { - return sd_bus_reply_method_errorf(message, - SD_BUS_ERROR_UNKNOWN_OBJECT, - "Unknown object '%s'.", - sd_bus_message_get_path(message)= ); - } - - domains[0] =3D domain; - domains[1] =3D NULL; - - if (virDomainListGetStats(domains, stats, &records, flags) !=3D 1) - return bus_error_set_last_virt_error(error); - - r =3D sd_bus_message_new_method_return(message, &reply); - if (r < 0) - return r; - - r =3D bus_message_append_typed_parameters(reply, records[0]->params, r= ecords[0]->nparams); - if (r < 0) - return r; - - return sd_bus_send(NULL, reply, NULL); -} - -static int -domain_shutdown(sd_bus_message *message, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - int r; - - domain =3D domain_from_bus_path(manager->connection, - sd_bus_message_get_path(message)); - if (domain =3D=3D NULL) { - return sd_bus_reply_method_errorf(message, - SD_BUS_ERROR_UNKNOWN_OBJECT, - "Unknown object '%s'.", - sd_bus_message_get_path(message)= ); - } - - r =3D virDomainShutdown(domain); - if (r < 0) - return bus_error_set_last_virt_error(error); - - return sd_bus_reply_method_return(message, ""); -} - -static int -domain_destroy(sd_bus_message *message, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - int r; - - domain =3D domain_from_bus_path(manager->connection, - sd_bus_message_get_path(message)); - if (domain =3D=3D NULL) { - return sd_bus_reply_method_errorf(message, - SD_BUS_ERROR_UNKNOWN_OBJECT, - "Unknown object '%s'.", - sd_bus_message_get_path(message)= ); - } - - r =3D virDomainDestroy(domain); - if (r < 0) - return bus_error_set_last_virt_error(error); - - return sd_bus_reply_method_return(message, ""); -} - -static int -domain_reboot(sd_bus_message *message, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - uint32_t flags; - int r; - - r =3D sd_bus_message_read(message, "u", &flags); - if (r < 0) - return r; - - domain =3D domain_from_bus_path(manager->connection, - sd_bus_message_get_path(message)); - if (domain =3D=3D NULL) { - return sd_bus_reply_method_errorf(message, - SD_BUS_ERROR_UNKNOWN_OBJECT, - "Unknown object '%s'.", - sd_bus_message_get_path(message)= ); - } - - r =3D virDomainReboot(domain, flags); - if (r < 0) - return bus_error_set_last_virt_error(error); - - return sd_bus_reply_method_return(message, ""); -} - -static int -domain_reset(sd_bus_message *message, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - uint32_t flags; - int r; - - r =3D sd_bus_message_read(message, "u", &flags); - if (r < 0) - return r; - - domain =3D domain_from_bus_path(manager->connection, - sd_bus_message_get_path(message)); - if (domain =3D=3D NULL) { - return sd_bus_reply_method_errorf(message, - SD_BUS_ERROR_UNKNOWN_OBJECT, - "Unknown object '%s'.", - sd_bus_message_get_path(message)= ); - } - - r =3D virDomainReset(domain, flags); - if (r < 0) - return bus_error_set_last_virt_error(error); - - return sd_bus_reply_method_return(message, ""); -} - -static int -domain_create(sd_bus_message *message, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - int r; - - domain =3D domain_from_bus_path(manager->connection, - sd_bus_message_get_path(message)); - if (domain =3D=3D NULL) { - return sd_bus_reply_method_errorf(message, - SD_BUS_ERROR_UNKNOWN_OBJECT, - "Unknown object '%s'.", - sd_bus_message_get_path(message)= ); - } - - r =3D virDomainCreate(domain); - if (r < 0) - return bus_error_set_last_virt_error(error); - - return sd_bus_reply_method_return(message, ""); -} - -static int -domain_undefine(sd_bus_message *message, - void *userdata, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - int r; - - domain =3D domain_from_bus_path(manager->connection, - sd_bus_message_get_path(message)); - if (domain =3D=3D NULL) { - return sd_bus_reply_method_errorf(message, - SD_BUS_ERROR_UNKNOWN_OBJECT, - "Unknown object '%s'.", - sd_bus_message_get_path(message)= ); - } - - r =3D virDomainUndefine(domain); - if (r < 0) - return bus_error_set_last_virt_error(error); - - return sd_bus_reply_method_return(message, ""); -} - static int enumerate_domains(sd_bus *bus, const char *path, @@ -808,40 +332,6 @@ handle_domain_tray_change_event(virConnectPtr connecti= on, return sd_bus_send(manager->bus, message, NULL); } =20 -static int -lookup_domain(sd_bus *bus, - const char *path, - const char *interface, - void *userdata, - void **found, - sd_bus_error *error) -{ - VirtManager *manager =3D userdata; - _cleanup_(freep) char *name =3D NULL; - _cleanup_(virDomainFreep) virDomainPtr domain =3D NULL; - int r; - - r =3D sd_bus_path_decode(path, "/org/libvirt/domain", &name); - if (r < 0) - return r; - - if (*name =3D=3D '\0') - return 0; - - domain =3D virDomainLookupByUUIDString(manager->connection, name); - if (!domain) - return 0; - - /* - * There's no way to unref the pointer we're returning here. So, - * return the manager object and look up the domain again in the - * domain_* callbacks. - */ - *found =3D manager; - - return 1; -} - static void virt_manager_register_event(VirtManager *manager, int id, @@ -877,36 +367,6 @@ static const sd_bus_vtable virt_manager_vtable[] =3D { SD_BUS_VTABLE_END }; =20 -static const sd_bus_vtable virt_domain_vtable[] =3D { - SD_BUS_VTABLE_START(0), - - SD_BUS_PROPERTY("Name", "s", domain_get_name, 0, 0), - SD_BUS_PROPERTY("UUID", "s", domain_get_uuid, 0, 0), - SD_BUS_PROPERTY("Id", "u", domain_get_id, 0, 0), - SD_BUS_PROPERTY("Vcpus", "u", domain_get_vcpus, 0, 0), - SD_BUS_PROPERTY("OSType", "s", domain_get_os_type, 0, 0), - SD_BUS_PROPERTY("Active", "b", domain_get_active, 0, 0), - SD_BUS_PROPERTY("Persistent", "b", domain_get_persistent, 0, 0), - SD_BUS_PROPERTY("State", "s", domain_get_state, 0, 0), - SD_BUS_PROPERTY("Autostart", "b", domain_get_autostart, 0, 0), - - SD_BUS_METHOD("GetXMLDesc", "u", "s", domain_get_xml_desc, SD_BUS_VTAB= LE_UNPRIVILEGED), - SD_BUS_METHOD("GetStats", "uu", "a{sv}", domain_get_stats, SD_BUS_VTAB= LE_UNPRIVILEGED), - SD_BUS_METHOD("Shutdown", "", "", domain_shutdown, SD_BUS_VTABLE_UNPRI= VILEGED), - SD_BUS_METHOD("Destroy", "", "", domain_destroy, SD_BUS_VTABLE_UNPRIVI= LEGED), - SD_BUS_METHOD("Reboot", "u", "", domain_reboot, SD_BUS_VTABLE_UNPRIVIL= EGED), - SD_BUS_METHOD("Reset", "u", "", domain_reset, SD_BUS_VTABLE_UNPRIVILEG= ED), - SD_BUS_METHOD("Create", "", "", domain_create, SD_BUS_VTABLE_UNPRIVILE= GED), - SD_BUS_METHOD("Undefine", "", "", domain_undefine, SD_BUS_VTABLE_UNPRI= VILEGED), - - 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 -}; - int virt_manager_new(VirtManager **managerp, sd_bus *bus, @@ -958,14 +418,7 @@ virt_manager_new(VirtManager **managerp, if (r < 0) return r; =20 - r =3D sd_bus_add_fallback_vtable(bus, - NULL, - "/org/libvirt/domain", - "org.libvirt.Domain", - virt_domain_vtable, - lookup_domain, - manager); - if (r < 0) + if ((r =3D domain_register(manager, bus) < 0)) return r; =20 *managerp =3D manager; diff --git a/src/manager.h b/src/manager.h index 8f2aedb..06aaa04 100644 --- a/src/manager.h +++ b/src/manager.h @@ -5,6 +5,12 @@ #include #include =20 +struct VirtManager { + sd_bus *bus; + virConnectPtr connection; + + int callback_ids[VIR_DOMAIN_EVENT_ID_LAST]; +}; typedef struct VirtManager VirtManager; =20 int virt_manager_new(VirtManager **managerp, --=20 2.13.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list