From nobody Mon Feb 9 20:35:02 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1513793152973730.5934478193575; Wed, 20 Dec 2017 10:05:52 -0800 (PST) Received: from localhost ([::1]:32954 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eRikU-00059i-OA for importer@patchew.org; Wed, 20 Dec 2017 13:05:46 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56794) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eRhyl-000537-Em for qemu-devel@nongnu.org; Wed, 20 Dec 2017 12:16:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eRhyk-0007S6-Bb for qemu-devel@nongnu.org; Wed, 20 Dec 2017 12:16:27 -0500 Received: from mail-wr0-x241.google.com ([2a00:1450:400c:c0c::241]:42664) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eRhyj-0007RF-W6 for qemu-devel@nongnu.org; Wed, 20 Dec 2017 12:16:26 -0500 Received: by mail-wr0-x241.google.com with SMTP id s66so22904283wrc.9 for ; Wed, 20 Dec 2017 09:16:25 -0800 (PST) Received: from 640k.lan (dynamic-adsl-78-12-251-125.clienti.tiscali.it. [78.12.251.125]) by smtp.gmail.com with ESMTPSA id f125sm2751101wme.45.2017.12.20.09.16.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Dec 2017 09:16:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=tQ2WQa+U2P93tVZaW9XHplSVtZdkuBiiRzvHJHNXM60=; b=EEC90W+AA7hIeasUA0MU1ve9s33l9t9hW5NgbhkmFw2spKQiwaapOKeB92ZaZDlN8z 8TOkp23ANG7EiBdmjkW+8PTTugNoslZyl484jk2WbrTzpWFIl9W9rHp2IU/dbo0ztIb3 /94icPF+OtXA6Y+qoJ4PFTkM8fIFRX0/PUbIVhWbJaesX8hJAhqPvEDECl1kUzu7I8a5 QCI1gUif2lihLldCIbEHleTxcCcnhUXZEHqeeYIiUvmCY/xSZPCFgMV/UulTj9rFQrrk B6wM7pAquZQLNvEqPFTclHNsPMDZhZ0ubSqAonIoiIhX4Y22AfmbaRKGr1OPIICaDR7v MbOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=tQ2WQa+U2P93tVZaW9XHplSVtZdkuBiiRzvHJHNXM60=; b=PgIdnf+MgZHd+v+uR0cWiowdF1hYtyR7L+3IRgVJZTg8ePd+Gac1b50HG0c63U01Ky cZHWTf+WpSam0nmcuBbTiJ9Z/gfnJ5NehjLHz25bTfxZ3VQFpH1wuP6MrYFGHco4Y9g7 SngIeaB5TZizc6DmZHjfKZywHT/Xqmai0HKiAfZC1CalI5TTgm8pvCKQ3nmFj6Tago8s bIj+QC4gqSYXT7KF3z7tpXYa/mZ6d39u0C+gTULRZxmtDV73SO/q3KXumoZ8n7COaxOS qCMEGibynzQVyxJchs+25MZlzrcJfUaWuHApdLTJPe1o6M1bbHByQLiN9JJndUIFqJ1N AD5A== X-Gm-Message-State: AKGB3mLqNvcT9lj2esVAgsiTrmDOKN7KNOkC0IGN0yAPR/PbAkzWoDj5 i6wW98DVa2jSu9FbWKk6TfngL/Wj X-Google-Smtp-Source: ACJfBoszF/QFmoCK0ioXMRBXy3VeXkU8Kr0X9wecmoSrUFDO8gr/fmSxpkusnNsqKHbbD1zV5lIR0w== X-Received: by 10.223.136.56 with SMTP id d53mr9297748wrd.36.1513790184717; Wed, 20 Dec 2017 09:16:24 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Wed, 20 Dec 2017 18:14:57 +0100 Message-Id: <1513790098-9815-46-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1513790098-9815-1-git-send-email-pbonzini@redhat.com> References: <1513790098-9815-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::241 Subject: [Qemu-devel] [PULL 45/46] blockdev: convert qemu-nbd server to QIONetListener X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: "Daniel P. Berrange" Instead of creating a QIOChannelSocket directly for the NBD server socket, use a QIONetListener. This provides the ability to listen on multiple sockets at the same time, so enables full support for IPv4/IPv6 dual stack. This also means we can honour multiple FDs received during socket activation. Reviewed-by: Eric Blake Signed-off-by: Daniel P. Berrange Message-Id: <20171218101643.20360-3-berrange@redhat.com> Signed-off-by: Paolo Bonzini --- qemu-nbd.c | 61 ++++++++++++++++++++++++----------------------------------= --- 1 file changed, 24 insertions(+), 37 deletions(-) diff --git a/qemu-nbd.c b/qemu-nbd.c index d75ca51..3723493 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -37,6 +37,7 @@ #include "qapi/qmp/qstring.h" #include "qom/object_interfaces.h" #include "io/channel-socket.h" +#include "io/net-listener.h" #include "crypto/init.h" #include "trace/control.h" #include "qemu-version.h" @@ -62,8 +63,7 @@ static int persistent =3D 0; static enum { RUNNING, TERMINATE, TERMINATING, TERMINATED } state; static int shared =3D 1; static int nb_fds; -static QIOChannelSocket *server_ioc; -static int server_watch =3D -1; +static QIONetListener *server; static QCryptoTLSCreds *tlscreds; =20 static void usage(const char *name) @@ -344,44 +344,25 @@ static void nbd_client_closed(NBDClient *client, bool= negotiated) nbd_client_put(client); } =20 -static gboolean nbd_accept(QIOChannel *ioc, GIOCondition cond, gpointer op= aque) +static void nbd_accept(QIONetListener *listener, QIOChannelSocket *cioc, + gpointer opaque) { - QIOChannelSocket *cioc; - - cioc =3D qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc), - NULL); - if (!cioc) { - return TRUE; - } - if (state >=3D TERMINATE) { - object_unref(OBJECT(cioc)); - return TRUE; + return; } =20 nb_fds++; nbd_update_server_watch(); nbd_client_new(newproto ? NULL : exp, cioc, tlscreds, NULL, nbd_client_closed); - object_unref(OBJECT(cioc)); - - return TRUE; } =20 static void nbd_update_server_watch(void) { if (nbd_can_accept()) { - if (server_watch =3D=3D -1) { - server_watch =3D qio_channel_add_watch(QIO_CHANNEL(server_ioc), - G_IO_IN, - nbd_accept, - NULL, NULL); - } + qio_net_listener_set_client_func(server, nbd_accept, NULL, NULL); } else { - if (server_watch !=3D -1) { - g_source_remove(server_watch); - server_watch =3D -1; - } + qio_net_listener_set_client_func(server, NULL, NULL, NULL); } } =20 @@ -915,23 +896,29 @@ int main(int argc, char **argv) snprintf(sockpath, 128, SOCKET_PATH, basename(device)); } =20 + server =3D qio_net_listener_new(); if (socket_activation =3D=3D 0) { - server_ioc =3D qio_channel_socket_new(); saddr =3D nbd_build_socket_address(sockpath, bindto, port); - if (qio_channel_socket_listen_sync(server_ioc, saddr, &local_err) = < 0) { - object_unref(OBJECT(server_ioc)); + if (qio_net_listener_open_sync(server, saddr, &local_err) < 0) { + object_unref(OBJECT(server)); error_report_err(local_err); - return 1; + exit(EXIT_FAILURE); } } else { + size_t i; /* See comment in check_socket_activation above. */ - assert(socket_activation =3D=3D 1); - server_ioc =3D qio_channel_socket_new_fd(FIRST_SOCKET_ACTIVATION_F= D, - &local_err); - if (server_ioc =3D=3D NULL) { - error_report("Failed to use socket activation: %s", - error_get_pretty(local_err)); - exit(EXIT_FAILURE); + for (i =3D 0; i < socket_activation; i++) { + QIOChannelSocket *sioc; + sioc =3D qio_channel_socket_new_fd(FIRST_SOCKET_ACTIVATION_FD = + i, + &local_err); + if (sioc =3D=3D NULL) { + object_unref(OBJECT(server)); + error_report("Failed to use socket activation: %s", + error_get_pretty(local_err)); + exit(EXIT_FAILURE); + } + qio_net_listener_add(server, sioc); + object_unref(OBJECT(sioc)); } } =20 --=20 1.8.3.1