From 5d8aa97da2332a818579bbb24880f9d44715448a Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Mon, 19 Oct 2020 11:51:48 -0300 Subject: time: Add 64-bit time_t support for ftime It basically calls the 64-bit __clock_gettime64 and adds the overflow check. Checked on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: Lukasz Majewski --- time/Makefile | 2 +- time/bits/types/struct_timeb.h | 15 +++++++++++++++ time/ftime.c | 28 ++++++++++++++++++++++++---- time/sys/timeb.h | 12 +----------- 4 files changed, 41 insertions(+), 16 deletions(-) create mode 100644 time/bits/types/struct_timeb.h (limited to 'time') diff --git a/time/Makefile b/time/Makefile index a4fb13d6a3..26aa835166 100644 --- a/time/Makefile +++ b/time/Makefile @@ -27,7 +27,7 @@ headers := time.h sys/time.h sys/timeb.h bits/time.h \ bits/types/struct_itimerspec.h \ bits/types/struct_timespec.h bits/types/struct_timeval.h \ bits/types/struct_tm.h bits/types/timer_t.h \ - bits/types/time_t.h + bits/types/time_t.h bits/types/struct_timeb.h routines := offtime asctime clock ctime ctime_r difftime \ gmtime localtime mktime time \ diff --git a/time/bits/types/struct_timeb.h b/time/bits/types/struct_timeb.h new file mode 100644 index 0000000000..1fe60c7131 --- /dev/null +++ b/time/bits/types/struct_timeb.h @@ -0,0 +1,15 @@ +#ifndef __timeb_defined +#define __timeb_defined 1 + +#include + +/* Structure returned by the 'ftime' function. */ +struct timeb + { + time_t time; /* Seconds since epoch, as from 'time'. */ + unsigned short int millitm; /* Additional milliseconds. */ + short int timezone; /* Minutes west of GMT. */ + short int dstflag; /* Nonzero if Daylight Savings Time used. */ + }; + +#endif diff --git a/time/ftime.c b/time/ftime.c index 70a2590c17..91ba100503 100644 --- a/time/ftime.c +++ b/time/ftime.c @@ -18,13 +18,13 @@ #include #include -#include +#include int -ftime (struct timeb *timebuf) +__ftime64 (struct __timeb64 *timebuf) { - struct timespec ts; - __clock_gettime (CLOCK_REALTIME, &ts); + struct __timespec64 ts; + __clock_gettime64 (CLOCK_REALTIME, &ts); timebuf->time = ts.tv_sec; timebuf->millitm = ts.tv_nsec / 1000000; @@ -32,3 +32,23 @@ ftime (struct timeb *timebuf) timebuf->dstflag = 0; return 0; } +#if __TIMESIZE != 64 +libc_hidden_def (__ftime64) + +int +ftime (struct timeb *timebuf) +{ + struct __timeb64 tb64; + __ftime64 (&tb64); + if (! in_time_t_range (tb64.time)) + { + __set_errno (EOVERFLOW); + return -1; + } + timebuf->time = tb64.time; + timebuf->millitm = tb64.millitm; + timebuf->timezone = tb64.timezone; + timebuf->dstflag = tb64.dstflag; + return 0; +} +#endif diff --git a/time/sys/timeb.h b/time/sys/timeb.h index d6cdf29111..bbad4eb8c0 100644 --- a/time/sys/timeb.h +++ b/time/sys/timeb.h @@ -20,19 +20,9 @@ #include -#include - __BEGIN_DECLS -/* Structure returned by the `ftime' function. */ - -struct timeb - { - time_t time; /* Seconds since epoch, as from `time'. */ - unsigned short int millitm; /* Additional milliseconds. */ - short int timezone; /* Minutes west of GMT. */ - short int dstflag; /* Nonzero if Daylight Savings Time used. */ - }; +# include /* Fill in TIMEBUF with information about the current time. */ -- cgit 1.4.1