summaryrefslogtreecommitdiff
path: root/src/slack-timedate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/slack-timedate.cpp')
-rw-r--r--src/slack-timedate.cpp53
1 files changed, 29 insertions, 24 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<Gio::DBus::Connection>& connect
{
Glib::Variant<gint64> usec_utc;
Glib::Variant<bool> relative;
+ Glib::Variant<bool> 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<time_t>(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<time_t>(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<time_t>(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<time_t>(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;
}