zeroconf/AvahiPoll: the struct timeval is an absolute time point

Fixes broken libavahi-client timeouts.
This commit is contained in:
Max Kellermann 2021-05-25 22:17:10 +02:00
parent bce144a232
commit 7a6823dcdf
1 changed files with 21 additions and 1 deletions

View File

@ -105,8 +105,28 @@ public:
} }
private: private:
[[gnu::pure]]
Event::Duration AbsoluteToDuration(const struct timeval &tv) noexcept {
if (tv.tv_sec == 0)
/* schedule immediately */
return {};
struct timeval now;
if (gettimeofday(&now, nullptr) < 0)
/* shouldn't ever fail, but if it does, do
something reasonable */
return std::chrono::seconds(1);
auto d = ToSteadyClockDuration(tv)
- ToSteadyClockDuration(now);
if (d.count() < 0)
return {};
return d;
}
void Schedule(const struct timeval &tv) noexcept { void Schedule(const struct timeval &tv) noexcept {
event.Schedule(ToSteadyClockDuration(tv)); event.Schedule(AbsoluteToDuration(tv));
} }
void OnTimeout() noexcept { void OnTimeout() noexcept {