diff mbox series

[v2] Reinstate ftime and move define it for POSIX.1-2001 or older

Message ID 20201021123559.598864-1-adhemerval.zanella@linaro.org
State Committed
Headers show
Series [v2] Reinstate ftime and move define it for POSIX.1-2001 or older | expand

Commit Message

Adhemerval Zanella Oct. 21, 2020, 12:35 p.m. UTC
This patch revert "Move ftime to a compatibility symbol" (commit
14633d3e568eb9770a7e5046eff257113e0453fb).  It as adds a deprecated
message on ftime usage.

Checked on x86_64-linux-gnu and i686-linux-gnu.
---
 NEWS                                          |  6 +--
 include/sys/timeb.h                           |  1 +
 .../unix/sysv/linux/riscv/rv32/libc.abilist   |  1 +
 time/Makefile                                 |  5 +--
 time/ftime.c                                  | 20 ++-------
 time/sys/timeb.h                              | 45 +++++++++++++++++++
 time/tst-ftime.c                              | 38 ++++++----------
 7 files changed, 67 insertions(+), 49 deletions(-)
 create mode 100644 include/sys/timeb.h
 create mode 100644 time/sys/timeb.h

Comments

Adhemerval Zanella Oct. 26, 2020, 12:17 p.m. UTC | #1
Florian, 

Are you OK with this version?

