| From 46da4c4e090e0412cee0777f1e8b219964781da7 Mon Sep 17 00:00:00 2001 |
| From: Eneas U de Queiroz <cotequeiroz@gmail.com> |
| Date: Fri, 8 Oct 2021 14:39:52 -0300 |
| Subject: [PATCH] Avoid problems with 64-bit time_t |
| |
| The clock_gettime() calls are being handled by calling |
| syscall(__NR_clock_gettime, ...), which is not portable between systems |
| using 32-bit and 64-bit time_t. This is being done to avoid having to |
| link agains librt. |
| |
| So, use the standard function, and add a test to see if we can compile |
| a test without the library, including it otherwise. |
| |
| Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com> |
| --- |
| Makefile.flags | 6 ++++++ |
| coreutils/date.c | 6 ++---- |
| libbb/time.c | 2 +- |
| 3 files changed, 9 insertions(+), 5 deletions(-) |
| |
| --- a/Makefile.flags |
| +++ b/Makefile.flags |
| @@ -124,6 +124,12 @@ CFLAGS += --sysroot=$(CONFIG_SYSROOT) |
| export SYSROOT=$(CONFIG_SYSROOT) |
| endif |
| |
| +# glibc versions before 2.17 need to link with -rt to use clock_gettime |
| +RT_NEEDED := $(shell echo 'int main(void){struct timespec tp; return clock_gettime(CLOCK_MONOTONIC, &tp);}' >rttest.c; $(CC) $(CFLAGS) -include time.h -o /dev/null rttest.c >/dev/null 2>&1 || echo "y"; rm rttest.c) |
| +ifeq ($(RT_NEEDED),y) |
| +LDLIBS += rt |
| +endif |
| + |
| # Android has no separate crypt library |
| # gcc-4.2.1 fails if we try to feed C source on stdin: |
| # echo 'int main(void){return 0;}' | $(CC) $(CFLAGS) -lcrypt -o /dev/null -xc - |
| --- a/coreutils/date.c |
| +++ b/coreutils/date.c |
| @@ -37,7 +37,7 @@ |
| //config:config FEATURE_DATE_NANO |
| //config: bool "Support %[num]N nanosecond format specifier" |
| //config: default n |
| -//config: depends on DATE # syscall(__NR_clock_gettime) |
| +//config: depends on DATE # clock_gettime() |
| //config: select PLATFORM_LINUX |
| //config: help |
| //config: Support %[num]N format specifier. Adds ~250 bytes of code. |
| @@ -265,9 +265,7 @@ int date_main(int argc UNUSED_PARAM, cha |
| #endif |
| } else { |
| #if ENABLE_FEATURE_DATE_NANO |
| - /* libc has incredibly messy way of doing this, |
| - * typically requiring -lrt. We just skip all this mess */ |
| - syscall(__NR_clock_gettime, CLOCK_REALTIME, &ts); |
| + clock_gettime(CLOCK_REALTIME, &ts); |
| #else |
| time(&ts.tv_sec); |
| #endif |
| --- a/libbb/time.c |
| +++ b/libbb/time.c |
| @@ -243,7 +243,7 @@ char* FAST_FUNC strftime_YYYYMMDDHHMMSS( |
| * typically requiring -lrt. We just skip all this mess */ |
| static void get_mono(struct timespec *ts) |
| { |
| - if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, ts)) |
| + if (clock_gettime(CLOCK_MONOTONIC, ts)) |
| bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); |
| } |
| unsigned long long FAST_FUNC monotonic_ns(void) |