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 <lukma@denx.de>
This commit is contained in:
Adhemerval Zanella 2020-10-19 11:51:48 -03:00
parent 30a0b167d3
commit 5d8aa97da2
7 changed files with 70 additions and 16 deletions

View File

@ -0,0 +1 @@
#include <time/bits/types/struct_timeb.h>

View File

@ -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 */

View File

@ -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

View File

@ -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 \

View File

@ -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

View File

@ -18,13 +18,13 @@
#include <features.h>
#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;
@ -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

View File

@ -20,19 +20,9 @@
#include <features.h>
#include <bits/types/time_t.h>
__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 <bits/types/struct_timeb.h>
/* Fill in TIMEBUF with information about the current time. */