On 21/10/2020 09:35, Adhemerval Zanella wrote:
> This patch revert "Move ftime to a compatibility symbol" (commit
> 14633d3e568eb9770a7e5046eff257113e0453fb).  It as adds a deprecated
> message on ftime usage.
> 
> Checked on x86_64-linux-gnu and i686-linux-gnu.
> ---
>  NEWS                                          |  6 +--
>  include/sys/timeb.h                           |  1 +
>  .../unix/sysv/linux/riscv/rv32/libc.abilist   |  1 +
>  time/Makefile                                 |  5 +--
>  time/ftime.c                                  | 20 ++-------
>  time/sys/timeb.h                              | 45 +++++++++++++++++++
>  time/tst-ftime.c                              | 38 ++++++----------
>  7 files changed, 67 insertions(+), 49 deletions(-)
>  create mode 100644 include/sys/timeb.h
>  create mode 100644 time/sys/timeb.h
> 
> diff --git a/NEWS b/NEWS
> index 6eb577a669..6105eb0b3e 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -37,10 +37,8 @@ Deprecated and removed features, and other changes affecting compatibility:
>    implementations from HWCAP subdirectories are no longer loaded.
>    Instead, the default implementation is used.
>  
> -* The deprecated <sys/timeb.h> header and the ftime function have been
> -  removed.  To support old binaries, the ftime function continue to exist
> -  as a compatibility symbol (on those architectures which had it).  All
> -  programs should use gettimeofday or clock_gettime instead.
> +* The deprecated ftime function is now only declared for POSIX.1-2001 or
> +  older standard.
>  
>  Changes to build and runtime requirements:
>  
> diff --git a/include/sys/timeb.h b/include/sys/timeb.h
> new file mode 100644
> index 0000000000..9f4509c35e
> --- /dev/null
> +++ b/include/sys/timeb.h
> @@ -0,0 +1 @@
> +#include <time/sys/timeb.h>
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> index e977715088..36aa34a5e7 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> @@ -795,6 +795,7 @@ GLIBC_2.33 fsync F
>  GLIBC_2.33 ftell F
>  GLIBC_2.33 ftello F
>  GLIBC_2.33 ftello64 F
> +GLIBC_2.33 ftime F
>  GLIBC_2.33 ftok F
>  GLIBC_2.33 ftruncate F
>  GLIBC_2.33 ftruncate64 F
> diff --git a/time/Makefile b/time/Makefile
> index ab8fb3303b..a4fb13d6a3 100644
> --- a/time/Makefile
> +++ b/time/Makefile
> @@ -22,7 +22,7 @@ subdir	:= time
>  
>  include ../Makeconfig
>  
> -headers := time.h sys/time.h bits/time.h				\
> +headers := time.h sys/time.h sys/timeb.h bits/time.h			\
>  	   bits/types/clockid_t.h bits/types/clock_t.h			\
>  	   bits/types/struct_itimerspec.h				\
>  	   bits/types/struct_timespec.h bits/types/struct_timeval.h	\
> @@ -45,10 +45,9 @@ aux :=	    era alt_digit lc-time-cleanup
>  tests	:= test_time clocktest tst-posixtz tst-strptime tst_wcsftime \
>  	   tst-getdate tst-mktime tst-mktime2 tst-ftime_l tst-strftime \
>  	   tst-mktime3 tst-strptime2 bug-asctime bug-asctime_r bug-mktime1 \
> -	   tst-strptime3 bug-getdate1 tst-strptime-whitespace \
> +	   tst-strptime3 bug-getdate1 tst-strptime-whitespace tst-ftime \
>  	   tst-tzname tst-y2039 bug-mktime4 tst-strftime2 tst-strftime3 \
>  	   tst-clock tst-clock2 tst-clock_nanosleep tst-cpuclock1
> -tests-internal := tst-ftime
>  
>  include ../Rules
>  
> diff --git a/time/ftime.c b/time/ftime.c
> index be3295ef76..70a2590c17 100644
> --- a/time/ftime.c
> +++ b/time/ftime.c
> @@ -16,23 +16,12 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>  
> -#include <shlib-compat.h>
> -
> -#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
> -
> +#include <features.h>
> +#include <sys/timeb.h>
>  #include <time.h>
>  
> -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.  */
> -  };
> -
>  int
> -attribute_compat_text_section
> -__ftime (struct timeb *timebuf)
> +ftime (struct timeb *timebuf)
>  {
>    struct timespec ts;
>    __clock_gettime (CLOCK_REALTIME, &ts);
> @@ -43,6 +32,3 @@ __ftime (struct timeb *timebuf)
>    timebuf->dstflag = 0;
>    return 0;
>  }
> -
> -compat_symbol (libc, __ftime, ftime, GLIBC_2_0);
> -#endif
> diff --git a/time/sys/timeb.h b/time/sys/timeb.h
> new file mode 100644
> index 0000000000..d6cdf29111
> --- /dev/null
> +++ b/time/sys/timeb.h
> @@ -0,0 +1,45 @@
> +/* Copyright (C) 1994-2020 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
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_TIMEB_H
> +#define _SYS_TIMEB_H	1
> +
> +#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.  */
> +  };
> +
> +/* Fill in TIMEBUF with information about the current time.  */
> +
> +extern int ftime (struct timeb *__timebuf)
> +  __nonnull ((1))
> +  __attribute_deprecated_msg__ ("Use gettimeofday or clock_gettime instead");
> +
> +__END_DECLS
> +
> +#endif	/* sys/timeb.h */
> diff --git a/time/tst-ftime.c b/time/tst-ftime.c
> index 6978feb0f1..44d82620af 100644
> --- a/time/tst-ftime.c
> +++ b/time/tst-ftime.c
> @@ -16,24 +16,12 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>  
> +#include <features.h>
> +#include <sys/timeb.h>
> +#include <libc-diag.h>
>  
> -#include <shlib-compat.h>
> -#if TEST_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
> -#include <time.h>
>  #include <support/check.h>
>  
> -compat_symbol_reference (libc, ftime, ftime, GLIBC_2_0);
> -
> -struct timeb
> -  {
> -    time_t time;
> -    unsigned short int millitm;
> -    short int timezone;
> -    short int dstflag;
> -  };
> -
> -extern int ftime (struct timeb *__timebuf);
> -
>  static int
>  do_test (void)
>  {
> @@ -44,23 +32,23 @@ do_test (void)
>      {
>        prev = curr;
>  
> -      /* ftime was deprecated on 2.31 and removed on 2.33.  */
> +      /* ftime was deprecated on 2.31.  */
> +      DIAG_PUSH_NEEDS_COMMENT;
> +      DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations");
> +
>        TEST_COMPARE (ftime (&curr), 0);
> -      TEST_VERIFY_EXIT (curr.time >= prev.time);
> +
> +      DIAG_POP_NEEDS_COMMENT;
> +
> +      TEST_VERIFY (curr.time >= prev.time);
> +
>        if (curr.time == prev.time)
> -	TEST_VERIFY_EXIT (curr.millitm >= prev.millitm);
> +	TEST_VERIFY (curr.millitm >= prev.millitm);
>  
>        if (curr.time > prev.time)
>          sec ++;
>      }
>    return 0;
>  }
> -#else
> -static int
> -do_test (void)
> -{
> -  return EXIT_UNSUPPORTED;
> -}
> -#endif
>  
>  #include <support/test-driver.c>
>
Szabolcs Nagy Oct. 26, 2020, 4:03 p.m. UTC | #2
The 10/26/2020 09:17, Adhemerval Zanella via Libc-alpha wrote:
> Florian, 
> 
> Are you OK with this version?
> 
> On 21/10/2020 09:35, Adhemerval Zanella wrote:
> > This patch revert "Move ftime to a compatibility symbol" (commit
> > 14633d3e568eb9770a7e5046eff257113e0453fb).  It as adds a deprecated
> > message on ftime usage.
> > 
> > Checked on x86_64-linux-gnu and i686-linux-gnu.
...
> > diff --git a/NEWS b/NEWS
> > index 6eb577a669..6105eb0b3e 100644
> > --- a/NEWS
> > +++ b/NEWS
> > @@ -37,10 +37,8 @@ Deprecated and removed features, and other changes affecting compatibility:
> >    implementations from HWCAP subdirectories are no longer loaded.
> >    Instead, the default implementation is used.
> >  
> > -* The deprecated <sys/timeb.h> header and the ftime function have been
> > -  removed.  To support old binaries, the ftime function continue to exist
> > -  as a compatibility symbol (on those architectures which had it).  All
> > -  programs should use gettimeofday or clock_gettime instead.
> > +* The deprecated ftime function is now only declared for POSIX.1-2001 or
> > +  older standard.

