# HG changeset patch # User henry # Date 1226691202 0 # Node ID 459dd8d5ad86d933796304701816b88faaefa2e3 # Parent 175eeb7a88d5dbad86b69488440035f5fa6f4193 check for interrupt when receiving from socket diff -r 175eeb7a88d5 -r 459dd8d5ad86 udp.c --- a/udp.c Fri Nov 14 18:37:58 2008 +0000 +++ b/udp.c Fri Nov 14 19:33:22 2008 +0000 @@ -29,6 +29,9 @@ #include #include "network.h" #include "os_support.h" +#ifdef HAVE_SYS_SELECT_H +#include +#endif #ifndef IPV6_ADD_MEMBERSHIP #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP @@ -449,9 +452,23 @@ { UDPContext *s = h->priv_data; int len; + fd_set rfds; + int ret; + struct timeval tv; for(;;) { - len = recv(s->udp_fd, buf, size, 0); + if (url_interrupt_cb()) + return AVERROR(EINTR); + FD_ZERO(&rfds); + FD_SET(s->udp_fd, &rfds); + tv.tv_sec = 0; + tv.tv_usec = 100 * 1000; + ret = select(s->udp_fd + 1, &rfds, NULL, NULL, &tv); + if (ret < 0) + return AVERROR(EIO); + if (!(ret > 0 && FD_ISSET(s->udp_fd, &rfds))) + continue; + len = recv(s->udp_fd, buf, size, MSG_DONTWAIT); if (len < 0) { if (ff_neterrno() != FF_NETERROR(EAGAIN) && ff_neterrno() != FF_NETERROR(EINTR))