Diff between b268efe526c5be737ad5aa3c336ed5a1841ddb0e and aa05beff8f18669ae7ce3a6670ca8edaedce399f

Changed Files

File Additions Deletions Status
tools/hcidump.c +13 -3 modified

Full Patch

diff --git a/tools/hcidump.c b/tools/hcidump.c
index 869c0e3..0535662 100644
--- a/tools/hcidump.c
+++ b/tools/hcidump.c
@@ -263,7 +263,12 @@ static void process_frames(int dev, int sock, int fd, unsigned long flags)
 		}
 
 		if (mode == SERVER) {
-			if (read_n(fd, buf, snap_len) < 0) {
+			len = recv(fd, buf, snap_len, MSG_DONTWAIT);
+			if (len == 0) {
+				printf("Client disconnect\n");
+				return;
+			}
+			if (len < 0 && errno != EAGAIN && errno != EINTR) {
 				perror("Connection read failure");
 				return;
 			}
@@ -279,7 +284,7 @@ static void process_frames(int dev, int sock, int fd, unsigned long flags)
 
 		len = recvmsg(sock, &msg, MSG_DONTWAIT);
 		if (len < 0) {
-			if (errno == EAGAIN || errno == EINPROGRESS)
+			if (errno == EAGAIN || errno == EINTR)
 				continue;
 			perror("Receive failed");
 			return;
@@ -653,7 +658,8 @@ static int open_connection(char *addr, char *port)
 			((struct sockaddr_in *) &ss)->sin_port = 0;
 			break;
 		case AF_INET6:
-			memcpy(&((struct sockaddr_in6 *) &ss)->sin6_addr, &in6addr_any, sizeof(in6addr_any));
+			memcpy(&((struct sockaddr_in6 *) &ss)->sin6_addr,
+						&in6addr_any, sizeof(in6addr_any));
 			((struct sockaddr_in6 *) &ss)->sin6_port = 0;
 			break;
 		}
@@ -712,6 +718,10 @@ static int wait_connection(char *addr, char *port)
 		setsockopt(fds[nfds].fd, SOL_SOCKET, SO_REUSEADDR,
 							&opt, sizeof(opt));
 
+		opt = 0;
+		setsockopt(fds[nfds].fd, SOL_SOCKET, SO_KEEPALIVE,
+							&opt, sizeof(opt));
+
 		if (bind(fds[nfds].fd, runp->ai_addr, runp->ai_addrlen) < 0) {
 			if (errno != EADDRINUSE) {
 				perror("Can't bind socket");