The convention throughout glibc is that every public header includes
features.h directly, as its first action, and relies on features.h to
include sys/cdefs.h. In a few places, though, it’s been done the
other way around, usually in headers that were copied from a BSD
source (where the convention is exactly the opposite). This patch
makes all installed headers match the glibc convention.
This patch also corrects a bug in glob.h: it may declare size_t
without notifying stddef.h that it has done this, so e.g.
#define _XOPEN_SOURCE 700
#include <glob.h>
#include <stddef.h>
int dummy;
declares size_t twice, which is invalid prior to C2011. I wasn’t able
to persuade gcc 8 to issue an error, even with -std=c89 -Wsystem-headers,
but clang is not so lenient.
* posix/glob.h: Include features.h, not sys/cdefs.h.
When __USE_XOPEN || USE_XOPEN2K8, include stddef.h for size_t;
otherwise, issue an immediate #error if __SIZE_TYPE__ is not
available. Use __gsize_t, not __size_t, as an impl-namespace
alternative name for size_t.
* conform/data/glob.h-data: Adjust to match.
* inet/netinet/igmp.h, mach/lock-intern.h, misc/ar.h
* misc/sys/auxv.h, resolv/resolv.h, socket/sys/un.h
* sunrpc/rpc/auth_des.h, sunrpc/rpc/rpc_msg.h
* sysdeps/generic/memcopy.h, sysdeps/generic/netinet/tcp.h
* sysdeps/htl/pthread.h, sysdeps/mach/hurd/net/ethernet.h
* sysdeps/mach/hurd/net/if_arp.h: Include features.h, not sys/cdefs.h.
* scripts/check-obsolete-constructs.py (HEADER_ALLOWED_INCLUDES):
Update.
---
conform/data/glob.h-data | 2 +-
inet/netinet/igmp.h | 3 ++-
mach/lock-intern.h | 3 ++-
misc/ar.h | 2 +-
misc/sys/auxv.h | 3 ++-
posix/glob.h | 33 +++++++++++++++-------------
resolv/resolv.h | 3 ++-
scripts/check-obsolete-constructs.py | 18 ++++++---------
socket/sys/un.h | 2 +-
sunrpc/rpc/auth_des.h | 3 ++-
sunrpc/rpc/rpc_msg.h | 2 +-
sysdeps/generic/memcopy.h | 3 ++-
sysdeps/generic/netinet/tcp.h | 3 +--
sysdeps/htl/pthread.h | 1 -
sysdeps/mach/hurd/net/ethernet.h | 3 ++-
sysdeps/mach/hurd/net/if_arp.h | 4 ++--
16 files changed, 46 insertions(+), 42 deletions(-)
@@ -1,6 +1,6 @@
#if !defined ISO && !defined ISO99 && !defined ISO11
#ifdef POSIX
-# define size_t __size_t
+# define size_t __gsize_t
#endif
type glob_t
@@ -18,7 +18,8 @@
#ifndef _NETINET_IGMP_H
#define _NETINET_IGMP_H 1
-#include <sys/cdefs.h>
+#include <features.h>
+
#include <sys/types.h>
#ifdef __USE_MISC
@@ -18,7 +18,8 @@
#ifndef _LOCK_INTERN_H
#define _LOCK_INTERN_H
-#include <sys/cdefs.h>
+#include <features.h>
+
#if defined __USE_EXTERN_INLINES && defined _LIBC
# include <lowlevellock.h>
#endif
@@ -19,7 +19,7 @@
#ifndef _AR_H
#define _AR_H 1
-#include <sys/cdefs.h>
+#include <features.h>
/* Archive files start with the ARMAG identifying string. Then follows a
`struct ar_hdr', and as many bytes of member file data as its `ar_size'
@@ -19,8 +19,9 @@
#ifndef _SYS_AUXV_H
#define _SYS_AUXV_H 1
+#include <features.h>
+
#include <elf.h>
-#include <sys/cdefs.h>
#include <bits/hwcap.h>
__BEGIN_DECLS
@@ -18,21 +18,24 @@
#ifndef _GLOB_H
#define _GLOB_H 1
-#include <sys/cdefs.h>
+#include <features.h>
__BEGIN_DECLS
-/* We need `size_t' for the following definitions. */
-#ifndef __size_t
-typedef __SIZE_TYPE__ __size_t;
-# if defined __USE_XOPEN || defined __USE_XOPEN2K8
-typedef __SIZE_TYPE__ size_t;
-# endif
+/* Structures below have size_t fields, but this header is not supposed to
+ define size_t itself, unless XSI or POSIX.1-2008 features are active.
+ We can't use __size_t as an alternative name, as we do for most types
+ with this kind of constraint, because GCC's stddef.h uses __size_t for
+ a different purpose. */
+
+#if defined __USE_XOPEN || defined __USE_XOPEN2K8
+# define __need_size_t
+# include <stddef.h>
+typedef size_t __gsize_t;
+#elif defined __SIZE_TYPE__
+typedef __SIZE_TYPE__ __gsize_t;
#else
-/* The GNU CC stddef.h version defines __size_t as empty. We need a real
- definition. */
-# undef __size_t
-# define __size_t size_t
+# error "Don't know how to define __gsize_t"
#endif
/* Bits set in the FLAGS argument to `glob'. */
@@ -81,9 +84,9 @@ struct stat;
#endif
typedef struct
{
- __size_t gl_pathc; /* Count of paths matched by the pattern. */
+ __gsize_t gl_pathc; /* Count of paths matched by the pattern. */
char **gl_pathv; /* List of matched pathnames. */
- __size_t gl_offs; /* Slots to reserve in `gl_pathv'. */
+ __gsize_t gl_offs; /* Slots to reserve in `gl_pathv'. */
int gl_flags; /* Set to FLAGS, maybe | GLOB_MAGCHAR. */
/* If the GLOB_ALTDIRFUNC flag is set, the following functions
@@ -110,9 +113,9 @@ struct stat64;
# endif
typedef struct
{
- __size_t gl_pathc;
+ __gsize_t gl_pathc;
char **gl_pathv;
- __size_t gl_offs;
+ __gsize_t gl_offs;
int gl_flags;
/* If the GLOB_ALTDIRFUNC flag is set, the following functions
@@ -52,7 +52,8 @@
#ifndef _RESOLV_H_
#define _RESOLV_H_
-#include <sys/cdefs.h>
+#include <features.h>
+
#include <sys/param.h>
#include <sys/types.h>
#include <stdio.h>
@@ -527,11 +527,9 @@ HEADER_ALLOWED_INCLUDES = {
# spawn.h -> sched.h
"aio.h": [ "sys/types.h" ],
"ftw.h": [ "sys/stat.h", "sys/types.h" ],
- "glob.h": [ "sys/cdefs.h" ],
"langinfo.h": [ "nl_types.h" ],
"mqueue.h": [ "fcntl.h", "sys/types.h" ],
- "pthread.h": [ "endian.h", "sched.h", "time.h",
- "sys/cdefs.h" ],
+ "pthread.h": [ "sched.h", "time.h" ],
"regex.h": [ "limits.h", "sys/types.h" ],
"sched.h": [ "time.h" ],
"semaphore.h": [ "sys/types.h" ],
@@ -550,7 +548,7 @@ HEADER_ALLOWED_INCLUDES = {
"sys/time.h": [ "sys/select.h" ],
"sys/types.h": [ "endian.h", "sys/select.h" ],
"sys/uio.h": [ "sys/types.h" ],
- "sys/un.h": [ "string.h", "sys/cdefs.h" ],
+ "sys/un.h": [ "string.h" ],
"sys/wait.h": [ "signal.h" ],
# POSIX networking headers
@@ -565,7 +563,6 @@ HEADER_ALLOWED_INCLUDES = {
# Nonstandardized top-level headers
"aliases.h": [ "sys/types.h" ],
- "ar.h": [ "sys/cdefs.h" ],
"argp.h": [ "ctype.h", "errno.h", "getopt.h",
"limits.h", "stdio.h" ],
"argz.h": [ "errno.h", "string.h" ],
@@ -594,7 +591,7 @@ HEADER_ALLOWED_INCLUDES = {
# Nonstandardized sys/ headers
"sys/acct.h": [ "endian.h", "stdint.h", "sys/types.h" ],
- "sys/auxv.h": [ "elf.h", "sys/cdefs.h" ],
+ "sys/auxv.h": [ "elf.h" ],
"sys/elf.h": [ "sys/procfs.h" ],
"sys/epoll.h": [ "stdint.h", "sys/types.h" ],
"sys/eventfd.h": [ "stdint.h" ],
@@ -649,16 +646,16 @@ HEADER_ALLOWED_INCLUDES = {
# Nonstandardized networking headers
"ifaddrs.h": [ "sys/socket.h" ],
"resolv.h": [ "arpa/nameser.h", "netinet/in.h",
- "stdio.h", "sys/cdefs.h", "sys/param.h",\
+ "stdio.h", "sys/param.h",
"sys/types.h" ],
"arpa/nameser.h": [ "arpa/nameser_compat.h", "stdint.h",
"sys/param.h", "sys/types.h" ],
"arpa/nameser_compat.h": [ "endian.h" ],
- "net/ethernet.h": [ "stdint.h", "sys/types.h", "sys/cdefs.h",
+ "net/ethernet.h": [ "stdint.h", "sys/types.h",
"net/if_ether.h" ],
"net/if_arp.h": [ "stdint.h", "sys/socket.h",
- "sys/types.h", "sys/cdefs.h" ],
+ "sys/types.h" ],
"net/if_ppp.h": [ "net/if.h", "net/ppp_defs.h", "stdint.h",
"sys/ioctl.h", "sys/types.h" ],
"net/if_shaper.h": [ "net/if.h", "stdint.h", "sys/ioctl.h",
@@ -673,8 +670,7 @@ HEADER_ALLOWED_INCLUDES = {
"sys/types.h", "stdint.h" ],
"netinet/if_fddi.h": [ "stdint.h", "sys/types.h" ],
"netinet/if_tr.h": [ "stdint.h", "sys/types.h" ],
- "netinet/igmp.h": [ "netinet/in.h", "sys/cdefs.h",
- "sys/types.h" ],
+ "netinet/igmp.h": [ "netinet/in.h", "sys/types.h" ],
"netinet/in_systm.h": [ "stdint.h", "sys/types.h" ],
"netinet/ip.h": [ "netinet/in.h", "sys/types.h" ],
"netinet/ip6.h": [ "inttypes.h", "netinet/in.h" ],
@@ -18,7 +18,7 @@
#ifndef _SYS_UN_H
#define _SYS_UN_H 1
-#include <sys/cdefs.h>
+#include <features.h>
/* Get the definition of the macro to define the common sockaddr members. */
#include <bits/sockaddr.h>
@@ -18,7 +18,8 @@
#ifndef _RPC_AUTH_DES_H
#define _RPC_AUTH_DES_H 1
-#include <sys/cdefs.h>
+#include <features.h>
+
#include <rpc/auth.h>
__BEGIN_DECLS
@@ -35,7 +35,7 @@
#ifndef _RPC_MSG_H
#define _RPC_MSG_H 1
-#include <sys/cdefs.h>
+#include <features.h>
#include <rpc/xdr.h>
#include <rpc/clnt.h>
@@ -20,6 +20,8 @@
#ifndef _MEMCOPY_H
#define _MEMCOPY_H 1
+#include <features.h>
+
/* The strategy of the memory functions is:
1. Copy bytes until the destination pointer is aligned.
@@ -38,7 +40,6 @@
exhaustive in the sense that I tried all alignment and length
combinations, with and without overlap. */
-#include <sys/cdefs.h>
#include <endian.h>
#include <pagecopy.h>
@@ -30,10 +30,9 @@
*/
#ifndef _NETINET_TCP_H
-
#define _NETINET_TCP_H 1
-#include <sys/cdefs.h>
+#include <features.h>
__BEGIN_DECLS
@@ -25,7 +25,6 @@
#include <features.h>
-#include <sys/cdefs.h>
#ifndef __extern_inline
/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
inline semantics, unless -fgnu89-inline is used. */
@@ -21,7 +21,8 @@
#ifndef __NET_ETHERNET_H
#define __NET_ETHERNET_H 1
-#include <sys/cdefs.h>
+#include <features.h>
+
#include <sys/types.h>
#include <stdint.h>
#include <net/if_ether.h> /* IEEE 802.3 Ethernet constants */
@@ -20,9 +20,9 @@
/* Based on the 4.4BSD and Linux version of this file. */
#ifndef _NET_IF_ARP_H
-
#define _NET_IF_ARP_H 1
-#include <sys/cdefs.h>
+
+#include <features.h>
#include <sys/types.h>
#include <sys/socket.h>