On Thu, 31 May 2012, Luca Barbato wrote:
@@ -163,6 +166,49 @@ static struct addrinfo* udp_resolve_host(const char *hostname, int port, return res; }+static int udp_set_multicast_sources(int sockfd, struct sockaddr *addr, + char **sources, int nb_sources, + int include) +{ + int i; + if (addr->sa_family != AF_INET) { + av_log(NULL, AV_LOG_ERROR, + "Setting multicast sources only supported for IPv4 for now\n"); + return AVERROR_PATCHWELCOME; + } +#if HAVE_STRUCT_IP_MREQ_SOURCE && defined(IP_BLOCK_SOURCE) + for (i = 0; i < nb_sources; i++) { + struct ip_mreq_source mreqs; + struct addrinfo *sourceaddr = udp_resolve_host(sources[i], 0, + SOCK_DGRAM, AF_UNSPEC, + AI_NUMERICHOST); + if (!sourceaddr) + return -1; + if (sourceaddr->ai_addr->sa_family != AF_INET) { + freeaddrinfo(sourceaddr); + av_log(NULL, AV_LOG_ERROR, "%s is of incorrect protocol family\n", + sources[i]); + return AVERROR(EINVAL); + } + + mreqs.imr_multiaddr.s_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr; + mreqs.imr_interface.s_addr = INADDR_ANY; + mreqs.imr_sourceaddr.s_addr = ((struct sockaddr_in *)sourceaddr->ai_addr)->sin_addr.s_addr; + freeaddrinfo(sourceaddr); + + if (setsockopt(sockfd, IPPROTO_IP, + include ? IP_ADD_SOURCE_MEMBERSHIP : IP_BLOCK_SOURCE, + (const void *)&mreqs, sizeof(mreqs)) < 0) { + int err = errno; + av_log(NULL, AV_LOG_ERROR, "setsockopt(%s): %s\n", + include ? "IP_ADD_SOURCE_MEMBERSHIP" : "IP_BLOCK_SOURCE", + strerror(err)); + return AVERROR(err); + }
Was this errno fix the only change from my version? This doesn't necessarily work on windows, we should use ff_neterrno() instead, but I'm not sure if we have anything hooked up for using that with strerror (otoh, iirc winsock doesn't even have any function for getting a suitable string for a socket error). While this in principle is better than just returning -1, I'm afraid this might just return 0 on windows.
// Martin _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
