[2/2] time: Add 64-bit time_t support for ftime
Commit Message
It basically calls the 64-bit __clock_gettime64 and adds the overflow
check.
Checked on x86_64-linux-gnu and i686-linux-gnu.
---
include/bits/types/struct_timeb.h | 1 +
include/struct___timeb64.h | 16 ++++++++++++++++
include/sys/timeb.h | 12 ++++++++++++
time/Makefile | 2 +-
time/bits/types/struct_timeb.h | 15 +++++++++++++++
time/ftime.c | 28 ++++++++++++++++++++++++----
time/sys/timeb.h | 12 +-----------
7 files changed, 70 insertions(+), 16 deletions(-)
create mode 100644 include/bits/types/struct_timeb.h
create mode 100644 include/struct___timeb64.h
create mode 100644 time/bits/types/struct_timeb.h
Comments
Hi Adhemerval,
> It basically calls the 64-bit __clock_gettime64 and adds the overflow
> check.
>
> Checked on x86_64-linux-gnu and i686-linux-gnu.
> ---
> include/bits/types/struct_timeb.h | 1 +
> include/struct___timeb64.h | 16 ++++++++++++++++
> include/sys/timeb.h | 12 ++++++++++++
> time/Makefile | 2 +-
> time/bits/types/struct_timeb.h | 15 +++++++++++++++
> time/ftime.c | 28 ++++++++++++++++++++++++----
> time/sys/timeb.h | 12 +-----------
> 7 files changed, 70 insertions(+), 16 deletions(-)
> create mode 100644 include/bits/types/struct_timeb.h
> create mode 100644 include/struct___timeb64.h
> create mode 100644 time/bits/types/struct_timeb.h
>
> diff --git a/include/bits/types/struct_timeb.h
> b/include/bits/types/struct_timeb.h new file mode 100644
> index 0000000000..fef74d2f44
> --- /dev/null
> +++ b/include/bits/types/struct_timeb.h
> @@ -0,0 +1 @@
> +#include <time/bits/types/struct_timeb.h>
> diff --git a/include/struct___timeb64.h b/include/struct___timeb64.h
> new file mode 100644
> index 0000000000..14704a9e30
> --- /dev/null
> +++ b/include/struct___timeb64.h
> @@ -0,0 +1,16 @@
> +#ifndef _STRUCT_TIMEB64_H
> +#define _STRUCT_TIMEB64_H
> +
> +#if __TIMESIZE == 64
> +# define __timeb64 timeb
> +#else
> +struct __timeb64
> +{
> + __time64_t time;
> + unsigned short int millitm;
> + short int timezone;
> + short int dstflag;
> +};
> +#endif
> +
> +#endif /* _STRUCT_TIMEB64_H */
> diff --git a/include/sys/timeb.h b/include/sys/timeb.h
> index 9f4509c35e..2b01dafea7 100644
> --- a/include/sys/timeb.h
> +++ b/include/sys/timeb.h
> @@ -1 +1,13 @@
> #include <time/sys/timeb.h>
> +
> +#ifndef _ISOMAC
> +# if __TIMESIZE == 64
> +# define __timeb64 timeb
> +# define __ftime64 ftime
> +# else
> +# include <struct___timeb64.h>
> +
> +extern int __ftime64 (struct __timeb64 *) __nonnull ((1));
> +libc_hidden_proto (__ftime64);
> +# endif
> +#endif
> 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 <bits/types/time_t.h>
> +
> +/* 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 ec88d9963f..a99070d3e0 100644
> --- a/time/ftime.c
> +++ b/time/ftime.c
> @@ -20,13 +20,13 @@
> #undef __GLIBC_USE_DEPRECATED_FTIME
> #define __GLIBC_USE_DEPRECATED_FTIME 1
> #include <sys/timeb.h>
> -#include <time.h>
> +#include <errno.h>
>
> 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;
> @@ -34,3 +34,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 be7b46c178..3f44abe55e 100644
> --- a/time/sys/timeb.h
> +++ b/time/sys/timeb.h
> @@ -20,21 +20,11 @@
>
> #include <features.h>
>
> -#include <bits/types/time_t.h>
> -
> __BEGIN_DECLS
>
> #if __GLIBC_USE (DEPRECATED_FTIME)
>
> -/* 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 <bits/types/struct_timeb.h>
>
> /* Fill in TIMEBUF with information about the current time. */
>
Reviewed-by: Lukasz Majewski <lukma@denx.de>
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
The build of the 64-bit ftime appears broken for Hurd:
ftime.c: In function '__ftime64':
ftime.c:27:3: error: implicit declaration of function '__clock_gettime64' [-Werror=implicit-function-declaration]
27 | __clock_gettime64 (CLOCK_REALTIME, &ts);
| ^~~~~~~~~~~~~~~~~
ftime.c:27:22: error: 'CLOCK_REALTIME' undeclared (first use in this function)
27 | __clock_gettime64 (CLOCK_REALTIME, &ts);
| ^~~~~~~~~~~~~~
ftime.c:27:22: note: each undeclared identifier is reported only once for each function it appears in
ftime.c: In function 'ftime':
ftime.c:43:9: error: implicit declaration of function 'in_time_t_range'; did you mean 'in_ino_t_range'? [-Werror=implicit-function-declaration]
43 | if (! in_time_t_range (tb64.time))
| ^~~~~~~~~~~~~~~
| in_ino_t_range
https://sourceware.org/pipermail/libc-testresults/2020q4/006962.html
On 27/10/2020 14:38, Joseph Myers wrote:
> The build of the 64-bit ftime appears broken for Hurd:
>
> ftime.c: In function '__ftime64':
> ftime.c:27:3: error: implicit declaration of function '__clock_gettime64' [-Werror=implicit-function-declaration]
> 27 | __clock_gettime64 (CLOCK_REALTIME, &ts);
> | ^~~~~~~~~~~~~~~~~
> ftime.c:27:22: error: 'CLOCK_REALTIME' undeclared (first use in this function)
> 27 | __clock_gettime64 (CLOCK_REALTIME, &ts);
> | ^~~~~~~~~~~~~~
> ftime.c:27:22: note: each undeclared identifier is reported only once for each function it appears in
> ftime.c: In function 'ftime':
> ftime.c:43:9: error: implicit declaration of function 'in_time_t_range'; did you mean 'in_ino_t_range'? [-Werror=implicit-function-declaration]
> 43 | if (! in_time_t_range (tb64.time))
> | ^~~~~~~~~~~~~~~
> | in_ino_t_range
>
> https://sourceware.org/pipermail/libc-testresults/2020q4/006962.html
>
I think we will need to make the y2038 ftime support Linux specific
for now, I will fix it.
new file mode 100644
@@ -0,0 +1 @@
+#include <time/bits/types/struct_timeb.h>
new file mode 100644
@@ -0,0 +1,16 @@
+#ifndef _STRUCT_TIMEB64_H
+#define _STRUCT_TIMEB64_H
+
+#if __TIMESIZE == 64
+# define __timeb64 timeb
+#else
+struct __timeb64
+{
+ __time64_t time;
+ unsigned short int millitm;
+ short int timezone;
+ short int dstflag;
+};
+#endif
+
+#endif /* _STRUCT_TIMEB64_H */
@@ -1 +1,13 @@
#include <time/sys/timeb.h>
+
+#ifndef _ISOMAC
+# if __TIMESIZE == 64
+# define __timeb64 timeb
+# define __ftime64 ftime
+# else
+# include <struct___timeb64.h>
+
+extern int __ftime64 (struct __timeb64 *) __nonnull ((1));
+libc_hidden_proto (__ftime64);
+# endif
+#endif
@@ -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 \
new file mode 100644
@@ -0,0 +1,15 @@
+#ifndef __timeb_defined
+#define __timeb_defined 1
+
+#include <bits/types/time_t.h>
+
+/* 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
@@ -20,13 +20,13 @@
#undef __GLIBC_USE_DEPRECATED_FTIME
#define __GLIBC_USE_DEPRECATED_FTIME 1
#include <sys/timeb.h>
-#include <time.h>
+#include <errno.h>
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;
@@ -34,3 +34,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
@@ -20,21 +20,11 @@
#include <features.h>
-#include <bits/types/time_t.h>
-
__BEGIN_DECLS
#if __GLIBC_USE (DEPRECATED_FTIME)
-/* 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 <bits/types/struct_timeb.h>
/* Fill in TIMEBUF with information about the current time. */