g_ACL.modify([domain](NetmaskGroup& nmg) { nmg.addMask(domain); });
});
- g_lua.writeFunction("addLocal", [client](const std::string& addr) {
+ g_lua.writeFunction("addLocal", [client](const std::string& addr, boost::optional<bool> doTCP) {
if(client)
return;
try {
ComboAddress loc(addr, 53);
- g_locals.push_back(loc); /// only works pre-startup, so no sync necessary
+ g_locals.push_back({loc, doTCP ? *doTCP : true}); /// only works pre-startup, so no sync necessary
}
catch(std::exception& e) {
g_outputBuffer="Error: "+string(e.what())+"\n";
GlobalStateHolder<NetmaskGroup> g_ACL;
string g_outputBuffer;
-vector<ComboAddress> g_locals;
+vector<std::pair<ComboAddress, bool>> g_locals;
/* UDP: the grand design. Per socket we listen on for incoming queries there is one thread.
Then we have a bunch of connected sockets for talking to downstream servers.
if(g_cmdLine.locals.size()) {
g_locals.clear();
for(auto loc : g_cmdLine.locals)
- g_locals.push_back(ComboAddress(loc, 53));
+ g_locals.push_back({ComboAddress(loc, 53), true});
}
if(g_locals.empty())
- g_locals.push_back(ComboAddress("0.0.0.0", 53));
+ g_locals.push_back({ComboAddress("0.0.0.0", 53), true});
vector<ClientState*> toLaunch;
for(const auto& local : g_locals) {
ClientState* cs = new ClientState;
- cs->local= local;
+ cs->local= local.first;
cs->udpFD = SSocket(cs->local.sin4.sin_family, SOCK_DGRAM, 0);
if(cs->local.sin4.sin_family == AF_INET6) {
SSetsockopt(cs->udpFD, IPPROTO_IPV6, IPV6_V6ONLY, 1);
}
//if(g_vm.count("bind-non-local"))
- bindAny(local.sin4.sin_family, cs->udpFD);
+ bindAny(local.first.sin4.sin_family, cs->udpFD);
// if (!setSocketTimestamps(cs->udpFD))
// L<<Logger::Warning<<"Unable to enable timestamp reporting for socket"<<endl;
- if(IsAnyAddress(local)) {
+ if(IsAnyAddress(local.first)) {
int one=1;
setsockopt(cs->udpFD, IPPROTO_IP, GEN_IP_PKTINFO, &one, sizeof(one)); // linux supports this, so why not - might fail on other systems
#ifdef IPV6_RECVPKTINFO
for(const auto& local : g_locals) {
ClientState* cs = new ClientState;
- cs->local= local;
+ if(!local.second) { // no TCP/IP
+ warnlog("Not providing TCP/IP service on local address '%s'", local.first.toStringWithPort());
+ continue;
+ }
+ cs->local= local.first;
cs->tcpFD = SSocket(cs->local.sin4.sin_family, SOCK_STREAM, 0);