From 02c17c8c1456e4c07f11ba7d080e1dd292bed162 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Thu, 22 Jul 2021 19:12:12 +0200 Subject: socket: Add time64 alias for getsockopt Reviewed-by: Lukasz Majewski Reviewed-by: Adhemerval Zanella --- socket/Makefile | 9 +++++++- socket/sys/socket.h | 15 +++++++++++++ socket/tst-sockopt-time64.c | 1 + socket/tst-sockopt.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 socket/tst-sockopt-time64.c create mode 100644 socket/tst-sockopt.c (limited to 'socket') 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 + . */ + +#include +#include +#include +#include + +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 -- cgit 1.4.1