From: Jongsung Kim Date: Mon, 16 Apr 2018 04:01:41 +0000 (+0900) Subject: tcp: fix tcp_socket_dead() for FreeBSD X-Git-Tag: v4.2.7~77 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=51f8095115a9e79d71267bb34f53ba6fbb9cb86f;p=thirdparty%2Ftvheadend.git tcp: fix tcp_socket_dead() for FreeBSD The FreeBSD port of tvheadend couldn't stream Live TV, and debug log shows webui judged the peer socket closed immediately after starting streaming: 2018-04-15 06:30:04.996 [ DEBUG]:webui: Start streaming /stream/mux/c4bc67bdaa13457e33740ca883cc4d75?ticket=7D1B56AD0E434C5F7EBFA4677A7FBE4C94097974 2018-04-15 06:30:04.996 [ DEBUG]:webui: Stop streaming /stream/mux/c4bc67bdaa13457e33740ca883cc4d75?ticket=7D1B56AD0E434C5F7EBFA4677A7FBE4C94097974, client hung up It looks because tcp_socket_dead() misunderstood the zero-return from recv(). For the FreeBSD, recv() might return zero for alive sockets which have nothing to read. Patch tested with the latest FreeBSD port of tvheadend-4.2.6. --- diff --git a/src/tcp.c b/src/tcp.c index da4abb95d..71d2e5fa1 100644 --- a/src/tcp.c +++ b/src/tcp.c @@ -413,8 +413,13 @@ tcp_socket_dead(int fd) return -errno; if (err) return -err; +#ifdef PLATFORM_FREEBSD + if (recv(fd, NULL, 0, MSG_PEEK | MSG_DONTWAIT) < 0) + return -errno; +#else if (recv(fd, NULL, 0, MSG_PEEK | MSG_DONTWAIT) == 0) return -EIO; +#endif return 0; }