diff --git a/src/timedate.cpp b/src/timedate.cpp index e6ec83f..c7c2406 100644 --- a/src/timedate.cpp +++ b/src/timedate.cpp @@ -45,6 +45,30 @@ static void slack_method_call(const Glib::RefPtr& connect invocation->return_error(Gio::DBus::Error{ Gio::DBus::Error::FAILED, filesystem_error.what() }); } } + else if (method_name == "SetLocalRTC") + { + Glib::Variant local_rtc; + Glib::Variant fix_system; + Glib::Variant user_interaction; + + parameters.get_child(local_rtc, 0); + parameters.get_child(fix_system, 1); + parameters.get_child(user_interaction, 2); + + try + { + dlackware::timedate::set_local_rtc(local_rtc.get(), fix_system.get(), user_interaction.get()); + invocation->return_value(Glib::VariantContainerBase()); + } + catch (const std::system_error& error) + { + invocation->return_error(Gio::DBus::Error{ Gio::DBus::Error::FAILED, error.what() }); + } + catch (const Glib::SpawnError& spawn_error) + { + invocation->return_error(Gio::DBus::Error{ Gio::DBus::Error::FAILED, spawn_error.what() }); + } + } else if (method_name == "SetTime") { Glib::Variant usec_utc; @@ -285,6 +309,37 @@ namespace dlackware::timedate } } + void set_local_rtc(bool local_rtc, bool fix_system, bool) + { + std::ofstream hardwareclock{ "/etc/hardwareclock", std::ios::trunc }; + std::string hwclock_argument; + + hardwareclock << "# /etc/hardwareclock" << std::endl + << "#" << std::endl + << "# Tells how the hardware clock time is stored." << std::endl + << "# You should run timeconfig to edit this file." << std::endl + << std::endl; + + if (local_rtc) + { + hwclock_argument = "--localtime"; + hardwareclock << "localtime"; + } + else + { + hwclock_argument = "--utc"; + hardwareclock << "UTC"; + } + hardwareclock << std::endl; + + if (!fix_system) + { + Glib::spawn_sync("", std::vector{ "/sbin/hwclock", hwclock_argument, "--hctosys" }, + Glib::SpawnFlags::SPAWN_STDOUT_TO_DEV_NULL | Glib::SpawnFlags::SPAWN_STDERR_TO_DEV_NULL, + {}, nullptr, nullptr, static_cast(nullptr)); + } + } + bool local_rtc() { std::ifstream fh{ "/etc/hardwareclock", std::ios::in }; diff --git a/src/timedate.h b/src/timedate.h index 1c33594..a1b2852 100644 --- a/src/timedate.h +++ b/src/timedate.h @@ -65,6 +65,9 @@ namespace dlackware::timedate // Throws std::system_error. void set_time(std::int64_t seconds_since_epoch, bool relative, bool user_interaction); + // Controls whether the RTC is local time or UTC. + void set_local_rtc(bool local_rtc, bool fix_system, bool user_interaction); + class timedate1 { const Gio::DBus::InterfaceVTable interface_vtable;