Re: [PATCHv2 06/16] android/hal-sock: Implement Android RFCOMM stack events

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

 



Hi Andrei,

> Handle events from Android framework. Write everything to real RFCOMM
> socket. Consider splice() in the future.
> ---
> android/socket.c |   57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 57 insertions(+)
> 
> diff --git a/android/socket.c b/android/socket.c
> index c9ee32f..af14ef6 100644
> --- a/android/socket.c
> +++ b/android/socket.c
> @@ -115,9 +115,66 @@ static int get_rfcomm_default_chan(const uint8_t *uuid)
> 	return -1;
> }
> 
> +static inline int write_n(int fd, unsigned char *buf, int len)
> +{
> +	int t = 0, w;
> +
> +	while (len > 0) {
> +		if ((w = write(fd, buf, len)) < 0) {

this is not coding style we use.

Also we can limit the scope of w to the loop.

I also do not really like these kind of one letter variables unless they are used as iterators. So you better use written here or sent in case you actually want to use send() and not write().

> +			if (errno == EINTR || errno == EAGAIN)
> +				continue;
> +			return -1;
> +		}
> +
> +		if (!w)
> +			return 0;
> +
> +		len -= w; buf += w; t += w;
> +	}
> +
> +	return t;

The variable name t is also unclear to me. What does it stand for.

> +}
> +
> static gboolean sock_stack_event_cb(GIOChannel *io, GIOCondition cond,
> 								gpointer data)
> {
> +	struct rfcomm_slot *rfslot = data;
> +	unsigned char buf[1024];
> +	int len, sent;
> +
> +	DBG("rfslot: fd %d real_sock %d chan %u sock %d",
> +		rfslot->fd, rfslot->real_sock, rfslot->channel,
> +		g_io_channel_unix_get_fd(io));
> +
> +	if (!g_list_find(rfcomm_connected_list, rfslot)) {
> +		error("rfslot %p not found in the list", rfslot);
> +		return FALSE;
> +	}
> +
> +	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);
> +		rfcomm_connected_list = g_list_remove(rfcomm_connected_list,
> +								rfslot);
> +		cleanup_rfslot(rfslot);
> +		return FALSE;
> +	}
> +
> +	len = recv(rfslot->fd, buf, sizeof(buf), 0);
> +	if (len <= 0) {
> +		error("recv(): %s", strerror(errno));
> +		return FALSE;
> +	}
> +
> +	DBG("read %d bytes write to %d", len, rfslot->real_sock);
> +
> +	if ((sent = write_n(rfslot->real_sock, buf, len)) < 0) {

We do not use this coding style.

> +		error("send(): %s", strerror(errno));
> +		return FALSE;
> +	}
> +
> +	DBG("Written %d bytes", sent);
> +
> 	return TRUE;
> }

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