adjtime.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /*
  2. * Copyright (c) 2020, Nico Weber <thakis@chromium.org>
  3. * Copyright (c) 2022, Matthias Zimmerman <matthias291999@gmail.com>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <LibCore/ArgsParser.h>
  8. #include <LibCore/System.h>
  9. #include <math.h>
  10. #include <sys/time.h>
  11. #include <unistd.h>
  12. ErrorOr<int> serenity_main(Main::Arguments arguments)
  13. {
  14. TRY(Core::System::pledge("stdio settime"));
  15. Core::ArgsParser args_parser;
  16. Optional<double> delta;
  17. args_parser.add_option(delta, "Adjust system time by this many seconds", "set", 's', "delta_seconds");
  18. args_parser.parse(arguments);
  19. if (delta.has_value()) {
  20. long delta_us = lround(*delta * 1'000'000);
  21. timeval delta_timeval;
  22. delta_timeval.tv_sec = delta_us / 1'000'000;
  23. delta_timeval.tv_usec = delta_us % 1'000'000;
  24. if (delta_timeval.tv_usec < 0) {
  25. delta_timeval.tv_sec--;
  26. delta_timeval.tv_usec += 1'000'000;
  27. }
  28. TRY(Core::System::adjtime(&delta_timeval, nullptr));
  29. }
  30. TRY(Core::System::pledge("stdio"));
  31. timeval remaining_delta_timeval;
  32. TRY(Core::System::adjtime(nullptr, &remaining_delta_timeval));
  33. double remaining_delta = remaining_delta_timeval.tv_sec + remaining_delta_timeval.tv_usec / 1'000'000.0;
  34. outln("{}", remaining_delta);
  35. return 0;
  36. }