i think the news entry is no longer needed and should just be removed.

otherwise it looks good to me.

> >  
> >  Changes to build and runtime requirements:
> >  
> > diff --git a/include/sys/timeb.h b/include/sys/timeb.h
> > new file mode 100644
> > index 0000000000..9f4509c35e
> > --- /dev/null
> > +++ b/include/sys/timeb.h
> > @@ -0,0 +1 @@
> > +#include <time/sys/timeb.h>
> > diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> > index e977715088..36aa34a5e7 100644
> > --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> > @@ -795,6 +795,7 @@ GLIBC_2.33 fsync F
> >  GLIBC_2.33 ftell F
> >  GLIBC_2.33 ftello F
> >  GLIBC_2.33 ftello64 F
> > +GLIBC_2.33 ftime F
> >  GLIBC_2.33 ftok F
> >  GLIBC_2.33 ftruncate F
> >  GLIBC_2.33 ftruncate64 F
> > diff --git a/time/Makefile b/time/Makefile
> > index ab8fb3303b..a4fb13d6a3 100644
> > --- a/time/Makefile
> > +++ b/time/Makefile
> > @@ -22,7 +22,7 @@ subdir	:= time
> >  
> >  include ../Makeconfig
> >  
> > -headers := time.h sys/time.h bits/time.h				\
> > +headers := time.h sys/time.h sys/timeb.h bits/time.h			\
> >  	   bits/types/clockid_t.h bits/types/clock_t.h			\
> >  	   bits/types/struct_itimerspec.h				\
> >  	   bits/types/struct_timespec.h bits/types/struct_timeval.h	\
> > @@ -45,10 +45,9 @@ aux :=	    era alt_digit lc-time-cleanup
> >  tests	:= test_time clocktest tst-posixtz tst-strptime tst_wcsftime \
> >  	   tst-getdate tst-mktime tst-mktime2 tst-ftime_l tst-strftime \
> >  	   tst-mktime3 tst-strptime2 bug-asctime bug-asctime_r bug-mktime1 \
> > -	   tst-strptime3 bug-getdate1 tst-strptime-whitespace \
> > +	   tst-strptime3 bug-getdate1 tst-strptime-whitespace tst-ftime \
> >  	   tst-tzname tst-y2039 bug-mktime4 tst-strftime2 tst-strftime3 \
> >  	   tst-clock tst-clock2 tst-clock_nanosleep tst-cpuclock1
> > -tests-internal := tst-ftime
> >  
> >  include ../Rules
> >  
> > diff --git a/time/ftime.c b/time/ftime.c
> > index be3295ef76..70a2590c17 100644
> > --- a/time/ftime.c
> > +++ b/time/ftime.c
> > @@ -16,23 +16,12 @@
> >     License along with the GNU C Library; if not, see
> >     <https://www.gnu.org/licenses/>.  */
> >  
> > -#include <shlib-compat.h>
> > -
> > -#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
> > -
> > +#include <features.h>
> > +#include <sys/timeb.h>
> >  #include <time.h>
> >  
> > -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.  */
> > -  };
> > -
> >  int
> > -attribute_compat_text_section
> > -__ftime (struct timeb *timebuf)
> > +ftime (struct timeb *timebuf)
> >  {
> >    struct timespec ts;
> >    __clock_gettime (CLOCK_REALTIME, &ts);
> > @@ -43,6 +32,3 @@ __ftime (struct timeb *timebuf)
> >    timebuf->dstflag = 0;
> >    return 0;
> >  }
> > -
> > -compat_symbol (libc, __ftime, ftime, GLIBC_2_0);
> > -#endif
> > diff --git a/time/sys/timeb.h b/time/sys/timeb.h
> > new file mode 100644
> > index 0000000000..d6cdf29111
> > --- /dev/null
> > +++ b/time/sys/timeb.h
> > @@ -0,0 +1,45 @@
> > +/* Copyright (C) 1994-2020 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
> > +   <https://www.gnu.org/licenses/>.  */
> > +
> > +#ifndef _SYS_TIMEB_H
> > +#define _SYS_TIMEB_H	1
> > +
> > +#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.  */
> > +  };
> > +
> > +/* Fill in TIMEBUF with information about the current time.  */
> > +
> > +extern int ftime (struct timeb *__timebuf)
> > +  __nonnull ((1))
> > +  __attribute_deprecated_msg__ ("Use gettimeofday or clock_gettime instead");
> > +
> > +__END_DECLS
> > +
> > +#endif	/* sys/timeb.h */
> > diff --git a/time/tst-ftime.c b/time/tst-ftime.c
> > index 6978feb0f1..44d82620af 100644
> > --- a/time/tst-ftime.c
> > +++ b/time/tst-ftime.c
> > @@ -16,24 +16,12 @@
> >     License along with the GNU C Library; if not, see
> >     <https://www.gnu.org/licenses/>.  */
> >  
> > +#include <features.h>
> > +#include <sys/timeb.h>
> > +#include <libc-diag.h>
> >  
> > -#include <shlib-compat.h>
> > -#if TEST_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
> > -#include <time.h>
> >  #include <support/check.h>
> >  
> > -compat_symbol_reference (libc, ftime, ftime, GLIBC_2_0);
> > -
> > -struct timeb
> > -  {
> > -    time_t time;
> > -    unsigned short int millitm;
> > -    short int timezone;
> > -    short int dstflag;
> > -  };
> > -
> > -extern int ftime (struct timeb *__timebuf);
> > -
> >  static int
> >  do_test (void)
> >  {
> > @@ -44,23 +32,23 @@ do_test (void)
> >      {
> >        prev = curr;
> >  
> > -      /* ftime was deprecated on 2.31 and removed on 2.33.  */
> > +      /* ftime was deprecated on 2.31.  */
> > +      DIAG_PUSH_NEEDS_COMMENT;
> > +      DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations");
> > +
> >        TEST_COMPARE (ftime (&curr), 0);
> > -      TEST_VERIFY_EXIT (curr.time >= prev.time);
> > +
> > +      DIAG_POP_NEEDS_COMMENT;
> > +
> > +      TEST_VERIFY (curr.time >= prev.time);
> > +
> >        if (curr.time == prev.time)
> > -	TEST_VERIFY_EXIT (curr.millitm >= prev.millitm);
> > +	TEST_VERIFY (curr.millitm >= prev.millitm);
> >  
> >        if (curr.time > prev.time)
> >          sec ++;
> >      }
> >    return 0;
> >  }
> > -#else
> > -static int
> > -do_test (void)
> > -{
> > -  return EXIT_UNSUPPORTED;
> > -}
> > -#endif
> >  
> >  #include <support/test-driver.c>
> >
Adhemerval Zanella Oct. 26, 2020, 4:13 p.m. UTC | #3
On 26/10/2020 13:03, Szabolcs Nagy wrote:
> The 10/26/2020 09:17, Adhemerval Zanella via Libc-alpha wrote:
>> Florian, 
>>
>> Are you OK with this version?
>>
>> On 21/10/2020 09:35, Adhemerval Zanella wrote:
>>> This patch revert "Move ftime to a compatibility symbol" (commit
>>> 14633d3e568eb9770a7e5046eff257113e0453fb).  It as adds a deprecated
>>> message on ftime usage.
>>>
>>> Checked on x86_64-linux-gnu and i686-linux-gnu.
> ...
>>> diff --git a/NEWS b/NEWS
>>> index 6eb577a669..6105eb0b3e 100644
>>> --- a/NEWS
>>> +++ b/NEWS
>>> @@ -37,10 +37,8 @@ Deprecated and removed features, and other changes affecting compatibility:
>>>    implementations from HWCAP subdirectories are no longer loaded.
>>>    Instead, the default implementation is used.
>>>  
>>> -* The deprecated <sys/timeb.h> header and the ftime function have been
>>> -  removed.  To support old binaries, the ftime function continue to exist
>>> -  as a compatibility symbol (on those architectures which had it).  All
>>> -  programs should use gettimeofday or clock_gettime instead.
>>> +* The deprecated ftime function is now only declared for POSIX.1-2001 or
>>> +  older standard.
> 
> i think the news entry is no longer needed and should just be removed.
> 
> otherwise it looks good to me.

