void CommunicatorClass::makeNotifySockets()
{
- d_nsock4 = makeQuerySocket(ComboAddress(::arg()["query-local-address"]), true);
+ d_nsock4 = makeQuerySocket(ComboAddress(::arg()["query-local-address"]), true, ::arg().mustDo("non-local-bind"));
if(!::arg()["query-local-address6"].empty())
- d_nsock6 = makeQuerySocket(ComboAddress(::arg()["query-local-address6"]), true);
+ d_nsock6 = makeQuerySocket(ComboAddress(::arg()["query-local-address6"]), true, ::arg().mustDo("non-local-bind"));
else
d_nsock6 = -1;
}
#include "gss_context.hh"
#include "namespaces.hh"
-int makeQuerySocket(const ComboAddress& local, bool udpOrTCP)
+int makeQuerySocket(const ComboAddress& local, bool udpOrTCP, bool nonLocalBind)
{
ComboAddress ourLocal(local);
}
setCloseOnExec(sock);
+
+ if(nonLocalBind)
+ Utility::setBindAny(local.sin4.sin_family, sock);
+
if(udpOrTCP) {
// udp, try hard to bind an unpredictable port
int tries=10;
locals["default4"] = -1;
locals["default6"] = -1;
try {
- locals["default4"] = makeQuerySocket(ComboAddress(::arg()["query-local-address"]), true);
+ locals["default4"] = makeQuerySocket(ComboAddress(::arg()["query-local-address"]), true, ::arg().mustDo("non-local-bind"));
if(!::arg()["query-local-address6"].empty())
- locals["default6"] = makeQuerySocket(ComboAddress(::arg()["query-local-address6"]), true);
+ locals["default6"] = makeQuerySocket(ComboAddress(::arg()["query-local-address6"]), true, ::arg().mustDo("non-local-bind"));
}
catch(...) {
if(locals["default4"]>=0)
};
// make an IPv4 or IPv6 query socket
-int makeQuerySocket(const ComboAddress& local, bool udpOrTCP);
+int makeQuerySocket(const ComboAddress& local, bool udpOrTCP, bool nonLocalBind=false);
//! Resolver class. Can be used synchronously and asynchronously, over IPv4 and over IPv6 (simultaneously)
class Resolver : public boost::noncopyable
{