]> sourceware.org Git - glibc.git/commitdiff
y2038: Introduce struct __timespec64 - new internal glibc type
authorLukasz Majewski <lukma@denx.de>
Fri, 22 Mar 2019 10:53:45 +0000 (11:53 +0100)
committerLukasz Majewski <lukma@denx.de>
Thu, 26 Sep 2019 21:32:27 +0000 (23:32 +0200)
This type is a glibc's "internal" type similar to struct timespec but
whose tv_sec field is a __time64_t rather than a time_t, which makes it
Y2038-proof and usable to pass syscalls between user code and Y2038-proof
kernel.

To support passing this structure to the kernel - the unnamed 32 bit
padding bit-field has been introduced. The placement of it depends on
the endianness of the SoC.

Tested on x86_64 and ARM.

ChangeLog
include/time.h

index bb53a33e6852aeb5bb648c08ff6bf044d98c57c2..31e49765bafe0050f5a25ed34ee584d611f6916a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2019-09-26  Lukasz Majewski <lukma@denx.de>
+
+       * include/time.h: Add struct __timespec64 definition
+
 2019-09-26  Siddhesh Poyarekar  <siddhesh@gotplt.org>
 
        * scripts/vcs_to_changelog/misc_util.py (decode): Remove latin1
index dcf91855add3829c713e7fca40e562e3801697d9..9727786634a5a274ce7de5c9ac0c9d55213fa907 100644 (file)
@@ -5,6 +5,7 @@
 # include <bits/types/locale_t.h>
 # include <stdbool.h>
 # include <time/mktime-internal.h>
+# include <endian.h>
 
 extern __typeof (strftime_l) __strftime_l;
 libc_hidden_proto (__strftime_l)
@@ -49,6 +50,29 @@ extern void __tzset_parse_tz (const char *tz) attribute_hidden;
 extern void __tz_compute (__time64_t timer, struct tm *tm, int use_localtime)
   __THROW attribute_hidden;
 
+#if __TIMESIZE == 64
+# define __timespec64 timespec
+#else
+/* The glibc Y2038-proof struct __timespec64 structure for a time value.
+   To keep things Posix-ish, we keep the nanoseconds field a 32-bit
+   signed long, but since the Linux field is a 64-bit signed int, we
+   pad our tv_nsec with a 32-bit unnamed bit-field padding.
+
+   As a general rule the Linux kernel is ignoring upper 32 bits of
+   tv_nsec field.  */
+struct __timespec64
+{
+  __time64_t tv_sec;         /* Seconds */
+# if BYTE_ORDER == BIG_ENDIAN
+  __int32_t :32;             /* Padding */
+  __int32_t tv_nsec;         /* Nanoseconds */
+# else
+  __int32_t tv_nsec;         /* Nanoseconds */
+  __int32_t :32;             /* Padding */
+# endif
+};
+#endif
+
 #if __TIMESIZE == 64
 # define __ctime64 ctime
 #else
This page took 0.278819 seconds and 5 git commands to generate.