return std::shared_ptr<DNSRule>(new RCodeRule(rcode));
});
- g_lua.writeFunction("addAction", [](luadnsrule_t var, std::shared_ptr<DNSAction> ea)
+ g_lua.writeFunction("addAction", [](luadnsrule_t var, boost::variant<std::shared_ptr<DNSAction>, std::shared_ptr<DNSResponseAction> > era)
{
+ if (era.type() == typeid(std::shared_ptr<DNSResponseAction>)) {
+ throw std::runtime_error("addAction() can only be called with query-related actions, not response-related ones. Are you looking for addResponseAction()?");
+ }
+
+ auto ea = *boost::get<std::shared_ptr<DNSAction>>(&era);
setLuaSideEffect();
auto rule=makeRule(var);
g_rulactions.modify([rule, ea](decltype(g_rulactions)::value_type& rulactions){
g_lua.registerFunction("getStats", &DNSAction::getStats);
- g_lua.writeFunction("addResponseAction", [](luadnsrule_t var, std::shared_ptr<DNSResponseAction> ea) {
- setLuaSideEffect();
- auto rule=makeRule(var);
- g_resprulactions.modify([rule, ea](decltype(g_resprulactions)::value_type& rulactions){
- rulactions.push_back({rule, ea});
- });
- });
+ g_lua.writeFunction("addResponseAction", [](luadnsrule_t var, boost::variant<std::shared_ptr<DNSAction>, std::shared_ptr<DNSResponseAction> > era) {
+ if (era.type() == typeid(std::shared_ptr<DNSAction>)) {
+ throw std::runtime_error("addResponseAction() can only be called with response-related actions, not query-related ones. Are you looking for addAction()?");
+ }
+
+ auto ea = *boost::get<std::shared_ptr<DNSResponseAction>>(&era);
+
+ setLuaSideEffect();
+ auto rule=makeRule(var);
+ g_resprulactions.modify([rule, ea](decltype(g_resprulactions)::value_type& rulactions){
+ rulactions.push_back({rule, ea});
+ });
+ });
g_lua.writeFunction("showResponseRules", []() {
setLuaNoSideEffect();