From: Remi Gacogne Date: Tue, 20 Aug 2024 13:14:45 +0000 (+0200) Subject: dnsdist: Take nanoseconds into account in `DynBlock`'s `until` accessor X-Git-Tag: rec-5.2.0-alpha1~111^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F14570%2Fhead;p=thirdparty%2Fpdns.git dnsdist: Take nanoseconds into account in `DynBlock`'s `until` accessor --- diff --git a/pdns/dnsdistdist/dnsdist-lua-inspection.cc b/pdns/dnsdistdist/dnsdist-lua-inspection.cc index b9828e0e8a..cba8e03e4e 100644 --- a/pdns/dnsdistdist/dnsdist-lua-inspection.cc +++ b/pdns/dnsdistdist/dnsdist-lua-inspection.cc @@ -1054,7 +1054,21 @@ void setupLuaInspection(LuaContext& luaCtx) gettime(&nowMonotonic); timespec nowRealTime{}; gettime(&nowRealTime, true); - nowRealTime.tv_sec += (block.until.tv_sec - nowMonotonic.tv_sec); + + auto seconds = block.until.tv_sec - nowMonotonic.tv_sec; + auto nseconds = block.until.tv_nsec - nowMonotonic.tv_nsec; + if (nseconds < 0) { + seconds -= 1; + nseconds += 1000000000; + } + + nowRealTime.tv_sec += seconds; + nowRealTime.tv_nsec += nseconds; + if (nowRealTime.tv_nsec > 1000000000) { + nowRealTime.tv_sec += 1; + nowRealTime.tv_nsec -= 1000000000; + } + return nowRealTime; }, [](DynBlock& block, [[maybe_unused]] timespec until) {}); luaCtx.registerMember( "blocks", [](const DynBlock& block) { return block.blocks.load(); }, [](DynBlock& block, [[maybe_unused]] unsigned int blocks) {});