From bbb4efde187ec2a9546f2b9ff54e0db7d275fc5d Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sat, 15 Jun 2024 11:34:37 +0200 Subject: [PATCH] Report errors from clock_gettime and clock_settime --- src/slack-timedate.cpp | 55 +++++++++++++++++++++++------------------- src/slack-timedate.h | 13 +++++----- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/slack-timedate.cpp b/src/slack-timedate.cpp index 41a4961..7b4c194 100644 --- a/src/slack-timedate.cpp +++ b/src/slack-timedate.cpp @@ -53,18 +53,20 @@ static void slack_method_call(const Glib::RefPtr& connect { Glib::Variant usec_utc; Glib::Variant relative; + Glib::Variant user_interaction; parameters.get_child(usec_utc, 0); parameters.get_child(relative, 1); + parameters.get_child(user_interaction, 2); - if (slack_set_time(usec_utc.get(), relative.get())) + try { + dlackware::timedate::set_time(usec_utc.get(), relative.get(), user_interaction.get()); invocation->return_value(Glib::VariantContainerBase()); } - else + catch (const std::system_error& error) { - Gio::DBus::Error error{ Gio::DBus::Error::FAILED, "Failed to set system clock" }; - invocation->return_error(error); + invocation->return_error(Gio::DBus::Error{ Gio::DBus::Error::FAILED, error.what() }); } } else if (method_name == "SetNTP") @@ -293,31 +295,34 @@ namespace dlackware::timedate { return Glib::file_test("/etc/rc.d/rc.ntpd", Glib::FileTest::FILE_TEST_IS_EXECUTABLE); } -} -gboolean slack_set_time(gint64 seconds_since_epoch, gboolean relative) -{ - timespec ts; - - if (relative) + void set_time(gint64 seconds_since_epoch, bool relative, bool) { - if (clock_gettime(CLOCK_REALTIME, &ts) == -1) - { - return FALSE; - } - ts.tv_sec += static_cast(seconds_since_epoch / dlackware::timedate::usec_per_sec); - ts.tv_nsec += (seconds_since_epoch % dlackware::timedate::usec_per_sec) * dlackware::timedate::nsec_per_usec; + timespec ts; - if (ts.tv_nsec < 0) + if (relative) { - --ts.tv_sec; - ts.tv_nsec += dlackware::timedate::usec_per_sec; + if (clock_gettime(CLOCK_REALTIME, &ts) == -1) + { + throw std::system_error(errno, std::generic_category()); + } + ts.tv_sec += static_cast(seconds_since_epoch / dlackware::timedate::usec_per_sec); + ts.tv_nsec += (seconds_since_epoch % dlackware::timedate::usec_per_sec) * dlackware::timedate::nsec_per_usec; + + if (ts.tv_nsec < 0) + { + --ts.tv_sec; + ts.tv_nsec += dlackware::timedate::usec_per_sec; + } + } + else + { + ts.tv_sec = static_cast(seconds_since_epoch / dlackware::timedate::usec_per_sec); + ts.tv_nsec = (seconds_since_epoch % dlackware::timedate::usec_per_sec) * dlackware::timedate::nsec_per_usec; + } + if (clock_settime(CLOCK_REALTIME, &ts) == -1) + { + throw std::system_error(errno, std::generic_category()); } } - else - { - ts.tv_sec = static_cast(seconds_since_epoch / dlackware::timedate::usec_per_sec); - ts.tv_nsec = (seconds_since_epoch % dlackware::timedate::usec_per_sec) * dlackware::timedate::nsec_per_usec; - } - return clock_settime (CLOCK_REALTIME, &ts) == 0; } diff --git a/src/slack-timedate.h b/src/slack-timedate.h index 41eb0e7..2dd4223 100644 --- a/src/slack-timedate.h +++ b/src/slack-timedate.h @@ -47,12 +47,18 @@ namespace dlackware::timedate std::vector list_timezones(); // Sets the system time zone to the one passed by the argument - // Returns true on success, false otherwise + // Throws std::filesystem::filesystem_error. void set_timezone(const Glib::ustring& zone, bool user_interaction); // Sets NTP + // Throws std::filesystem::filesystem_error. void set_ntp(bool use_ntp, bool user_interaction); + // Changes the date/time + // Takes the amount of seconds since UNIX epoche and + // Throws std::system_error. + void set_time(gint64 seconds_since_epoch, bool relative, bool user_interaction); + class timedate1 { const Gio::DBus::InterfaceVTable interface_vtable; @@ -64,8 +70,3 @@ namespace dlackware::timedate void on_name_lost(const Glib::RefPtr& connection, const Glib::ustring& name); }; } - -// Changes the date/time -// Takes the amount of seconds since UNIX epoche and -// Returns true on success, false otherwise -gboolean slack_set_time(gint64 seconds_since_epoch, gboolean relative);