Re: [RFCv1 7/9] android/hal-sock: Implement RFCOMM events

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Andrei,

> Copy data from RFCOMM socket to Android framework.
> ---
> android/socket.c |   29 +++++++++++++++++++++++++++++
> 1 file changed, 29 insertions(+)
> 
> diff --git a/android/socket.c b/android/socket.c
> index dfad9da..a962cdc 100644
> --- a/android/socket.c
> +++ b/android/socket.c
> @@ -129,6 +129,35 @@ static gboolean sock_stack_event_cb(GIOChannel *io, GIOCondition cond,
> static gboolean sock_rfcomm_event_cb(GIOChannel *io, GIOCondition cond,
> 								gpointer data)
> {
> +	struct rfcomm_slot *rfslot = data;
> +	unsigned char buf[1024] = { 0 };
> +	int len;
> +
> +	DBG("rfslot: fd %d hal_fd %d real_sock %d chan %u sock %d",
> +		rfslot->fd, rfslot->hal_fd, rfslot->real_sock, rfslot->channel,
> +		g_io_channel_unix_get_fd(io));
> +
> +	if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) {
> +		error("Socket error: sock %d cond %d",
> +					g_io_channel_unix_get_fd(io), cond);
> +		g_io_channel_shutdown(io, TRUE, NULL);
> +		return FALSE;
> +	}
> +
> +	/* FIXME check real_sock vs sock(io) */
> +	len = recv(rfslot->real_sock, buf, sizeof(buf), 0);
> +	if (len <= 0) {
> +		error("recv(): %s sock %d", strerror(errno), rfslot->real_sock);
> +		return FALSE;
> +	}
> +
> +	DBG("read %d bytes, write to fd %d", len, rfslot->fd);
> +
> +	if (send(rfslot->fd, buf, len, MSG_DONTWAIT) < 0) {
> +		error("send(): %s sock %d", strerror(errno), rfslot->fd);
> +		return FALSE;
> +	}
> +

since both sockets are SOCK_STREAM there is no guarantee that write() will write exactly the same amount of data that you just got via read(). Especially when using MSG_DONTWAIT. The kernel can decide to interrupt you here any time it wants to.

So you need proper error handling for the send() part in case you get truncated transfers.

Regards

Marcel

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux