aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2019-06-18 11:47:49 -0400
committerZack Weinberg <zackw@panix.com>2020-01-08 13:04:44 -0500
commitafaa4fe717db9f4106570665f5db0cd45684b96a (patch)
tree202ee1da168bf8b9c9a3209fa54d52fb8404d496
parent89cbc039a98f6bfc7e27c98a7e3799cf190c11f1 (diff)
downloadglibc-afaa4fe717db9f4106570665f5db0cd45684b96a.tar
glibc-afaa4fe717db9f4106570665f5db0cd45684b96a.tar.gz
glibc-afaa4fe717db9f4106570665f5db0cd45684b96a.tar.bz2
glibc-afaa4fe717db9f4106570665f5db0cd45684b96a.zip
Don’t include sys/cdefs.h directly from public headers.
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.
-rw-r--r--conform/data/glob.h-data2
-rw-r--r--inet/netinet/igmp.h3
-rw-r--r--mach/lock-intern.h3
-rw-r--r--misc/ar.h2
-rw-r--r--misc/sys/auxv.h3
-rw-r--r--posix/glob.h33
-rw-r--r--resolv/resolv.h3
-rwxr-xr-xscripts/check-obsolete-constructs.py18
-rw-r--r--socket/sys/un.h2
-rw-r--r--sunrpc/rpc/auth_des.h3
-rw-r--r--sunrpc/rpc/rpc_msg.h2
-rw-r--r--sysdeps/generic/memcopy.h3
-rw-r--r--sysdeps/generic/netinet/tcp.h3
-rw-r--r--sysdeps/htl/pthread.h1
-rw-r--r--sysdeps/mach/hurd/net/ethernet.h3
-rw-r--r--sysdeps/mach/hurd/net/if_arp.h4
16 files changed, 46 insertions, 42 deletions
diff --git a/conform/data/glob.h-data b/conform/data/glob.h-data
index eca83937af..6268134b35 100644
--- a/conform/data/glob.h-data
+++ b/conform/data/glob.h-data
@@ -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
diff --git a/inet/netinet/igmp.h b/inet/netinet/igmp.h
index 2c3f167946..3a5b157073 100644
--- a/inet/netinet/igmp.h
+++ b/inet/netinet/igmp.h
@@ -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
diff --git a/mach/lock-intern.h b/mach/lock-intern.h
index b6a075bc3a..357860c836 100644
--- a/mach/lock-intern.h
+++ b/mach/lock-intern.h
@@ -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
diff --git a/misc/ar.h b/misc/ar.h
index 85ecba604c..8dcef44a9d 100644
--- a/misc/ar.h
+++ b/misc/ar.h
@@ -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'
diff --git a/misc/sys/auxv.h b/misc/sys/auxv.h
index 1a563e1337..038bbbe255 100644
--- a/misc/sys/auxv.h
+++ b/misc/sys/auxv.h
@@ -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
diff --git a/posix/glob.h b/posix/glob.h
index b82a28286a..e647ba813a 100644
--- a/posix/glob.h
+++ b/posix/glob.h
@@ -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
diff --git a/resolv/resolv.h b/resolv/resolv.h
index a039a9e636..ce3922c3ed 100644
--- a/resolv/resolv.h
+++ b/resolv/resolv.h
@@ -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>
diff --git a/scripts/check-obsolete-constructs.py b/scripts/check-obsolete-constructs.py
index 1d9eec5d0e..25c0d6868d 100755
--- a/scripts/check-obsolete-constructs.py
+++ b/scripts/check-obsolete-constructs.py
@@ -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" ],
diff --git a/socket/sys/un.h b/socket/sys/un.h
index 95400f78a5..8bc9c3adb8 100644
--- a/socket/sys/un.h
+++ b/socket/sys/un.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>
diff --git a/sunrpc/rpc/auth_des.h b/sunrpc/rpc/auth_des.h
index 79b49ad66a..f7437bb7f7 100644
--- a/sunrpc/rpc/auth_des.h
+++ b/sunrpc/rpc/auth_des.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
diff --git a/sunrpc/rpc/rpc_msg.h b/sunrpc/rpc/rpc_msg.h
index a2cc516cd6..efd9ee4a2f 100644
--- a/sunrpc/rpc/rpc_msg.h
+++ b/sunrpc/rpc/rpc_msg.h
@@ -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>
diff --git a/sysdeps/generic/memcopy.h b/sysdeps/generic/memcopy.h
index 0b09ca330c..a2d37a1cd8 100644
--- a/sysdeps/generic/memcopy.h
+++ b/sysdeps/generic/memcopy.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>
diff --git a/sysdeps/generic/netinet/tcp.h b/sysdeps/generic/netinet/tcp.h
index 49f1bfbc26..3b59e949d8 100644
--- a/sysdeps/generic/netinet/tcp.h
+++ b/sysdeps/generic/netinet/tcp.h
@@ -30,10 +30,9 @@
*/
#ifndef _NETINET_TCP_H
-
#define _NETINET_TCP_H 1
-#include <sys/cdefs.h>
+#include <features.h>
__BEGIN_DECLS
diff --git a/sysdeps/htl/pthread.h b/sysdeps/htl/pthread.h
index 3216860493..2f9d37707e 100644
--- a/sysdeps/htl/pthread.h
+++ b/sysdeps/htl/pthread.h
@@ -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. */
diff --git a/sysdeps/mach/hurd/net/ethernet.h b/sysdeps/mach/hurd/net/ethernet.h
index 06beb6c9af..53b2e39600 100644
--- a/sysdeps/mach/hurd/net/ethernet.h
+++ b/sysdeps/mach/hurd/net/ethernet.h
@@ -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 */
diff --git a/sysdeps/mach/hurd/net/if_arp.h b/sysdeps/mach/hurd/net/if_arp.h
index 0fa9bcec9e..ffb6ef1e22 100644
--- a/sysdeps/mach/hurd/net/if_arp.h
+++ b/sysdeps/mach/hurd/net/if_arp.h
@@ -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>