1 Star 0 Fork 25

池鱼/util-linux

forked from src-anolis-os/util-linux 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
1001-hwclock-make-glibc-2.31-compatible.patch 7.56 KB
一键复制 编辑 原始数据 按行查看 历史
From e42f9f05a96c9e0129722b15fc638d4133ac1ecb Mon Sep 17 00:00:00 2001
From: J William Piggott <elseifthen@gmx.com>
Date: Tue, 19 Apr 2022 23:22:11 -0400
Subject: [PATCH] hwclock: make glibc 2.31 compatible
______________________________________________________
GNU C Library NEWS -- history of user-visible changes.
Version 2.31
Deprecated and removed features, and other changes affecting compatibility:
* The settimeofday function can still be used to set a system-wide time
zone when the operating system supports it. This is because the Linux
kernel reused the API, on some architectures, to describe a system-wide
time-zone-like offset between the software clock maintained by the kernel,
and the "RTC" clock that keeps time when the system is shut down.
However, to reduce the odds of this offset being set by accident,
settimeofday can no longer be used to set the time and the offset
simultaneously. If both of its two arguments are non-null, the call
will fail (setting errno to EINVAL).
Callers attempting to set this offset should also be prepared for the call
to fail and set errno to ENOSYS; this already happens on the Hurd and on
some Linux architectures. The Linux kernel maintainers are discussing a
more principled replacement for the reused API. After a replacement
becomes available, we will change settimeofday to fail with ENOSYS on all
platforms when its 'tzp' argument is not a null pointer.
settimeofday itself is obsolescent according to POSIX. Programs that set
the system time should use clock_settime and/or the adjtime family of
functions instead. We may cease to make settimeofday available to newly
linked binaries after there is a replacement for Linux's time-zone-like
offset API.
______________________________________________________
hwclock(8) had one settimeofday(2) call where both args were set for
--hctosys when the RTC was ticking UTC. This allowed setting the system
time, timezone, and locking the warp_clock function with a single call.
That operation now takes 3 calls of settimeofday(2).
Although this common operation now takes three calls, the overall logic
for the set_system_clock() function was simplified.
Co-Author: Karel Zak <kzak@redhat.com>
Signed-off-by: J William Piggott <elseifthen@gmx.com>
---
sys-utils/hwclock.c | 70 ++++++++++++++++++++++-----------------------
1 file changed, 35 insertions(+), 35 deletions(-)
diff --git a/sys-utils/hwclock.c b/sys-utils/hwclock.c
index b83e710..19e7410 100644
--- a/sys-utils/hwclock.c
+++ b/sys-utils/hwclock.c
@@ -583,28 +583,28 @@ display_time(struct timeval hwctime)
* tz.tz_minuteswest argument and sets PCIL (see below). At boot settimeofday(2)
* has one-shot access to this function as shown in the table below.
*
- * +-------------------------------------------------------------------+
- * | settimeofday(tv, tz) |
- * |-------------------------------------------------------------------|
- * | Arguments | System Time | PCIL | | warp_clock |
- * | tv | tz | set | warped | set | firsttime | locked |
- * |---------|---------|---------------|------|-----------|------------|
- * | pointer | NULL | yes | no | no | 1 | no |
- * | pointer | pointer | yes | no | no | 0 | yes |
- * | NULL | ptr2utc | no | no | no | 0 | yes |
- * | NULL | pointer | no | yes | yes | 0 | yes |
- * +-------------------------------------------------------------------+
+ * +-------------------------------------------------------------------------+
+ * | settimeofday(tv, tz) |
+ * |-------------------------------------------------------------------------|
+ * | Arguments | System Time | TZ | PCIL | | warp_clock |
+ * | tv | tz | set | warped | set | set | firsttime | locked |
+ * |---------|---------|---------------|-----|------|-----------|------------|
+ * | pointer | NULL | yes | no | no | no | 1 | no |
+ * | NULL | ptr2utc | no | no | yes | no | 0 | yes |
+ * | NULL | pointer | no | yes | yes | yes | 0 | yes |
+ * +-------------------------------------------------------------------------+
* ptr2utc: tz.tz_minuteswest is zero (UTC).
* PCIL: persistent_clock_is_local, sets the "11 minute mode" timescale.
* firsttime: locks the warp_clock function (initialized to 1 at boot).
+ * Since glibc v2.31 settimeofday() will fail if both args are non NULL
*
* +---------------------------------------------------------------------------+
* | op | RTC scale | settimeofday calls |
* |---------|-----------|-----------------------------------------------------|
* | systz | Local | 1) warps system time*, sets PCIL* and kernel tz |
* | systz | UTC | 1st) locks warp_clock* 2nd) sets kernel tz |
- * | hctosys | Local | 1st) sets PCIL* 2nd) sets system time and kernel tz |
- * | hctosys | UTC | 1) sets system time and kernel tz |
+ * | hctosys | Local | 1st) sets PCIL* & kernel tz 2nd) sets system time |
+ * | hctosys | UTC | 1st) locks warp* 2nd) sets tz 3rd) sets system time |
* +---------------------------------------------------------------------------+
* * only on first call after boot
*/
@@ -615,41 +615,41 @@ set_system_clock(const struct hwclock_control *ctl,
struct tm broken;
int minuteswest;
int rc = 0;
- const struct timezone tz_utc = { 0 };
localtime_r(&newtime.tv_sec, &broken);
minuteswest = -get_gmtoff(&broken) / 60;
if (ctl->verbose) {
- if (ctl->hctosys && !ctl->universal)
- printf(_("Calling settimeofday(NULL, %d) to set "
- "persistent_clock_is_local.\n"), minuteswest);
- if (ctl->systz && ctl->universal)
+ if (ctl->universal) {
puts(_("Calling settimeofday(NULL, 0) "
- "to lock the warp function."));
+ "to lock the warp_clock function."));
+ if (!( ctl->universal && !minuteswest ))
+ printf(_("Calling settimeofday(NULL, %d) "
+ "to set the kernel timezone.\n"),
+ minuteswest);
+ } else
+ printf(_("Calling settimeofday(NULL, %d) to warp "
+ "System time, set PCIL and the kernel tz.\n"),
+ minuteswest);
+
if (ctl->hctosys)
- printf(_("Calling settimeofday(%ld.%06ld, %d)\n"),
- newtime.tv_sec, newtime.tv_usec, minuteswest);
- else {
- printf(_("Calling settimeofday(NULL, %d) "), minuteswest);
- if (ctl->universal)
- puts(_("to set the kernel timezone."));
- else
- puts(_("to warp System time."));
- }
+ printf(_("Calling settimeofday(%ld.%06ld, NULL) "
+ "to set the System time.\n"),
+ newtime.tv_sec, newtime.tv_usec);
}
if (!ctl->testing) {
+ const struct timezone tz_utc = { 0 };
const struct timezone tz = { minuteswest };
-
- if (ctl->hctosys && !ctl->universal) /* set PCIL */
- rc = settimeofday(NULL, &tz);
- if (ctl->systz && ctl->universal) /* lock warp_clock */
+ /* If UTC RTC: lock warp_clock and PCIL */
+ if (ctl->universal)
rc = settimeofday(NULL, &tz_utc);
- if (!rc && ctl->hctosys)
- rc = settimeofday(&newtime, &tz);
- else if (!rc)
+ /* Set kernel tz; if localtime RTC: warp_clock and set PCIL */
+ if (!rc && !( ctl->universal && !minuteswest ))
rc = settimeofday(NULL, &tz);
+ /* Set the System Clock */
+ if ((!rc || errno == ENOSYS) && ctl->hctosys)
+ rc = settimeofday(&newtime, NULL);
if (rc) {
warn(_("settimeofday() failed"));
--
2.27.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zxy19951122/util-linux.git
git@gitee.com:zxy19951122/util-linux.git
zxy19951122
util-linux
util-linux
a8

搜索帮助

23e8dbc6 1850385 7e0993f3 1850385