diff --git a/tools/hcidump.c b/tools/hcidump.c
index 869c0e3..0535662 100644
--- a/tools/hcidump.c
+++ b/tools/hcidump.c
}
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;
}
len = recvmsg(sock, &msg, MSG_DONTWAIT);
if (len < 0) {
- if (errno == EAGAIN || errno == EINPROGRESS)
+ if (errno == EAGAIN || errno == EINTR)
continue;
perror("Receive failed");
return;
((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;
}
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");