diff --git a/NEWS b/NEWS index 7e9d36e180..75b380c0f8 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,19 @@ Major new features: 18661-1:2014 and TS 18661-3:2015 as amended by the resolution of Clarification Request 13 to TS 18661-3. +* The gettimeofday function will no longer report information about a + system-wide time zone, expect for aarch64, powerpc, and x86 on Linux + which still uses the vDSO symbol (when available). + + This 4.2-BSD-era feature has been deprecated for many years, as it cannot + handle the full complexity of the world's timezones, but hitherto we have + supported it on a best-effort basis. Changes required to support 64-bit + time_t on 32-bit architectures have made this no longer practical. + + As of this release, callers of gettimeofday with a non-null 'tzp' argument + will always receive a 'struct timezone' whose tz_minuteswest and + tz_dsttime fields are zero. + Deprecated and removed features, and other changes affecting compatibility: * The totalorder and totalordermag functions, and the corresponding diff --git a/include/sys/time.h b/include/sys/time.h index c0e30e70fb..2bf4297e76 100644 --- a/include/sys/time.h +++ b/include/sys/time.h @@ -22,8 +22,6 @@ # ifndef _ISOMAC extern int __gettimeofday (struct timeval *__tv, struct timezone *__tz); -libc_hidden_proto (__gettimeofday) -libc_hidden_proto (gettimeofday) extern int __settimezone (const struct timezone *__tz) attribute_hidden; extern int __adjtime (const struct timeval *__delta, diff --git a/sysdeps/unix/clock_gettime.c b/sysdeps/mach/clock_gettime.c similarity index 65% rename from sysdeps/unix/clock_gettime.c rename to sysdeps/mach/clock_gettime.c index aa74e11703..0f872e5a45 100644 --- a/sysdeps/unix/clock_gettime.c +++ b/sysdeps/mach/clock_gettime.c @@ -1,5 +1,4 @@ -/* clock_gettime -- Get the current time from a POSIX clockid_t. Unix version. - Copyright (C) 1999-2019 Free Software Foundation, Inc. +/* Copyright (C) 1991-2019 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -18,32 +17,28 @@ #include #include -#include +#include #include -/* Get current value of CLOCK and store it in TP. */ +/* Get the current time of day, putting it into *TS. + Returns 0 on success, -1 on errors. */ int -__clock_gettime (clockid_t clock_id, struct timespec *tp) +__clock_gettime (clockid_t clock_id, struct timespec *ts) { - int retval = -1; - - switch (clock_id) + if (clock_id != CLOCK_REALTIME) { - case CLOCK_REALTIME: - { - struct timeval tv; - retval = __gettimeofday (&tv, NULL); - if (retval == 0) - TIMEVAL_TO_TIMESPEC (&tv, tp); - } - break; - - default: - __set_errno (EINVAL); - break; + errno = EINVAL; + return -1; } - return retval; + /* __host_get_time can only fail if passed an invalid host_t. + __mach_host_self could theoretically fail (producing an + invalid host_t) due to resource exhaustion, but we assume + this will never happen. */ + time_value_t tv; + __host_get_time (__mach_host_self (), &tv); + TIME_VALUE_TO_TIMESPEC (&tv, ts); + return 0; } libc_hidden_def (__clock_gettime) diff --git a/sysdeps/mach/gettimeofday.c b/sysdeps/mach/gettimeofday.c deleted file mode 100644 index f6df00306b..0000000000 --- a/sysdeps/mach/gettimeofday.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (C) 1991-2019 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include -#include - -/* Get the current time of day and timezone information, - putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled. - Returns 0 on success, -1 on errors. */ -int -__gettimeofday (struct timeval *tv, struct timezone *tz) -{ - kern_return_t err; - - if (tz != NULL) - *tz = (struct timezone){0, 0}; /* XXX */ - - if (err = __host_get_time (__mach_host_self (), (time_value_t *) tv)) - { - errno = err; - return -1; - } - return 0; -} -libc_hidden_def (__gettimeofday) -weak_alias (__gettimeofday, gettimeofday) -libc_hidden_weak (gettimeofday) diff --git a/sysdeps/posix/gettimeofday.c b/sysdeps/posix/gettimeofday.c deleted file mode 100644 index 6bb98cd018..0000000000 --- a/sysdeps/posix/gettimeofday.c +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 1991-2019 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include - -/* Get the current time of day and timezone information, - putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled. - Returns 0 on success, -1 on errors. */ -int -__gettimeofday (struct timeval *tv, struct timezone *tz) -{ - if (tv == NULL) - { - __set_errno (EINVAL); - return -1; - } - - tv->tv_sec = (long int) time ((time_t *) NULL); - tv->tv_usec = 0L; - - if (tz != NULL) - { - const time_t timer = tv->tv_sec; - struct tm tm; - const struct tm *tmp; - - const long int save_timezone = __timezone; - const long int save_daylight = __daylight; - char *save_tzname[2]; - save_tzname[0] = __tzname[0]; - save_tzname[1] = __tzname[1]; - - tmp = localtime_r (&timer, &tm); - - tz->tz_minuteswest = __timezone / 60; - tz->tz_dsttime = __daylight; - - __timezone = save_timezone; - __daylight = save_daylight; - __tzname[0] = save_tzname[0]; - __tzname[1] = save_tzname[1]; - - if (tmp == NULL) - return -1; - } - - return 0; -} -libc_hidden_def (__gettimeofday) -weak_alias (__gettimeofday, gettimeofday) -libc_hidden_weak (gettimeofday) diff --git a/sysdeps/unix/syscalls.list b/sysdeps/unix/syscalls.list index 5fedd5733d..e28e801c7a 100644 --- a/sysdeps/unix/syscalls.list +++ b/sysdeps/unix/syscalls.list @@ -33,7 +33,6 @@ getrlimit - getrlimit i:ip __getrlimit getrlimit getrusage - getrusage i:ip __getrusage getrusage getsockname - getsockname i:ibN __getsockname getsockname getsockopt - getsockopt i:iiiBN getsockopt -gettimeofday - gettimeofday i:pP __gettimeofday gettimeofday getuid - getuid Ei: __getuid getuid ioctl - ioctl i:iiI __ioctl ioctl kill - kill i:ii __kill kill diff --git a/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c b/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c index 4ff74fa285..075af3d0d3 100644 --- a/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/aarch64/gettimeofday.c @@ -20,39 +20,39 @@ putting it into *tv and *tz. If tz is null, *tz is not filled. Returns 0 on success, -1 on errors. */ -#include +#include +#include -#ifdef SHARED - -# include -# include +#ifdef HAVE_GETTIMEOFDAY_VSYSCALL +# define HAVE_VSYSCALL +#endif +#include /* Used as a fallback in the ifunc resolver if VDSO is not available and for libc.so internal __gettimeofday calls. */ - static int __gettimeofday_vsyscall (struct timeval *tv, struct timezone *tz) { + if (__glibc_unlikely (tz != 0)) + memset (tz, 0, sizeof *tz); + return INLINE_VSYSCALL (gettimeofday, 2, tv, tz); } +#ifdef SHARED +# include +# include + # define INIT_ARCH() -libc_ifunc_hidden (__gettimeofday, __gettimeofday, - (get_vdso_symbol (HAVE_GETTIMEOFDAY_VSYSCALL) - ?: __gettimeofday_vsyscall)) -libc_hidden_def (__gettimeofday) +libc_ifunc (__gettimeofday, + (get_vdso_symbol (HAVE_GETTIMEOFDAY_VSYSCALL) + ?: __gettimeofday_vsyscall)) #else - -# include int __gettimeofday (struct timeval *tv, struct timezone *tz) { - return INLINE_SYSCALL (gettimeofday, 2, tv, tz); + return __gettimeofday_vsyscall (tv, tz); } -libc_hidden_def (__gettimeofday) - #endif - weak_alias (__gettimeofday, gettimeofday) -libc_hidden_weak (gettimeofday) diff --git a/sysdeps/unix/sysv/linux/i386/gettimeofday.c b/sysdeps/unix/sysv/linux/alpha/gettimeofday.c similarity index 58% rename from sysdeps/unix/sysv/linux/i386/gettimeofday.c rename to sysdeps/unix/sysv/linux/alpha/gettimeofday.c index f6faecb21e..262a3c2352 100644 --- a/sysdeps/unix/sysv/linux/i386/gettimeofday.c +++ b/sysdeps/unix/sysv/linux/alpha/gettimeofday.c @@ -1,5 +1,5 @@ -/* gettimeofday - get the time. Linux/i386 version. - Copyright (C) 2015-2019 Free Software Foundation, Inc. +/* gettimeofday -- Get the current time of day. Linux/Alpha/tv64 version. + Copyright (C) 2019 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,20 +16,7 @@ License along with the GNU C Library; if not, see . */ -#ifdef SHARED -# define __gettimeofday __redirect___gettimeofday -#endif - -#include - -#ifdef SHARED -# undef __gettimeofday -# define __gettimeofday_type __redirect___gettimeofday - -# undef libc_hidden_def -# define libc_hidden_def(name) \ - __hidden_ver1 (__gettimeofday_syscall, __GI___gettimeofday, \ - __gettimeofday_syscall); -#endif - -#include +/* We can use the generic implementation, but we have to override its + default symbol version. */ +#define VERSION_gettimeofday GLIBC_2.1 +#include