Alright, I will remove it.
Florian Weimer Oct. 26, 2020, 4:19 p.m. UTC | #4
* Adhemerval Zanella:

> +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.  */
> +  };

I think you could add __attribute_deprecated_msg__ on the struct itself.

Rest looks okay to me.

Thanks,
Florian
Adhemerval Zanella Oct. 26, 2020, 4:23 p.m. UTC | #5
On 26/10/2020 13:19, Florian Weimer wrote:
> * Adhemerval Zanella:
> 
>> +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.  */
>> +  };
> 
> I think you could add __attribute_deprecated_msg__ on the struct itself.

I tried to add on it, but it would require to add the warning suppression
on ftime.c build before the header inclusion and also on check-local header
tests as well (since it includes).  I think adding on the function itself
should suffice, using the struct without calling ftime should be unusual
scenario. 

> 
> Rest looks okay to me.
> 
> Thanks,
> Florian
>
Florian Weimer Oct. 26, 2020, 4:29 p.m. UTC | #6
* Adhemerval Zanella:

> On 26/10/2020 13:19, Florian Weimer wrote:
>> * Adhemerval Zanella:
>> 
>>> +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.  */
>>> +  };
>> 
>> I think you could add __attribute_deprecated_msg__ on the struct itself.
>
> I tried to add on it, but it would require to add the warning suppression
> on ftime.c build before the header inclusion and also on check-local header
> tests as well (since it includes).

