From nobody Wed May 14 23:46:26 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 1516641405253834.7596647644318; Mon, 22 Jan 2018 09:16:45 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 482D8C098D23; Mon, 22 Jan 2018 17:16:44 +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 242186267D; Mon, 22 Jan 2018 17:16:44 +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 D92B818033E2; Mon, 22 Jan 2018 17:16:43 +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 w0MHGYX8028769 for ; Mon, 22 Jan 2018 12:16:34 -0500 Received: by smtp.corp.redhat.com (Postfix) id 6425A5E1C7; Mon, 22 Jan 2018 17:16:34 +0000 (UTC) Received: from antique-work.brq.redhat.com (unknown [10.43.2.152]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5A7221715B; Mon, 22 Jan 2018 17:16:29 +0000 (UTC) From: Pavel Hrdina To: libvir-list@redhat.com Date: Mon, 22 Jan 2018 18:16:08 +0100 Message-Id: <59de15e423a774f282e549e5a775f9724957eb9c.1516640486.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 Cc: lars@karlitski.net Subject: [libvirt] [dbus RFC 10/11] main: implement multiple connection within one daemon 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.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 22 Jan 2018 17:16:44 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This effectively removes --connect parameter from daemon, for now we will support only local connection. Instead of specifying URI for different drivers we will use connect object which allows using multiple drivers from one daemon. In the future if that feature will be requested we can extend libvirt-dbus to have some configuration file where we will have an option to specify remote host instead of local connection. This change also defines the difference between session and system bus, and limits the list of drivers available for that specific bus because not all drivers support session mode. Currently only QEMU driver has session mode. For test purposes we can allow TEST driver to be available for session bus. Signed-off-by: Pavel Hrdina Reviewed-by: Daniel P. Berrange --- src/connect.c | 17 +++++++++++++++-- src/connect.h | 4 +++- src/main.c | 55 ++++++++++++++++++++++++++++++++++---------------= ---- test/libvirttest.py | 4 ++-- 4 files changed, 55 insertions(+), 25 deletions(-) diff --git a/src/connect.c b/src/connect.c index 5249eba..878cf91 100644 --- a/src/connect.c +++ b/src/connect.c @@ -238,7 +238,8 @@ static const sd_bus_vtable virt_connect_vtable[] =3D { int virtDBusConnectNew(virtDBusConnect **connectp, sd_bus *bus, - const char *uri) + const char *uri, + const char *connectPath) { _cleanup_(virtDBusConnectFreep) virtDBusConnect *connect =3D NULL; int r; @@ -249,7 +250,7 @@ virtDBusConnectNew(virtDBusConnect **connectp, =20 connect->bus =3D sd_bus_ref(bus); connect->uri =3D uri; - connect->connectPath =3D "/org/libvirt/Connect"; + connect->connectPath =3D connectPath; =20 connect->enumerateDomains =3D virtDBusConnectEnumarateDomains; =20 @@ -293,3 +294,15 @@ virtDBusConnectFreep(virtDBusConnect **connectp) if (*connectp) virtDBusConnectFree(*connectp); } + +void +virtDBusConnectListFree(virtDBusConnect ***connectList) +{ + if (!*connectList) + return; + + for (int i =3D 0; (*connectList)[i]; i +=3D 1) + virtDBusConnectFree((*connectList)[i]); + + free(*connectList); +} diff --git a/src/connect.h b/src/connect.h index bed2c7e..46e8c9a 100644 --- a/src/connect.h +++ b/src/connect.h @@ -20,6 +20,8 @@ typedef struct virtDBusConnect virtDBusConnect; =20 int virtDBusConnectNew(virtDBusConnect **connectp, sd_bus *bus, - const char *uri); + const char *uri, + const char *connectPath); virtDBusConnect *virtDBusConnectFree(virtDBusConnect *connect); void virtDBusConnectFreep(virtDBusConnect **connectp); +void virtDBusConnectListFree(virtDBusConnect ***connectList); diff --git a/src/main.c b/src/main.c index 95522f5..14c7c18 100644 --- a/src/main.c +++ b/src/main.c @@ -79,6 +79,21 @@ virtDBusHandleBusEvent(int watch, virEventUpdateHandle(watch, virtDBusGetLibvirtEvents(bus)); } =20 +struct virtDBusDriver { + const char *uri; + const char *object; +}; + +static const struct virtDBusDriver sessionDrivers[] =3D { + { "qemu:///session", "/org/libvirt/qemu" }, + { "test:///default", "/org/libvirt/test" }, +}; + +static const struct virtDBusDriver systemDrivers[] =3D { + { "qemu:///system", "/org/libvirt/qemu" }, + { "test:///default", "/org/libvirt/test" }, +}; + int main(int argc, char *argv[]) { @@ -89,16 +104,16 @@ main(int argc, char *argv[]) =20 static const struct option options[] =3D { { "help", no_argument, NULL, 'h' }, - { "connect", required_argument, NULL, 'c' }, { "system", no_argument, NULL, ARG_SYSTEM }, { "session", no_argument, NULL, ARG_SESSION }, {} }; =20 bool system_bus; - const char *uri =3D NULL; + const struct virtDBusDriver *drivers =3D NULL; + int ndrivers =3D 0; =20 - _cleanup_(virtDBusConnectFreep) virtDBusConnect *connect =3D NULL; + _cleanup_(virtDBusConnectListFree) virtDBusConnect **connect =3D NULL; _cleanup_(sd_bus_unrefp) sd_bus *bus =3D NULL; _cleanup_(virtDBusUtilClosep) int signal_fd =3D -1; _cleanup_(virtDBusVirEventRemoveHandlep) int bus_watch =3D -1; @@ -121,15 +136,10 @@ main(int argc, char *argv[]) printf("Provide a D-Bus interface to a libvirtd.\n"); printf("\n"); printf(" -h, --help Display this help text and exi= t\n"); - printf(" -c, --connect URI Connect to the specified libvi= rt URI\n"); printf(" --session Connect to the session bus\n"); printf(" --system Connect to the system bus\n"); return 0; =20 - case 'c': - uri =3D optarg; - break; - case ARG_SYSTEM: system_bus =3D true; break; @@ -143,14 +153,6 @@ main(int argc, char *argv[]) } } =20 - if (uri =3D=3D NULL) { - if (system_bus) { - uri =3D "qemu:///system"; - } else { - uri =3D "qemu:///session"; - } - } - sigemptyset(&mask); sigaddset(&mask, SIGTERM); sigaddset(&mask, SIGINT); @@ -170,10 +172,23 @@ main(int argc, char *argv[]) return EXIT_FAILURE; } =20 - r =3D virtDBusConnectNew(&connect, bus, uri); - if (r < 0) { - fprintf(stderr, "Failed to connect to libvirt."); - return EXIT_FAILURE; + if (system_bus) { + drivers =3D systemDrivers; + ndrivers =3D VIRT_ARRAY_CARDINALITY(systemDrivers); + } else { + drivers =3D sessionDrivers; + ndrivers =3D VIRT_ARRAY_CARDINALITY(sessionDrivers); + } + + connect =3D calloc(ndrivers + 1, sizeof(virtDBusConnect *)); + + for (int i =3D 0; i < ndrivers; i +=3D 1) { + r =3D virtDBusConnectNew(&connect[i], bus, + drivers[i].uri, drivers[i].object); + if (r < 0) { + fprintf(stderr, "Failed to register libvirt connection."); + return EXIT_FAILURE; + } } =20 r =3D virtDBusProcessEvents(bus); diff --git a/test/libvirttest.py b/test/libvirttest.py index 2c735e9..579485f 100644 --- a/test/libvirttest.py +++ b/test/libvirttest.py @@ -28,7 +28,7 @@ class TestCase(unittest.TestCase): def setUp(self): os.environ['LIBVIRT_DEBUG'] =3D '3' =20 - self.daemon =3D subprocess.Popen([exe, '--connect', 'test:///defau= lt']) + self.daemon =3D subprocess.Popen([exe]) self.bus =3D dbus.SessionBus() =20 for i in range(10): @@ -38,7 +38,7 @@ class TestCase(unittest.TestCase): else: raise TimeoutError('error starting libvirt-dbus') =20 - obj =3D self.bus.get_object('org.libvirt', '/org/libvirt/Connect') + obj =3D self.bus.get_object('org.libvirt', '/org/libvirt/test') self.connect =3D dbus.Interface(obj, 'org.libvirt.Connect') =20 def tearDown(self): --=20 2.14.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list