Deprecated and removed features, and other changes affecting compatibility:
- [Add deprecations, removals and changes affecting compatibility here]
+* Architectures which use a 32-bit seconds-since-epoch field in struct
+ lastlog, struct utmp, struct utmpx (such as i386, powerpc64le, rv32,
+ rv64, x86-64) switched from a signed to an unsigned type for that
+ field. This allows these fields to store timestamps beyond the year
+ 2038, until the year 2106. Please note that applications are still
+ expected to migrate off the interfaces declared in <utmp.h> and
+ <utmpx.h> (except for login_tty) due to locking and session management
+ problems.
Changes to build and runtime requirements:
struct lastlog
{
#if __WORDSIZE_TIME64_COMPAT32
- int32_t ll_time;
+ __uint32_t ll_time;
#else
__time_t ll_time;
#endif
int32_t ut_session; /* Session ID, used for windowing. */
struct
{
- int32_t tv_sec; /* Seconds. */
+ __uint32_t tv_sec; /* Seconds. */
int32_t tv_usec; /* Microseconds. */
} ut_tv; /* Time entry was made. */
#else
vpath %.c programs
tests := tst-utmp tst-utmpx tst-grantpt tst-ptsname tst-getlogin tst-updwtmpx \
- tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size tst-utmp-size-64
+ tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size tst-utmp-size-64 \
+ tst-utmp-unsigned tst-utmp-unsigned-64
CFLAGS-tst-utmp-size-64.c += -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
+CFLAGS-tst-utmp-unsigned-64.c += -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
# Empty compatibility library for old binaries.
extra-libs := libutil
--- /dev/null
+#include "tst-utmp-unsigned.c"
--- /dev/null
+/* Check that struct utmp, struct utmpx, struct lastlog use unsigned epoch.
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <utmp.h>
+#include <utmpx.h>
+#include <utmp-size.h>
+
+/* Undefined. Used to check that the conditions below are optimized away. */
+void link_failure_utmp (void);
+void link_failure_utmpx (void);
+void link_failure_lastlog (void);
+
+static int
+do_test (void)
+{
+ if ((struct utmp) { .ut_tv = { 0x80000000U, }, }.ut_tv.tv_sec <= 0)
+ link_failure_utmp ();
+ if ((struct utmpx) { .ut_tv = { 0x80000000U, }, }.ut_tv.tv_sec <= 0)
+ link_failure_utmpx ();
+ if ((struct lastlog) { .ll_time = 0x80000000U, }.ll_time <= 0)
+ link_failure_lastlog ();
+ return 0;
+}
+
+#include <support/test-driver.c>
__int32_t ut_session; /* Session ID, used for windowing. */
struct
{
- __int32_t tv_sec; /* Seconds. */
+ __uint32_t tv_sec; /* Seconds. */
__int32_t tv_usec; /* Microseconds. */
} ut_tv; /* Time entry was made. */
#else