diff mbox series

Linux: Use in-tree copy of SO_ constants for !__USE_MISC [BZ #24532]

Message ID 87wogfxk3u.fsf@oldenburg2.str.redhat.com
State New
Headers show
Series Linux: Use in-tree copy of SO_ constants for !__USE_MISC [BZ #24532] | expand

Commit Message

Florian Weimer July 18, 2019, 6:39 p.m. UTC
The kernel changes for a 64-bit time_t on 32-bit architectures
resulted in <asm/socket.h> indirectly including <linux/posix_types.h>.
The latter is not namespace-clean for the POSIX version of
<sys/socket.h>.

This issue has persisted across several Linux releases, so this commit
creates our own copy of the SO_* definitions for !__USE_MISC mode.

The new test socket/tst-socket-consts ensures that the copy is
consistent with the kernel definitions (which vary across
architectures).  The test is tricky to get right because CPPFLAGS
includes include/libc-symbols.h, which in turn defines _GNU_SOURCE
unconditionally.

Tested with build-many-glibcs.py.  I verified that a discrepancy in the
definitions actually results in a failure of the
socket/tst-socket-consts test.

2019-07-18  Florian Weimer  <fweimer@redhat.com>

	[BZ #24532]
	Linux: Use in-tree copy of SO_ constants for !__USE_MISC.
	* sysdeps/unix/sysv/linux/Makefile [$(subdir) == socket]
	(sysdep_headers): Add bits/socket-constants.h.
	(tests-special): Add tst-socket-consts.out.
	(tst-socket-consts.out): New target.
	* sysdeps/unix/sysv/linux/bits/socket.h: Remove macro tracking
	around <asm/unistd.h>.
	[__USE_MISC]: Include <bits/types/time_t.h> before <asm/socket.h>.
	[!__USE_MISC]: Include <sys/socket-constants.h> instead of
	<asm/socket.h>.
	* sysdeps/unix/sysv/linux/bits/tst-socket-consts.py: New file.
	* sysdeps/unix/sysv/linux/bits/socket-constants.h: Likewise.
	* sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h: Likewise.
	* sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/socket-constants.h: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h:
	Likewise.
	* sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h: Likewise.

Comments

Carlos O'Donell July 20, 2019, 5:11 a.m. UTC | #1
On 7/18/19 2:39 PM, Florian Weimer wrote:
> The kernel changes for a 64-bit time_t on 32-bit architectures
> resulted in <asm/socket.h> indirectly including <linux/posix_types.h>.
> The latter is not namespace-clean for the POSIX version of
> <sys/socket.h>.
> 
> This issue has persisted across several Linux releases, so this commit
> creates our own copy of the SO_* definitions for !__USE_MISC mode.

Thanks for working this out.
  
> The new test socket/tst-socket-consts ensures that the copy is
> consistent with the kernel definitions (which vary across
> architectures).  The test is tricky to get right because CPPFLAGS
> includes include/libc-symbols.h, which in turn defines _GNU_SOURCE
> unconditionally.

Right.
  
> Tested with build-many-glibcs.py.  I verified that a discrepancy in the
> definitions actually results in a failure of the
> socket/tst-socket-consts test.

Perfect.

Overall the patch looks good, I note only one mistake which I think
is in the definition of SOL_SOCKET, please review and post v2.

> 2019-07-18  Florian Weimer  <fweimer@redhat.com>
> 
> 	[BZ #24532]
> 	Linux: Use in-tree copy of SO_ constants for !__USE_MISC.

OK.

> 	* sysdeps/unix/sysv/linux/Makefile [$(subdir) == socket]
> 	(sysdep_headers): Add bits/socket-constants.h.
> 	(tests-special): Add tst-socket-consts.out.
> 	(tst-socket-consts.out): New target.
> 	* sysdeps/unix/sysv/linux/bits/socket.h: Remove macro tracking
> 	around <asm/unistd.h>.
> 	[__USE_MISC]: Include <bits/types/time_t.h> before <asm/socket.h>.
> 	[!__USE_MISC]: Include <sys/socket-constants.h> instead of
> 	<asm/socket.h>.
> 	* sysdeps/unix/sysv/linux/bits/tst-socket-consts.py: New file.
> 	* sysdeps/unix/sysv/linux/bits/socket-constants.h: Likewise.
> 	* sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h: Likewise.
> 	* sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h: Likewise.
> 	* sysdeps/unix/sysv/linux/mips/bits/socket-constants.h: Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h:
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h: Likewise.
> 
> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index afcdc658b5..1ab6bcbfc8 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -146,11 +146,21 @@ endif
>   ifeq ($(subdir),socket)
>   sysdep_headers += net/if_ppp.h net/ppp-comp.h \
>   		  net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \
> -		  net/if_slip.h net/if_packet.h net/if_shaper.h
> +		  net/if_slip.h net/if_packet.h net/if_shaper.h \
> +		  bits/socket-constants.h

OK. Adds new socket-constants.h.

>   sysdep_routines += cmsg_nxthdr
>   CFLAGS-recvmmsg.c = -fexceptions -fasynchronous-unwind-tables
>   CFLAGS-sendmmsg.c = -fexceptions -fasynchronous-unwind-tables
> -endif
> +
> +tests-special += $(objpfx)tst-socket-consts.out
> +$(objpfx)tst-socket-consts.out: ../sysdeps/unix/sysv/linux/tst-socket-consts.py
> +	PYTHONPATH=../scripts \
> +	$(PYTHON) ../sysdeps/unix/sysv/linux/tst-socket-consts.py \
> +		   --cc="$(CC) $(patsubst -DMODULE_NAME=%, \
> +					  -DMODULE_NAME=testsuite, \
> +					  $(CPPFLAGS)) -D_ISOMAC" \
> +	< /dev/null > $@ 2>&1; $(evaluate-test)
> +endif # $(subdir) == socket

OK, a special test.

>   
>   ifeq ($(subdir),sunrpc)
>   sysdep_headers += nfs/nfs.h
> diff --git a/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h b/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h
> new file mode 100644
> index 0000000000..2a405e1cca
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h
> @@ -0,0 +1,37 @@
> +/* Socket constants which vary among Linux architectures.  Version for alpha.

OK.

> +   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
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_SOCKET_H
> +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
> +#endif
> +
> +#define SO_ACCEPTCONN 4116
> +#define SO_BROADCAST 32
> +#define SO_DONTROUTE 16
> +#define SO_ERROR 4103
> +#define SO_KEEPALIVE 8
> +#define SO_LINGER 128
> +#define SO_OOBINLINE 256
> +#define SO_RCVBUF 4098
> +#define SO_RCVLOWAT 4112
> +#define SO_RCVTIMEO 4114
> +#define SO_REUSEADDR 4
> +#define SO_SNDBUF 4097
> +#define SO_SNDLOWAT 4113
> +#define SO_SNDTIMEO 4115
> +#define SO_TYPE 4104

OK. Spot checked these again arch/alpha/include/uapi/asm/socket.h.

> diff --git a/sysdeps/unix/sysv/linux/bits/socket-constants.h b/sysdeps/unix/sysv/linux/bits/socket-constants.h
> new file mode 100644
> index 0000000000..4d486385f1
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/bits/socket-constants.h
> @@ -0,0 +1,37 @@
> +/* Socket constants which vary among Linux architectures.
> +   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
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_SOCKET_H
> +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
> +#endif
> +
> +#define SO_ACCEPTCONN 30
> +#define SO_BROADCAST 6
> +#define SO_DONTROUTE 5
> +#define SO_ERROR 4
> +#define SO_KEEPALIVE 9
> +#define SO_LINGER 13
> +#define SO_OOBINLINE 10
> +#define SO_RCVBUF 8
> +#define SO_RCVLOWAT 18
> +#define SO_RCVTIMEO 20
> +#define SO_REUSEADDR 2
> +#define SO_SNDBUF 7
> +#define SO_SNDLOWAT 19
> +#define SO_SNDTIMEO 21
> +#define SO_TYPE 3

OK. Spot checked against include/uapi/asm-generic/socket.h

> diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h
> index 99af01d2a4..1d37217aa2 100644
> --- a/sysdeps/unix/sysv/linux/bits/socket.h
> +++ b/sysdeps/unix/sysv/linux/bits/socket.h
> @@ -349,98 +349,13 @@ struct ucred
>   };
>   #endif
>   
> -/* Ugly workaround for unclean kernel headers.  */
> -#ifndef __USE_MISC
> -# ifndef FIOGETOWN
> -#  define __SYS_SOCKET_H_undef_FIOGETOWN
> -# endif
> -# ifndef FIOSETOWN
> -#  define __SYS_SOCKET_H_undef_FIOSETOWN
> -# endif
> -# ifndef SIOCATMARK
> -#  define __SYS_SOCKET_H_undef_SIOCATMARK
> -# endif
> -# ifndef SIOCGPGRP
> -#  define __SYS_SOCKET_H_undef_SIOCGPGRP
> -# endif
> -# ifndef SIOCGSTAMP
> -#  define __SYS_SOCKET_H_undef_SIOCGSTAMP
> -# endif
> -# ifndef SIOCGSTAMPNS
> -#  define __SYS_SOCKET_H_undef_SIOCGSTAMPNS
> -# endif
> -# ifndef SIOCSPGRP
> -#  define __SYS_SOCKET_H_undef_SIOCSPGRP
> -# endif
> -#endif
> -#ifndef IOCSIZE_MASK
> -# define __SYS_SOCKET_H_undef_IOCSIZE_MASK
> -#endif
> -#ifndef IOCSIZE_SHIFT
> -# define __SYS_SOCKET_H_undef_IOCSIZE_SHIFT
> -#endif
> -#ifndef IOC_IN
> -# define __SYS_SOCKET_H_undef_IOC_IN
> -#endif
> -#ifndef IOC_INOUT
> -# define __SYS_SOCKET_H_undef_IOC_INOUT
> -#endif
> -#ifndef IOC_OUT
> -# define __SYS_SOCKET_H_undef_IOC_OUT
> -#endif
> -
> -/* Get socket manipulation related informations from kernel headers.  */
> -#include <asm/socket.h>
> -
> -#ifndef __USE_MISC
> -# ifdef __SYS_SOCKET_H_undef_FIOGETOWN
> -#  undef __SYS_SOCKET_H_undef_FIOGETOWN
> -#  undef FIOGETOWN
> -# endif
> -# ifdef __SYS_SOCKET_H_undef_FIOSETOWN
> -#  undef __SYS_SOCKET_H_undef_FIOSETOWN
> -#  undef FIOSETOWN
> -# endif
> -# ifdef __SYS_SOCKET_H_undef_SIOCATMARK
> -#  undef __SYS_SOCKET_H_undef_SIOCATMARK
> -#  undef SIOCATMARK
> -# endif
> -# ifdef __SYS_SOCKET_H_undef_SIOCGPGRP
> -#  undef __SYS_SOCKET_H_undef_SIOCGPGRP
> -#  undef SIOCGPGRP
> -# endif
> -# ifdef __SYS_SOCKET_H_undef_SIOCGSTAMP
> -#  undef __SYS_SOCKET_H_undef_SIOCGSTAMP
> -#  undef SIOCGSTAMP
> -# endif
> -# ifdef __SYS_SOCKET_H_undef_SIOCGSTAMPNS
> -#  undef __SYS_SOCKET_H_undef_SIOCGSTAMPNS
> -#  undef SIOCGSTAMPNS
> -# endif
> -# ifdef __SYS_SOCKET_H_undef_SIOCSPGRP
> -#  undef __SYS_SOCKET_H_undef_SIOCSPGRP
> -#  undef SIOCSPGRP
> -# endif
> -#endif
> -#ifdef __SYS_SOCKET_H_undef_IOCSIZE_MASK
> -# undef __SYS_SOCKET_H_undef_IOCSIZE_MASK
> -# undef IOCSIZE_MASK
> -#endif
> -#ifdef __SYS_SOCKET_H_undef_IOCSIZE_SHIFT
> -# undef __SYS_SOCKET_H_undef_IOCSIZE_SHIFT
> -# undef IOCSIZE_SHIFT
> -#endif
> -#ifdef __SYS_SOCKET_H_undef_IOC_IN
> -# undef __SYS_SOCKET_H_undef_IOC_IN
> -# undef IOC_IN
> -#endif
> -#ifdef __SYS_SOCKET_H_undef_IOC_INOUT
> -# undef __SYS_SOCKET_H_undef_IOC_INOUT
> -# undef IOC_INOUT
> -#endif
> -#ifdef __SYS_SOCKET_H_undef_IOC_OUT
> -# undef __SYS_SOCKET_H_undef_IOC_OUT
> -# undef IOC_OUT

OK.

> +#ifdef __USE_MISC
> +# include <bits/types/time_t.h>
> +# include <asm/socket.h>
> +#else
> +# define SOL_SOCKET 1
> +# define SO_DEBUG 1

Is this correct for alpha, sparc, mips, and hppa?

They define SOL_SOCKET as 0xffff.

SO_DEBUG is fine.

> +# include <bits/socket-constants.h>

OK.

>   #endif
>   
>   /* Structure used to manipulate the SO_LINGER option.  */
> diff --git a/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h b/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h
> new file mode 100644
> index 0000000000..09b3c6ca51
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h
> @@ -0,0 +1,37 @@
> +/* Socket constants which vary among Linux architectures.  Version for hppa.

OK.

> +   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
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_SOCKET_H
> +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
> +#endif
> +
> +#define SO_ACCEPTCONN 16412
> +#define SO_BROADCAST 32
> +#define SO_DONTROUTE 16
> +#define SO_ERROR 4103
> +#define SO_KEEPALIVE 8
> +#define SO_LINGER 128
> +#define SO_OOBINLINE 256
> +#define SO_RCVBUF 4098
> +#define SO_RCVLOWAT 4100
> +#define SO_RCVTIMEO 4102
> +#define SO_REUSEADDR 4
> +#define SO_SNDBUF 4097
> +#define SO_SNDLOWAT 4099
> +#define SO_SNDTIMEO 4101
> +#define SO_TYPE 4104

OK. Spot checked against arch/parisc/include/uapi/asm/socket.h.

> diff --git a/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h b/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h
> new file mode 100644
> index 0000000000..880e3401a8
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h
> @@ -0,0 +1,37 @@
> +/* Socket constants which vary among Linux architectures.  Version for MIPS.
> +   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
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_SOCKET_H
> +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
> +#endif
> +
> +#define SO_ACCEPTCONN 4105
> +#define SO_BROADCAST 32
> +#define SO_DONTROUTE 16
> +#define SO_ERROR 4103
> +#define SO_KEEPALIVE 8
> +#define SO_LINGER 128
> +#define SO_OOBINLINE 256
> +#define SO_RCVBUF 4098
> +#define SO_RCVLOWAT 4100
> +#define SO_RCVTIMEO 4102
> +#define SO_REUSEADDR 4
> +#define SO_SNDBUF 4097
> +#define SO_SNDLOWAT 4099
> +#define SO_SNDTIMEO 4101
> +#define SO_TYPE 4104

OK. Spot checked against arch/mips/include/uapi/asm/socket.h.

> diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h b/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h
> new file mode 100644
> index 0000000000..b4ed16b5c8
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h
> @@ -0,0 +1,37 @@
> +/* Socket constants which vary among Linux architectures.  Version for POWER.
> +   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
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_SOCKET_H
> +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
> +#endif
> +
> +#define SO_ACCEPTCONN 30
> +#define SO_BROADCAST 6
> +#define SO_DONTROUTE 5
> +#define SO_ERROR 4
> +#define SO_KEEPALIVE 9
> +#define SO_LINGER 13
> +#define SO_OOBINLINE 10
> +#define SO_RCVBUF 8
> +#define SO_RCVLOWAT 16
> +#define SO_RCVTIMEO 18
> +#define SO_REUSEADDR 2
> +#define SO_SNDBUF 7
> +#define SO_SNDLOWAT 17
> +#define SO_SNDTIMEO 19
> +#define SO_TYPE 3

OK. No custom socket.h in kernel. Spot checked against include/uapi/asm-generic/socket.h.

> diff --git a/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h b/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h
> new file mode 100644
> index 0000000000..5adce1df3c
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h
> @@ -0,0 +1,37 @@
> +/* Socket constants which vary among Linux architectures.  Version for SPARC.
> +   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
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_SOCKET_H
> +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
> +#endif
> +
> +#define SO_ACCEPTCONN 32768
> +#define SO_BROADCAST 32
> +#define SO_DONTROUTE 16
> +#define SO_ERROR 4103
> +#define SO_KEEPALIVE 8
> +#define SO_LINGER 128
> +#define SO_OOBINLINE 256
> +#define SO_RCVBUF 4098
> +#define SO_RCVLOWAT 2048
> +#define SO_RCVTIMEO 8192
> +#define SO_REUSEADDR 4
> +#define SO_SNDBUF 4097
> +#define SO_SNDLOWAT 4096
> +#define SO_SNDTIMEO 16384
> +#define SO_TYPE 4104

OK. Spot checked against arch/sparc/include/uapi/asm/socket.h.

> diff --git a/sysdeps/unix/sysv/linux/tst-socket-consts.py b/sysdeps/unix/sysv/linux/tst-socket-consts.py
> new file mode 100644
> index 0000000000..e486b87c5b
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/tst-socket-consts.py
> @@ -0,0 +1,55 @@
> +#!/usr/bin/python3
> +# Test that glibc's sys/socket.h SO_* constants match the kernel's.

OK.

> +# Copyright (C) 2018-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
> +# <http://www.gnu.org/licenses/>.
> +
> +import argparse
> +import sys
> +
> +import glibcextract
> +
> +def main():
> +    """The main entry point."""
> +    parser = argparse.ArgumentParser(
> +        description="Test that glibc's sys/socket.h constants "
> +        "match the kernel's.")
> +    parser.add_argument('--cc', metavar='CC',
> +                        help='C compiler (including options) to use')
> +    args = parser.parse_args()
> +
> +    def check(define):
> +        return glibcextract.compare_macro_consts(
> +            define + '#include <sys/socket.h>\n',
> +            # Some constants in <asm/socket.h> may depend on the size
> +            # of time_t.
> +            '#include <bits/types/time_t.h>\n'
> +            '#include <asm/socket.h>\n',
> +            args.cc,
> +            macro_re='SO_.*',

While all SO_.* constants match correctly, it's SOL_SOCKET that we have wrong?

> +            allow_extra_2=True)
> +    # _GNU_SOURCE is defined by include/libc-symbols.h, which is
> +    # included by the --cc command.  Defining _ISOMAC does not prevent
> +    # that.
> +    status = max(
> +        check(''),
> +        check('#undef _GNU_SOURCE\n'),
> +        check('#undef _GNU_SOURCE\n'
> +              '#define _POSIX_SOURCE 1\n'))
> +    sys.exit(status)
> +
> +if __name__ == '__main__':
> +    main()
>
Florian Weimer July 21, 2019, 11:07 p.m. UTC | #2
* Carlos O'Donell:

> While all SO_.* constants match correctly, it's SOL_SOCKET that we
> have wrong?

Yes, thanks for noticing.  I fixed this and expanded the test scope.
build-many-glibcs.py still passes.

I have a half-done patch to extend glibcextract.py so that it's able to
skip extraction of macros with errors (efficiently, at the cost of
roughly one additional compiler run per failing macro), but that's
fairly involved.  On certain architectures, there are awkward predefined
macros which cause the extraction go wrong (e.g. bool on POWER), and
there also glibc macros such as TOP_NAMESPACE which are confusing it.

Florian

Linux: Use in-tree copy of SO_ constants for !__USE_MISC [BZ #24532]

The kernel changes for a 64-bit time_t on 32-bit architectures
resulted in <asm/socket.h> indirectly including <linux/posix_types.h>.
The latter is not namespace-clean for the POSIX version of
<sys/socket.h>.

This issue has persisted across several Linux releases, so this commit
creates our own copy of the SO_* definitions for !__USE_MISC mode.

The new test socket/tst-socket-consts ensures that the copy is
consistent with the kernel definitions (which vary across
architectures).  The test is tricky to get right because CPPFLAGS
includes include/libc-symbols.h, which in turn defines _GNU_SOURCE
unconditionally.

Tested with build-many-glibcs.py.  I verified that a discrepancy in
the definitions actually results in a failure of the
socket/tst-socket-consts test.

2019-07-18  Florian Weimer  <fweimer@redhat.com>

	[BZ #24532]
	Linux: Use in-tree copy of SO_ constants for !__USE_MISC.
	* sysdeps/unix/sysv/linux/Makefile [$(subdir) == socket]
	(sysdep_headers): Add bits/socket-constants.h.
	(tests-special): Add tst-socket-consts.out.
	(tst-socket-consts.out): New target.
	* sysdeps/unix/sysv/linux/bits/socket.h: Remove macro tracking
	around <asm/unistd.h>.
	[__USE_MISC]: Include <bits/types/time_t.h> before <asm/socket.h>.
	[!__USE_MISC]: Include <sys/socket-constants.h> instead of
	<asm/socket.h>.
	* sysdeps/unix/sysv/linux/bits/tst-socket-consts.py: New file.
	* sysdeps/unix/sysv/linux/bits/socket-constants.h: Likewise.
	* sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h: Likewise.
	* sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/socket-constants.h: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h:
	Likewise.
	* sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h: Likewise.

diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index afcdc658b5..1ab6bcbfc8 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -146,11 +146,21 @@ endif
 ifeq ($(subdir),socket)
 sysdep_headers += net/if_ppp.h net/ppp-comp.h \
 		  net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \
-		  net/if_slip.h net/if_packet.h net/if_shaper.h
+		  net/if_slip.h net/if_packet.h net/if_shaper.h \
+		  bits/socket-constants.h
 sysdep_routines += cmsg_nxthdr
 CFLAGS-recvmmsg.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-sendmmsg.c = -fexceptions -fasynchronous-unwind-tables
-endif
+
+tests-special += $(objpfx)tst-socket-consts.out
+$(objpfx)tst-socket-consts.out: ../sysdeps/unix/sysv/linux/tst-socket-consts.py
+	PYTHONPATH=../scripts \
+	$(PYTHON) ../sysdeps/unix/sysv/linux/tst-socket-consts.py \
+		   --cc="$(CC) $(patsubst -DMODULE_NAME=%, \
+					  -DMODULE_NAME=testsuite, \
+					  $(CPPFLAGS)) -D_ISOMAC" \
+	< /dev/null > $@ 2>&1; $(evaluate-test)
+endif # $(subdir) == socket
 
 ifeq ($(subdir),sunrpc)
 sysdep_headers += nfs/nfs.h
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h b/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h
new file mode 100644
index 0000000000..571196756e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h
@@ -0,0 +1,38 @@
+/* Socket constants which vary among Linux architectures.  Version for alpha.
+   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
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_SOCKET_H
+# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
+#endif
+
+#define SOL_SOCKET 65535
+#define SO_ACCEPTCONN 4116
+#define SO_BROADCAST 32
+#define SO_DONTROUTE 16
+#define SO_ERROR 4103
+#define SO_KEEPALIVE 8
+#define SO_LINGER 128
+#define SO_OOBINLINE 256
+#define SO_RCVBUF 4098
+#define SO_RCVLOWAT 4112
+#define SO_RCVTIMEO 4114
+#define SO_REUSEADDR 4
+#define SO_SNDBUF 4097
+#define SO_SNDLOWAT 4113
+#define SO_SNDTIMEO 4115
+#define SO_TYPE 4104
diff --git a/sysdeps/unix/sysv/linux/bits/socket-constants.h b/sysdeps/unix/sysv/linux/bits/socket-constants.h
new file mode 100644
index 0000000000..b231342102
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/socket-constants.h
@@ -0,0 +1,38 @@
+/* Socket constants which vary among Linux architectures.
+   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
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_SOCKET_H
+# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
+#endif
+
+#define SOL_SOCKET 1
+#define SO_ACCEPTCONN 30
+#define SO_BROADCAST 6
+#define SO_DONTROUTE 5
+#define SO_ERROR 4
+#define SO_KEEPALIVE 9
+#define SO_LINGER 13
+#define SO_OOBINLINE 10
+#define SO_RCVBUF 8
+#define SO_RCVLOWAT 18
+#define SO_RCVTIMEO 20
+#define SO_REUSEADDR 2
+#define SO_SNDBUF 7
+#define SO_SNDLOWAT 19
+#define SO_SNDTIMEO 21
+#define SO_TYPE 3
diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h
index 99af01d2a4..082f8b9031 100644
--- a/sysdeps/unix/sysv/linux/bits/socket.h
+++ b/sysdeps/unix/sysv/linux/bits/socket.h
@@ -349,98 +349,12 @@ struct ucred
 };
 #endif
 
-/* Ugly workaround for unclean kernel headers.  */
-#ifndef __USE_MISC
-# ifndef FIOGETOWN
-#  define __SYS_SOCKET_H_undef_FIOGETOWN
-# endif
-# ifndef FIOSETOWN
-#  define __SYS_SOCKET_H_undef_FIOSETOWN
-# endif
-# ifndef SIOCATMARK
-#  define __SYS_SOCKET_H_undef_SIOCATMARK
-# endif
-# ifndef SIOCGPGRP
-#  define __SYS_SOCKET_H_undef_SIOCGPGRP
-# endif
-# ifndef SIOCGSTAMP
-#  define __SYS_SOCKET_H_undef_SIOCGSTAMP
-# endif
-# ifndef SIOCGSTAMPNS
-#  define __SYS_SOCKET_H_undef_SIOCGSTAMPNS
-# endif
-# ifndef SIOCSPGRP
-#  define __SYS_SOCKET_H_undef_SIOCSPGRP
-# endif
-#endif
-#ifndef IOCSIZE_MASK
-# define __SYS_SOCKET_H_undef_IOCSIZE_MASK
-#endif
-#ifndef IOCSIZE_SHIFT
-# define __SYS_SOCKET_H_undef_IOCSIZE_SHIFT
-#endif
-#ifndef IOC_IN
-# define __SYS_SOCKET_H_undef_IOC_IN
-#endif
-#ifndef IOC_INOUT
-# define __SYS_SOCKET_H_undef_IOC_INOUT
-#endif
-#ifndef IOC_OUT
-# define __SYS_SOCKET_H_undef_IOC_OUT
-#endif
-
-/* Get socket manipulation related informations from kernel headers.  */
-#include <asm/socket.h>
-
-#ifndef __USE_MISC
-# ifdef __SYS_SOCKET_H_undef_FIOGETOWN
-#  undef __SYS_SOCKET_H_undef_FIOGETOWN
-#  undef FIOGETOWN
-# endif
-# ifdef __SYS_SOCKET_H_undef_FIOSETOWN
-#  undef __SYS_SOCKET_H_undef_FIOSETOWN
-#  undef FIOSETOWN
-# endif
-# ifdef __SYS_SOCKET_H_undef_SIOCATMARK
-#  undef __SYS_SOCKET_H_undef_SIOCATMARK
-#  undef SIOCATMARK
-# endif
-# ifdef __SYS_SOCKET_H_undef_SIOCGPGRP
-#  undef __SYS_SOCKET_H_undef_SIOCGPGRP
-#  undef SIOCGPGRP
-# endif
-# ifdef __SYS_SOCKET_H_undef_SIOCGSTAMP
-#  undef __SYS_SOCKET_H_undef_SIOCGSTAMP
-#  undef SIOCGSTAMP
-# endif
-# ifdef __SYS_SOCKET_H_undef_SIOCGSTAMPNS
-#  undef __SYS_SOCKET_H_undef_SIOCGSTAMPNS
-#  undef SIOCGSTAMPNS
-# endif
-# ifdef __SYS_SOCKET_H_undef_SIOCSPGRP
-#  undef __SYS_SOCKET_H_undef_SIOCSPGRP
-#  undef SIOCSPGRP
-# endif
-#endif
-#ifdef __SYS_SOCKET_H_undef_IOCSIZE_MASK
-# undef __SYS_SOCKET_H_undef_IOCSIZE_MASK
-# undef IOCSIZE_MASK
-#endif
-#ifdef __SYS_SOCKET_H_undef_IOCSIZE_SHIFT
-# undef __SYS_SOCKET_H_undef_IOCSIZE_SHIFT
-# undef IOCSIZE_SHIFT
-#endif
-#ifdef __SYS_SOCKET_H_undef_IOC_IN
-# undef __SYS_SOCKET_H_undef_IOC_IN
-# undef IOC_IN
-#endif
-#ifdef __SYS_SOCKET_H_undef_IOC_INOUT
-# undef __SYS_SOCKET_H_undef_IOC_INOUT
-# undef IOC_INOUT
-#endif
-#ifdef __SYS_SOCKET_H_undef_IOC_OUT
-# undef __SYS_SOCKET_H_undef_IOC_OUT
-# undef IOC_OUT
+#ifdef __USE_MISC
+# include <bits/types/time_t.h>
+# include <asm/socket.h>
+#else
+# define SO_DEBUG 1
+# include <bits/socket-constants.h>
 #endif
 
 /* Structure used to manipulate the SO_LINGER option.  */
diff --git a/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h b/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h
new file mode 100644
index 0000000000..0b652b81be
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h
@@ -0,0 +1,38 @@
+/* Socket constants which vary among Linux architectures.  Version for hppa.
+   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
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_SOCKET_H
+# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
+#endif
+
+#define SOL_SOCKET 65535
+#define SO_ACCEPTCONN 16412
+#define SO_BROADCAST 32
+#define SO_DONTROUTE 16
+#define SO_ERROR 4103
+#define SO_KEEPALIVE 8
+#define SO_LINGER 128
+#define SO_OOBINLINE 256
+#define SO_RCVBUF 4098
+#define SO_RCVLOWAT 4100
+#define SO_RCVTIMEO 4102
+#define SO_REUSEADDR 4
+#define SO_SNDBUF 4097
+#define SO_SNDLOWAT 4099
+#define SO_SNDTIMEO 4101
+#define SO_TYPE 4104
diff --git a/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h b/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h
new file mode 100644
index 0000000000..2c504499cb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h
@@ -0,0 +1,38 @@
+/* Socket constants which vary among Linux architectures.  Version for MIPS.
+   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
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_SOCKET_H
+# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
+#endif
+
+#define SOL_SOCKET 65535
+#define SO_ACCEPTCONN 4105
+#define SO_BROADCAST 32
+#define SO_DONTROUTE 16
+#define SO_ERROR 4103
+#define SO_KEEPALIVE 8
+#define SO_LINGER 128
+#define SO_OOBINLINE 256
+#define SO_RCVBUF 4098
+#define SO_RCVLOWAT 4100
+#define SO_RCVTIMEO 4102
+#define SO_REUSEADDR 4
+#define SO_SNDBUF 4097
+#define SO_SNDLOWAT 4099
+#define SO_SNDTIMEO 4101
+#define SO_TYPE 4104
diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h b/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h
new file mode 100644
index 0000000000..6d4301b1fd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h
@@ -0,0 +1,38 @@
+/* Socket constants which vary among Linux architectures.  Version for POWER.
+   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
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_SOCKET_H
+# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
+#endif
+
+#define SOL_SOCKET 1
+#define SO_ACCEPTCONN 30
+#define SO_BROADCAST 6
+#define SO_DONTROUTE 5
+#define SO_ERROR 4
+#define SO_KEEPALIVE 9
+#define SO_LINGER 13
+#define SO_OOBINLINE 10
+#define SO_RCVBUF 8
+#define SO_RCVLOWAT 16
+#define SO_RCVTIMEO 18
+#define SO_REUSEADDR 2
+#define SO_SNDBUF 7
+#define SO_SNDLOWAT 17
+#define SO_SNDTIMEO 19
+#define SO_TYPE 3
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h b/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h
new file mode 100644
index 0000000000..a663e11210
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h
@@ -0,0 +1,38 @@
+/* Socket constants which vary among Linux architectures.  Version for SPARC.
+   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
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_SOCKET_H
+# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
+#endif
+
+#define SOL_SOCKET 65535
+#define SO_ACCEPTCONN 32768
+#define SO_BROADCAST 32
+#define SO_DONTROUTE 16
+#define SO_ERROR 4103
+#define SO_KEEPALIVE 8
+#define SO_LINGER 128
+#define SO_OOBINLINE 256
+#define SO_RCVBUF 4098
+#define SO_RCVLOWAT 2048
+#define SO_RCVTIMEO 8192
+#define SO_REUSEADDR 4
+#define SO_SNDBUF 4097
+#define SO_SNDLOWAT 4096
+#define SO_SNDTIMEO 16384
+#define SO_TYPE 4104
diff --git a/sysdeps/unix/sysv/linux/tst-socket-consts.py b/sysdeps/unix/sysv/linux/tst-socket-consts.py
new file mode 100644
index 0000000000..ca2634110c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tst-socket-consts.py
@@ -0,0 +1,65 @@
+#!/usr/bin/python3
+# Test that glibc's sys/socket.h SO_* constants match the kernel's.
+# Copyright (C) 2018-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
+# <http://www.gnu.org/licenses/>.
+
+import argparse
+import sys
+
+import glibcextract
+
+def main():
+    """The main entry point."""
+    parser = argparse.ArgumentParser(
+        description="Test that glibc's sys/socket.h constants "
+        "match the kernel's.")
+    parser.add_argument('--cc', metavar='CC',
+                        help='C compiler (including options) to use')
+    args = parser.parse_args()
+
+    def check(define):
+        return glibcextract.compare_macro_consts(
+            source_1=define + '#include <sys/socket.h>\n',
+            # Some constants in <asm/socket.h> may depend on the size
+            # of pid_t or time_t.
+            source_2='#include <sys/types.h>\n'
+            '#include <asm/socket.h>\n',
+            cc=args.cc,
+            # We cannot compare all macros because some macros cannot
+            # be expanded as constants, and glibcextract currently is
+            # not able to isolate errors.
+            macro_re='SOL?_.*',
+            # <sys/socket.h> and <asm/socket.h> are not a good match.
+            # Most socket-related constants are not defined in any
+            # UAPI header.  Check only the intersection of the macros
+            # in both headers.  Regular tests ensure that expected
+            # macros for _GNU_SOURCE are present, and the conformance
+            # tests cover most of the other modes.
+            allow_extra_1=True,
+            allow_extra_2=True)
+    # _GNU_SOURCE is defined by include/libc-symbols.h, which is
+    # included by the --cc command.  Defining _ISOMAC does not prevent
+    # that.
+    status = max(
+        check(''),
+        check('#undef _GNU_SOURCE\n'),
+        check('#undef _GNU_SOURCE\n'
+              '#define _POSIX_SOURCE 1\n'))
+    sys.exit(status)
+
+if __name__ == '__main__':
+    main()
Carlos O'Donell July 23, 2019, 9:27 p.m. UTC | #3
On 7/21/19 7:07 PM, Florian Weimer wrote:
> * Carlos O'Donell:
> 
>> While all SO_.* constants match correctly, it's SOL_SOCKET that we
>> have wrong?
> 
> Yes, thanks for noticing.  I fixed this and expanded the test scope.
> build-many-glibcs.py still passes.
> 
> I have a half-done patch to extend glibcextract.py so that it's able to
> skip extraction of macros with errors (efficiently, at the cost of
> roughly one additional compiler run per failing macro), but that's
> fairly involved.  On certain architectures, there are awkward predefined
> macros which cause the extraction go wrong (e.g. bool on POWER), and
> there also glibc macros such as TOP_NAMESPACE which are confusing it.
  
This version looks good to me.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
  
> Linux: Use in-tree copy of SO_ constants for !__USE_MISC [BZ #24532]
> 
> The kernel changes for a 64-bit time_t on 32-bit architectures
> resulted in <asm/socket.h> indirectly including <linux/posix_types.h>.
> The latter is not namespace-clean for the POSIX version of
> <sys/socket.h>.
> 
> This issue has persisted across several Linux releases, so this commit
> creates our own copy of the SO_* definitions for !__USE_MISC mode.
> 
> The new test socket/tst-socket-consts ensures that the copy is
> consistent with the kernel definitions (which vary across
> architectures).  The test is tricky to get right because CPPFLAGS
> includes include/libc-symbols.h, which in turn defines _GNU_SOURCE
> unconditionally.
> 
> Tested with build-many-glibcs.py.  I verified that a discrepancy in
> the definitions actually results in a failure of the
> socket/tst-socket-consts test.
> 
> 2019-07-18  Florian Weimer  <fweimer@redhat.com>
> 
> 	[BZ #24532]
> 	Linux: Use in-tree copy of SO_ constants for !__USE_MISC.
> 	* sysdeps/unix/sysv/linux/Makefile [$(subdir) == socket]
> 	(sysdep_headers): Add bits/socket-constants.h.
> 	(tests-special): Add tst-socket-consts.out.
> 	(tst-socket-consts.out): New target.
> 	* sysdeps/unix/sysv/linux/bits/socket.h: Remove macro tracking
> 	around <asm/unistd.h>.
> 	[__USE_MISC]: Include <bits/types/time_t.h> before <asm/socket.h>.
> 	[!__USE_MISC]: Include <sys/socket-constants.h> instead of
> 	<asm/socket.h>.
> 	* sysdeps/unix/sysv/linux/bits/tst-socket-consts.py: New file.
> 	* sysdeps/unix/sysv/linux/bits/socket-constants.h: Likewise.
> 	* sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h: Likewise.
> 	* sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h: Likewise.
> 	* sysdeps/unix/sysv/linux/mips/bits/socket-constants.h: Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h:
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h: Likewise.
> 
> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index afcdc658b5..1ab6bcbfc8 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -146,11 +146,21 @@ endif
>   ifeq ($(subdir),socket)
>   sysdep_headers += net/if_ppp.h net/ppp-comp.h \
>   		  net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \
> -		  net/if_slip.h net/if_packet.h net/if_shaper.h
> +		  net/if_slip.h net/if_packet.h net/if_shaper.h \
> +		  bits/socket-constants.h
>   sysdep_routines += cmsg_nxthdr
>   CFLAGS-recvmmsg.c = -fexceptions -fasynchronous-unwind-tables
>   CFLAGS-sendmmsg.c = -fexceptions -fasynchronous-unwind-tables
> -endif
> +
> +tests-special += $(objpfx)tst-socket-consts.out
> +$(objpfx)tst-socket-consts.out: ../sysdeps/unix/sysv/linux/tst-socket-consts.py
> +	PYTHONPATH=../scripts \
> +	$(PYTHON) ../sysdeps/unix/sysv/linux/tst-socket-consts.py \
> +		   --cc="$(CC) $(patsubst -DMODULE_NAME=%, \
> +					  -DMODULE_NAME=testsuite, \
> +					  $(CPPFLAGS)) -D_ISOMAC" \
> +	< /dev/null > $@ 2>&1; $(evaluate-test)
> +endif # $(subdir) == socket
>   
>   ifeq ($(subdir),sunrpc)
>   sysdep_headers += nfs/nfs.h
> diff --git a/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h b/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h
> new file mode 100644
> index 0000000000..571196756e
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h
> @@ -0,0 +1,38 @@
> +/* Socket constants which vary among Linux architectures.  Version for alpha.
> +   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
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_SOCKET_H
> +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
> +#endif
> +
> +#define SOL_SOCKET 65535
> +#define SO_ACCEPTCONN 4116
> +#define SO_BROADCAST 32
> +#define SO_DONTROUTE 16
> +#define SO_ERROR 4103
> +#define SO_KEEPALIVE 8
> +#define SO_LINGER 128
> +#define SO_OOBINLINE 256
> +#define SO_RCVBUF 4098
> +#define SO_RCVLOWAT 4112
> +#define SO_RCVTIMEO 4114
> +#define SO_REUSEADDR 4
> +#define SO_SNDBUF 4097
> +#define SO_SNDLOWAT 4113
> +#define SO_SNDTIMEO 4115
> +#define SO_TYPE 4104
> diff --git a/sysdeps/unix/sysv/linux/bits/socket-constants.h b/sysdeps/unix/sysv/linux/bits/socket-constants.h
> new file mode 100644
> index 0000000000..b231342102
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/bits/socket-constants.h
> @@ -0,0 +1,38 @@
> +/* Socket constants which vary among Linux architectures.
> +   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
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_SOCKET_H
> +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
> +#endif
> +
> +#define SOL_SOCKET 1
> +#define SO_ACCEPTCONN 30
> +#define SO_BROADCAST 6
> +#define SO_DONTROUTE 5
> +#define SO_ERROR 4
> +#define SO_KEEPALIVE 9
> +#define SO_LINGER 13
> +#define SO_OOBINLINE 10
> +#define SO_RCVBUF 8
> +#define SO_RCVLOWAT 18
> +#define SO_RCVTIMEO 20
> +#define SO_REUSEADDR 2
> +#define SO_SNDBUF 7
> +#define SO_SNDLOWAT 19
> +#define SO_SNDTIMEO 21
> +#define SO_TYPE 3
> diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h
> index 99af01d2a4..082f8b9031 100644
> --- a/sysdeps/unix/sysv/linux/bits/socket.h
> +++ b/sysdeps/unix/sysv/linux/bits/socket.h
> @@ -349,98 +349,12 @@ struct ucred
>   };
>   #endif
>   
> -/* Ugly workaround for unclean kernel headers.  */
> -#ifndef __USE_MISC
> -# ifndef FIOGETOWN
> -#  define __SYS_SOCKET_H_undef_FIOGETOWN
> -# endif
> -# ifndef FIOSETOWN
> -#  define __SYS_SOCKET_H_undef_FIOSETOWN
> -# endif
> -# ifndef SIOCATMARK
> -#  define __SYS_SOCKET_H_undef_SIOCATMARK
> -# endif
> -# ifndef SIOCGPGRP
> -#  define __SYS_SOCKET_H_undef_SIOCGPGRP
> -# endif
> -# ifndef SIOCGSTAMP
> -#  define __SYS_SOCKET_H_undef_SIOCGSTAMP
> -# endif
> -# ifndef SIOCGSTAMPNS
> -#  define __SYS_SOCKET_H_undef_SIOCGSTAMPNS
> -# endif
> -# ifndef SIOCSPGRP
> -#  define __SYS_SOCKET_H_undef_SIOCSPGRP
> -# endif
> -#endif
> -#ifndef IOCSIZE_MASK
> -# define __SYS_SOCKET_H_undef_IOCSIZE_MASK
> -#endif
> -#ifndef IOCSIZE_SHIFT
> -# define __SYS_SOCKET_H_undef_IOCSIZE_SHIFT
> -#endif
> -#ifndef IOC_IN
> -# define __SYS_SOCKET_H_undef_IOC_IN
> -#endif
> -#ifndef IOC_INOUT
> -# define __SYS_SOCKET_H_undef_IOC_INOUT
> -#endif
> -#ifndef IOC_OUT
> -# define __SYS_SOCKET_H_undef_IOC_OUT
> -#endif
> -
> -/* Get socket manipulation related informations from kernel headers.  */
> -#include <asm/socket.h>
> -
> -#ifndef __USE_MISC
> -# ifdef __SYS_SOCKET_H_undef_FIOGETOWN
> -#  undef __SYS_SOCKET_H_undef_FIOGETOWN
> -#  undef FIOGETOWN
> -# endif
> -# ifdef __SYS_SOCKET_H_undef_FIOSETOWN
> -#  undef __SYS_SOCKET_H_undef_FIOSETOWN
> -#  undef FIOSETOWN
> -# endif
> -# ifdef __SYS_SOCKET_H_undef_SIOCATMARK
> -#  undef __SYS_SOCKET_H_undef_SIOCATMARK
> -#  undef SIOCATMARK
> -# endif
> -# ifdef __SYS_SOCKET_H_undef_SIOCGPGRP
> -#  undef __SYS_SOCKET_H_undef_SIOCGPGRP
> -#  undef SIOCGPGRP
> -# endif
> -# ifdef __SYS_SOCKET_H_undef_SIOCGSTAMP
> -#  undef __SYS_SOCKET_H_undef_SIOCGSTAMP
> -#  undef SIOCGSTAMP
> -# endif
> -# ifdef __SYS_SOCKET_H_undef_SIOCGSTAMPNS
> -#  undef __SYS_SOCKET_H_undef_SIOCGSTAMPNS
> -#  undef SIOCGSTAMPNS
> -# endif
> -# ifdef __SYS_SOCKET_H_undef_SIOCSPGRP
> -#  undef __SYS_SOCKET_H_undef_SIOCSPGRP
> -#  undef SIOCSPGRP
> -# endif
> -#endif
> -#ifdef __SYS_SOCKET_H_undef_IOCSIZE_MASK
> -# undef __SYS_SOCKET_H_undef_IOCSIZE_MASK
> -# undef IOCSIZE_MASK
> -#endif
> -#ifdef __SYS_SOCKET_H_undef_IOCSIZE_SHIFT
> -# undef __SYS_SOCKET_H_undef_IOCSIZE_SHIFT
> -# undef IOCSIZE_SHIFT
> -#endif
> -#ifdef __SYS_SOCKET_H_undef_IOC_IN
> -# undef __SYS_SOCKET_H_undef_IOC_IN
> -# undef IOC_IN
> -#endif
> -#ifdef __SYS_SOCKET_H_undef_IOC_INOUT
> -# undef __SYS_SOCKET_H_undef_IOC_INOUT
> -# undef IOC_INOUT
> -#endif
> -#ifdef __SYS_SOCKET_H_undef_IOC_OUT
> -# undef __SYS_SOCKET_H_undef_IOC_OUT
> -# undef IOC_OUT
> +#ifdef __USE_MISC
> +# include <bits/types/time_t.h>
> +# include <asm/socket.h>
> +#else
> +# define SO_DEBUG 1
> +# include <bits/socket-constants.h>
>   #endif
>   
>   /* Structure used to manipulate the SO_LINGER option.  */
> diff --git a/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h b/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h
> new file mode 100644
> index 0000000000..0b652b81be
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h
> @@ -0,0 +1,38 @@
> +/* Socket constants which vary among Linux architectures.  Version for hppa.
> +   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
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_SOCKET_H
> +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
> +#endif
> +
> +#define SOL_SOCKET 65535
> +#define SO_ACCEPTCONN 16412
> +#define SO_BROADCAST 32
> +#define SO_DONTROUTE 16
> +#define SO_ERROR 4103
> +#define SO_KEEPALIVE 8
> +#define SO_LINGER 128
> +#define SO_OOBINLINE 256
> +#define SO_RCVBUF 4098
> +#define SO_RCVLOWAT 4100
> +#define SO_RCVTIMEO 4102
> +#define SO_REUSEADDR 4
> +#define SO_SNDBUF 4097
> +#define SO_SNDLOWAT 4099
> +#define SO_SNDTIMEO 4101
> +#define SO_TYPE 4104
> diff --git a/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h b/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h
> new file mode 100644
> index 0000000000..2c504499cb
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h
> @@ -0,0 +1,38 @@
> +/* Socket constants which vary among Linux architectures.  Version for MIPS.
> +   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
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_SOCKET_H
> +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
> +#endif
> +
> +#define SOL_SOCKET 65535
> +#define SO_ACCEPTCONN 4105
> +#define SO_BROADCAST 32
> +#define SO_DONTROUTE 16
> +#define SO_ERROR 4103
> +#define SO_KEEPALIVE 8
> +#define SO_LINGER 128
> +#define SO_OOBINLINE 256
> +#define SO_RCVBUF 4098
> +#define SO_RCVLOWAT 4100
> +#define SO_RCVTIMEO 4102
> +#define SO_REUSEADDR 4
> +#define SO_SNDBUF 4097
> +#define SO_SNDLOWAT 4099
> +#define SO_SNDTIMEO 4101
> +#define SO_TYPE 4104
> diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h b/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h
> new file mode 100644
> index 0000000000..6d4301b1fd
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h
> @@ -0,0 +1,38 @@
> +/* Socket constants which vary among Linux architectures.  Version for POWER.
> +   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
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_SOCKET_H
> +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
> +#endif
> +
> +#define SOL_SOCKET 1
> +#define SO_ACCEPTCONN 30
> +#define SO_BROADCAST 6
> +#define SO_DONTROUTE 5
> +#define SO_ERROR 4
> +#define SO_KEEPALIVE 9
> +#define SO_LINGER 13
> +#define SO_OOBINLINE 10
> +#define SO_RCVBUF 8
> +#define SO_RCVLOWAT 16
> +#define SO_RCVTIMEO 18
> +#define SO_REUSEADDR 2
> +#define SO_SNDBUF 7
> +#define SO_SNDLOWAT 17
> +#define SO_SNDTIMEO 19
> +#define SO_TYPE 3
> diff --git a/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h b/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h
> new file mode 100644
> index 0000000000..a663e11210
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h
> @@ -0,0 +1,38 @@
> +/* Socket constants which vary among Linux architectures.  Version for SPARC.
> +   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
> +   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
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_SOCKET_H
> +# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
> +#endif
> +
> +#define SOL_SOCKET 65535
> +#define SO_ACCEPTCONN 32768
> +#define SO_BROADCAST 32
> +#define SO_DONTROUTE 16
> +#define SO_ERROR 4103
> +#define SO_KEEPALIVE 8
> +#define SO_LINGER 128
> +#define SO_OOBINLINE 256
> +#define SO_RCVBUF 4098
> +#define SO_RCVLOWAT 2048
> +#define SO_RCVTIMEO 8192
> +#define SO_REUSEADDR 4
> +#define SO_SNDBUF 4097
> +#define SO_SNDLOWAT 4096
> +#define SO_SNDTIMEO 16384
> +#define SO_TYPE 4104
> diff --git a/sysdeps/unix/sysv/linux/tst-socket-consts.py b/sysdeps/unix/sysv/linux/tst-socket-consts.py
> new file mode 100644
> index 0000000000..ca2634110c
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/tst-socket-consts.py
> @@ -0,0 +1,65 @@
> +#!/usr/bin/python3
> +# Test that glibc's sys/socket.h SO_* constants match the kernel's.
> +# Copyright (C) 2018-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
> +# <http://www.gnu.org/licenses/>.
> +
> +import argparse
> +import sys
> +
> +import glibcextract
> +
> +def main():
> +    """The main entry point."""
> +    parser = argparse.ArgumentParser(
> +        description="Test that glibc's sys/socket.h constants "
> +        "match the kernel's.")
> +    parser.add_argument('--cc', metavar='CC',
> +                        help='C compiler (including options) to use')
> +    args = parser.parse_args()
> +
> +    def check(define):
> +        return glibcextract.compare_macro_consts(
> +            source_1=define + '#include <sys/socket.h>\n',
> +            # Some constants in <asm/socket.h> may depend on the size
> +            # of pid_t or time_t.
> +            source_2='#include <sys/types.h>\n'
> +            '#include <asm/socket.h>\n',
> +            cc=args.cc,
> +            # We cannot compare all macros because some macros cannot
> +            # be expanded as constants, and glibcextract currently is
> +            # not able to isolate errors.
> +            macro_re='SOL?_.*',
> +            # <sys/socket.h> and <asm/socket.h> are not a good match.
> +            # Most socket-related constants are not defined in any
> +            # UAPI header.  Check only the intersection of the macros
> +            # in both headers.  Regular tests ensure that expected
> +            # macros for _GNU_SOURCE are present, and the conformance
> +            # tests cover most of the other modes.
> +            allow_extra_1=True,
> +            allow_extra_2=True)
> +    # _GNU_SOURCE is defined by include/libc-symbols.h, which is
> +    # included by the --cc command.  Defining _ISOMAC does not prevent
> +    # that.
> +    status = max(
> +        check(''),
> +        check('#undef _GNU_SOURCE\n'),
> +        check('#undef _GNU_SOURCE\n'
> +              '#define _POSIX_SOURCE 1\n'))
> +    sys.exit(status)
> +
> +if __name__ == '__main__':
> +    main()
>
diff mbox series

Patch

diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index afcdc658b5..1ab6bcbfc8 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -146,11 +146,21 @@  endif
 ifeq ($(subdir),socket)
 sysdep_headers += net/if_ppp.h net/ppp-comp.h \
 		  net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \
-		  net/if_slip.h net/if_packet.h net/if_shaper.h
+		  net/if_slip.h net/if_packet.h net/if_shaper.h \
+		  bits/socket-constants.h
 sysdep_routines += cmsg_nxthdr
 CFLAGS-recvmmsg.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-sendmmsg.c = -fexceptions -fasynchronous-unwind-tables
-endif
+
+tests-special += $(objpfx)tst-socket-consts.out
+$(objpfx)tst-socket-consts.out: ../sysdeps/unix/sysv/linux/tst-socket-consts.py
+	PYTHONPATH=../scripts \
+	$(PYTHON) ../sysdeps/unix/sysv/linux/tst-socket-consts.py \
+		   --cc="$(CC) $(patsubst -DMODULE_NAME=%, \
+					  -DMODULE_NAME=testsuite, \
+					  $(CPPFLAGS)) -D_ISOMAC" \
+	< /dev/null > $@ 2>&1; $(evaluate-test)
+endif # $(subdir) == socket
 
 ifeq ($(subdir),sunrpc)
 sysdep_headers += nfs/nfs.h
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h b/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h
new file mode 100644
index 0000000000..2a405e1cca
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/bits/socket-constants.h
@@ -0,0 +1,37 @@ 
+/* Socket constants which vary among Linux architectures.  Version for alpha.
+   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
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_SOCKET_H
+# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
+#endif
+
+#define SO_ACCEPTCONN 4116
+#define SO_BROADCAST 32
+#define SO_DONTROUTE 16
+#define SO_ERROR 4103
+#define SO_KEEPALIVE 8
+#define SO_LINGER 128
+#define SO_OOBINLINE 256
+#define SO_RCVBUF 4098
+#define SO_RCVLOWAT 4112
+#define SO_RCVTIMEO 4114
+#define SO_REUSEADDR 4
+#define SO_SNDBUF 4097
+#define SO_SNDLOWAT 4113
+#define SO_SNDTIMEO 4115
+#define SO_TYPE 4104
diff --git a/sysdeps/unix/sysv/linux/bits/socket-constants.h b/sysdeps/unix/sysv/linux/bits/socket-constants.h
new file mode 100644
index 0000000000..4d486385f1
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/socket-constants.h
@@ -0,0 +1,37 @@ 
+/* Socket constants which vary among Linux architectures.
+   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
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_SOCKET_H
+# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
+#endif
+
+#define SO_ACCEPTCONN 30
+#define SO_BROADCAST 6
+#define SO_DONTROUTE 5
+#define SO_ERROR 4
+#define SO_KEEPALIVE 9
+#define SO_LINGER 13
+#define SO_OOBINLINE 10
+#define SO_RCVBUF 8
+#define SO_RCVLOWAT 18
+#define SO_RCVTIMEO 20
+#define SO_REUSEADDR 2
+#define SO_SNDBUF 7
+#define SO_SNDLOWAT 19
+#define SO_SNDTIMEO 21
+#define SO_TYPE 3
diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h
index 99af01d2a4..1d37217aa2 100644
--- a/sysdeps/unix/sysv/linux/bits/socket.h
+++ b/sysdeps/unix/sysv/linux/bits/socket.h
@@ -349,98 +349,13 @@  struct ucred
 };
 #endif
 
-/* Ugly workaround for unclean kernel headers.  */
-#ifndef __USE_MISC
-# ifndef FIOGETOWN
-#  define __SYS_SOCKET_H_undef_FIOGETOWN
-# endif
-# ifndef FIOSETOWN
-#  define __SYS_SOCKET_H_undef_FIOSETOWN
-# endif
-# ifndef SIOCATMARK
-#  define __SYS_SOCKET_H_undef_SIOCATMARK
-# endif
-# ifndef SIOCGPGRP
-#  define __SYS_SOCKET_H_undef_SIOCGPGRP
-# endif
-# ifndef SIOCGSTAMP
-#  define __SYS_SOCKET_H_undef_SIOCGSTAMP
-# endif
-# ifndef SIOCGSTAMPNS
-#  define __SYS_SOCKET_H_undef_SIOCGSTAMPNS
-# endif
-# ifndef SIOCSPGRP
-#  define __SYS_SOCKET_H_undef_SIOCSPGRP
-# endif
-#endif
-#ifndef IOCSIZE_MASK
-# define __SYS_SOCKET_H_undef_IOCSIZE_MASK
-#endif
-#ifndef IOCSIZE_SHIFT
-# define __SYS_SOCKET_H_undef_IOCSIZE_SHIFT
-#endif
-#ifndef IOC_IN
-# define __SYS_SOCKET_H_undef_IOC_IN
-#endif
-#ifndef IOC_INOUT
-# define __SYS_SOCKET_H_undef_IOC_INOUT
-#endif
-#ifndef IOC_OUT
-# define __SYS_SOCKET_H_undef_IOC_OUT
-#endif
-
-/* Get socket manipulation related informations from kernel headers.  */
-#include <asm/socket.h>
-
-#ifndef __USE_MISC
-# ifdef __SYS_SOCKET_H_undef_FIOGETOWN
-#  undef __SYS_SOCKET_H_undef_FIOGETOWN
-#  undef FIOGETOWN
-# endif
-# ifdef __SYS_SOCKET_H_undef_FIOSETOWN
-#  undef __SYS_SOCKET_H_undef_FIOSETOWN
-#  undef FIOSETOWN
-# endif
-# ifdef __SYS_SOCKET_H_undef_SIOCATMARK
-#  undef __SYS_SOCKET_H_undef_SIOCATMARK
-#  undef SIOCATMARK
-# endif
-# ifdef __SYS_SOCKET_H_undef_SIOCGPGRP
-#  undef __SYS_SOCKET_H_undef_SIOCGPGRP
-#  undef SIOCGPGRP
-# endif
-# ifdef __SYS_SOCKET_H_undef_SIOCGSTAMP
-#  undef __SYS_SOCKET_H_undef_SIOCGSTAMP
-#  undef SIOCGSTAMP
-# endif
-# ifdef __SYS_SOCKET_H_undef_SIOCGSTAMPNS
-#  undef __SYS_SOCKET_H_undef_SIOCGSTAMPNS
-#  undef SIOCGSTAMPNS
-# endif
-# ifdef __SYS_SOCKET_H_undef_SIOCSPGRP
-#  undef __SYS_SOCKET_H_undef_SIOCSPGRP
-#  undef SIOCSPGRP
-# endif
-#endif
-#ifdef __SYS_SOCKET_H_undef_IOCSIZE_MASK
-# undef __SYS_SOCKET_H_undef_IOCSIZE_MASK
-# undef IOCSIZE_MASK
-#endif
-#ifdef __SYS_SOCKET_H_undef_IOCSIZE_SHIFT
-# undef __SYS_SOCKET_H_undef_IOCSIZE_SHIFT
-# undef IOCSIZE_SHIFT
-#endif
-#ifdef __SYS_SOCKET_H_undef_IOC_IN
-# undef __SYS_SOCKET_H_undef_IOC_IN
-# undef IOC_IN
-#endif
-#ifdef __SYS_SOCKET_H_undef_IOC_INOUT
-# undef __SYS_SOCKET_H_undef_IOC_INOUT
-# undef IOC_INOUT
-#endif
-#ifdef __SYS_SOCKET_H_undef_IOC_OUT
-# undef __SYS_SOCKET_H_undef_IOC_OUT
-# undef IOC_OUT
+#ifdef __USE_MISC
+# include <bits/types/time_t.h>
+# include <asm/socket.h>
+#else
+# define SOL_SOCKET 1
+# define SO_DEBUG 1
+# include <bits/socket-constants.h>
 #endif
 
 /* Structure used to manipulate the SO_LINGER option.  */
diff --git a/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h b/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h
new file mode 100644
index 0000000000..09b3c6ca51
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/hppa/bits/socket-constants.h
@@ -0,0 +1,37 @@ 
+/* Socket constants which vary among Linux architectures.  Version for hppa.
+   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
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_SOCKET_H
+# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
+#endif
+
+#define SO_ACCEPTCONN 16412
+#define SO_BROADCAST 32
+#define SO_DONTROUTE 16
+#define SO_ERROR 4103
+#define SO_KEEPALIVE 8
+#define SO_LINGER 128
+#define SO_OOBINLINE 256
+#define SO_RCVBUF 4098
+#define SO_RCVLOWAT 4100
+#define SO_RCVTIMEO 4102
+#define SO_REUSEADDR 4
+#define SO_SNDBUF 4097
+#define SO_SNDLOWAT 4099
+#define SO_SNDTIMEO 4101
+#define SO_TYPE 4104
diff --git a/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h b/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h
new file mode 100644
index 0000000000..880e3401a8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/bits/socket-constants.h
@@ -0,0 +1,37 @@ 
+/* Socket constants which vary among Linux architectures.  Version for MIPS.
+   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
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_SOCKET_H
+# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
+#endif
+
+#define SO_ACCEPTCONN 4105
+#define SO_BROADCAST 32
+#define SO_DONTROUTE 16
+#define SO_ERROR 4103
+#define SO_KEEPALIVE 8
+#define SO_LINGER 128
+#define SO_OOBINLINE 256
+#define SO_RCVBUF 4098
+#define SO_RCVLOWAT 4100
+#define SO_RCVTIMEO 4102
+#define SO_REUSEADDR 4
+#define SO_SNDBUF 4097
+#define SO_SNDLOWAT 4099
+#define SO_SNDTIMEO 4101
+#define SO_TYPE 4104
diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h b/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h
new file mode 100644
index 0000000000..b4ed16b5c8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/bits/socket-constants.h
@@ -0,0 +1,37 @@ 
+/* Socket constants which vary among Linux architectures.  Version for POWER.
+   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
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_SOCKET_H
+# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
+#endif
+
+#define SO_ACCEPTCONN 30
+#define SO_BROADCAST 6
+#define SO_DONTROUTE 5
+#define SO_ERROR 4
+#define SO_KEEPALIVE 9
+#define SO_LINGER 13
+#define SO_OOBINLINE 10
+#define SO_RCVBUF 8
+#define SO_RCVLOWAT 16
+#define SO_RCVTIMEO 18
+#define SO_REUSEADDR 2
+#define SO_SNDBUF 7
+#define SO_SNDLOWAT 17
+#define SO_SNDTIMEO 19
+#define SO_TYPE 3
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h b/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h
new file mode 100644
index 0000000000..5adce1df3c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/bits/socket-constants.h
@@ -0,0 +1,37 @@ 
+/* Socket constants which vary among Linux architectures.  Version for SPARC.
+   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
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_SOCKET_H
+# error "Never include <bits/socket-constants.h> directly; use <sys/socket.h> instead."
+#endif
+
+#define SO_ACCEPTCONN 32768
+#define SO_BROADCAST 32
+#define SO_DONTROUTE 16
+#define SO_ERROR 4103
+#define SO_KEEPALIVE 8
+#define SO_LINGER 128
+#define SO_OOBINLINE 256
+#define SO_RCVBUF 4098
+#define SO_RCVLOWAT 2048
+#define SO_RCVTIMEO 8192
+#define SO_REUSEADDR 4
+#define SO_SNDBUF 4097
+#define SO_SNDLOWAT 4096
+#define SO_SNDTIMEO 16384
+#define SO_TYPE 4104
diff --git a/sysdeps/unix/sysv/linux/tst-socket-consts.py b/sysdeps/unix/sysv/linux/tst-socket-consts.py
new file mode 100644
index 0000000000..e486b87c5b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tst-socket-consts.py
@@ -0,0 +1,55 @@ 
+#!/usr/bin/python3
+# Test that glibc's sys/socket.h SO_* constants match the kernel's.
+# Copyright (C) 2018-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
+# <http://www.gnu.org/licenses/>.
+
+import argparse
+import sys
+
+import glibcextract
+
+def main():
+    """The main entry point."""
+    parser = argparse.ArgumentParser(
+        description="Test that glibc's sys/socket.h constants "
+        "match the kernel's.")
+    parser.add_argument('--cc', metavar='CC',
+                        help='C compiler (including options) to use')
+    args = parser.parse_args()
+
+    def check(define):
+        return glibcextract.compare_macro_consts(
+            define + '#include <sys/socket.h>\n',
+            # Some constants in <asm/socket.h> may depend on the size
+            # of time_t.
+            '#include <bits/types/time_t.h>\n'
+            '#include <asm/socket.h>\n',
+            args.cc,
+            macro_re='SO_.*',
+            allow_extra_2=True)
+    # _GNU_SOURCE is defined by include/libc-symbols.h, which is
+    # included by the --cc command.  Defining _ISOMAC does not prevent
+    # that.
+    status = max(
+        check(''),
+        check('#undef _GNU_SOURCE\n'),
+        check('#undef _GNU_SOURCE\n'
+              '#define _POSIX_SOURCE 1\n'))
+    sys.exit(status)
+
+if __name__ == '__main__':
+    main()