Ahh, so you get a deprecation warning on the ftime function declaration,
even though itself it is marked deprecated.  Oh well.  That's not how
things work in Java.

> I think adding on the function itself should suffice, using the struct
> without calling ftime should be unusual scenario.

Yes, given this compiler limitation, I do not really see an alternative.

Thanks,
Florian
Adhemerval Zanella Oct. 26, 2020, 5:09 p.m. UTC | #7
On 26/10/2020 13:29, Florian Weimer wrote:
> * Adhemerval Zanella:
> 
>> On 26/10/2020 13:19, Florian Weimer wrote:
>>> * Adhemerval Zanella:
>>>
>>>> +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.  */
>>>> +  };
>>>
>>> I think you could add __attribute_deprecated_msg__ on the struct itself.
>>
>> I tried to add on it, but it would require to add the warning suppression
>> on ftime.c build before the header inclusion and also on check-local header
>> tests as well (since it includes).
> 
> Ahh, so you get a deprecation warning on the ftime function declaration,
> even though itself it is marked deprecated.  Oh well.  That's not how
> things work in Java.

On the struct timeb declaration to be more exact, even when then ftime
is not issued.  I would expect a deprecation warning iff the code
actually uses the struct timeb.

> 
>> I think adding on the function itself should suffice, using the struct
>> without calling ftime should be unusual scenario.
> 
> Yes, given this compiler limitation, I do not really see an alternative.
> 
> Thanks,
> Florian
>
Florian Weimer Oct. 28, 2020, 1:54 p.m. UTC | #8
* Adhemerval Zanella:

