+static NBDServerData *nbd_server;
+
+static void nbd_blockdev_client_closed(NBDClient *client, bool ignored)
+{
+ nbd_client_put(client);
+}
+
+static void nbd_accept(QIONetListener *listener, QIOChannelSocket *cioc,
+ gpointer opaque)
+{
+ qio_channel_set_name(QIO_CHANNEL(cioc), "nbd-server");
+ nbd_client_new(cioc, nbd_server->tlscreds, nbd_server->tlsauthz,
+ nbd_blockdev_client_closed);
+}
+
+
+static void nbd_server_free(NBDServerData *server)
+{
+ if (!server) {
+ return;
+ }
+
+ qio_net_listener_disconnect(server->listener);
+ object_unref(OBJECT(server->listener));
+ if (server->tlscreds) {
+ object_unref(OBJECT(server->tlscreds));
+ }
+ g_free(server->tlsauthz);
+
+ g_free(server);
+}
+
+static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp)