[7/8] socket: Add time64 alias for getsockopt

Message ID a15532a91cbfa51ecfa6b35a5d2f0083f78dbc79.1626708388.git.fweimer@redhat.com
State New
Headers show
Series
  • Additional time64 system call wrappers
Related show

Commit Message

Michael Hudson-Doyle via Libc-alpha July 19, 2021, 3:29 p.m.
---
 socket/Makefile                               |  9 +++-
 socket/sys/socket.h                           | 15 ++++++
 socket/tst-sockopt-time64.c                   |  1 +
 socket/tst-sockopt.c                          | 52 +++++++++++++++++++
 sysdeps/unix/sysv/linux/Versions              |  1 +
 sysdeps/unix/sysv/linux/arm/be/libc.abilist   |  1 +
 sysdeps/unix/sysv/linux/arm/le/libc.abilist   |  1 +
 sysdeps/unix/sysv/linux/csky/libc.abilist     |  1 +
 sysdeps/unix/sysv/linux/getsockopt.c          |  3 ++
 sysdeps/unix/sysv/linux/hppa/libc.abilist     |  1 +
 sysdeps/unix/sysv/linux/i386/libc.abilist     |  1 +
 .../sysv/linux/m68k/coldfire/libc.abilist     |  1 +
 .../unix/sysv/linux/m68k/m680x0/libc.abilist  |  1 +
 .../sysv/linux/microblaze/be/libc.abilist     |  1 +
 .../sysv/linux/microblaze/le/libc.abilist     |  1 +
 .../sysv/linux/mips/mips32/fpu/libc.abilist   |  1 +
 .../sysv/linux/mips/mips32/nofpu/libc.abilist |  1 +
 .../sysv/linux/mips/mips64/n32/libc.abilist   |  1 +
 sysdeps/unix/sysv/linux/nios2/libc.abilist    |  1 +
 .../linux/powerpc/powerpc32/fpu/libc.abilist  |  1 +
 .../powerpc/powerpc32/nofpu/libc.abilist      |  1 +
 .../unix/sysv/linux/s390/s390-32/libc.abilist |  1 +
 sysdeps/unix/sysv/linux/sh/be/libc.abilist    |  1 +
 sysdeps/unix/sysv/linux/sh/le/libc.abilist    |  1 +
 .../sysv/linux/sparc/sparc32/libc.abilist     |  1 +
 25 files changed, 99 insertions(+), 1 deletion(-)
 create mode 100644 socket/tst-sockopt-time64.c
 create mode 100644 socket/tst-sockopt.c

-- 
2.31.1

Comments

Michael Hudson-Doyle via Libc-alpha July 21, 2021, 8:19 p.m. | #1
LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>


On 19/07/2021 12:29, Florian Weimer via Libc-alpha wrote:
> ---

>  socket/Makefile                               |  9 +++-

>  socket/sys/socket.h                           | 15 ++++++

>  socket/tst-sockopt-time64.c                   |  1 +

>  socket/tst-sockopt.c                          | 52 +++++++++++++++++++

>  sysdeps/unix/sysv/linux/Versions              |  1 +

>  sysdeps/unix/sysv/linux/arm/be/libc.abilist   |  1 +

>  sysdeps/unix/sysv/linux/arm/le/libc.abilist   |  1 +

>  sysdeps/unix/sysv/linux/csky/libc.abilist     |  1 +

>  sysdeps/unix/sysv/linux/getsockopt.c          |  3 ++

>  sysdeps/unix/sysv/linux/hppa/libc.abilist     |  1 +

>  sysdeps/unix/sysv/linux/i386/libc.abilist     |  1 +

>  .../sysv/linux/m68k/coldfire/libc.abilist     |  1 +

>  .../unix/sysv/linux/m68k/m680x0/libc.abilist  |  1 +

>  .../sysv/linux/microblaze/be/libc.abilist     |  1 +

>  .../sysv/linux/microblaze/le/libc.abilist     |  1 +

>  .../sysv/linux/mips/mips32/fpu/libc.abilist   |  1 +

>  .../sysv/linux/mips/mips32/nofpu/libc.abilist |  1 +

>  .../sysv/linux/mips/mips64/n32/libc.abilist   |  1 +

>  sysdeps/unix/sysv/linux/nios2/libc.abilist    |  1 +

>  .../linux/powerpc/powerpc32/fpu/libc.abilist  |  1 +

>  .../powerpc/powerpc32/nofpu/libc.abilist      |  1 +

>  .../unix/sysv/linux/s390/s390-32/libc.abilist |  1 +

>  sysdeps/unix/sysv/linux/sh/be/libc.abilist    |  1 +

>  sysdeps/unix/sysv/linux/sh/le/libc.abilist    |  1 +

>  .../sysv/linux/sparc/sparc32/libc.abilist     |  1 +

>  25 files changed, 99 insertions(+), 1 deletion(-)

>  create mode 100644 socket/tst-sockopt-time64.c

>  create mode 100644 socket/tst-sockopt.c

> 

> diff --git a/socket/Makefile b/socket/Makefile

> index 27ffe44c05..3759576010 100644

> --- a/socket/Makefile

> +++ b/socket/Makefile

> @@ -31,7 +31,14 @@ routines := accept bind connect getpeername getsockname getsockopt	\

>  	    setsockopt shutdown socket socketpair isfdtype opensock	\

>  	    sockatmark accept4 recvmmsg sendmmsg

>  

> -tests := tst-accept4

> +tests := \

> +  tst-accept4 \

> +  tst-sockopt \

> +  # tests

> +

> +tests-time64 := \

> +  tst-sockopt-time64 \

> +  # tests

>  

>  aux	 := sa_len

>  


Ok.

> diff --git a/socket/sys/socket.h b/socket/sys/socket.h

> index e779dc837f..b37c87e7df 100644

> --- a/socket/sys/socket.h

> +++ b/socket/sys/socket.h

> @@ -251,9 +251,24 @@ extern int __REDIRECT (recvmmsg, (int __fd, struct mmsghdr *__vmessages,

>  /* Put the current value for socket FD's option OPTNAME at protocol level LEVEL

>     into OPTVAL (which is *OPTLEN bytes long), and set *OPTLEN to the value's

>     actual length.  Returns 0 on success, -1 for errors.  */

> +#ifndef __USE_TIME_BITS64

>  extern int getsockopt (int __fd, int __level, int __optname,

>  		       void *__restrict __optval,

>  		       socklen_t *__restrict __optlen) __THROW;

> +#else

> +# ifdef __REDIRECT

> +extern int __REDIRECT_NTH (getsockopt,

> +			   (int __fd, int __level, int __optname,

> +			    void *__restrict __optval,

> +			    socklen_t *__restrict __optlen),

> +			   __getsockopt64);

> +# else

> +extern int __getsockopt64 (int __fd, int __level, int __optname,

> +			   void *__restrict __optval,

> +			   socklen_t *__restrict __optlen) __THROW;

> +#  define getsockopt __getsockopt64

> +# endif

> +#endif

>  

>  /* Set socket FD's option OPTNAME at protocol level LEVEL

>     to *OPTVAL (which is OPTLEN bytes long).


Ok.

> diff --git a/socket/tst-sockopt-time64.c b/socket/tst-sockopt-time64.c

> new file mode 100644

> index 0000000000..f1df48de73

> --- /dev/null

> +++ b/socket/tst-sockopt-time64.c

> @@ -0,0 +1 @@

> +#include "tst-sockopt.c"

> diff --git a/socket/tst-sockopt.c b/socket/tst-sockopt.c

> new file mode 100644

> index 0000000000..f3ce0bc3a4

> --- /dev/null

> +++ b/socket/tst-sockopt.c

> @@ -0,0 +1,52 @@

> +/* Smoke test for socket options.

> +   Copyright (C) 2021 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/>.  */

> +

> +#include <support/xsocket.h>

> +#include <support/xunistd.h>

> +#include <support/check.h>

> +#include <netinet/in.h>

> +

> +static int

> +do_test (void)

> +{

> +  int fd = xsocket (AF_INET, SOCK_STREAM, IPPROTO_TCP);

> +

> +  struct linger value = { -1, -1 };

> +  socklen_t optlen = sizeof (value);

> +  TEST_COMPARE (getsockopt (fd, SOL_SOCKET, SO_LINGER, &value, &optlen), 0);

> +  TEST_COMPARE (optlen, sizeof (value));

> +  TEST_COMPARE (value.l_onoff, 0);

> +  TEST_COMPARE (value.l_linger, 0);

> +

> +  value.l_onoff = 1;

> +  value.l_linger = 30;

> +  TEST_COMPARE (setsockopt (fd, SOL_SOCKET, SO_LINGER, &value, sizeof (value)),

> +                0);

> +

> +  value.l_onoff = -1;

> +  value.l_linger = -1;

> +  TEST_COMPARE (getsockopt (fd, SOL_SOCKET, SO_LINGER, &value, &optlen), 0);

> +  TEST_COMPARE (optlen, sizeof (value));

> +  TEST_COMPARE (value.l_onoff, 1);

> +  TEST_COMPARE (value.l_linger, 30);

> +

> +  xclose (fd);

> +  return 0;

> +}

> +

> +#include <support/test-driver.c>


Ok.

> diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions

> index e03ebf9aff..5ff450f476 100644

> --- a/sysdeps/unix/sysv/linux/Versions

> +++ b/sysdeps/unix/sysv/linux/Versions

> @@ -225,6 +225,7 @@ libc {

>      __gai_suspend_time64;

>      __getitimer64;

>      __getrusage64;

> +    __getsockopt64;

>      __gettimeofday64;

>      __glob64_time64;

>      __globfree64_time64;


Ok.

> diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist

> index c3c96f24c4..cb5615f428 100644

> --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist

> @@ -218,6 +218,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist

> index 2786afa406..88c3db4560 100644

> --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist

> @@ -215,6 +215,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist

> index da3f538b40..e90ad23a66 100644

> --- a/sysdeps/unix/sysv/linux/csky/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist

> @@ -2374,6 +2374,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/getsockopt.c b/sysdeps/unix/sysv/linux/getsockopt.c

> index f86b06dec6..57343d432c 100644

> --- a/sysdeps/unix/sysv/linux/getsockopt.c

> +++ b/sysdeps/unix/sysv/linux/getsockopt.c

> @@ -101,3 +101,6 @@ __getsockopt (int fd, int level, int optname, void *optval, socklen_t *len)

>   return r;

>  }

>  weak_alias (__getsockopt, getsockopt)

> +#if __TIMESIZE != 64

> +weak_alias (__getsockopt, __getsockopt64)

> +#endif


Ok.

> diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist

> index 47d376ff62..ea727e1956 100644

> --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist

> @@ -2325,6 +2325,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist

> index d6b038b6a3..f53a44f7ca 100644

> --- a/sysdeps/unix/sysv/linux/i386/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist

> @@ -2508,6 +2508,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist

> index ab9e0955dd..c86910563a 100644

> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist

> @@ -219,6 +219,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist

> index 479d17be35..c7fe3b31e7 100644

> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist

> @@ -2452,6 +2452,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist

> index 90302842f5..3c8ed8d962 100644

> --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist

> @@ -2425,6 +2425,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist

> index dcfd52ec31..cc3a28054d 100644

> --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist

> @@ -2422,6 +2422,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist

> index c72c2a7101..49bc91ab6a 100644

> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist

> @@ -2417,6 +2417,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist

> index 6725735b59..853a61f3db 100644

> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist

> @@ -2415,6 +2415,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist

> index 5c2e228628..28917895bd 100644

> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist

> @@ -2423,6 +2423,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist

> index e0ffbb5687..e4d4ea4d26 100644

> --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist

> @@ -2464,6 +2464,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist

> index 105dda5300..22b7f8604d 100644

> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist

> @@ -2479,6 +2479,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist

> index b079847f84..8b49bcfe32 100644

> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist

> @@ -2512,6 +2512,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist

> index b3b55c9c68..97939a88ee 100644

> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist

> @@ -2477,6 +2477,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist

> index 54174a2263..a56b7ddd00 100644

> --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist

> @@ -2332,6 +2332,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist

> index 3028f6c334..c043e9b58f 100644

> --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist

> @@ -2329,6 +2329,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist

> index 8b0ae536e2..ebd2acd9e4 100644

> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist

> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist

> @@ -2472,6 +2472,7 @@ GLIBC_2.34 __futimesat64 F

>  GLIBC_2.34 __gai_suspend_time64 F

>  GLIBC_2.34 __getitimer64 F

>  GLIBC_2.34 __getrusage64 F

> +GLIBC_2.34 __getsockopt64 F

>  GLIBC_2.34 __gettimeofday64 F

>  GLIBC_2.34 __glob64_time64 F

>  GLIBC_2.34 __globfree64_time64 F

>

Patch

diff --git a/socket/Makefile b/socket/Makefile
index 27ffe44c05..3759576010 100644
--- a/socket/Makefile
+++ b/socket/Makefile
@@ -31,7 +31,14 @@  routines := accept bind connect getpeername getsockname getsockopt	\
 	    setsockopt shutdown socket socketpair isfdtype opensock	\
 	    sockatmark accept4 recvmmsg sendmmsg
 
-tests := tst-accept4
+tests := \
+  tst-accept4 \
+  tst-sockopt \
+  # tests
+
+tests-time64 := \
+  tst-sockopt-time64 \
+  # tests
 
 aux	 := sa_len
 
diff --git a/socket/sys/socket.h b/socket/sys/socket.h
index e779dc837f..b37c87e7df 100644
--- a/socket/sys/socket.h
+++ b/socket/sys/socket.h
@@ -251,9 +251,24 @@  extern int __REDIRECT (recvmmsg, (int __fd, struct mmsghdr *__vmessages,
 /* Put the current value for socket FD's option OPTNAME at protocol level LEVEL
    into OPTVAL (which is *OPTLEN bytes long), and set *OPTLEN to the value's
    actual length.  Returns 0 on success, -1 for errors.  */
+#ifndef __USE_TIME_BITS64
 extern int getsockopt (int __fd, int __level, int __optname,
 		       void *__restrict __optval,
 		       socklen_t *__restrict __optlen) __THROW;
+#else
+# ifdef __REDIRECT
+extern int __REDIRECT_NTH (getsockopt,
+			   (int __fd, int __level, int __optname,
+			    void *__restrict __optval,
+			    socklen_t *__restrict __optlen),
+			   __getsockopt64);
+# else
+extern int __getsockopt64 (int __fd, int __level, int __optname,
+			   void *__restrict __optval,
+			   socklen_t *__restrict __optlen) __THROW;
+#  define getsockopt __getsockopt64
+# endif
+#endif
 
 /* Set socket FD's option OPTNAME at protocol level LEVEL
    to *OPTVAL (which is OPTLEN bytes long).
diff --git a/socket/tst-sockopt-time64.c b/socket/tst-sockopt-time64.c
new file mode 100644
index 0000000000..f1df48de73
--- /dev/null
+++ b/socket/tst-sockopt-time64.c
@@ -0,0 +1 @@ 
+#include "tst-sockopt.c"
diff --git a/socket/tst-sockopt.c b/socket/tst-sockopt.c
new file mode 100644
index 0000000000..f3ce0bc3a4
--- /dev/null
+++ b/socket/tst-sockopt.c
@@ -0,0 +1,52 @@ 
+/* Smoke test for socket options.
+   Copyright (C) 2021 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/>.  */
+
+#include <support/xsocket.h>
+#include <support/xunistd.h>
+#include <support/check.h>
+#include <netinet/in.h>
+
+static int
+do_test (void)
+{
+  int fd = xsocket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
+
+  struct linger value = { -1, -1 };
+  socklen_t optlen = sizeof (value);
+  TEST_COMPARE (getsockopt (fd, SOL_SOCKET, SO_LINGER, &value, &optlen), 0);
+  TEST_COMPARE (optlen, sizeof (value));
+  TEST_COMPARE (value.l_onoff, 0);
+  TEST_COMPARE (value.l_linger, 0);
+
+  value.l_onoff = 1;
+  value.l_linger = 30;
+  TEST_COMPARE (setsockopt (fd, SOL_SOCKET, SO_LINGER, &value, sizeof (value)),
+                0);
+
+  value.l_onoff = -1;
+  value.l_linger = -1;
+  TEST_COMPARE (getsockopt (fd, SOL_SOCKET, SO_LINGER, &value, &optlen), 0);
+  TEST_COMPARE (optlen, sizeof (value));
+  TEST_COMPARE (value.l_onoff, 1);
+  TEST_COMPARE (value.l_linger, 30);
+
+  xclose (fd);
+  return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions
index e03ebf9aff..5ff450f476 100644
--- a/sysdeps/unix/sysv/linux/Versions
+++ b/sysdeps/unix/sysv/linux/Versions
@@ -225,6 +225,7 @@  libc {
     __gai_suspend_time64;
     __getitimer64;
     __getrusage64;
+    __getsockopt64;
     __gettimeofday64;
     __glob64_time64;
     __globfree64_time64;
diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
index c3c96f24c4..cb5615f428 100644
--- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
@@ -218,6 +218,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
index 2786afa406..88c3db4560 100644
--- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
@@ -215,6 +215,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
index da3f538b40..e90ad23a66 100644
--- a/sysdeps/unix/sysv/linux/csky/libc.abilist
+++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
@@ -2374,6 +2374,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/getsockopt.c b/sysdeps/unix/sysv/linux/getsockopt.c
index f86b06dec6..57343d432c 100644
--- a/sysdeps/unix/sysv/linux/getsockopt.c
+++ b/sysdeps/unix/sysv/linux/getsockopt.c
@@ -101,3 +101,6 @@  __getsockopt (int fd, int level, int optname, void *optval, socklen_t *len)
  return r;
 }
 weak_alias (__getsockopt, getsockopt)
+#if __TIMESIZE != 64
+weak_alias (__getsockopt, __getsockopt64)
+#endif
diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
index 47d376ff62..ea727e1956 100644
--- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
@@ -2325,6 +2325,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
index d6b038b6a3..f53a44f7ca 100644
--- a/sysdeps/unix/sysv/linux/i386/libc.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
@@ -2508,6 +2508,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
index ab9e0955dd..c86910563a 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
@@ -219,6 +219,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
index 479d17be35..c7fe3b31e7 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
@@ -2452,6 +2452,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
index 90302842f5..3c8ed8d962 100644
--- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
@@ -2425,6 +2425,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
index dcfd52ec31..cc3a28054d 100644
--- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
@@ -2422,6 +2422,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
index c72c2a7101..49bc91ab6a 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
@@ -2417,6 +2417,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
index 6725735b59..853a61f3db 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
@@ -2415,6 +2415,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
index 5c2e228628..28917895bd 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
@@ -2423,6 +2423,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
index e0ffbb5687..e4d4ea4d26 100644
--- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
@@ -2464,6 +2464,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
index 105dda5300..22b7f8604d 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
@@ -2479,6 +2479,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
index b079847f84..8b49bcfe32 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
@@ -2512,6 +2512,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
index b3b55c9c68..97939a88ee 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
@@ -2477,6 +2477,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
index 54174a2263..a56b7ddd00 100644
--- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
@@ -2332,6 +2332,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
index 3028f6c334..c043e9b58f 100644
--- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
@@ -2329,6 +2329,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
index 8b0ae536e2..ebd2acd9e4 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
@@ -2472,6 +2472,7 @@  GLIBC_2.34 __futimesat64 F
 GLIBC_2.34 __gai_suspend_time64 F
 GLIBC_2.34 __getitimer64 F
 GLIBC_2.34 __getrusage64 F
+GLIBC_2.34 __getsockopt64 F
 GLIBC_2.34 __gettimeofday64 F
 GLIBC_2.34 __glob64_time64 F
 GLIBC_2.34 __globfree64_time64 F