> On 26/10/2020 13:29, Florian Weimer wrote:
>> * Adhemerval Zanella:
>> 
>>> On 26/10/2020 13:19, Florian Weimer wrote:
>>>> * Adhemerval Zanella:
>>>>
>>>>> +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.  */
>>>>> +  };
>>>>
>>>> I think you could add __attribute_deprecated_msg__ on the struct itself.
>>>
>>> I tried to add on it, but it would require to add the warning suppression
>>> on ftime.c build before the header inclusion and also on check-local header
>>> tests as well (since it includes).
>> 
>> Ahh, so you get a deprecation warning on the ftime function declaration,
>> even though itself it is marked deprecated.  Oh well.  That's not how
>> things work in Java.
>
> On the struct timeb declaration to be more exact, even when then ftime
> is not issued.  I would expect a deprecation warning iff the code
> actually uses the struct timeb.

The ftime prototype uses it (in the deprecation sense).  This use should
be ignored due to the deprecation attribute on ftime itself, though.

Thanks,
Florian
Zack Weinberg Oct. 28, 2020, 2:12 p.m. UTC | #9
On Wed, Oct 28, 2020 at 9:54 AM Florian Weimer via Libc-alpha
<libc-alpha@sourceware.org> wrote:
>
> * Adhemerval Zanella:
>
> > On 26/10/2020 13:29, Florian Weimer wrote:
> >> * Adhemerval Zanella:
> >>
> >>> On 26/10/2020 13:19, Florian Weimer wrote:
> >>>> * Adhemerval Zanella:
> >>>>
> >>>>> +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.  */
> >>>>> +  };
> >>>>
> >>>> I think you could add __attribute_deprecated_msg__ on the struct itself.
> >>>
> >>> I tried to add on it, but it would require to add the warning suppression
> >>> on ftime.c build before the header inclusion and also on check-local header
> >>> tests as well (since it includes).
> >>
> >> Ahh, so you get a deprecation warning on the ftime function declaration,
> >> even though itself it is marked deprecated.  Oh well.  That's not how
> >> things work in Java.
> >
> > On the struct timeb declaration to be more exact, even when then ftime
> > is not issued.  I would expect a deprecation warning iff the code
> > actually uses the struct timeb.
>
> The ftime prototype uses it (in the deprecation sense).  This use should
> be ignored due to the deprecation attribute on ftime itself, though.

Workaround: move the complete declaration of struct timeb, with
__attribute_deprecated__, below the declaration of ftime:

__BEGIN_DECLS

/* Forward-declare struct timeb so we can use it in the prototype
   of ftime without a spurious deprecation warning.
   See GCC bug xxxxxx.  */
struct timeb;

/* Fill in TIMEBUF with information about the current time.  */

extern int ftime (struct timeb *__timebuf)
  __nonnull ((1)) __attribute_deprecated__;

/* 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.  */
  }
__attribute_deprecated__;

__END_DECLS

zw
diff mbox series

Patch

diff --git a/NEWS b/NEWS
index 6eb577a669..6105eb0b3e 100644
--- a/NEWS
+++ b/NEWS
@@ -37,10 +37,8 @@  Deprecated and removed features, and other changes affecting compatibility:
   implementations from HWCAP subdirectories are no longer loaded.
   Instead, the default implementation is used.
 
-* The deprecated <sys/timeb.h> header and the ftime function have been
-  removed.  To support old binaries, the ftime function continue to exist
-  as a compatibility symbol (on those architectures which had it).  All
-  programs should use gettimeofday or clock_gettime instead.
+* The deprecated ftime function is now only declared for POSIX.1-2001 or
+  older standard.
 
 Changes to build and runtime requirements:
 
diff --git a/include/sys/timeb.h b/include/sys/timeb.h
new file mode 100644
index 0000000000..9f4509c35e
--- /dev/null
+++ b/include/sys/timeb.h
@@ -0,0 +1 @@ 
+#include <time/sys/timeb.h>
diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
index e977715088..36aa34a5e7 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
@@ -795,6 +795,7 @@  GLIBC_2.33 fsync F
 GLIBC_2.33 ftell F
 GLIBC_2.33 ftello F
 GLIBC_2.33 ftello64 F
+GLIBC_2.33 ftime F
 GLIBC_2.33 ftok F
 GLIBC_2.33 ftruncate F
 GLIBC_2.33 ftruncate64 F
diff --git a/time/Makefile b/time/Makefile
index ab8fb3303b..a4fb13d6a3 100644
--- a/time/Makefile
+++ b/time/Makefile
@@ -22,7 +22,7 @@  subdir	:= time
 
 include ../Makeconfig
 
