}
}
+static bool g_warned_ipv6_recvpktinfo = false;
+
static void setUpLocalBind(std::unique_ptr<ClientState>& cs)
{
/* skip some warnings if there is an identical UDP context */
if(!cs->tcp && IsAnyAddress(cs->local)) {
int one=1;
- setsockopt(fd, IPPROTO_IP, GEN_IP_PKTINFO, &one, sizeof(one)); // linux supports this, so why not - might fail on other systems
+ (void)setsockopt(fd, IPPROTO_IP, GEN_IP_PKTINFO, &one, sizeof(one)); // linux supports this, so why not - might fail on other systems
#ifdef IPV6_RECVPKTINFO
- setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
+ if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one)) < 0 &&
+ !g_warned_ipv6_recvpktinfo) {
+ warnlog("Warning: IPV6_RECVPKTINFO setsockopt failed: %s", stringerror());
+ g_warned_ipv6_recvpktinfo = true;
+ }
#endif
}
throw PDNSException("Unable to set UDP socket " + locala.toStringWithPort() + " to non-blocking: "+stringerror());
if(IsAnyAddress(locala)) {
- setsockopt(s, IPPROTO_IP, GEN_IP_PKTINFO, &one, sizeof(one));
+ (void)setsockopt(s, IPPROTO_IP, GEN_IP_PKTINFO, &one, sizeof(one));
if (locala.isIPv6()) {
- setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one)); // if this fails, we report an error in tcpreceiver too
+ (void)setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one)); // if this fails, we report an error in tcpreceiver too
#ifdef IPV6_RECVPKTINFO
- setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
+ (void)setsockopt(s, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
#endif
}
}
return;
// failure to raise is not fatal
- setsockopt(fd, SOL_SOCKET, optname, (const void*)&size, sizeof(size));
+ (void)setsockopt(fd, SOL_SOCKET, optname, (const void*)&size, sizeof(size));
}