btio: Add support for accepting BIS after defer setup
authorIulia Tanasescu <iulia.tanasescu@nxp.com>
Thu, 7 Sep 2023 15:12:27 +0000 (18:12 +0300)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 5 Jan 2024 13:34:04 +0000 (19:04 +0530)
This adds btio support for accepting BIS connections when defer
setup is enabled on a Broadcast Receiver socket.

btio/btio.c
btio/btio.h

index f500a2328db55499beb9c524679b1f5ff97a4e4a..b11a4e850e504b2d4bf958beaa8a7e0d9eabfb1c 100755 (executable)
@@ -1789,6 +1789,37 @@ gboolean bt_io_accept(GIOChannel *io, BtIOConnect connect, gpointer user_data,
        return TRUE;
 }
 
+gboolean bt_io_bcast_accept(GIOChannel *io, BtIOConnect connect,
+                               gpointer user_data, GDestroyNotify destroy,
+                               GError * *err)
+{
+       int sock;
+       char c;
+       struct pollfd pfd;
+
+       sock = g_io_channel_unix_get_fd(io);
+
+       memset(&pfd, 0, sizeof(pfd));
+       pfd.fd = sock;
+       pfd.events = POLLOUT;
+
+       if (poll(&pfd, 1, 0) < 0) {
+               ERROR_FAILED(err, "poll", errno);
+               return FALSE;
+       }
+
+       if (!(pfd.revents & POLLOUT)) {
+               if (read(sock, &c, 1) < 0) {
+                       ERROR_FAILED(err, "read", errno);
+                       return FALSE;
+               }
+       }
+
+       server_add(io, connect, NULL, user_data, destroy);
+
+       return TRUE;
+}
+
 gboolean bt_io_set(GIOChannel *io, GError **err, BtIOOption opt1, ...)
 {
        va_list args;
index 642af2e221a891b29b32764e115d7c301f999ff2..3169bebf35d418a20df597e7245776d74abdfe8c 100755 (executable)
@@ -75,6 +75,10 @@ typedef void (*BtIOConnect)(GIOChannel *io, GError *err, gpointer user_data);
 gboolean bt_io_accept(GIOChannel *io, BtIOConnect connect, gpointer user_data,
                                        GDestroyNotify destroy, GError **err);
 
+gboolean bt_io_bcast_accept(GIOChannel *io, BtIOConnect connect,
+                               gpointer user_data, GDestroyNotify destroy,
+                               GError **err);
+
 gboolean bt_io_set(GIOChannel *io, GError **err, BtIOOption opt1, ...);
 
 gboolean bt_io_get(GIOChannel *io, GError **err, BtIOOption opt1, ...);