From bbb4efde187ec2a9546f2b9ff54e0db7d275fc5d Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sat, 15 Jun 2024 11:34:37 +0200 Subject: Report errors from clock_gettime and clock_settime --- src/slack-timedate.cpp | 53 +++++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 24 deletions(-) (limited to 'src/slack-timedate.cpp') 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) + timespec ts; + + if (relative) { - 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; + 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) + if (ts.tv_nsec < 0) + { + --ts.tv_sec; + ts.tv_nsec += dlackware::timedate::usec_per_sec; + } + } + else { - --ts.tv_sec; - ts.tv_nsec += dlackware::timedate::usec_per_sec; + 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; } -- cgit v1.2.3