From: Richard Gibson Date: Fri, 31 Aug 2018 03:34:20 +0000 (-0400) Subject: dnsdist: Duplicate new DNSQuestion Lua bindings on DNSResponse X-Git-Tag: rec-4.2.0-alpha1~16^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=06f64918c6a838ed92b14ef444687f3cf78e9ad4;p=thirdparty%2Fpdns.git dnsdist: Duplicate new DNSQuestion Lua bindings on DNSResponse --- diff --git a/pdns/dnsdist-lua-bindings-dnsquestion.cc b/pdns/dnsdist-lua-bindings-dnsquestion.cc index 8bad1fa352..147efb7ee0 100644 --- a/pdns/dnsdist-lua-bindings-dnsquestion.cc +++ b/pdns/dnsdist-lua-bindings-dnsquestion.cc @@ -144,6 +144,27 @@ void setupLuaBindingsDNSQuestion() g_lua.registerFunction editFunc)>("editTTLs", [](const DNSResponse& dr, std::function editFunc) { editDNSPacketTTL((char*) dr.dh, dr.len, editFunc); }); + g_lua.registerFunction(DNSResponse::*)(void)>("getTrailingData", [](const DNSResponse& dq) { + const uint8_t* message = reinterpret_cast(dq.dh); + const uint16_t length = getDNSPacketLength(reinterpret_cast(message), dq.len); + vector tail(message + length, message + dq.len); + return tail; + }); + g_lua.registerFunction>)>("setTrailingData", [](DNSResponse& dq, const vector>&data) { + uint8_t* message = reinterpret_cast(dq.dh); + const uint16_t length = getDNSPacketLength(reinterpret_cast(message), dq.len); + if(length + data.size() > dq.size) { + return false; + } + + /* Copy data from the Lua array, whose first index is 1 instead of 0. */ + dq.len = length + data.size(); + uint8_t* tail = message + length - 1; + for(const auto& pair : data) { + *(tail + pair.first) = pair.second; + } + return true; + }); g_lua.registerFunction("sendTrap", [](const DNSResponse& dr, boost::optional reason) { #ifdef HAVE_NET_SNMP if (g_snmpAgent && g_snmpTrapsEnabled) {