Message ID | 20201019191304.3471080-2-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | [1/2] Reinstate ftime and move define it for POSIX.1-2001 or older | expand |
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.
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. */