+ bool HandleSetTime(const std::string &prefix, std::deque<std::string> ¶ms)
+ {
+ if (!params.size() || !Utils->EnableTimeSync)
+ return true;
+
+ bool force = false;
+
+ if ((params.size() == 2) && (params[1] == "FORCE"))
+ force = true;
+
+ time_t rts = atoi(params[0].c_str());
+ time_t us = Instance->Time(true);
+
+ if (rts == us)
+ {
+ Instance->Log(DEBUG, "Timestamp from %s is equal", prefix.c_str());
+
+ Utils->DoOneToAllButSender(prefix, "TIMESET", params, prefix);
+ }
+ else if (force || (rts < us))
+ {
+ int old = Instance->SetTimeDelta(rts - us);
+ Instance->Log(DEBUG, "%s TS (diff %d) from %s applied (old delta was %d)", (force) ? "Forced" : "Lower", rts - us, prefix.c_str(), old);
+
+ Utils->DoOneToAllButSender(prefix, "TIMESET", params, prefix);
+ }
+ else
+ {
+ Instance->Log(DEBUG, "Higher TS (diff %d) from %s overridden", us - rts, prefix.c_str());
+
+ std::deque<std::string> oparams;
+ oparams.push_back(ConvToStr(us));
+
+ Utils->DoOneToMany(prefix, "TIMESET", oparams);
+ }
+
+ return true;
+ }
+