-headers := time.h sys/time.h bits/time.h				\
+headers := time.h sys/time.h sys/timeb.h bits/time.h			\
 	   bits/types/clockid_t.h bits/types/clock_t.h			\
 	   bits/types/struct_itimerspec.h				\
 	   bits/types/struct_timespec.h bits/types/struct_timeval.h	\
@@ -45,10 +45,9 @@  aux :=	    era alt_digit lc-time-cleanup
 tests	:= test_time clocktest tst-posixtz tst-strptime tst_wcsftime \
 	   tst-getdate tst-mktime tst-mktime2 tst-ftime_l tst-strftime \
 	   tst-mktime3 tst-strptime2 bug-asctime bug-asctime_r bug-mktime1 \
-	   tst-strptime3 bug-getdate1 tst-strptime-whitespace \
+	   tst-strptime3 bug-getdate1 tst-strptime-whitespace tst-ftime \
 	   tst-tzname tst-y2039 bug-mktime4 tst-strftime2 tst-strftime3 \
 	   tst-clock tst-clock2 tst-clock_nanosleep tst-cpuclock1
-tests-internal := tst-ftime
 
 include ../Rules
 
diff --git a/time/ftime.c b/time/ftime.c
index be3295ef76..70a2590c17 100644
--- a/time/ftime.c
+++ b/time/ftime.c
@@ -16,23 +16,12 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#include <shlib-compat.h>
-
-#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
-
+#include <features.h>
+#include <sys/timeb.h>
 #include <time.h>
 
-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.  */
-  };
-
 int
-attribute_compat_text_section
-__ftime (struct timeb *timebuf)
+ftime (struct timeb *timebuf)
 {
   struct timespec ts;
   __clock_gettime (CLOCK_REALTIME, &ts);
@@ -43,6 +32,3 @@  __ftime (struct timeb *timebuf)
   timebuf->dstflag = 0;
   return 0;
 }
-
-compat_symbol (libc, __ftime, ftime, GLIBC_2_0);
-#endif
diff --git a/time/sys/timeb.h b/time/sys/timeb.h
new file mode 100644
index 0000000000..d6cdf29111
--- /dev/null
+++ b/time/sys/timeb.h
@@ -0,0 +1,45 @@ 
+/* Copyright (C) 1994-2020 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
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_TIMEB_H
+#define _SYS_TIMEB_H	1
+
+#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.  */
+  };
+
+/* Fill in TIMEBUF with information about the current time.  */
+
+extern int ftime (struct timeb *__timebuf)
+  __nonnull ((1))
+  __attribute_deprecated_msg__ ("Use gettimeofday or clock_gettime instead");
+
+__END_DECLS
+
+#endif	/* sys/timeb.h */
diff --git a/time/tst-ftime.c b/time/tst-ftime.c
index 6978feb0f1..44d82620af 100644
--- a/time/tst-ftime.c
+++ b/time/tst-ftime.c
@@ -16,24 +16,12 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#include <features.h>
+#include <sys/timeb.h>
+#include <libc-diag.h>
 
-#include <shlib-compat.h>
-#if TEST_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
-#include <time.h>
 #include <support/check.h>
 
-compat_symbol_reference (libc, ftime, ftime, GLIBC_2_0);
-
-struct timeb
-  {
-    time_t time;
-    unsigned short int millitm;
-    short int timezone;
-    short int dstflag;
-  };
-
-extern int ftime (struct timeb *__timebuf);
-
 static int
 do_test (void)
 {
@@ -44,23 +32,23 @@  do_test (void)
     {
       prev = curr;
 
-      /* ftime was deprecated on 2.31 and removed on 2.33.  */
+      /* ftime was deprecated on 2.31.  */
+      DIAG_PUSH_NEEDS_COMMENT;
+      DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations");
+
       TEST_COMPARE (ftime (&curr), 0);
-      TEST_VERIFY_EXIT (curr.time >= prev.time);
+
+      DIAG_POP_NEEDS_COMMENT;
+
+      TEST_VERIFY (curr.time >= prev.time);
+
       if (curr.time == prev.time)
-	TEST_VERIFY_EXIT (curr.millitm >= prev.millitm);
+	TEST_VERIFY (curr.millitm >= prev.millitm);
 
       if (curr.time > prev.time)
         sec ++;
     }
   return 0;
 }
-#else
-static int
-do_test (void)
-{
-  return EXIT_UNSUPPORTED;
-}
-#endif
 
 #include <support/test-driver.c>