luacall_prequery_t d_prequery;
};
std::vector<shared_ptr<DNSRecordContent>> luaSynth(const std::string& code, const DNSName& qname,
- const DNSName& zone, int zoneid, const DNSPacket& dnsp, uint16_t qtype);
+ const DNSName& zone, int zoneid, const DNSPacket& dnsp, uint16_t qtype, unique_ptr<AuthLua4>& s_LUA);
return result;
}
-static thread_local unique_ptr<AuthLua4> s_LUA;
bool g_LuaRecordSharedState;
typedef struct AuthLuaRecordContext
static thread_local unique_ptr<lua_record_ctx_t> s_lua_record_ctx;
-static void setupLuaRecords()
+static void setupLuaRecords(LuaContext& lua)
{
- LuaContext& lua = *s_LUA->getLua();
-
lua.writeFunction("latlon", []() {
double lat = 0, lon = 0;
getLatLon(s_lua_record_ctx->bestwho.toString(), lat, lon);
});
}
-std::vector<shared_ptr<DNSRecordContent>> luaSynth(const std::string& code, const DNSName& query, const DNSName& zone, int zoneid, const DNSPacket& dnsp, uint16_t qtype)
+std::vector<shared_ptr<DNSRecordContent>> luaSynth(const std::string& code, const DNSName& query, const DNSName& zone, int zoneid, const DNSPacket& dnsp, uint16_t qtype, unique_ptr<AuthLua4>& s_LUA)
{
if(!s_LUA || // we don't have a Lua state yet
!g_LuaRecordSharedState) { // or we want a new one even if we had one
s_LUA = make_unique<AuthLua4>();
- setupLuaRecords();
+ setupLuaRecords(*s_LUA->getLua());
}
std::vector<shared_ptr<DNSRecordContent>> ret;
// noCache=true;
DLOG(g_log<<"Executing Lua: '"<<rec->getCode()<<"'"<<endl);
try {
- auto recvec=luaSynth(rec->getCode(), target, d_sd.qname, d_sd.domain_id, p, rec->d_type);
+ auto recvec=luaSynth(rec->getCode(), target, d_sd.qname, d_sd.domain_id, p, rec->d_type, s_LUA);
for(const auto& r : recvec) {
rr.dr.d_type = rec->d_type; // might be CNAME
rr.dr.d_content = r;
if(rec->d_type == QType::CNAME || rec->d_type == p.qtype.getCode() || (p.qtype.getCode() == QType::ANY && rec->d_type != QType::RRSIG)) {
noCache=true;
try {
- auto recvec=luaSynth(rec->getCode(), target, d_sd.qname, d_sd.domain_id, p, rec->d_type);
+ auto recvec=luaSynth(rec->getCode(), target, d_sd.qname, d_sd.domain_id, p, rec->d_type, s_LUA);
if(!recvec.empty()) {
for(const auto& r_it : recvec) {
rr.dr.d_type = rec->d_type; // might be CNAME
SOAData d_sd;
std::unique_ptr<AuthLua4> d_pdl;
std::unique_ptr<AuthLua4> d_update_policy_lua;
-
+ std::unique_ptr<AuthLua4> s_LUA;
UeberBackend B; // every thread an own instance
DNSSECKeeper d_dk; // B is shared with DNSSECKeeper
};