This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH v10] y2038: Provide conversion helpers for struct __timespec64
- From: Lukasz Majewski <lukma at denx dot de>
- To: Joseph Myers <joseph at codesourcery dot com>, Paul Eggert <eggert at cs dot ucla dot edu>
- Cc: Alistair Francis <alistair23 at gmail dot com>, Arnd Bergmann <arnd at arndb dot de>, Alistair Francis <alistair dot francis at wdc dot com>, GNU C Library <libc-alpha at sourceware dot org>, Adhemerval Zanella <adhemerval dot zanella at linaro dot org>, Florian Weimer <fweimer at redhat dot com>, Carlos O'Donell <carlos at redhat dot com>, Stepan Golosunov <stepan at golosunov dot pp dot ru>, Florian Weimer <fw at deneb dot enyo dot de>, Zack Weinberg <zackw at panix dot com>, Lukasz Majewski <lukma at denx dot de>
- Date: Mon, 30 Sep 2019 15:31:34 +0200
- Subject: [PATCH v10] y2038: Provide conversion helpers for struct __timespec64
Those functions allow easy conversion between Y2038 safe struct
__timespec64 and other time related data structures (like struct timeval
or struct timespec).
* include/time.h (valid_timeval_to_timespec64): Add.
* include/time.h (valid_timespec_to_timespec64): Likewise.
* include/time.h (valid_timespec64_to_timespec): Likewise.
* include/time.h (valid_timespec64_to_timeval): Likewise.
---
Changes for v10:
- Provide only conversion functions to work on "valid" time structures
(no need to provide any excessive checks)
- Return values instead of pointers
Changes for v9:
- Update comments to be more concise and describe return values from
conversion functions (according to Joseph's request).
Changes for v8:
- None
Changes for v7:
- None
Changes for v6:
- Remove the #ifdef guard on __ASSUME_TIME64_SYSCALLS as those functions
may be needed for fallback execution paths (on e.g. __clock_settime64).
Changes for v5:
- This code is now only compiled in when __ASSUME_TIME64_SYSCALLS is NOT
defined. Previously it was depending on #if __TIMESIZE != 64.
Changes for v4:
- None
Changes for v3:
- Remove misleading comments regarding clearing tv_pad values during
conversion (as Linux kernel on its own ignores upper 32 bits of tv_nsec).
Changes for v3:
- Remove timespec64_clear_padding function - as kernel ignores upper 32
bits of tv_nsec when passed via syscall to the Linux kernel
Changes for v2:
- Add timespec64_clear_padding function
---
include/time.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/include/time.h b/include/time.h
index 9727786634..9878c2b2ca 100644
--- a/include/time.h
+++ b/include/time.h
@@ -178,5 +178,54 @@ in_time_t_range (__time64_t t)
return s == t;
}
+/* Convert a known valid struct timeval into a struct __timespec64. */
+static inline struct __timespec64
+valid_timeval_to_timespec64 (const struct timeval tv)
+{
+ struct __timespec64 ts64;
+
+ ts64.tv_sec = tv.tv_sec;
+ ts64.tv_nsec = tv.tv_usec * 1000;
+
+ return ts64;
+}
+
+/* Convert a known valid struct timespec into a struct __timespec64. */
+static inline struct __timespec64
+valid_timespec_to_timespec64 (const struct timespec ts)
+{
+ struct __timespec64 ts64;
+
+ ts64.tv_sec = ts.tv_sec;
+ ts64.tv_nsec = ts.tv_nsec;
+
+ return ts64;
+}
+
+/* Convert a valid and within range of struct timespec, struct
+ __timespec64 into a struct timespec. */
+static inline struct timespec
+valid_timespec64_to_timespec (const struct __timespec64 ts64)
+{
+ struct timespec ts;
+
+ ts.tv_sec = (time_t) ts64.tv_sec;
+ ts.tv_nsec = ts64.tv_nsec;
+
+ return ts;
+}
+
+/* Convert a valid and within range of struct timeval struct
+ __timespec64 into a struct timeval. */
+static inline struct timeval
+valid_timespec64_to_timeval (const struct __timespec64 ts64)
+{
+ struct timeval tv;
+
+ tv.tv_sec = (time_t) ts64.tv_sec;
+ tv.tv_usec = ts64.tv_nsec / 1000;
+
+ return tv;
+}
#endif
#endif
--
2.20.1