This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch zack/headers-cleanups created. glibc-2.25-389-ge19ce60
- From: zack at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 2 Jun 2017 12:58:29 -0000
- Subject: GNU C Library master sources branch zack/headers-cleanups created. glibc-2.25-389-ge19ce60
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, zack/headers-cleanups has been created
at e19ce6057b5a27368f10df97bbd2316285356d71 (commit)
- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=e19ce6057b5a27368f10df97bbd2316285356d71
commit e19ce6057b5a27368f10df97bbd2316285356d71
Author: Zack Weinberg <zackw@panix.com>
Date: Sat May 20 18:23:01 2017 -0400
Remove __need_schedparam and __cpu_set_t_defined.
bits/sched.h has logic to expose only an impl-namespace variant of
struct sched_param (i.e. struct __sched_param), but nothing uses it,
and the only header that includes bits/sched.h is sched.h. The
__need_schedparam logic can therefore be removed.
bits/sched.h also has a great deal of code relating to cpu_set_t
objects that was *almost* the same between the two versions of
bits/sched.h in the tree; a little spelunking indicated that this is
because some bug fixes got applied to the Linux-specific bits/sched.h
but not the generic one. Introduce a new header, bits/cpu-set.h,
containing the version of that code with the bugfixes, have sched.h
include it directly, and delete all of the code from both versions of
bits/sched.h.
Also remove the unnecessary name mangling in the definition of struct
sched_param -- POSIX specifies a field 'sched_priority', so there is
no reason to define it as '__sched_priority' and then paper over that
with a macro. (Just in case someone was using the internal name,
'sched_priority' remains a macro defined to expand to itself, and
'__sched_priority' now expands to 'sched_priority'.)
Finally, as long as I'm touching these files anyway, merge new
constants from linux/sched.h into the Linux bits/sched.h.
* bits/sched.h: Remove __need_schedparam logic and replace with a
normal multiple-include guard. Change field name in struct
sched_param from __sched_priority to sched_priority. Delete
everything under #ifndef __cpu_set_t_defined.
* sysdeps/unix/sysv/linux/bits/sched.h: Likewise. Also sync with
kernel sched.h, adding SCHED_ISO and SCHED_DEADLINE constants.
* posix/sched.h: Include bits/cpu-set.h as well as bits/sched.h.
For compatibility, #define sched_priority to itself, and #define
__sched_priority as sched_priority.
* posix/bits/cpu-set.h: New file containing, verbatim, the code
that was under #ifndef __cpu_set_t_defined in
sysdeps/unix/sysv/linux/bits/sched.h.
* include/bits/cpu-set.h: New wrapper.
* posix/Makefile: Install bits/cpu-set.h.
diff --git a/bits/sched.h b/bits/sched.h
index c36c569..0588f31 100644
--- a/bits/sched.h
+++ b/bits/sched.h
@@ -17,13 +17,13 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifndef __need_schedparam
+#ifndef _BITS_SCHED_H
+#define _BITS_SCHED_H 1
#ifndef _SCHED_H
# error "Never include <bits/sched.h> directly; use <sched.h> instead."
#endif
-
/* Scheduling algorithms. */
#define SCHED_OTHER 0
#define SCHED_FIFO 1
@@ -32,120 +32,7 @@
/* Data structure to describe a process' schedulability. */
struct sched_param
{
- int __sched_priority;
+ int sched_priority;
};
-#endif /* need schedparam */
-
-#if !defined __defined_schedparam \
- && (defined __need_schedparam || defined _SCHED_H)
-# define __defined_schedparam 1
-/* Data structure to describe a process' schedulability. */
-struct __sched_param
- {
- int __sched_priority;
- };
-# undef __need_schedparam
-#endif
-
-
-#if defined _SCHED_H && !defined __cpu_set_t_defined
-# define __cpu_set_t_defined
-/* Size definition for CPU sets. */
-# define __CPU_SETSIZE 1024
-# define __NCPUBITS (8 * sizeof (__cpu_mask))
-
-/* Type for array elements in 'cpu_set_t'. */
-typedef unsigned long int __cpu_mask;
-
-/* Basic access functions. */
-# define __CPUELT(cpu) ((cpu) / __NCPUBITS)
-# define __CPUMASK(cpu) ((__cpu_mask) 1 << ((cpu) % __NCPUBITS))
-
-/* Data structure to describe CPU mask. */
-typedef struct
-{
- __cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS];
-} cpu_set_t;
-
-/* Access functions for CPU masks. */
-# if __GNUC_PREREQ (2, 91)
-# define __CPU_ZERO_S(setsize, cpusetp) \
- do __builtin_memset (cpusetp, '\0', setsize); while (0)
-# else
-# define __CPU_ZERO_S(setsize, cpusetp) \
- do { \
- size_t __i; \
- size_t __imax = (setsize) / sizeof (__cpu_mask); \
- __cpu_mask *__bits = (cpusetp)->__bits; \
- for (__i = 0; __i < __imax; ++__i) \
- __bits[__i] = 0; \
- } while (0)
-# endif
-# define __CPU_SET_S(cpu, setsize, cpusetp) \
- (__extension__ \
- ({ size_t __cpu = (cpu); \
- __cpu < 8 * (setsize) \
- ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \
- |= __CPUMASK (__cpu)) \
- : 0; }))
-# define __CPU_CLR_S(cpu, setsize, cpusetp) \
- (__extension__ \
- ({ size_t __cpu = (cpu); \
- __cpu < 8 * (setsize) \
- ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \
- &= ~__CPUMASK (__cpu)) \
- : 0; }))
-# define __CPU_ISSET_S(cpu, setsize, cpusetp) \
- (__extension__ \
- ({ size_t __cpu = (cpu); \
- __cpu < 8 * (setsize) \
- ? ((((const __cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \
- & __CPUMASK (__cpu))) != 0 \
- : 0; }))
-
-# define __CPU_COUNT_S(setsize, cpusetp) \
- __sched_cpucount (setsize, cpusetp)
-
-# if __GNUC_PREREQ (2, 91)
-# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
- (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0)
-# else
-# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
- (__extension__ \
- ({ const __cpu_mask *__arr1 = (cpusetp1)->__bits; \
- const __cpu_mask *__arr2 = (cpusetp2)->__bits; \
- size_t __imax = (setsize) / sizeof (__cpu_mask); \
- size_t __i; \
- for (__i = 0; __i < __imax; ++__i) \
- if (__arr1[__i] != __arr2[__i]) \
- break; \
- __i == __imax; }))
-# endif
-
-# define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \
- (__extension__ \
- ({ cpu_set_t *__dest = (destset); \
- const __cpu_mask *__arr1 = (srcset1)->__bits; \
- const __cpu_mask *__arr2 = (srcset2)->__bits; \
- size_t __imax = (setsize) / sizeof (__cpu_mask); \
- size_t __i; \
- for (__i = 0; __i < __imax; ++__i) \
- ((__cpu_mask *) __dest->__bits)[__i] = __arr1[__i] op __arr2[__i]; \
- __dest; }))
-
-# define __CPU_ALLOC_SIZE(count) \
- ((((count) + __NCPUBITS - 1) / __NCPUBITS) * sizeof (__cpu_mask))
-# define __CPU_ALLOC(count) __sched_cpualloc (count)
-# define __CPU_FREE(cpuset) __sched_cpufree (cpuset)
-
-__BEGIN_DECLS
-
-extern int __sched_cpucount (size_t __setsize, const cpu_set_t *__setp)
- __THROW;
-extern cpu_set_t *__sched_cpualloc (size_t __count) __THROW __wur;
-extern void __sched_cpufree (cpu_set_t *__set) __THROW;
-
-__END_DECLS
-
-#endif
+#endif /* bits/sched.h */
diff --git a/include/bits/cpu-set.h b/include/bits/cpu-set.h
new file mode 100644
index 0000000..388f03c
--- /dev/null
+++ b/include/bits/cpu-set.h
@@ -0,0 +1 @@
+#include <posix/bits/cpu-set.h>
diff --git a/posix/Makefile b/posix/Makefile
index 52b022c..1c328b8 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -30,8 +30,8 @@ headers := sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h \
bits/posix1_lim.h bits/posix2_lim.h bits/posix_opt.h \
bits/local_lim.h tar.h bits/utsname.h bits/confname.h \
bits/waitflags.h bits/waitstatus.h sys/unistd.h sched.h \
- bits/sched.h re_comp.h wait.h bits/environments.h cpio.h \
- spawn.h bits/unistd.h
+ bits/sched.h bits/cpu-set.h re_comp.h wait.h bits/environments.h \
+ cpio.h spawn.h bits/unistd.h
routines := \
uname \
diff --git a/bits/sched.h b/posix/bits/cpu-set.h
similarity index 81%
copy from bits/sched.h
copy to posix/bits/cpu-set.h
index c36c569..f9b11b9 100644
--- a/bits/sched.h
+++ b/posix/bits/cpu-set.h
@@ -1,4 +1,4 @@
-/* Definitions of constants and data structure for POSIX 1003.1b-1993
+/* Definition of the cpu_set_t structure used by the POSIX 1003.1b-1993
scheduling interface.
Copyright (C) 1996-2017 Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -17,46 +17,19 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifndef __need_schedparam
+#ifndef _BITS_CPU_SET_H
+#define _BITS_CPU_SET_H 1
#ifndef _SCHED_H
-# error "Never include <bits/sched.h> directly; use <sched.h> instead."
+# error "Never include <bits/cpu-set.h> directly; use <sched.h> instead."
#endif
-
-/* Scheduling algorithms. */
-#define SCHED_OTHER 0
-#define SCHED_FIFO 1
-#define SCHED_RR 2
-
-/* Data structure to describe a process' schedulability. */
-struct sched_param
-{
- int __sched_priority;
-};
-
-#endif /* need schedparam */
-
-#if !defined __defined_schedparam \
- && (defined __need_schedparam || defined _SCHED_H)
-# define __defined_schedparam 1
-/* Data structure to describe a process' schedulability. */
-struct __sched_param
- {
- int __sched_priority;
- };
-# undef __need_schedparam
-#endif
-
-
-#if defined _SCHED_H && !defined __cpu_set_t_defined
-# define __cpu_set_t_defined
/* Size definition for CPU sets. */
# define __CPU_SETSIZE 1024
# define __NCPUBITS (8 * sizeof (__cpu_mask))
/* Type for array elements in 'cpu_set_t'. */
-typedef unsigned long int __cpu_mask;
+typedef __CPU_MASK_TYPE __cpu_mask;
/* Basic access functions. */
# define __CPUELT(cpu) ((cpu) / __NCPUBITS)
@@ -85,22 +58,22 @@ typedef struct
# define __CPU_SET_S(cpu, setsize, cpusetp) \
(__extension__ \
({ size_t __cpu = (cpu); \
- __cpu < 8 * (setsize) \
+ __cpu / 8 < (setsize) \
? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \
|= __CPUMASK (__cpu)) \
: 0; }))
# define __CPU_CLR_S(cpu, setsize, cpusetp) \
(__extension__ \
({ size_t __cpu = (cpu); \
- __cpu < 8 * (setsize) \
+ __cpu / 8 < (setsize) \
? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \
&= ~__CPUMASK (__cpu)) \
: 0; }))
# define __CPU_ISSET_S(cpu, setsize, cpusetp) \
(__extension__ \
({ size_t __cpu = (cpu); \
- __cpu < 8 * (setsize) \
- ? ((((const __cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \
+ __cpu / 8 < (setsize) \
+ ? ((((const __cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \
& __CPUMASK (__cpu))) != 0 \
: 0; }))
@@ -148,4 +121,4 @@ extern void __sched_cpufree (cpu_set_t *__set) __THROW;
__END_DECLS
-#endif
+#endif /* bits/cpu-set.h */
diff --git a/posix/sched.h b/posix/sched.h
index 7037ab3..d5cdac3 100644
--- a/posix/sched.h
+++ b/posix/sched.h
@@ -39,11 +39,13 @@ typedef __pid_t pid_t;
# define __pid_t_defined
#endif
-
/* Get system specific constant and data structure definitions. */
#include <bits/sched.h>
-/* Define the real names for the elements of `struct sched_param'. */
-#define sched_priority __sched_priority
+#include <bits/cpu-set.h>
+
+/* Backward compatibility. */
+#define sched_priority sched_priority
+#define __sched_priority sched_priority
__BEGIN_DECLS
diff --git a/sysdeps/unix/sysv/linux/bits/sched.h b/sysdeps/unix/sysv/linux/bits/sched.h
index cc0d698..6d23e94 100644
--- a/sysdeps/unix/sysv/linux/bits/sched.h
+++ b/sysdeps/unix/sysv/linux/bits/sched.h
@@ -17,20 +17,22 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifndef __need_schedparam
+#ifndef _BITS_SCHED_H
+#define _BITS_SCHED_H 1
#ifndef _SCHED_H
# error "Never include <bits/sched.h> directly; use <sched.h> instead."
#endif
-
/* Scheduling algorithms. */
#define SCHED_OTHER 0
#define SCHED_FIFO 1
#define SCHED_RR 2
#ifdef __USE_GNU
# define SCHED_BATCH 3
+# define SCHED_ISO 4
# define SCHED_IDLE 5
+# define SCHED_DEADLINE 6
# define SCHED_RESET_ON_FORK 0x40000000
#endif
@@ -69,11 +71,11 @@
# define CLONE_IO 0x80000000 /* Clone I/O context. */
#endif
-/* The official definition. */
+/* Data structure to describe a process' schedulability. */
struct sched_param
- {
- int __sched_priority;
- };
+{
+ int sched_priority;
+};
__BEGIN_DECLS
@@ -92,120 +94,6 @@ extern int sched_getcpu (void) __THROW;
extern int setns (int __fd, int __nstype) __THROW;
#endif
-
-__END_DECLS
-
-#endif /* need schedparam */
-
-#if !defined __defined_schedparam \
- && (defined __need_schedparam || defined _SCHED_H)
-# define __defined_schedparam 1
-/* Data structure to describe a process' schedulability. */
-struct __sched_param
- {
- int __sched_priority;
- };
-# undef __need_schedparam
-#endif
-
-
-#if defined _SCHED_H && !defined __cpu_set_t_defined
-# define __cpu_set_t_defined
-/* Size definition for CPU sets. */
-# define __CPU_SETSIZE 1024
-# define __NCPUBITS (8 * sizeof (__cpu_mask))
-
-/* Type for array elements in 'cpu_set_t'. */
-typedef __CPU_MASK_TYPE __cpu_mask;
-
-/* Basic access functions. */
-# define __CPUELT(cpu) ((cpu) / __NCPUBITS)
-# define __CPUMASK(cpu) ((__cpu_mask) 1 << ((cpu) % __NCPUBITS))
-
-/* Data structure to describe CPU mask. */
-typedef struct
-{
- __cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS];
-} cpu_set_t;
-
-/* Access functions for CPU masks. */
-# if __GNUC_PREREQ (2, 91)
-# define __CPU_ZERO_S(setsize, cpusetp) \
- do __builtin_memset (cpusetp, '\0', setsize); while (0)
-# else
-# define __CPU_ZERO_S(setsize, cpusetp) \
- do { \
- size_t __i; \
- size_t __imax = (setsize) / sizeof (__cpu_mask); \
- __cpu_mask *__bits = (cpusetp)->__bits; \
- for (__i = 0; __i < __imax; ++__i) \
- __bits[__i] = 0; \
- } while (0)
-# endif
-# define __CPU_SET_S(cpu, setsize, cpusetp) \
- (__extension__ \
- ({ size_t __cpu = (cpu); \
- __cpu / 8 < (setsize) \
- ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \
- |= __CPUMASK (__cpu)) \
- : 0; }))
-# define __CPU_CLR_S(cpu, setsize, cpusetp) \
- (__extension__ \
- ({ size_t __cpu = (cpu); \
- __cpu / 8 < (setsize) \
- ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \
- &= ~__CPUMASK (__cpu)) \
- : 0; }))
-# define __CPU_ISSET_S(cpu, setsize, cpusetp) \
- (__extension__ \
- ({ size_t __cpu = (cpu); \
- __cpu / 8 < (setsize) \
- ? ((((const __cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)] \
- & __CPUMASK (__cpu))) != 0 \
- : 0; }))
-
-# define __CPU_COUNT_S(setsize, cpusetp) \
- __sched_cpucount (setsize, cpusetp)
-
-# if __GNUC_PREREQ (2, 91)
-# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
- (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0)
-# else
-# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
- (__extension__ \
- ({ const __cpu_mask *__arr1 = (cpusetp1)->__bits; \
- const __cpu_mask *__arr2 = (cpusetp2)->__bits; \
- size_t __imax = (setsize) / sizeof (__cpu_mask); \
- size_t __i; \
- for (__i = 0; __i < __imax; ++__i) \
- if (__arr1[__i] != __arr2[__i]) \
- break; \
- __i == __imax; }))
-# endif
-
-# define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \
- (__extension__ \
- ({ cpu_set_t *__dest = (destset); \
- const __cpu_mask *__arr1 = (srcset1)->__bits; \
- const __cpu_mask *__arr2 = (srcset2)->__bits; \
- size_t __imax = (setsize) / sizeof (__cpu_mask); \
- size_t __i; \
- for (__i = 0; __i < __imax; ++__i) \
- ((__cpu_mask *) __dest->__bits)[__i] = __arr1[__i] op __arr2[__i]; \
- __dest; }))
-
-# define __CPU_ALLOC_SIZE(count) \
- ((((count) + __NCPUBITS - 1) / __NCPUBITS) * sizeof (__cpu_mask))
-# define __CPU_ALLOC(count) __sched_cpualloc (count)
-# define __CPU_FREE(cpuset) __sched_cpufree (cpuset)
-
-__BEGIN_DECLS
-
-extern int __sched_cpucount (size_t __setsize, const cpu_set_t *__setp)
- __THROW;
-extern cpu_set_t *__sched_cpualloc (size_t __count) __THROW __wur;
-extern void __sched_cpufree (cpu_set_t *__set) __THROW;
-
__END_DECLS
-#endif
+#endif /* bits/sched.h */
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=3ea6b40d44b494b0fb4706935310bc43a00f75a7
commit 3ea6b40d44b494b0fb4706935310bc43a00f75a7
Author: Zack Weinberg <zackw@panix.com>
Date: Wed Mar 22 10:55:38 2017 -0400
Remove __need_IOV_MAX and __need_FOPEN_MAX.
__need_FOPEN_MAX wasn't being used anywhere. __need_IOV_MAX was more
complicated; the basic deal is that sys/uio.h wants to define a
constant named UIO_MAXIOV and bits/xopen_lim.h wants to define a
constant named IOV_MAX, with the same meaning. For no apparent reason
this was being handled via bits/stdio_lim.h -- stdio.h is NOT supposed
to define IOV_MAX -- and some mess in Makerules. Also, bits/uio.h on
Linux was being used as a dumping ground for extension functions, and
there's no longer any good reason for the definition of struct iovec
itself to be system-dependent.
So now we have bits/uio_lim.h, which defines __IOV_MAX.
bits/xopen_lim.h and sys/uio.h use that to define their respective
constants. We also now have bits/types/struct_iovec.h, which is the
one true definition of struct iovec, used by sys/uio.h and
bits/fcntl-linux.h (another dumping ground for extension functions
which I am not tackling in this patch series), and sys/uio_ext.h,
which is the official Proper Home for extensions to sys/uio.h. And
stdio_lim.h doesn't define IOV_MAX at all.
* bits/uio_lim.h, sysdeps/unix/sysv/linux/bits/uio_lim.h
* misc/bits/types/struct_iovec.h, include/bits/types/struct_iovec.h
* sysdeps/generic/sys/uio_ext.h, sysdeps/unix/sysv/linux/sys/uio_ext.h:
New file.
* bits/uio.h, sysdeps/unix/sysv/linux/bits/uio.h: Delete file.
* include/bits/xopen_lim.h: Use bits/uio_lim.h to get the value
for IOV_MAX.
* misc/Makefile: Install sys/uio_ext.h, bits/uio_lim.h, and
bits/types/struct_iovec.h. Don't install bits/uio.h.
* misc/sys/uio.h: Use bits/types/struct_iovec.h to get the
definition of struct iovec, and bits/uio_lim.h to get the value
for UIO_MAXIOV. Under __USE_GNU, include sys/uio_ext.h.
* sysdeps/unix/sysv/linux/bits/fcntl-linux.h:
Use bits/types/struct_iovec.h to get the definition of struct
iovec. Use __ssize_t, not ssize_t, in function prototypes.
* stdio-common/stdio_lim.h.in: Remove logic for __need_FOPEN_MAX
and __need_IOV_MAX. Don't define IOV_MAX at all.
* Makerules (stdio_lim.h): Remove logic for setting IOV_MAX.
diff --git a/Makerules b/Makerules
index 7656c49..f23f5b7 100644
--- a/Makerules
+++ b/Makerules
@@ -1513,8 +1513,7 @@ $(stdio_lim:h=st): $(..)stdio-common/stdio_lim.h.in $(..)Rules \
$(common-objpfx)config.make
$(make-target-directory)
{ echo '#include "$(..)posix/bits/posix1_lim.h"'; \
- echo '#define _LIBC 1'; \
- echo '#include "$(..)misc/sys/uio.h"'; } | \
+ } | \
$(CC) -E -dM -MD -MP -MF $(@:st=dT) -MT '$(@:st=h) $(@:st=d)' \
$(CPPUNDEFS) $(+includes) -xc - -o $(@:st=hT)
sed $(sed-remove-objpfx) $(sed-remove-dotdot) \
@@ -1522,21 +1521,14 @@ $(stdio_lim:h=st): $(..)stdio-common/stdio_lim.h.in $(..)Rules \
mv -f $(@:st=dt) $(@:st=d)
fopen_max=`sed -n 's/^#define OPEN_MAX //1p' $(@:st=hT)`; \
filename_max=`sed -n 's/^#define PATH_MAX //1p' $(@:st=hT)`; \
- iov_max=`sed -n 's/^#define UIO_MAXIOV //p' $(@:st=hT)`; \
fopen_max=$${fopen_max:-16}; \
filename_max=$${filename_max:-1024}; \
- if [ -z "$$iov_max" ]; then \
- define_iov_max="# undef IOV_MAX"; \
- else \
- define_iov_max="# define IOV_MAX $$iov_max"; \
- fi; \
sed -e "s/@FOPEN_MAX@/$$fopen_max/" \
-e "s/@FILENAME_MAX@/$$filename_max/" \
-e "s/@L_tmpnam@/$(L_tmpnam)/" \
-e "s/@TMP_MAX@/$(TMP_MAX)/" \
-e "s/@L_ctermid@/$(L_ctermid)/" \
-e "s/@L_cuserid@/$(L_cuserid)/" \
- -e "s/@define_IOV_MAX@/$$define_iov_max/" \
$< > $(@:st=h.new)
$(move-if-change) $(@:st=h.new) $(@:st=h)
# Remove these last so that they can be examined if something went wrong.
diff --git a/bits/uio.h b/bits/uio_lim.h
similarity index 79%
copy from bits/uio.h
copy to bits/uio_lim.h
index 96a3a71..f6919f0 100644
--- a/bits/uio.h
+++ b/bits/uio_lim.h
@@ -15,9 +15,11 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifndef _SYS_UIO_H
-# error "Never include <bits/uio.h> directly; use <sys/uio.h> instead."
-#endif
+#ifndef _BITS_UIO_LIM_H
+#define _BITS_UIO_LIM_H 1
+/* Maximum length of the 'struct iovec' array in a single call to
+ readv or writev. If there is no limit, the macro is not defined. */
+#undef __IOV_MAX
-#include <bits/types/struct_iovec.h>
+#endif
diff --git a/include/bits/xopen_lim.h b/include/bits/xopen_lim.h
index 2ae7cb3..4c5e62f 100644
--- a/include/bits/xopen_lim.h
+++ b/include/bits/xopen_lim.h
@@ -29,9 +29,6 @@
#ifndef _XOPEN_LIM_H
#define _XOPEN_LIM_H 1
-#define __need_IOV_MAX
-#include <bits/stdio_lim.h>
-
/* We do not provide fixed values for
ARG_MAX Maximum length of argument to the `exec' function
@@ -60,10 +57,16 @@
*/
-/* Maximum number of `iovec' structures that one process has available
- for use with `readv' or writev'. */
+/* Maximum number of `iovec' structures that may be used in a single call
+ to `readv', `writev', etc. */
#define _XOPEN_IOV_MAX _POSIX_UIO_MAXIOV
+#include <bits/uio_lim.h>
+#ifdef __IOV_MAX
+# define IOV_MAX __IOV_MAX
+#else
+# undef IOV_MAX
+#endif
/* Maximum value of `digit' in calls to the `printf' and `scanf'
functions. We have no limit, so return a reasonable value. */
diff --git a/misc/Makefile b/misc/Makefile
index c393fa7..456b87f 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -23,7 +23,8 @@ subdir := misc
include ../Makeconfig
-headers := sys/uio.h bits/uio.h sys/ioctl.h bits/ioctls.h bits/ioctl-types.h \
+headers := sys/uio.h sys/uio_ext.h bits/uio_lim.h \
+ sys/ioctl.h bits/ioctls.h bits/ioctl-types.h \
sys/ptrace.h sys/file.h sys/dir.h sys/cdefs.h \
ar.h a.out.h libgen.h stab.h bits/stab.def sgtty.h \
ttyent.h paths.h sys/reboot.h \
diff --git a/misc/sys/uio.h b/misc/sys/uio.h
index 66c22f0..ece7611 100644
--- a/misc/sys/uio.h
+++ b/misc/sys/uio.h
@@ -19,15 +19,17 @@
#define _SYS_UIO_H 1
#include <features.h>
-
#include <sys/types.h>
+#include <bits/types/struct_iovec.h>
+#include <bits/uio_lim.h>
+#ifdef __IOV_MAX
+# define UIO_MAXIOV __IOV_MAX
+#else
+# undef UIO_MAXIOV
+#endif
__BEGIN_DECLS
-/* This file defines `struct iovec'. */
-#include <bits/uio.h>
-
-
/* Read data from file descriptor FD, and put the result in the
buffers described by IOVEC, which is a vector of COUNT 'struct iovec's.
The buffers are filled in the order specified.
@@ -160,4 +162,10 @@ extern ssize_t pwritev64v2 (int __fd, const struct iovec *__iodev,
__END_DECLS
+/* Some operating systems provide system-specific extensions to this
+ header. */
+#ifdef __USE_GNU
+# include <sys/uio_ext.h>
+#endif
+
#endif /* sys/uio.h */
diff --git a/stdio-common/stdio_lim.h.in b/stdio-common/stdio_lim.h.in
index 510bf00..5288907 100644
--- a/stdio-common/stdio_lim.h.in
+++ b/stdio-common/stdio_lim.h.in
@@ -15,28 +15,25 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#if !defined _STDIO_H && !defined __need_FOPEN_MAX && !defined __need_IOV_MAX
+#ifndef _BITS_STDIO_LIM_H
+#define _BITS_STDIO_LIM_H 1
+
+#ifndef _STDIO_H
# error "Never include <bits/stdio_lim.h> directly; use <stdio.h> instead."
#endif
-#ifdef _STDIO_H
-# define L_tmpnam @L_tmpnam@
-# define TMP_MAX @TMP_MAX@
-# define FILENAME_MAX @FILENAME_MAX@
+#define L_tmpnam @L_tmpnam@
+#define TMP_MAX @TMP_MAX@
+#define FILENAME_MAX @FILENAME_MAX@
-# ifdef __USE_POSIX
-# define L_ctermid @L_ctermid@
-# if !defined __USE_XOPEN2K || defined __USE_GNU
-# define L_cuserid @L_cuserid@
-# endif
+#ifdef __USE_POSIX
+# define L_ctermid @L_ctermid@
+# if !defined __USE_XOPEN2K || defined __USE_GNU
+# define L_cuserid @L_cuserid@
# endif
#endif
-#if defined __need_FOPEN_MAX || defined _STDIO_H
-# undef FOPEN_MAX
-# define FOPEN_MAX @FOPEN_MAX@
-#endif
+#undef FOPEN_MAX
+#define FOPEN_MAX @FOPEN_MAX@
-#if defined __need_IOV_MAX && !defined IOV_MAX
-@define_IOV_MAX@
-#endif
+#endif /* bits/stdio_lim.h */
diff --git a/bits/uio.h b/sysdeps/generic/sys/uio_ext.h
similarity index 77%
copy from bits/uio.h
copy to sysdeps/generic/sys/uio_ext.h
index 96a3a71..bd49003 100644
--- a/bits/uio.h
+++ b/sysdeps/generic/sys/uio_ext.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2017 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
@@ -15,9 +15,11 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifndef _SYS_UIO_H
-# error "Never include <bits/uio.h> directly; use <sys/uio.h> instead."
-#endif
+#ifndef _SYS_UIO_EXT_H
+#define _SYS_UIO_EXT_H 1
+#include <sys/uio.h>
-#include <bits/types/struct_iovec.h>
+/* This operating system does not extend sys/uio.h. */
+
+#endif /* sys/uio_ext.h */
diff --git a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
index 59d6631..f68b2f2 100644
--- a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
+++ b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
@@ -35,10 +35,10 @@
*/
#ifdef __USE_GNU
-# include <bits/uio.h>
+# include <bits/types/struct_iovec.h>
#endif
-/* open/fcntl. */
+/* open/fcntl. */
#define O_ACCMODE 0003
#define O_RDONLY 00
#define O_WRONLY 01
@@ -76,7 +76,7 @@
#endif
#ifndef __O_DIRECTORY
-# define __O_DIRECTORY 0200000
+# define __O_DIRECTORY 0200000
#endif
#ifndef __O_NOFOLLOW
# define __O_NOFOLLOW 0400000
@@ -104,7 +104,7 @@
# ifndef __USE_FILE_OFFSET64
# define F_GETLK 5 /* Get record locking info. */
# define F_SETLK 6 /* Set record locking info (non-blocking). */
-# define F_SETLKW 7 /* Set record locking info (blocking). */
+# define F_SETLKW 7 /* Set record locking info (blocking). */
# else
# define F_GETLK F_GETLK64 /* Get record locking info. */
# define F_SETLK F_SETLK64 /* Set record locking info (non-blocking).*/
@@ -114,7 +114,7 @@
#ifndef F_GETLK64
# define F_GETLK64 12 /* Get record locking info. */
# define F_SETLK64 13 /* Set record locking info (non-blocking). */
-# define F_SETLKW64 14 /* Set record locking info (blocking). */
+# define F_SETLKW64 14 /* Set record locking info (blocking). */
#endif
/* open file description locks.
@@ -139,27 +139,27 @@
#endif
#ifdef __USE_XOPEN2K8
-# define O_DIRECTORY __O_DIRECTORY /* Must be a directory. */
-# define O_NOFOLLOW __O_NOFOLLOW /* Do not follow links. */
+# define O_DIRECTORY __O_DIRECTORY /* Must be a directory. */
+# define O_NOFOLLOW __O_NOFOLLOW /* Do not follow links. */
# define O_CLOEXEC __O_CLOEXEC /* Set close_on_exec. */
#endif
#ifdef __USE_GNU
-# define O_DIRECT __O_DIRECT /* Direct disk access. */
+# define O_DIRECT __O_DIRECT /* Direct disk access. */
# define O_NOATIME __O_NOATIME /* Do not set atime. */
# define O_PATH __O_PATH /* Resolve pathname but do not open file. */
# define O_TMPFILE __O_TMPFILE /* Atomically create nameless file. */
#endif
-/* For now, Linux has no separate synchronicitiy options for read
+/* For now, Linux has no separate synchronicity options for read
operations. We define O_RSYNC therefore as the same as O_SYNC
since this is a superset. */
#if defined __USE_POSIX199309 || defined __USE_UNIX98
# define O_DSYNC __O_DSYNC /* Synchronize data. */
# if defined __O_RSYNC
-# define O_RSYNC __O_RSYNC /* Synchronize read operations. */
+# define O_RSYNC __O_RSYNC /* Synchronize read operations. */
# else
-# define O_RSYNC O_SYNC /* Synchronize read operations. */
+# define O_RSYNC O_SYNC /* Synchronize read operations. */
# endif
#endif
@@ -197,7 +197,7 @@
#endif
#ifdef __USE_GNU
-# define F_SETLEASE 1024 /* Set a lease. */
+# define F_SETLEASE 1024 /* Set a lease. */
# define F_GETLEASE 1025 /* Enquire what lease is active. */
# define F_NOTIFY 1026 /* Request notifications on a directory. */
# define F_SETPIPE_SZ 1031 /* Set pipe page size array. */
@@ -214,8 +214,8 @@
#ifndef F_RDLCK
/* For posix fcntl() and `l_type' field of a `struct flock' for lockf(). */
# define F_RDLCK 0 /* Read lock. */
-# define F_WRLCK 1 /* Write lock. */
-# define F_UNLCK 2 /* Remove lock. */
+# define F_WRLCK 1 /* Write lock. */
+# define F_UNLCK 2 /* Remove lock. */
#endif
@@ -236,9 +236,9 @@
#ifdef __USE_GNU
# define LOCK_MAND 32 /* This is a mandatory flock: */
-# define LOCK_READ 64 /* ... which allows concurrent read operations. */
+# define LOCK_READ 64 /* ... which allows concurrent read operations. */
# define LOCK_WRITE 128 /* ... which allows concurrent write operations. */
-# define LOCK_RW 192 /* ... Which allows concurrent read & write operations. */
+# define LOCK_RW 192 /* ... Which allows concurrent read & write operations. */
#endif
#ifdef __USE_GNU
@@ -260,7 +260,7 @@ enum __pid_type
F_OWNER_TID = 0, /* Kernel thread. */
F_OWNER_PID, /* Process. */
F_OWNER_PGRP, /* Process group. */
- F_OWNER_GID = F_OWNER_PGRP /* Alternative, obsolete name. */
+ F_OWNER_GID = F_OWNER_PGRP /* Alternative, obsolete name. */
};
/* Structure to use with F_GETOWN_EX and F_SETOWN_EX. */
@@ -289,7 +289,7 @@ struct f_owner_ex
#ifdef __USE_XOPEN2K
# define POSIX_FADV_NORMAL 0 /* No further special treatment. */
# define POSIX_FADV_RANDOM 1 /* Expect random page references. */
-# define POSIX_FADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define POSIX_FADV_SEQUENTIAL 2 /* Expect sequential page references. */
# define POSIX_FADV_WILLNEED 3 /* Will need these pages. */
# define POSIX_FADV_DONTNEED __POSIX_FADV_DONTNEED /* Don't need these pages. */
# define POSIX_FADV_NOREUSE __POSIX_FADV_NOREUSE /* Data will be accessed once. */
@@ -312,9 +312,9 @@ struct f_owner_ex
# define SPLICE_F_MOVE 1 /* Move pages instead of copying. */
# define SPLICE_F_NONBLOCK 2 /* Don't block on the pipe splicing
(but we may still block on the fd
- we splice from/to). */
+ we splice from/to). */
# define SPLICE_F_MORE 4 /* Expect more data. */
-# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
+# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
/* Flags for fallocate. */
@@ -339,7 +339,7 @@ __BEGIN_DECLS
#ifdef __USE_GNU
/* Provide kernel hint to read ahead. */
-extern ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
+extern __ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
__THROW;
@@ -355,23 +355,23 @@ extern int sync_file_range (int __fd, __off64_t __offset, __off64_t __count,
This function is a possible cancellation point and therefore not
marked with __THROW. */
-extern ssize_t vmsplice (int __fdout, const struct iovec *__iov,
- size_t __count, unsigned int __flags);
+extern __ssize_t vmsplice (int __fdout, const struct iovec *__iov,
+ size_t __count, unsigned int __flags);
/* Splice two files together.
This function is a possible cancellation point and therefore not
marked with __THROW. */
-extern ssize_t splice (int __fdin, __off64_t *__offin, int __fdout,
- __off64_t *__offout, size_t __len,
- unsigned int __flags);
+extern __ssize_t splice (int __fdin, __off64_t *__offin, int __fdout,
+ __off64_t *__offout, size_t __len,
+ unsigned int __flags);
/* In-kernel implementation of tee for pipe buffers.
This function is a possible cancellation point and therefore not
marked with __THROW. */
-extern ssize_t tee (int __fdin, int __fdout, size_t __len,
- unsigned int __flags);
+extern __ssize_t tee (int __fdin, int __fdout, size_t __len,
+ unsigned int __flags);
/* Reserve storage for the data of the file associated with FD.
diff --git a/sysdeps/unix/sysv/linux/bits/uio.h b/sysdeps/unix/sysv/linux/bits/uio.h
deleted file mode 100644
index d5701f8..0000000
--- a/sysdeps/unix/sysv/linux/bits/uio.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Copyright (C) 1996-2017 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/>. */
-
-#if !defined _SYS_UIO_H && !defined _FCNTL_H
-# error "Never include <bits/uio.h> directly; use <sys/uio.h> instead."
-#endif
-
-#ifndef _BITS_UIO_H
-#define _BITS_UIO_H 1
-
-#include <sys/types.h>
-
-
-/* We should normally use the Linux kernel header file to define this
- type and macros but this calls for trouble because of the header
- includes other kernel headers. */
-
-/* Size of object which can be written atomically.
-
- This macro has different values in different kernel versions. The
- latest versions of the kernel use 1024 and this is good choice. Since
- the C library implementation of readv/writev is able to emulate the
- functionality even if the currently running kernel does not support
- this large value the readv/writev call will not fail because of this. */
-#define UIO_MAXIOV 1024
-
-
-#include <bits/types/struct_iovec.h>
-
-#endif
-
-
-#ifdef __USE_GNU
-# if defined _SYS_UIO_H && !defined _BITS_UIO_H_FOR_SYS_UIO_H
-# define _BITS_UIO_H_FOR_SYS_UIO_H 1
-
-__BEGIN_DECLS
-
-/* Read from another process' address space. */
-extern ssize_t process_vm_readv (pid_t __pid, const struct iovec *__lvec,
- unsigned long int __liovcnt,
- const struct iovec *__rvec,
- unsigned long int __riovcnt,
- unsigned long int __flags)
- __THROW;
-
-/* Write to another process' address space. */
-extern ssize_t process_vm_writev (pid_t __pid, const struct iovec *__lvec,
- unsigned long int __liovcnt,
- const struct iovec *__rvec,
- unsigned long int __riovcnt,
- unsigned long int __flags)
- __THROW;
-
-__END_DECLS
-
-# endif
-
-/* Flags for preadv2/pwritev2: */
-#define RWF_HIPRI 0x00000001 /* High priority request. */
-#define RWF_DSYNC 0x00000002 /* per-IO O_DSYNC. */
-#define RWF_SYNC 0x00000004 /* per-IO O_SYNC. */
-
-#endif
diff --git a/bits/uio.h b/sysdeps/unix/sysv/linux/bits/uio_lim.h
similarity index 60%
rename from bits/uio.h
rename to sysdeps/unix/sysv/linux/bits/uio_lim.h
index 96a3a71..7c69b93 100644
--- a/bits/uio.h
+++ b/sysdeps/unix/sysv/linux/bits/uio_lim.h
@@ -15,9 +15,17 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifndef _SYS_UIO_H
-# error "Never include <bits/uio.h> directly; use <sys/uio.h> instead."
-#endif
+#ifndef _BITS_UIO_LIM_H
+#define _BITS_UIO_LIM_H 1
+
+/* Maximum length of the 'struct iovec' array in a single call to
+ readv or writev.
+ This macro has different values in different kernel versions. The
+ latest versions of the kernel use 1024 and this is good choice. Since
+ the C library implementation of readv/writev is able to emulate the
+ functionality even if the currently running kernel does not support
+ this large value the readv/writev call will not fail because of this. */
+#define __IOV_MAX 1024
-#include <bits/types/struct_iovec.h>
+#endif
diff --git a/sysdeps/unix/sysv/linux/sys/uio_ext.h b/sysdeps/unix/sysv/linux/sys/uio_ext.h
new file mode 100644
index 0000000..09e68af
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sys/uio_ext.h
@@ -0,0 +1,49 @@
+/* Copyright (C) 1996-2017 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_UIO_EXT_H
+#define _SYS_UIO_EXT_H 1
+
+#include <sys/uio.h>
+
+__BEGIN_DECLS
+
+/* Read from another process' address space. */
+extern ssize_t process_vm_readv (pid_t __pid, const struct iovec *__lvec,
+ unsigned long int __liovcnt,
+ const struct iovec *__rvec,
+ unsigned long int __riovcnt,
+ unsigned long int __flags)
+ __THROW;
+
+/* Write to another process' address space. */
+extern ssize_t process_vm_writev (pid_t __pid, const struct iovec *__lvec,
+ unsigned long int __liovcnt,
+ const struct iovec *__rvec,
+ unsigned long int __riovcnt,
+ unsigned long int __flags)
+ __THROW;
+
+
+/* Flags for preadv2/pwritev2: */
+#define RWF_HIPRI 0x00000001 /* High priority request. */
+#define RWF_DSYNC 0x00000002 /* per-IO O_DSYNC. */
+#define RWF_SYNC 0x00000004 /* per-IO O_SYNC. */
+
+__END_DECLS
+
+#endif /* sys/uio_ext.h */
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=b943a9d4870cb9bf8d1933b027639ef18ad93d24
commit b943a9d4870cb9bf8d1933b027639ef18ad93d24
Author: Zack Weinberg <zackw@panix.com>
Date: Sun Nov 20 23:00:02 2016 -0500
Remove __need macros from stdio.h and wchar.h.
wint_t is a little finicky because it might be defined by stddef.h, which
belongs to the compiler.
In addition to the _types_, a bunch of other declarations shared between
wctype.h and wchar.h are factored out to their own header.
* libio/bits/types/FILE.h, libio/bits/types/__FILE.h
* wcsmbs/bits/types/mbstate_t.h, wcsmbs/bits/types/__mbstate_t.h
* wcsmbs/bits/types/wint_t.h: New single-type definition files.
* wctype/bits/wctype-wchar.h: New file holding declarations shared
between wctype.h and wchar.h.
* libio/Makefile, wcsmbs/Makefile, wctype/Makefile:
Install them.
* include/bits/types/FILE.h, include/bits/types/__FILE.h
* include/bits/types/mbstate_t.h, include/bits/types/__mbstate_t.h
* include/bits/types/wint_t.h, include/bits/wcsmbs-wchar.h:
New wrappers.
* include/stdio.h, include/wchar.h, include/wctype.h:
No need to handle __need macros.
* grp/grp.h, gshadow/gshadow.h, hurd/hurd.h, iconv/gconv.h
* libio/stdio.h, mach/mach.h, misc/mntent.h, pwd/pwd.h
* shadow/shadow.h, stdio-common/printf.h, wcsmbs/uchar.h
* wcsmbs/wchar.h, wctype/wctype.h
* sysdeps/generic/_G_config.h, sysdeps/unix/sysv/linux/_G_config.h
Use the new files instead of __need macros.
diff --git a/grp/grp.h b/grp/grp.h
index d829e4c..0f833ff 100644
--- a/grp/grp.h
+++ b/grp/grp.h
@@ -49,8 +49,7 @@ struct group
#ifdef __USE_MISC
-# define __need_FILE
-# include <stdio.h>
+# include <bits/types/FILE.h>
#endif
diff --git a/gshadow/gshadow.h b/gshadow/gshadow.h
index a93b3bd..70ab83d 100644
--- a/gshadow/gshadow.h
+++ b/gshadow/gshadow.h
@@ -21,11 +21,9 @@
#define _GSHADOW_H 1
#include <features.h>
-
#include <paths.h>
+#include <bits/types/FILE.h>
-#define __need_FILE
-#include <stdio.h>
#define __need_size_t
#include <stddef.h>
diff --git a/hurd/hurd.h b/hurd/hurd.h
index e51d3c5..3caa69f 100644
--- a/hurd/hurd.h
+++ b/hurd/hurd.h
@@ -141,8 +141,7 @@ extern struct mutex _hurd_brk_lock;
extern int _hurd_set_brk (vm_address_t newbrk);
-#define __need_FILE
-#include <stdio.h>
+#include <bits/types/FILE.h>
/* Calls to get and set basic ports. */
diff --git a/iconv/gconv.h b/iconv/gconv.h
index 71d91a0..db678db 100644
--- a/iconv/gconv.h
+++ b/iconv/gconv.h
@@ -23,9 +23,9 @@
#define _GCONV_H 1
#include <features.h>
-#define __need_mbstate_t
-#define __need_wint_t
-#include <wchar.h>
+#include <bits/types/__mbstate_t.h>
+#include <bits/types/wint_t.h>
+
#define __need_size_t
#define __need_wchar_t
#include <stddef.h>
diff --git a/include/bits/types/FILE.h b/include/bits/types/FILE.h
new file mode 100644
index 0000000..09b599b
--- /dev/null
+++ b/include/bits/types/FILE.h
@@ -0,0 +1 @@
+#include <libio/bits/types/FILE.h>
diff --git a/include/bits/types/__FILE.h b/include/bits/types/__FILE.h
new file mode 100644
index 0000000..236f60b
--- /dev/null
+++ b/include/bits/types/__FILE.h
@@ -0,0 +1 @@
+#include <libio/bits/types/__FILE.h>
diff --git a/include/bits/types/__mbstate_t.h b/include/bits/types/__mbstate_t.h
new file mode 100644
index 0000000..13e764e
--- /dev/null
+++ b/include/bits/types/__mbstate_t.h
@@ -0,0 +1 @@
+#include <wcsmbs/bits/types/__mbstate_t.h>
diff --git a/include/bits/types/mbstate_t.h b/include/bits/types/mbstate_t.h
new file mode 100644
index 0000000..99ec08a
--- /dev/null
+++ b/include/bits/types/mbstate_t.h
@@ -0,0 +1 @@
+#include <wcsmbs/bits/types/mbstate_t.h>
diff --git a/include/bits/types/wint_t.h b/include/bits/types/wint_t.h
new file mode 100644
index 0000000..f1e373d
--- /dev/null
+++ b/include/bits/types/wint_t.h
@@ -0,0 +1 @@
+#include <wcsmbs/bits/types/wint_t.h>
diff --git a/include/bits/wctype-wchar.h b/include/bits/wctype-wchar.h
new file mode 100644
index 0000000..8273cd7
--- /dev/null
+++ b/include/bits/wctype-wchar.h
@@ -0,0 +1 @@
+#include <wctype/bits/wctype-wchar.h>
diff --git a/include/stdio.h b/include/stdio.h
index ed6593b..f68f633 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -1,8 +1,6 @@
#ifndef _STDIO_H
-# if defined _ISOMAC || defined __need_FILE || defined __need___FILE
-# include <libio/stdio.h>
-# else
-# include <libio/stdio.h>
+# include <libio/stdio.h>
+# ifndef _ISOMAC
/* Now define the internal interfaces. */
@@ -71,11 +69,11 @@ libc_hidden_proto (__isoc99_vfscanf)
extern FILE *__new_tmpfile (void);
extern FILE *__old_tmpfile (void);
-
-
# define __need_size_t
-# define __need_wint_t
# include <stddef.h>
+
+# include <bits/types/wint_t.h>
+
/* Generate a unique file name (and possibly open it). */
extern int __path_search (char *__tmpl, size_t __tmpl_len,
const char *__dir, const char *__pfx,
@@ -183,5 +181,5 @@ libc_hidden_proto (__obstack_vprintf_chk)
extern FILE * __fmemopen (void *buf, size_t len, const char *mode);
libc_hidden_proto (__fmemopen)
-# endif
-#endif
+# endif /* not _ISOMAC */
+#endif /* stdio.h */
diff --git a/include/wchar.h b/include/wchar.h
index e2579a1..6a7af27 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -1,8 +1,6 @@
#ifndef _WCHAR_H
-#include <wcsmbs/wchar.h>
-
+# include <wcsmbs/wchar.h>
# ifndef _ISOMAC
-# ifdef _WCHAR_H
extern __typeof (wcscasecmp_l) __wcscasecmp_l;
extern __typeof (wcsncasecmp_l) __wcsncasecmp_l;
@@ -216,10 +214,4 @@ extern size_t __mbsrtowcs_l (wchar_t *dst, const char **src, size_t len,
# define __mbsinit(state) ((state)->__count == 0)
# endif
-# endif
#endif
-
-/* Undefine all __need_* constants in case we are included to get those
- constants but the whole file was already read. */
-#undef __need_mbstate_t
-#undef __need_wint_t
diff --git a/include/wctype.h b/include/wctype.h
index a71b103..5fd3f86 100644
--- a/include/wctype.h
+++ b/include/wctype.h
@@ -1,30 +1,7 @@
#ifndef _WCTYPE_H
+#include <wctype/wctype.h>
#ifndef _ISOMAC
-/* We try to get wint_t from <stddef.h>, but not all GCC versions define it
- there. So define it ourselves if it remains undefined. */
-# define __need_wint_t
-# include <stddef.h>
-# ifndef _WINT_T
-/* Integral type unchanged by default argument promotions that can
- hold any value corresponding to members of the extended character
- set, as well as at least one value that does not correspond to any
- member of the extended character set. */
-# define _WINT_T
-typedef unsigned int wint_t;
-# endif
-
-/* Need to repeat these prototypes here, as wctype/wctype.h defines all
- these as macros and thus we couldn't add libc_hidden_proto. */
-
-extern int iswalpha (wint_t __wc);
-extern int iswalnum (wint_t __wc);
-extern int iswdigit (wint_t __wc);
-extern int iswlower (wint_t __wc);
-extern int iswspace (wint_t __wc);
-extern int iswxdigit (wint_t __wc);
-extern wint_t towlower (wint_t __wc);
-extern wint_t towupper (wint_t __wc);
libc_hidden_proto (iswalpha)
libc_hidden_proto (iswalnum)
@@ -34,11 +11,7 @@ libc_hidden_proto (iswspace)
libc_hidden_proto (iswxdigit)
libc_hidden_proto (towlower)
libc_hidden_proto (towupper)
-#endif
-
-#include <wctype/wctype.h>
-#ifndef _ISOMAC
/* Internal interfaces. */
extern int __iswspace (wint_t __wc);
extern int __iswctype (wint_t __wc, wctype_t __desc);
diff --git a/libio/Makefile b/libio/Makefile
index be252f7..a002a33 100644
--- a/libio/Makefile
+++ b/libio/Makefile
@@ -23,7 +23,8 @@ subdir := libio
include ../Makeconfig
headers := stdio.h libio.h _G_config.h bits/stdio.h \
- bits/sys_errlist.h bits/stdio2.h bits/stdio-ldbl.h bits/libio-ldbl.h
+ bits/sys_errlist.h bits/stdio2.h bits/stdio-ldbl.h bits/libio-ldbl.h \
+ bits/types/FILE.h bits/types/__FILE.h
routines := \
filedoalloc iofclose iofdopen iofflush iofgetpos iofgets iofopen \
diff --git a/libio/bits/types/FILE.h b/libio/bits/types/FILE.h
new file mode 100644
index 0000000..f268263
--- /dev/null
+++ b/libio/bits/types/FILE.h
@@ -0,0 +1,9 @@
+#ifndef __FILE_defined
+#define __FILE_defined 1
+
+struct _IO_FILE;
+
+/* The opaque type of streams. This is the definition used elsewhere. */
+typedef struct _IO_FILE FILE;
+
+#endif
diff --git a/libio/bits/types/__FILE.h b/libio/bits/types/__FILE.h
new file mode 100644
index 0000000..06dd79b
--- /dev/null
+++ b/libio/bits/types/__FILE.h
@@ -0,0 +1,7 @@
+#ifndef ____FILE_defined
+#define ____FILE_defined 1
+
+struct _IO_FILE;
+typedef struct _IO_FILE __FILE;
+
+#endif
diff --git a/libio/stdio.h b/libio/stdio.h
index 422f39d..47490c8 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -21,48 +21,21 @@
*/
#ifndef _STDIO_H
+#define _STDIO_H 1
-#if !defined __need_FILE && !defined __need___FILE
-# define _STDIO_H 1
-# define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
-# include <bits/libc-header-start.h>
+#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+#include <bits/libc-header-start.h>
__BEGIN_DECLS
-# define __need_size_t
-# define __need_NULL
-# include <stddef.h>
+#define __need_size_t
+#define __need_NULL
+#include <stddef.h>
-# include <bits/types.h>
-# define __need_FILE
-# define __need___FILE
-#endif /* Don't need FILE. */
+#include <bits/types.h>
+#include <bits/types/__FILE.h>
+#include <bits/types/FILE.h>
-
-#if !defined __FILE_defined && defined __need_FILE
-
-/* Define outside of namespace so the C++ is happy. */
-struct _IO_FILE;
-
-/* The opaque type of streams. This is the definition used elsewhere. */
-typedef struct _IO_FILE FILE;
-
-# define __FILE_defined 1
-#endif /* FILE not defined. */
-#undef __need_FILE
-
-
-#if !defined ____FILE_defined && defined __need___FILE
-
-/* The opaque type of streams. This is the definition used elsewhere. */
-typedef struct _IO_FILE __FILE;
-
-# define ____FILE_defined 1
-#endif /* __FILE not defined. */
-#undef __need___FILE
-
-
-#ifdef _STDIO_H
#define _STDIO_USES_IOSTREAM
#include <libio.h>
@@ -895,5 +868,3 @@ extern void funlockfile (FILE *__stream) __THROW;
__END_DECLS
#endif /* <stdio.h> included. */
-
-#endif /* !_STDIO_H */
diff --git a/mach/mach.h b/mach/mach.h
index 3ceb7b6..42605af 100644
--- a/mach/mach.h
+++ b/mach/mach.h
@@ -20,10 +20,8 @@
#define _MACH_H 1
-/* We must include this before using __need_FILE with <stdio.h> below. */
#include <features.h>
-
/* Get the basic types used by Mach. */
#include <mach/mach_types.h>
@@ -79,9 +77,7 @@ extern void
__mach_msg_destroy (mach_msg_header_t *msg),
mach_msg_destroy (mach_msg_header_t *msg);
-
-#define __need_FILE
-#include <stdio.h>
+#include <bits/types/FILE.h>
/* Open a stream on a Mach device. */
extern FILE *mach_open_devstream (mach_port_t device_port, const char *mode);
diff --git a/misc/mntent.h b/misc/mntent.h
index 039a454..e54e165 100644
--- a/misc/mntent.h
+++ b/misc/mntent.h
@@ -20,10 +20,8 @@
#define _MNTENT_H 1
#include <features.h>
-#define __need_FILE
-#include <stdio.h>
#include <paths.h>
-
+#include <bits/types/FILE.h>
/* File listing canonical interesting mount points. */
#define MNTTAB _PATH_MNTTAB /* Deprecated alias. */
diff --git a/pwd/pwd.h b/pwd/pwd.h
index fabd950..100f33e 100644
--- a/pwd/pwd.h
+++ b/pwd/pwd.h
@@ -59,8 +59,7 @@ struct passwd
#ifdef __USE_MISC
-# define __need_FILE
-# include <stdio.h>
+# include <bits/types/FILE.h>
#endif
diff --git a/shadow/shadow.h b/shadow/shadow.h
index 855fe63..f55c946 100644
--- a/shadow/shadow.h
+++ b/shadow/shadow.h
@@ -24,11 +24,11 @@
#include <paths.h>
-#define __need_FILE
-#include <stdio.h>
#define __need_size_t
#include <stddef.h>
+#include <bits/types/FILE.h>
+
/* Paths to the user database files. */
#define SHADOW _PATH_SHADOW
diff --git a/stdio-common/printf.h b/stdio-common/printf.h
index 5d82e8d..b90fae6 100644
--- a/stdio-common/printf.h
+++ b/stdio-common/printf.h
@@ -22,11 +22,12 @@
__BEGIN_DECLS
-#define __need_FILE
-#include <stdio.h>
+#include <bits/types/FILE.h>
+
#define __need_size_t
#define __need_wchar_t
#include <stddef.h>
+
#include <stdarg.h>
diff --git a/sysdeps/generic/_G_config.h b/sysdeps/generic/_G_config.h
index f44a3d4..c49eed3 100644
--- a/sysdeps/generic/_G_config.h
+++ b/sysdeps/generic/_G_config.h
@@ -13,11 +13,12 @@
#endif
#define __need_NULL
#include <stddef.h>
-#define __need_mbstate_t
+
+#include <bits/types/__mbstate_t.h>
#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# define __need_wint_t
+# include <bits/types/wint_t.h>
#endif
-#include <wchar.h>
+
typedef struct
{
__off_t __pos;
diff --git a/sysdeps/unix/sysv/linux/_G_config.h b/sysdeps/unix/sysv/linux/_G_config.h
index abec245..3bc6cfd 100644
--- a/sysdeps/unix/sysv/linux/_G_config.h
+++ b/sysdeps/unix/sysv/linux/_G_config.h
@@ -13,11 +13,12 @@
#endif
#define __need_NULL
#include <stddef.h>
-#define __need_mbstate_t
+
+#include <bits/types/__mbstate_t.h>
#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# define __need_wint_t
+# include <bits/types/wint_t.h>
#endif
-#include <wchar.h>
+
typedef struct
{
__off_t __pos;
diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
index d6b214b..08b1de1 100644
--- a/wcsmbs/Makefile
+++ b/wcsmbs/Makefile
@@ -22,7 +22,8 @@ subdir := wcsmbs
include ../Makeconfig
-headers := wchar.h bits/wchar.h bits/wchar2.h bits/wchar-ldbl.h uchar.h
+headers := wchar.h bits/wchar.h bits/wchar2.h bits/wchar-ldbl.h uchar.h \
+ bits/types/__mbstate_t.h bits/types/mbstate_t.h bits/types/wint_t.h
routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
wcsncmp wcsncpy wcspbrk wcsrchr wcsspn wcstok wcsstr wmemchr \
diff --git a/wcsmbs/bits/types/__mbstate_t.h b/wcsmbs/bits/types/__mbstate_t.h
new file mode 100644
index 0000000..1d8a4e2
--- /dev/null
+++ b/wcsmbs/bits/types/__mbstate_t.h
@@ -0,0 +1,23 @@
+#ifndef ____mbstate_t_defined
+#define ____mbstate_t_defined 1
+
+/* Integral type unchanged by default argument promotions that can
+ hold any value corresponding to members of the extended character
+ set, as well as at least one value that does not correspond to any
+ member of the extended character set. */
+#ifndef __WINT_TYPE__
+# define __WINT_TYPE__ unsigned int
+#endif
+
+/* Conversion state information. */
+typedef struct
+{
+ int __count;
+ union
+ {
+ __WINT_TYPE__ __wch;
+ char __wchb[4];
+ } __value; /* Value so far. */
+} __mbstate_t;
+
+#endif
diff --git a/wcsmbs/bits/types/mbstate_t.h b/wcsmbs/bits/types/mbstate_t.h
new file mode 100644
index 0000000..8d1baa5
--- /dev/null
+++ b/wcsmbs/bits/types/mbstate_t.h
@@ -0,0 +1,8 @@
+#ifndef __mbstate_t_defined
+#define __mbstate_t_defined 1
+
+#include <bits/types/__mbstate_t.h>
+
+typedef __mbstate_t mbstate_t;
+
+#endif
diff --git a/wcsmbs/bits/types/wint_t.h b/wcsmbs/bits/types/wint_t.h
new file mode 100644
index 0000000..fbd63db
--- /dev/null
+++ b/wcsmbs/bits/types/wint_t.h
@@ -0,0 +1,23 @@
+#ifndef __wint_t_defined
+#define __wint_t_defined 1
+
+/* Some versions of stddef.h provide wint_t, even though neither the
+ C nor C++ standards, nor POSIX, specifies this. We assume that
+ stddef.h will define the macro _WINT_T if and only if it provides
+ wint_t, and conversely, that it will avoid providing wint_t if
+ _WINT_T is already defined. */
+#ifndef _WINT_T
+#define _WINT_T 1
+
+/* Integral type unchanged by default argument promotions that can
+ hold any value corresponding to members of the extended character
+ set, as well as at least one value that does not correspond to any
+ member of the extended character set. */
+#ifndef __WINT_TYPE__
+# define __WINT_TYPE__ unsigned int
+#endif
+
+typedef __WINT_TYPE__ wint_t;
+
+#endif /* _WINT_T */
+#endif /* bits/types/wint_t.h */
diff --git a/wcsmbs/uchar.h b/wcsmbs/uchar.h
index a656982..f937519 100644
--- a/wcsmbs/uchar.h
+++ b/wcsmbs/uchar.h
@@ -27,15 +27,8 @@
#define __need_size_t
#include <stddef.h>
-#define __need_mbstate_t
-#include <wchar.h>
-
-#ifndef __mbstate_t_defined
-/* Public type. */
-typedef __mbstate_t mbstate_t;
-# define __mbstate_t_defined 1
-#endif
+#include <bits/types/mbstate_t.h>
#if defined __GNUC__ && !defined __USE_ISOCXX11
/* Define the 16-bit and 32-bit character types. Use the information
diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
index 79be9fc..d389428 100644
--- a/wcsmbs/wchar.h
+++ b/wcsmbs/wchar.h
@@ -21,82 +21,32 @@
*/
#ifndef _WCHAR_H
+#define _WCHAR_H 1
-#if !defined __need_mbstate_t && !defined __need_wint_t
-# define _WCHAR_H 1
-# define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
-# include <bits/libc-header-start.h>
-#endif
+#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+#include <bits/libc-header-start.h>
-#ifdef _WCHAR_H
-/* Get FILE definition. */
-# define __need___FILE
-# if defined __USE_UNIX98 || defined __USE_XOPEN2K
-# define __need_FILE
-# endif
-# include <stdio.h>
-/* Get va_list definition. */
-# define __need___va_list
-# include <stdarg.h>
+#define __need_size_t
+#define __need_wchar_t
+#define __need_NULL
+#include <stddef.h>
-# include <bits/wchar.h>
+#define __need___va_list
+#include <stdarg.h>
-/* Get size_t, wchar_t, wint_t and NULL from <stddef.h>. */
-# define __need_size_t
-# define __need_wchar_t
-# define __need_NULL
-#endif
-#if defined _WCHAR_H || defined __need_wint_t || !defined __WINT_TYPE__
-# undef __need_wint_t
-# define __need_wint_t
-# include <stddef.h>
-
-/* We try to get wint_t from <stddef.h>, but not all GCC versions define it
- there. So define it ourselves if it remains undefined. */
-# ifndef _WINT_T
-/* Integral type unchanged by default argument promotions that can
- hold any value corresponding to members of the extended character
- set, as well as at least one value that does not correspond to any
- member of the extended character set. */
-# define _WINT_T
-typedef unsigned int wint_t;
-# endif
+#include <bits/wchar.h>
+#include <bits/types/wint_t.h>
+#include <bits/types/mbstate_t.h>
+#include <bits/types/__FILE.h>
-/* Tell the caller that we provide correct C++ prototypes. */
-# if defined __cplusplus && __GNUC_PREREQ (4, 4)
-# define __CORRECT_ISO_CPP_WCHAR_H_PROTO
-# endif
+#if defined __USE_UNIX98 || defined __USE_XOPEN2K
+# include <bits/types/FILE.h>
#endif
-#if (defined _WCHAR_H || defined __need_mbstate_t) && !defined ____mbstate_t_defined
-# define ____mbstate_t_defined 1
-/* Conversion state information. */
-typedef struct
-{
- int __count;
- union
- {
-# ifdef __WINT_TYPE__
- __WINT_TYPE__ __wch;
-# else
- wint_t __wch;
-# endif
- char __wchb[4];
- } __value; /* Value so far. */
-} __mbstate_t;
+/* Tell the caller that we provide correct C++ prototypes. */
+#if defined __cplusplus && __GNUC_PREREQ (4, 4)
+# define __CORRECT_ISO_CPP_WCHAR_H_PROTO
#endif
-#undef __need_mbstate_t
-
-
-/* The rest of the file is only used if used if __need_mbstate_t is not
- defined. */
-#ifdef _WCHAR_H
-
-# ifndef __mbstate_t_defined
-/* Public type. */
-typedef __mbstate_t mbstate_t;
-# define __mbstate_t_defined 1
-# endif
#ifndef WCHAR_MIN
/* These constants might also be defined in <inttypes.h>. */
@@ -108,13 +58,18 @@ typedef __mbstate_t mbstate_t;
# define WEOF (0xffffffffu)
#endif
-/* For XPG4 compliance we have to define the stuff from <wctype.h> here
- as well. */
-#if defined __USE_XOPEN && !defined __USE_UNIX98
-# include <wctype.h>
+/* All versions of XPG prior to the publication of ISO C99 required
+ the bulk of <wctype.h>'s declarations to appear in this header
+ (because <wctype.h> did not exist prior to C99). In POSIX.1-2001
+ those declarations were marked as XSI extensions; in -2008 they
+ were additionally marked as obsolescent. _GNU_SOURCE mode
+ anticipates the removal of these declarations in the next revision
+ of POSIX. */
+#if (defined __USE_XOPEN && !defined __USE_GNU \
+ && !(defined __USE_XOPEN2K && !defined __USE_XOPEN2KXSI))
+# include <bits/wctype-wchar.h>
#endif
-
__BEGIN_DECLS
/* This incomplete type is defined in <time.h> but needed here because
@@ -823,17 +778,6 @@ extern size_t wcsftime_l (wchar_t *__restrict __s, size_t __maxsize,
__locale_t __loc) __THROW;
# endif
-/* The X/Open standard demands that most of the functions defined in
- the <wctype.h> header must also appear here. This is probably
- because some X/Open members wrote their implementation before the
- ISO C standard was published and introduced the better solution.
- We have to provide these definitions for compliance reasons but we
- do this nonsense only if really necessary. */
-#if defined __USE_UNIX98 && !defined __USE_GNU
-# define __need_iswxxx
-# include <wctype.h>
-#endif
-
/* Define some macros helping to catch buffer overflows. */
#if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function
# include <bits/wchar2.h>
@@ -845,11 +789,4 @@ extern size_t wcsftime_l (wchar_t *__restrict __s, size_t __maxsize,
__END_DECLS
-#endif /* _WCHAR_H defined */
-
#endif /* wchar.h */
-
-/* Undefine all __need_* constants in case we are included to get those
- constants but the whole file was already read. */
-#undef __need_mbstate_t
-#undef __need_wint_t
diff --git a/wctype/Makefile b/wctype/Makefile
index 18756c3..2cb2a6d 100644
--- a/wctype/Makefile
+++ b/wctype/Makefile
@@ -22,7 +22,7 @@ subdir := wctype
include ../Makeconfig
-headers := wctype.h
+headers := wctype.h bits/wctype-wchar.h
routines := wcfuncs wctype iswctype wctrans towctrans \
wcfuncs_l wctype_l iswctype_l wctrans_l towctrans_l
diff --git a/wctype/bits/wctype-wchar.h b/wctype/bits/wctype-wchar.h
new file mode 100644
index 0000000..df5fd03
--- /dev/null
+++ b/wctype/bits/wctype-wchar.h
@@ -0,0 +1,173 @@
+/* Copyright (C) 1996-2016 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/>. */
+
+/*
+ * ISO C99 Standard: 7.25
+ * Wide character classification and mapping utilities <wctype.h>
+ */
+
+#ifndef _BITS_WCTYPE_WCHAR_H
+#define _BITS_WCTYPE_WCHAR_H 1
+
+#if !defined _WCTYPE_H && !defined _WCHAR_H
+#error "Never include <bits/wctype-wchar.h> directly; include <wctype.h> or <wchar.h> instead."
+#endif
+
+#include <bits/types.h>
+#include <bits/types/wint_t.h>
+
+/* The definitions in this header are specified to appear in <wctype.h>
+ in ISO C99, but in <wchar.h> in Unix98. _GNU_SOURCE follows C99. */
+
+/* Scalar type that can hold values which represent locale-specific
+ character classifications. */
+typedef unsigned long int wctype_t;
+
+# ifndef _ISwbit
+/* The characteristics are stored always in network byte order (big
+ endian). We define the bit value interpretations here dependent on the
+ machine's byte order. */
+
+# include <endian.h>
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define _ISwbit(bit) (1 << (bit))
+# else /* __BYTE_ORDER == __LITTLE_ENDIAN */
+# define _ISwbit(bit) \
+ ((bit) < 8 ? (int) ((1UL << (bit)) << 24) \
+ : ((bit) < 16 ? (int) ((1UL << (bit)) << 8) \
+ : ((bit) < 24 ? (int) ((1UL << (bit)) >> 8) \
+ : (int) ((1UL << (bit)) >> 24))))
+# endif
+
+enum
+{
+ __ISwupper = 0, /* UPPERCASE. */
+ __ISwlower = 1, /* lowercase. */
+ __ISwalpha = 2, /* Alphabetic. */
+ __ISwdigit = 3, /* Numeric. */
+ __ISwxdigit = 4, /* Hexadecimal numeric. */
+ __ISwspace = 5, /* Whitespace. */
+ __ISwprint = 6, /* Printing. */
+ __ISwgraph = 7, /* Graphical. */
+ __ISwblank = 8, /* Blank (usually SPC and TAB). */
+ __ISwcntrl = 9, /* Control character. */
+ __ISwpunct = 10, /* Punctuation. */
+ __ISwalnum = 11, /* Alphanumeric. */
+
+ _ISwupper = _ISwbit (__ISwupper), /* UPPERCASE. */
+ _ISwlower = _ISwbit (__ISwlower), /* lowercase. */
+ _ISwalpha = _ISwbit (__ISwalpha), /* Alphabetic. */
+ _ISwdigit = _ISwbit (__ISwdigit), /* Numeric. */
+ _ISwxdigit = _ISwbit (__ISwxdigit), /* Hexadecimal numeric. */
+ _ISwspace = _ISwbit (__ISwspace), /* Whitespace. */
+ _ISwprint = _ISwbit (__ISwprint), /* Printing. */
+ _ISwgraph = _ISwbit (__ISwgraph), /* Graphical. */
+ _ISwblank = _ISwbit (__ISwblank), /* Blank (usually SPC and TAB). */
+ _ISwcntrl = _ISwbit (__ISwcntrl), /* Control character. */
+ _ISwpunct = _ISwbit (__ISwpunct), /* Punctuation. */
+ _ISwalnum = _ISwbit (__ISwalnum) /* Alphanumeric. */
+};
+# endif /* Not _ISwbit */
+
+
+__BEGIN_DECLS
+
+/*
+ * Wide-character classification functions: 7.15.2.1.
+ */
+
+/* Test for any wide character for which `iswalpha' or `iswdigit' is
+ true. */
+extern int iswalnum (wint_t __wc) __THROW;
+
+/* Test for any wide character for which `iswupper' or 'iswlower' is
+ true, or any wide character that is one of a locale-specific set of
+ wide-characters for which none of `iswcntrl', `iswdigit',
+ `iswpunct', or `iswspace' is true. */
+extern int iswalpha (wint_t __wc) __THROW;
+
+/* Test for any control wide character. */
+extern int iswcntrl (wint_t __wc) __THROW;
+
+/* Test for any wide character that corresponds to a decimal-digit
+ character. */
+extern int iswdigit (wint_t __wc) __THROW;
+
+/* Test for any wide character for which `iswprint' is true and
+ `iswspace' is false. */
+extern int iswgraph (wint_t __wc) __THROW;
+
+/* Test for any wide character that corresponds to a lowercase letter
+ or is one of a locale-specific set of wide characters for which
+ none of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true. */
+extern int iswlower (wint_t __wc) __THROW;
+
+/* Test for any printing wide character. */
+extern int iswprint (wint_t __wc) __THROW;
+
+/* Test for any printing wide character that is one of a
+ locale-specific et of wide characters for which neither `iswspace'
+ nor `iswalnum' is true. */
+extern int iswpunct (wint_t __wc) __THROW;
+
+/* Test for any wide character that corresponds to a locale-specific
+ set of wide characters for which none of `iswalnum', `iswgraph', or
+ `iswpunct' is true. */
+extern int iswspace (wint_t __wc) __THROW;
+
+/* Test for any wide character that corresponds to an uppercase letter
+ or is one of a locale-specific set of wide character for which none
+ of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true. */
+extern int iswupper (wint_t __wc) __THROW;
+
+/* Test for any wide character that corresponds to a hexadecimal-digit
+ character equivalent to that performed be the functions described
+ in the previous subclause. */
+extern int iswxdigit (wint_t __wc) __THROW;
+
+/* Test for any wide character that corresponds to a standard blank
+ wide character or a locale-specific set of wide characters for
+ which `iswalnum' is false. */
+# ifdef __USE_ISOC99
+extern int iswblank (wint_t __wc) __THROW;
+# endif
+
+/*
+ * Extensible wide-character classification functions: 7.15.2.2.
+ */
+
+/* Construct value that describes a class of wide characters identified
+ by the string argument PROPERTY. */
+extern wctype_t wctype (const char *__property) __THROW;
+
+/* Determine whether the wide-character WC has the property described by
+ DESC. */
+extern int iswctype (wint_t __wc, wctype_t __desc) __THROW;
+
+/*
+ * Wide-character case-mapping functions: 7.15.3.1.
+ */
+
+/* Converts an uppercase letter to the corresponding lowercase letter. */
+extern wint_t towlower (wint_t __wc) __THROW;
+
+/* Converts an lowercase letter to the corresponding uppercase letter. */
+extern wint_t towupper (wint_t __wc) __THROW;
+
+__END_DECLS
+
+#endif /* bits/wctype-wchar.h. */
diff --git a/wctype/wctype.h b/wctype/wctype.h
index 73165bb..962aef1 100644
--- a/wctype/wctype.h
+++ b/wctype/wctype.h
@@ -21,186 +21,32 @@
*/
#ifndef _WCTYPE_H
+#define _WCTYPE_H 1
#include <features.h>
#include <bits/types.h>
-
-#ifndef __need_iswxxx
-# define _WCTYPE_H 1
-
-/* Get wint_t from <wchar.h>. */
-# define __need_wint_t
-# include <wchar.h>
+#include <bits/types/wint_t.h>
/* Constant expression of type `wint_t' whose value does not correspond
to any member of the extended character set. */
-# ifndef WEOF
-# define WEOF (0xffffffffu)
-# endif
+#ifndef WEOF
+# define WEOF (0xffffffffu)
#endif
-#undef __need_iswxxx
-
-
-/* The following part is also used in the <wcsmbs.h> header when compiled
- in the Unix98 compatibility mode. */
-#ifndef __iswxxx_defined
-# define __iswxxx_defined 1
-
-/* Scalar type that can hold values which represent locale-specific
- character classifications. */
-typedef unsigned long int wctype_t;
-
-# ifndef _ISwbit
-/* The characteristics are stored always in network byte order (big
- endian). We define the bit value interpretations here dependent on the
- machine's byte order. */
-
-# include <endian.h>
-# if __BYTE_ORDER == __BIG_ENDIAN
-# define _ISwbit(bit) (1 << (bit))
-# else /* __BYTE_ORDER == __LITTLE_ENDIAN */
-# define _ISwbit(bit) \
- ((bit) < 8 ? (int) ((1UL << (bit)) << 24) \
- : ((bit) < 16 ? (int) ((1UL << (bit)) << 8) \
- : ((bit) < 24 ? (int) ((1UL << (bit)) >> 8) \
- : (int) ((1UL << (bit)) >> 24))))
-# endif
-
-enum
-{
- __ISwupper = 0, /* UPPERCASE. */
- __ISwlower = 1, /* lowercase. */
- __ISwalpha = 2, /* Alphabetic. */
- __ISwdigit = 3, /* Numeric. */
- __ISwxdigit = 4, /* Hexadecimal numeric. */
- __ISwspace = 5, /* Whitespace. */
- __ISwprint = 6, /* Printing. */
- __ISwgraph = 7, /* Graphical. */
- __ISwblank = 8, /* Blank (usually SPC and TAB). */
- __ISwcntrl = 9, /* Control character. */
- __ISwpunct = 10, /* Punctuation. */
- __ISwalnum = 11, /* Alphanumeric. */
-
- _ISwupper = _ISwbit (__ISwupper), /* UPPERCASE. */
- _ISwlower = _ISwbit (__ISwlower), /* lowercase. */
- _ISwalpha = _ISwbit (__ISwalpha), /* Alphabetic. */
- _ISwdigit = _ISwbit (__ISwdigit), /* Numeric. */
- _ISwxdigit = _ISwbit (__ISwxdigit), /* Hexadecimal numeric. */
- _ISwspace = _ISwbit (__ISwspace), /* Whitespace. */
- _ISwprint = _ISwbit (__ISwprint), /* Printing. */
- _ISwgraph = _ISwbit (__ISwgraph), /* Graphical. */
- _ISwblank = _ISwbit (__ISwblank), /* Blank (usually SPC and TAB). */
- _ISwcntrl = _ISwbit (__ISwcntrl), /* Control character. */
- _ISwpunct = _ISwbit (__ISwpunct), /* Punctuation. */
- _ISwalnum = _ISwbit (__ISwalnum) /* Alphanumeric. */
-};
-# endif /* Not _ISwbit */
-
-__BEGIN_DECLS
+/* Some definitions from this header also appear in <wchar.h> in
+ Unix98 mode. */
+#include <bits/wctype-wchar.h>
/*
- * Wide-character classification functions: 7.15.2.1.
- */
-
-/* Test for any wide character for which `iswalpha' or `iswdigit' is
- true. */
-extern int iswalnum (wint_t __wc) __THROW;
-
-/* Test for any wide character for which `iswupper' or 'iswlower' is
- true, or any wide character that is one of a locale-specific set of
- wide-characters for which none of `iswcntrl', `iswdigit',
- `iswpunct', or `iswspace' is true. */
-extern int iswalpha (wint_t __wc) __THROW;
-
-/* Test for any control wide character. */
-extern int iswcntrl (wint_t __wc) __THROW;
-
-/* Test for any wide character that corresponds to a decimal-digit
- character. */
-extern int iswdigit (wint_t __wc) __THROW;
-
-/* Test for any wide character for which `iswprint' is true and
- `iswspace' is false. */
-extern int iswgraph (wint_t __wc) __THROW;
-
-/* Test for any wide character that corresponds to a lowercase letter
- or is one of a locale-specific set of wide characters for which
- none of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true. */
-extern int iswlower (wint_t __wc) __THROW;
-
-/* Test for any printing wide character. */
-extern int iswprint (wint_t __wc) __THROW;
-
-/* Test for any printing wide character that is one of a
- locale-specific et of wide characters for which neither `iswspace'
- nor `iswalnum' is true. */
-extern int iswpunct (wint_t __wc) __THROW;
-
-/* Test for any wide character that corresponds to a locale-specific
- set of wide characters for which none of `iswalnum', `iswgraph', or
- `iswpunct' is true. */
-extern int iswspace (wint_t __wc) __THROW;
-
-/* Test for any wide character that corresponds to an uppercase letter
- or is one of a locale-specific set of wide character for which none
- of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true. */
-extern int iswupper (wint_t __wc) __THROW;
-
-/* Test for any wide character that corresponds to a hexadecimal-digit
- character equivalent to that performed be the functions described
- in the previous subclause. */
-extern int iswxdigit (wint_t __wc) __THROW;
-
-/* Test for any wide character that corresponds to a standard blank
- wide character or a locale-specific set of wide characters for
- which `iswalnum' is false. */
-# ifdef __USE_ISOC99
-extern int iswblank (wint_t __wc) __THROW;
-# endif
-
-/*
- * Extensible wide-character classification functions: 7.15.2.2.
+ * Extensible wide-character mapping functions: 7.15.3.2.
*/
-/* Construct value that describes a class of wide characters identified
- by the string argument PROPERTY. */
-extern wctype_t wctype (const char *__property) __THROW;
-
-/* Determine whether the wide-character WC has the property described by
- DESC. */
-extern int iswctype (wint_t __wc, wctype_t __desc) __THROW;
-
-
-/*
- * Wide-character case-mapping functions: 7.15.3.1.
- */
+__BEGIN_DECLS
/* Scalar type that can hold values which represent locale-specific
character mappings. */
typedef const __int32_t *wctrans_t;
-/* Converts an uppercase letter to the corresponding lowercase letter. */
-extern wint_t towlower (wint_t __wc) __THROW;
-
-/* Converts an lowercase letter to the corresponding uppercase letter. */
-extern wint_t towupper (wint_t __wc) __THROW;
-
-__END_DECLS
-
-#endif /* need iswxxx. */
-
-
-/* The remaining definitions and declarations must not appear in the
- <wchar.h> header. */
-#ifdef _WCTYPE_H
-
-/*
- * Extensible wide-character mapping functions: 7.15.3.2.
- */
-
-__BEGIN_DECLS
-
/* Construct value that describes a mapping between wide characters
identified by the string argument PROPERTY. */
extern wctrans_t wctrans (const char *__property) __THROW;
@@ -276,7 +122,6 @@ extern wctype_t wctype_l (const char *__property, __locale_t __locale)
extern int iswctype_l (wint_t __wc, wctype_t __desc, __locale_t __locale)
__THROW;
-
/*
* Wide-character case-mapping functions.
*/
@@ -300,6 +145,4 @@ extern wint_t towctrans_l (wint_t __wc, wctrans_t __desc,
__END_DECLS
-#endif /* __WCTYPE_H defined. */
-
#endif /* wctype.h */
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=191d00b97563896fe2141bb8390f296c46724155
commit 191d00b97563896fe2141bb8390f296c46724155
Author: Zack Weinberg <zackw@panix.com>
Date: Tue Mar 21 16:30:53 2017 -0400
Remove __need macros from errno.h (__need_Emath, __need_error_t).
This is fairly complicated, not because the users of __need_Emath and
__need_error_t have complicated requirements, but because the core
changes had a lot of fallout.
__need_Emath is defined only by .S files; what they _really_ need is
for errno.h to avoid declaring anything other than the E-constants
(e.g. 'extern int __errno_location(void);' is a syntax error in
assembly language). This is replaced with a check for __ASSEMBLER__ in
errno.h, plus a carefully documented requirement for bits/errno.h not
to define anything other than macros. That in turn has the
consequence that bits/errno.h must not define errno - fortunately,
all live ports use the same definition of errno, so I've moved it to
errno.h.
__need_error_t exists for gnulib compatibility in argz.h and argp.h.
error_t itself is a Hurdism, an enum containing all the E-constants,
so you can do 'p (error_t) errno' in gdb and get a symbolic value.
argz.h and argp.h use it for function return values, and they want to
fall back to 'int' when that's not available. Also, to comply with
the rule that bits/errno.h may only define macros anymore, the
definition of error_t had to be removed from
sysdeps/mach/hurd/bits/errno.h somehow. I have elected to move
error_t to a file generated at build time and make it available for
all supported hosts, not just Hurd. This allows creation of a generic
bits/types/error_t.h. However, the price is that the new definition
requires a GCC >=4.5 feature - otherwise it falls back to 'int'. And
you may regret reading the generated bits/errno-enum.h.
* stdlib/errno.h: Remove __need_Emath and __need_error_t
logic. Declare errno here. Include bits/types/error_t.h for
error_t. When __ASSEMBLER__ is defined, provide only the
E-constants, as macros. Reorganize file.
* stdlib/bits/types/error_t.h: New file.
* include/bits/types/error_t.h: New wrapper.
* scripts/make-errno-enum.sh: New file.
* Makeconfig: Add rules to generate bits/errno-enum.h.
(common-generated): Add bits/errno-enum.h and bits/errno-enum.h.stmp.
Also add dl-tunable-list.h and dl-tunable-list.stmp, missed in a
previous patch.
(dl-tunable-list.h): Generate using a stamp file.
* stdlib/Makefile: Install bits/types/error_t.h and bits/errno-enum.h.
* bits/errno.h: Remove logic for __need_Emath. Document
requirements for a port-specific bits/errno.h.
* include/errno.h: Change conditional for exposing internal
declarations to (not _ISOMAC and not __ASSEMBLER__). Use
__attribute_const__ instead of __attribute__((__const__)).
* sysdeps/mach/hurd/errnos.awk
* sysdeps/unix/sysv/linux/bits/errno.h
* sysdeps/unix/sysv/linux/alpha/bits/errno.h
* sysdeps/unix/sysv/linux/hppa/bits/errno.h
* sysdeps/unix/sysv/linux/mips/bits/errno.h
* sysdeps/unix/sysv/linux/sparc/bits/errno.h:
Add multiple-include guard and check against improper inclusion.
Remove __need_Emath logic. Don't declare errno here. Ensure all
constants are defined as simple integer literals. Redefine
__GLIBC_USE_TLS_ERRNO to 1 if appropriate. Consistent formatting.
* sysdeps/mach/hurd/bits/errno.h: Regenerate.
* argp/argp.h, string/argz.h: Include bits/types/error_t.h for error_t.
* sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S
* sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S
* sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S
* sysdeps/x86_64/fpu/s_cosf.S
* sysdeps/x86_64/fpu/s_sincosf.S
* sysdeps/x86_64/fpu/s_sinf.S
Just include errno.h; don't define __need_Emath or include
bits/errno.h directly.
diff --git a/Makeconfig b/Makeconfig
index e4eda4b..a282b1f 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -1107,6 +1107,7 @@ postclean-generated += soversions.mk soversions.i \
shlib-versions.v shlib-versions.v.i
before-compile += $(common-objpfx)libc-modules.h
+common-generated += libc-modules.h libc-modules.stmp
ifeq ($(soversions.mk-done),t)
# Generate a header with macro definitions for use with the IS_IN macro.
# These are the possible values for the MODULE_NAME macro defined when building
@@ -1125,16 +1126,31 @@ endif
# glibc.
ifneq (no,$(have-tunables))
before-compile += $(common-objpfx)dl-tunable-list.h
-
-$(common-objpfx)dl-tunable-list.h: $(..)scripts/gen-tunables.awk \
- $(..)elf/dl-tunables.list \
- $(wildcard $(subdirs:%=$(..)%/dl-tunables.list)) \
- $(wildcard $(sysdirs:%=%/dl-tunables.list))
- $(AWK) -f $^ > $@.tmp
- mv $@.tmp $@
+common-generated += dl-tunable-list.h dl-tunable-list.stmp
+
+$(common-objpfx)dl-tunable-list.h: $(common-objpfx)dl-tunable-list.stmp; @:
+$(common-objpfx)dl-tunable-list.stmp: \
+ $(..)scripts/gen-tunables.awk \
+ $(..)elf/dl-tunables.list \
+ $(wildcard $(subdirs:%=$(..)%/dl-tunables.list)) \
+ $(wildcard $(sysdirs:%=%/dl-tunables.list))
+ $(AWK) -f $^ > ${@:stmp=T}
+ $(move-if-change) ${@:stmp=T} ${@:stmp=h}
+ touch $@
endif
-common-generated += libc-modules.h libc-modules.stmp
+# Build errno-enum.h early, ditto.
+before-compile += $(common-objpfx)bits/errno-enum.h
+common-generated += bits/error_t.h bits/errno-enum.stmp
+$(common-objpfx)bits/errno-enum.h: $(common-objpfx)bits/errno-enum.stmp; @:
+$(common-objpfx)bits/errno-enum.stmp: $(..)scripts/make-errno-enum.sh \
+ bits/errno.h
+ [ -d $(common-objpfx)bits ] || mkdir $(common-objpfx)bits
+ CC="$(CC)" AWK="$(AWK)" \
+ $(SHELL) $(..)scripts/make-errno-enum.sh $(+includes) \
+ > ${@:stmp=T}
+ $(move-if-change) ${@:stmp=T} ${@:stmp=h}
+ touch $@
# The name under which the run-time dynamic linker is installed.
# We are currently going for the convention that `/lib/ld.so.1'
diff --git a/NEWS b/NEWS
index 256d8f0..edbccbe 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,15 @@ Version 2.26
transliteration tables are all updated to Unicode 9.0.0, using
generator scripts contributed by Mike FABIAN (Red Hat).
+* errno.h is now safe to use from C-preprocessed assembly language on all
+ supported operating systems. In this context, it will only define the
+ Exxxx constants, as preprocessor macros expanding to integer literals.
+
+* error_t, a debugging aid, is now available on all supported operating
+ systems for programs compiled with GCC 4.5 or higher. 'p (error_t) errno'
+ in GDB will print the Exxxx constant corresponding to the current value of
+ errno.
+
* The rpcgen, librpcsvc and related headers will only be built and
installed when glibc is configured with --enable-obsolete-rpc.
This allows alternative RPC implementations, like TIRPC, to be used
diff --git a/argp/argp.h b/argp/argp.h
index 86b8e5a..f48c007 100644
--- a/argp/argp.h
+++ b/argp/argp.h
@@ -24,15 +24,9 @@
#include <ctype.h>
#include <getopt.h>
#include <limits.h>
-
-#define __need_error_t
#include <errno.h>
+#include <bits/types/error_t.h>
-#ifndef __error_t_defined
-typedef int error_t;
-# define __error_t_defined
-#endif
-
__BEGIN_DECLS
/* A description of a particular option. A pointer to an array of
diff --git a/bits/errno.h b/bits/errno.h
index cd4fcfa..a51fc3e 100644
--- a/bits/errno.h
+++ b/bits/errno.h
@@ -15,20 +15,32 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-/* This file defines the `errno' constants. */
+/* This file defines the errno constants. */
-#if !defined __Emath_defined && (defined _ERRNO_H || defined __need_Emath)
-#undef __need_Emath
-#define __Emath_defined 1
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
-# define EDOM XXX <--- fill in what is actually needed
-# define EILSEQ XXX <--- fill in what is actually needed
-# define ERANGE XXX <--- fill in what is actually needed
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
#endif
-#ifdef _ERRNO_H
-# error "Define here all the missing error messages for the port. These"
-# error "must match the numbers of the kernel."
-# define Exxxx XXX
-...
-#endif
+#error "Generic bits/errno.h included -- port is incomplete."
+
+/* Authors of new ports of the GNU C Library must override this file
+ with their own bits/errno.h in an appropriate subdirectory of
+ sysdeps/. Its function is to define all of the error constants
+ from C2011 and POSIX.1-2008, with values appropriate to the operating
+ system, and any additional OS-specific error constants.
+
+ C2011 requires all error constants to be object-like macros that
+ expand to "integer constant expressions with type int, positive
+ values, and suitable for use in #if directives". Moreover, all
+ of their names must begin with a capital E, followed immediately
+ by either another capital letter, or a digit.
+
+ errno.h is sometimes included from assembly language, so
+ bits/errno.h may only define macros; it may not make any other kind
+ of C declaration or definition. It is OK to define macros that are
+ not E-constants, but only in the implementation namespace. */
+
+#endif /* bits/errno.h. */
diff --git a/include/bits/types/error_t.h b/include/bits/types/error_t.h
new file mode 100644
index 0000000..1ce1f79
--- /dev/null
+++ b/include/bits/types/error_t.h
@@ -0,0 +1 @@
+#include <stdlib/bits/types/error_t.h>
diff --git a/include/errno.h b/include/errno.h
index 73fc32e..3c3d228 100644
--- a/include/errno.h
+++ b/include/errno.h
@@ -1,8 +1,6 @@
#ifndef _ERRNO_H
-
#include <stdlib/errno.h>
-
-#if defined _ERRNO_H && !defined _ISOMAC
+#if !defined _ISOMAC && !defined __ASSEMBLER__
# if IS_IN (rtld)
# include <dl-sysdep.h>
@@ -38,15 +36,12 @@ extern __thread int errno attribute_tls_model_ie;
# define __set_errno(val) (errno = (val))
-# ifndef __ASSEMBLER__
-extern int *__errno_location (void) __THROW __attribute__ ((__const__))
+extern int *__errno_location (void) __THROW __attribute_const__
# if RTLD_PRIVATE_ERRNO
attribute_hidden
# endif
;
libc_hidden_proto (__errno_location)
-# endif
-
-#endif /* _ERRNO_H */
-#endif /* ! _ERRNO_H */
+#endif /* !_ISOMAC && !__ASSEMBLER__ */
+#endif /* !_ERRNO_H */
diff --git a/scripts/make-errno-enum.sh b/scripts/make-errno-enum.sh
new file mode 100644
index 0000000..99a07d3
--- /dev/null
+++ b/scripts/make-errno-enum.sh
@@ -0,0 +1,67 @@
+#! /bin/sh
+# Script to produce bits/error_t.h.
+
+# Copyright (C) 2017 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/>.
+
+# This script is invoked with no input.
+# AWK and CC are expected to be set in the environment.
+# "$@" is expected to be a sequence of -I switches to pass to the compiler.
+# The generated error_t.h is written to stdout.
+
+set -e
+
+# Note: the steps below that may fail under normal circumstances are
+# carefully arranged to be at the ends of pipelines.
+tmp1=`mktemp -t me1.XXXXXXXXX`
+tmp2=`mktemp -t me2.XXXXXXXXX`
+trap "rm -f '$tmp1' '$tmp2'" 0
+
+printf '#include <features.h>\n#include <bits/errno.h>\n' |
+ "$CC" -E -dM -xc -D_GNU_SOURCE -D_ERRNO_H "$@" - > "$tmp1"
+
+LC_ALL=C sort < "$tmp1" | "$AWK" > "$tmp2" '
+ /^#define E[A-Z0-9]/ {
+ name = $2;
+ printf("\n#ifdef %s\n# pragma push_macro (\"%s\")\n# undef %s\n %s =\n",
+ name, name, name, name);
+ printf("# pragma pop_macro (\"%s\")\n %s,\n#endif\n",
+ name, name);
+ }
+'
+
+echo '/* Errno codes as enum constants.'
+echo ' This file was generated by make-errno-enum.sh from bits/errno.h. */'
+echo
+echo '#ifndef _BITS_ERRNO_ENUM_H'
+echo '#define _BITS_ERRNO_ENUM_H 1'
+echo
+echo '#include <bits/errno.h>'
+echo
+echo 'enum __error_t_codes'
+echo '{'
+echo ' /* Force the enum to be a signed type. */'
+echo ' __FORCE_ERROR_T_CODES_SIGNED = -1,'
+echo
+echo ' /* Zero indicates success. Including this entry may prevent'
+echo ' warnings from some compilers if "case 0" appears in a switch'
+echo ' statement over an error_t value. */'
+echo ' ESUCCESS = 0,'
+cat "$tmp2"
+echo '};'
+echo
+echo '#endif /* bits/errno-enum.h */'
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 9b0acce..770dedf 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -25,7 +25,8 @@ include ../Makeconfig
headers := stdlib.h bits/stdlib.h bits/stdlib-ldbl.h bits/stdlib-float.h \
monetary.h bits/monetary-ldbl.h \
inttypes.h stdint.h bits/wordsize.h \
- errno.h sys/errno.h bits/errno.h \
+ errno.h sys/errno.h bits/errno.h bits/errno-enum.h \
+ bits/types/error_t.h \
ucontext.h sys/ucontext.h \
alloca.h fmtmsg.h \
bits/stdlib-bsearch.h sys/random.h bits/stdint-intn.h \
diff --git a/stdlib/bits/types/error_t.h b/stdlib/bits/types/error_t.h
new file mode 100644
index 0000000..2b6197c
--- /dev/null
+++ b/stdlib/bits/types/error_t.h
@@ -0,0 +1,14 @@
+#ifndef __error_t_defined
+#define __error_t_defined 1
+
+/* The type error_t, a debugging aid. With sufficiently new compilers
+ you can type 'p (error_t) errno' in GDB and see the symbolic name
+ of the errno value. */
+#if __GNUC_PREREQ (4, 5)
+# include <bits/errno-enum.h>
+typedef enum __error_t_codes error_t;
+# else
+typedef int error_t;
+# endif
+
+#endif
diff --git a/stdlib/errno.h b/stdlib/errno.h
index 65f2f45..83c2997 100644
--- a/stdlib/errno.h
+++ b/stdlib/errno.h
@@ -20,53 +20,36 @@
*/
#ifndef _ERRNO_H
+#define _ERRNO_H 1
-/* The includer defined __need_Emath if he wants only the definitions
- of EDOM and ERANGE, and not everything else. */
-#ifndef __need_Emath
-# define _ERRNO_H 1
# include <features.h>
-#endif
-__BEGIN_DECLS
+/* The system-specific definitions of the E* constants, as macros. */
+# include <bits/errno.h>
+
+/* When included from assembly language, this header only provides the
+ E* constants. */
+# ifndef __ASSEMBLER__
-/* Get the error number constants from the system-specific file.
- This file will test __need_Emath and _ERRNO_H. */
-#include <bits/errno.h>
-#undef __need_Emath
+__BEGIN_DECLS
-#ifdef _ERRNO_H
+/* The error code set by various library functions. */
+extern int *__errno_location (void) __THROW __attribute_const__;
+# define errno (*__errno_location ())
-/* Declare the `errno' variable, unless it's defined as a macro by
- bits/errno.h. This is the case in GNU, where it is a per-thread
- variable. This redeclaration using the macro still works, but it
- will be a function declaration without a prototype and may trigger
- a -Wstrict-prototypes warning. */
-#ifndef errno
-extern int errno;
-#endif
+# ifdef __USE_GNU
-#ifdef __USE_GNU
+#include <bits/types/error_t.h>
/* The full and simple forms of the name with which the program was
invoked. These variables are set up automatically at startup based on
the value of ARGV[0] (this works only if you use GNU ld). */
-extern char *program_invocation_name, *program_invocation_short_name;
-#endif /* __USE_GNU */
-#endif /* _ERRNO_H */
+extern char *program_invocation_name;
+extern char *program_invocation_short_name;
+
+# endif /* __USE_GNU */
__END_DECLS
-#endif /* _ERRNO_H */
-
-/* The Hurd <bits/errno.h> defines `error_t' as an enumerated type so
- that printing `error_t' values in the debugger shows the names. We
- might need this definition sometimes even if this file was included
- before. */
-#if defined __USE_GNU || defined __need_error_t
-# ifndef __error_t_defined
-typedef int error_t;
-# define __error_t_defined 1
-# endif
-# undef __need_error_t
-#endif
+# endif /* !__ASSEMBLER__ */
+#endif /* errno.h */
diff --git a/string/argz.h b/string/argz.h
index f9d0ac9..58fcbd0 100644
--- a/string/argz.h
+++ b/string/argz.h
@@ -20,15 +20,8 @@
#define _ARGZ_H 1
#include <features.h>
-
-#define __need_error_t
-#include <errno.h>
#include <string.h> /* Need size_t, and strchr is called below. */
-
-#ifndef __error_t_defined
-typedef int error_t;
-#endif
-
+#include <bits/types/error_t.h>
__BEGIN_DECLS
diff --git a/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S b/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S
index f37850d..a5b76e9 100644
--- a/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S
+++ b/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S
@@ -17,8 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
/* Short algorithm description:
*
diff --git a/sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S b/sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S
index f31a925..1e99ee6 100644
--- a/sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S
+++ b/sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S
@@ -17,8 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
/* Short algorithm description:
*
diff --git a/sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S b/sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S
index ee96018..03b9254 100644
--- a/sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S
+++ b/sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S
@@ -17,8 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
/* Short algorithm description:
*
diff --git a/sysdeps/mach/hurd/bits/errno.h b/sysdeps/mach/hurd/bits/errno.h
index d20ffe6..7aa76b5 100644
--- a/sysdeps/mach/hurd/bits/errno.h
+++ b/sysdeps/mach/hurd/bits/errno.h
@@ -1,329 +1,198 @@
/* This file generated by errnos.awk. */
-/* The Hurd uses Mach error system 0x10, currently only subsystem 0. */
-#ifndef _HURD_ERRNO
-#define _HURD_ERRNO(n) ((0x10 << 26) | ((n) & 0x3fff))
-#endif
-
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
-enum __error_t_codes
-{
- /* The value zero always means success and it is perfectly fine for
- code to use 0 explicitly (or implicitly, e.g. via Boolean coercion).
- Having an enum entry for zero both makes the debugger print the name
- for error_t-typed zero values, and prevents the compiler from
- issuing warnings about 'case 0:' in a switch on an error_t-typed
- value. */
- ESUCCESS = 0,
-
-#undef EDOM
-#undef ERANGE
- EPERM = _HURD_ERRNO (1),
-#define EPERM _HURD_ERRNO (1) /* Operation not permitted */
- ENOENT = _HURD_ERRNO (2),
-#define ENOENT _HURD_ERRNO (2) /* No such file or directory */
- ESRCH = _HURD_ERRNO (3),
-#define ESRCH _HURD_ERRNO (3) /* No such process */
- EINTR = _HURD_ERRNO (4),
-#define EINTR _HURD_ERRNO (4) /* Interrupted system call */
- EIO = _HURD_ERRNO (5),
-#define EIO _HURD_ERRNO (5) /* Input/output error */
- ENXIO = _HURD_ERRNO (6),
-#define ENXIO _HURD_ERRNO (6) /* No such device or address */
- E2BIG = _HURD_ERRNO (7),
-#define E2BIG _HURD_ERRNO (7) /* Argument list too long */
- ENOEXEC = _HURD_ERRNO (8),
-#define ENOEXEC _HURD_ERRNO (8) /* Exec format error */
- EBADF = _HURD_ERRNO (9),
-#define EBADF _HURD_ERRNO (9) /* Bad file descriptor */
- ECHILD = _HURD_ERRNO (10),
-#define ECHILD _HURD_ERRNO (10)/* No child processes */
- EDEADLK = _HURD_ERRNO (11),
-#define EDEADLK _HURD_ERRNO (11)/* Resource deadlock avoided */
- ENOMEM = _HURD_ERRNO (12),
-#define ENOMEM _HURD_ERRNO (12)/* Cannot allocate memory */
- EACCES = _HURD_ERRNO (13),
-#define EACCES _HURD_ERRNO (13)/* Permission denied */
- EFAULT = _HURD_ERRNO (14),
-#define EFAULT _HURD_ERRNO (14)/* Bad address */
- ENOTBLK = _HURD_ERRNO (15),
-#define ENOTBLK _HURD_ERRNO (15)/* Block device required */
- EBUSY = _HURD_ERRNO (16),
-#define EBUSY _HURD_ERRNO (16)/* Device or resource busy */
- EEXIST = _HURD_ERRNO (17),
-#define EEXIST _HURD_ERRNO (17)/* File exists */
- EXDEV = _HURD_ERRNO (18),
-#define EXDEV _HURD_ERRNO (18)/* Invalid cross-device link */
- ENODEV = _HURD_ERRNO (19),
-#define ENODEV _HURD_ERRNO (19)/* No such device */
- ENOTDIR = _HURD_ERRNO (20),
-#define ENOTDIR _HURD_ERRNO (20)/* Not a directory */
- EISDIR = _HURD_ERRNO (21),
-#define EISDIR _HURD_ERRNO (21)/* Is a directory */
- EINVAL = _HURD_ERRNO (22),
-#define EINVAL _HURD_ERRNO (22)/* Invalid argument */
- EMFILE = _HURD_ERRNO (24),
-#define EMFILE _HURD_ERRNO (24)/* Too many open files */
- ENFILE = _HURD_ERRNO (23),
-#define ENFILE _HURD_ERRNO (23)/* Too many open files in system */
- ENOTTY = _HURD_ERRNO (25),
-#define ENOTTY _HURD_ERRNO (25)/* Inappropriate ioctl for device */
- ETXTBSY = _HURD_ERRNO (26),
-#define ETXTBSY _HURD_ERRNO (26)/* Text file busy */
- EFBIG = _HURD_ERRNO (27),
-#define EFBIG _HURD_ERRNO (27)/* File too large */
- ENOSPC = _HURD_ERRNO (28),
-#define ENOSPC _HURD_ERRNO (28)/* No space left on device */
- ESPIPE = _HURD_ERRNO (29),
-#define ESPIPE _HURD_ERRNO (29)/* Illegal seek */
- EROFS = _HURD_ERRNO (30),
-#define EROFS _HURD_ERRNO (30)/* Read-only file system */
- EMLINK = _HURD_ERRNO (31),
-#define EMLINK _HURD_ERRNO (31)/* Too many links */
- EPIPE = _HURD_ERRNO (32),
-#define EPIPE _HURD_ERRNO (32)/* Broken pipe */
- EDOM = _HURD_ERRNO (33),
-#define EDOM _HURD_ERRNO (33)/* Numerical argument out of domain */
- ERANGE = _HURD_ERRNO (34),
-#define ERANGE _HURD_ERRNO (34)/* Numerical result out of range */
- EAGAIN = _HURD_ERRNO (35),
-#define EAGAIN _HURD_ERRNO (35)/* Resource temporarily unavailable */
-#define EWOULDBLOCK EAGAIN /* Operation would block */
- EINPROGRESS = _HURD_ERRNO (36),
-#define EINPROGRESS _HURD_ERRNO (36)/* Operation now in progress */
- EALREADY = _HURD_ERRNO (37),
-#define EALREADY _HURD_ERRNO (37)/* Operation already in progress */
- ENOTSOCK = _HURD_ERRNO (38),
-#define ENOTSOCK _HURD_ERRNO (38)/* Socket operation on non-socket */
- EMSGSIZE = _HURD_ERRNO (40),
-#define EMSGSIZE _HURD_ERRNO (40)/* Message too long */
- EPROTOTYPE = _HURD_ERRNO (41),
-#define EPROTOTYPE _HURD_ERRNO (41)/* Protocol wrong type for socket */
- ENOPROTOOPT = _HURD_ERRNO (42),
-#define ENOPROTOOPT _HURD_ERRNO (42)/* Protocol not available */
- EPROTONOSUPPORT = _HURD_ERRNO (43),
-#define EPROTONOSUPPORT _HURD_ERRNO (43)/* Protocol not supported */
- ESOCKTNOSUPPORT = _HURD_ERRNO (44),
-#define ESOCKTNOSUPPORT _HURD_ERRNO (44)/* Socket type not supported */
- EOPNOTSUPP = _HURD_ERRNO (45),
-#define EOPNOTSUPP _HURD_ERRNO (45)/* Operation not supported */
- EPFNOSUPPORT = _HURD_ERRNO (46),
-#define EPFNOSUPPORT _HURD_ERRNO (46)/* Protocol family not supported */
- EAFNOSUPPORT = _HURD_ERRNO (47),
-#define EAFNOSUPPORT _HURD_ERRNO (47)/* Address family not supported by protocol */
- EADDRINUSE = _HURD_ERRNO (48),
-#define EADDRINUSE _HURD_ERRNO (48)/* Address already in use */
- EADDRNOTAVAIL = _HURD_ERRNO (49),
-#define EADDRNOTAVAIL _HURD_ERRNO (49)/* Cannot assign requested address */
- ENETDOWN = _HURD_ERRNO (50),
-#define ENETDOWN _HURD_ERRNO (50)/* Network is down */
- ENETUNREACH = _HURD_ERRNO (51),
-#define ENETUNREACH _HURD_ERRNO (51)/* Network is unreachable */
- ENETRESET = _HURD_ERRNO (52),
-#define ENETRESET _HURD_ERRNO (52)/* Network dropped connection on reset */
- ECONNABORTED = _HURD_ERRNO (53),
-#define ECONNABORTED _HURD_ERRNO (53)/* Software caused connection abort */
- ECONNRESET = _HURD_ERRNO (54),
-#define ECONNRESET _HURD_ERRNO (54)/* Connection reset by peer */
- ENOBUFS = _HURD_ERRNO (55),
-#define ENOBUFS _HURD_ERRNO (55)/* No buffer space available */
- EISCONN = _HURD_ERRNO (56),
-#define EISCONN _HURD_ERRNO (56)/* Transport endpoint is already connected */
- ENOTCONN = _HURD_ERRNO (57),
-#define ENOTCONN _HURD_ERRNO (57)/* Transport endpoint is not connected */
- EDESTADDRREQ = _HURD_ERRNO (39),
-#define EDESTADDRREQ _HURD_ERRNO (39)/* Destination address required */
- ESHUTDOWN = _HURD_ERRNO (58),
-#define ESHUTDOWN _HURD_ERRNO (58)/* Cannot send after transport endpoint shutdown */
- ETOOMANYREFS = _HURD_ERRNO (59),
-#define ETOOMANYREFS _HURD_ERRNO (59)/* Too many references: cannot splice */
- ETIMEDOUT = _HURD_ERRNO (60),
-#define ETIMEDOUT _HURD_ERRNO (60)/* Connection timed out */
- ECONNREFUSED = _HURD_ERRNO (61),
-#define ECONNREFUSED _HURD_ERRNO (61)/* Connection refused */
- ELOOP = _HURD_ERRNO (62),
-#define ELOOP _HURD_ERRNO (62)/* Too many levels of symbolic links */
- ENAMETOOLONG = _HURD_ERRNO (63),
-#define ENAMETOOLONG _HURD_ERRNO (63)/* File name too long */
- EHOSTDOWN = _HURD_ERRNO (64),
-#define EHOSTDOWN _HURD_ERRNO (64)/* Host is down */
- EHOSTUNREACH = _HURD_ERRNO (65),
-#define EHOSTUNREACH _HURD_ERRNO (65)/* No route to host */
- ENOTEMPTY = _HURD_ERRNO (66),
-#define ENOTEMPTY _HURD_ERRNO (66)/* Directory not empty */
- EPROCLIM = _HURD_ERRNO (67),
-#define EPROCLIM _HURD_ERRNO (67)/* Too many processes */
- EUSERS = _HURD_ERRNO (68),
-#define EUSERS _HURD_ERRNO (68)/* Too many users */
- EDQUOT = _HURD_ERRNO (69),
-#define EDQUOT _HURD_ERRNO (69)/* Disk quota exceeded */
- ESTALE = _HURD_ERRNO (70),
-#define ESTALE _HURD_ERRNO (70)/* Stale file handle */
- EREMOTE = _HURD_ERRNO (71),
-#define EREMOTE _HURD_ERRNO (71)/* Object is remote */
- EBADRPC = _HURD_ERRNO (72),
-#define EBADRPC _HURD_ERRNO (72)/* RPC struct is bad */
- ERPCMISMATCH = _HURD_ERRNO (73),
-#define ERPCMISMATCH _HURD_ERRNO (73)/* RPC version wrong */
- EPROGUNAVAIL = _HURD_ERRNO (74),
-#define EPROGUNAVAIL _HURD_ERRNO (74)/* RPC program not available */
- EPROGMISMATCH = _HURD_ERRNO (75),
-#define EPROGMISMATCH _HURD_ERRNO (75)/* RPC program version wrong */
- EPROCUNAVAIL = _HURD_ERRNO (76),
-#define EPROCUNAVAIL _HURD_ERRNO (76)/* RPC bad procedure for program */
- ENOLCK = _HURD_ERRNO (77),
-#define ENOLCK _HURD_ERRNO (77)/* No locks available */
- EFTYPE = _HURD_ERRNO (79),
-#define EFTYPE _HURD_ERRNO (79)/* Inappropriate file type or format */
- EAUTH = _HURD_ERRNO (80),
-#define EAUTH _HURD_ERRNO (80)/* Authentication error */
- ENEEDAUTH = _HURD_ERRNO (81),
-#define ENEEDAUTH _HURD_ERRNO (81)/* Need authenticator */
- ENOSYS = _HURD_ERRNO (78),
-#define ENOSYS _HURD_ERRNO (78)/* Function not implemented */
- ENOTSUP = _HURD_ERRNO (118),
-#define ENOTSUP _HURD_ERRNO (118)/* Not supported */
- EILSEQ = _HURD_ERRNO (106),
-#define EILSEQ _HURD_ERRNO (106)/* Invalid or incomplete multibyte or wide character */
- EBACKGROUND = _HURD_ERRNO (100),
-#define EBACKGROUND _HURD_ERRNO (100)/* Inappropriate operation for background process */
- EDIED = _HURD_ERRNO (101),
-#define EDIED _HURD_ERRNO (101)/* Translator died */
- ED = _HURD_ERRNO (102),
-#define ED _HURD_ERRNO (102)/* ? */
- EGREGIOUS = _HURD_ERRNO (103),
-#define EGREGIOUS _HURD_ERRNO (103)/* You really blew it this time */
- EIEIO = _HURD_ERRNO (104),
-#define EIEIO _HURD_ERRNO (104)/* Computer bought the farm */
- EGRATUITOUS = _HURD_ERRNO (105),
-#define EGRATUITOUS _HURD_ERRNO (105)/* Gratuitous error */
- EBADMSG = _HURD_ERRNO (107),
-#define EBADMSG _HURD_ERRNO (107)/* Bad message */
- EIDRM = _HURD_ERRNO (108),
-#define EIDRM _HURD_ERRNO (108)/* Identifier removed */
- EMULTIHOP = _HURD_ERRNO (109),
-#define EMULTIHOP _HURD_ERRNO (109)/* Multihop attempted */
- ENODATA = _HURD_ERRNO (110),
-#define ENODATA _HURD_ERRNO (110)/* No data available */
- ENOLINK = _HURD_ERRNO (111),
-#define ENOLINK _HURD_ERRNO (111)/* Link has been severed */
- ENOMSG = _HURD_ERRNO (112),
-#define ENOMSG _HURD_ERRNO (112)/* No message of desired type */
- ENOSR = _HURD_ERRNO (113),
-#define ENOSR _HURD_ERRNO (113)/* Out of streams resources */
- ENOSTR = _HURD_ERRNO (114),
-#define ENOSTR _HURD_ERRNO (114)/* Device not a stream */
- EOVERFLOW = _HURD_ERRNO (115),
-#define EOVERFLOW _HURD_ERRNO (115)/* Value too large for defined data type */
- EPROTO = _HURD_ERRNO (116),
-#define EPROTO _HURD_ERRNO (116)/* Protocol error */
- ETIME = _HURD_ERRNO (117),
-#define ETIME _HURD_ERRNO (117)/* Timer expired */
- ECANCELED = _HURD_ERRNO (119),
-#define ECANCELED _HURD_ERRNO (119)/* Operation canceled */
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
- /* Errors from <mach/message.h>. */
- EMACH_SEND_IN_PROGRESS = 0x10000001,
- EMACH_SEND_INVALID_DATA = 0x10000002,
- EMACH_SEND_INVALID_DEST = 0x10000003,
- EMACH_SEND_TIMED_OUT = 0x10000004,
- EMACH_SEND_WILL_NOTIFY = 0x10000005,
- EMACH_SEND_NOTIFY_IN_PROGRESS = 0x10000006,
- EMACH_SEND_INTERRUPTED = 0x10000007,
- EMACH_SEND_MSG_TOO_SMALL = 0x10000008,
- EMACH_SEND_INVALID_REPLY = 0x10000009,
- EMACH_SEND_INVALID_RIGHT = 0x1000000a,
- EMACH_SEND_INVALID_NOTIFY = 0x1000000b,
- EMACH_SEND_INVALID_MEMORY = 0x1000000c,
- EMACH_SEND_NO_BUFFER = 0x1000000d,
- EMACH_SEND_NO_NOTIFY = 0x1000000e,
- EMACH_SEND_INVALID_TYPE = 0x1000000f,
- EMACH_SEND_INVALID_HEADER = 0x10000010,
- EMACH_RCV_IN_PROGRESS = 0x10004001,
- EMACH_RCV_INVALID_NAME = 0x10004002,
- EMACH_RCV_TIMED_OUT = 0x10004003,
- EMACH_RCV_TOO_LARGE = 0x10004004,
- EMACH_RCV_INTERRUPTED = 0x10004005,
- EMACH_RCV_PORT_CHANGED = 0x10004006,
- EMACH_RCV_INVALID_NOTIFY = 0x10004007,
- EMACH_RCV_INVALID_DATA = 0x10004008,
- EMACH_RCV_PORT_DIED = 0x10004009,
- EMACH_RCV_IN_SET = 0x1000400a,
- EMACH_RCV_HEADER_ERROR = 0x1000400b,
- EMACH_RCV_BODY_ERROR = 0x1000400c,
+/* The Hurd uses Mach error system 0x10, currently only subsystem 0. */
+#define EPERM 0x40000001 /* Operation not permitted */
+#define ENOENT 0x40000002 /* No such file or directory */
+#define ESRCH 0x40000003 /* No such process */
+#define EINTR 0x40000004 /* Interrupted system call */
+#define EIO 0x40000005 /* Input/output error */
+#define ENXIO 0x40000006 /* No such device or address */
+#define E2BIG 0x40000007 /* Argument list too long */
+#define ENOEXEC 0x40000008 /* Exec format error */
+#define EBADF 0x40000009 /* Bad file descriptor */
+#define ECHILD 0x4000000a /* No child processes */
+#define EDEADLK 0x4000000b /* Resource deadlock avoided */
+#define ENOMEM 0x4000000c /* Cannot allocate memory */
+#define EACCES 0x4000000d /* Permission denied */
+#define EFAULT 0x4000000e /* Bad address */
+#define ENOTBLK 0x4000000f /* Block device required */
+#define EBUSY 0x40000010 /* Device or resource busy */
+#define EEXIST 0x40000011 /* File exists */
+#define EXDEV 0x40000012 /* Invalid cross-device link */
+#define ENODEV 0x40000013 /* No such device */
+#define ENOTDIR 0x40000014 /* Not a directory */
+#define EISDIR 0x40000015 /* Is a directory */
+#define EINVAL 0x40000016 /* Invalid argument */
+#define EMFILE 0x40000018 /* Too many open files */
+#define ENFILE 0x40000017 /* Too many open files in system */
+#define ENOTTY 0x40000019 /* Inappropriate ioctl for device */
+#define ETXTBSY 0x4000001a /* Text file busy */
+#define EFBIG 0x4000001b /* File too large */
+#define ENOSPC 0x4000001c /* No space left on device */
+#define ESPIPE 0x4000001d /* Illegal seek */
+#define EROFS 0x4000001e /* Read-only file system */
+#define EMLINK 0x4000001f /* Too many links */
+#define EPIPE 0x40000020 /* Broken pipe */
+#define EDOM 0x40000021 /* Numerical argument out of domain */
+#define ERANGE 0x40000022 /* Numerical result out of range */
+#define EAGAIN 0x40000023 /* Resource temporarily unavailable */
+#define EWOULDBLOCK EAGAIN /* Operation would block */
+#define EINPROGRESS 0x40000024 /* Operation now in progress */
+#define EALREADY 0x40000025 /* Operation already in progress */
+#define ENOTSOCK 0x40000026 /* Socket operation on non-socket */
+#define EMSGSIZE 0x40000028 /* Message too long */
+#define EPROTOTYPE 0x40000029 /* Protocol wrong type for socket */
+#define ENOPROTOOPT 0x4000002a /* Protocol not available */
+#define EPROTONOSUPPORT 0x4000002b /* Protocol not supported */
+#define ESOCKTNOSUPPORT 0x4000002c /* Socket type not supported */
+#define EOPNOTSUPP 0x4000002d /* Operation not supported */
+#define EPFNOSUPPORT 0x4000002e /* Protocol family not supported */
+#define EAFNOSUPPORT 0x4000002f /* Address family not supported by protocol */
+#define EADDRINUSE 0x40000030 /* Address already in use */
+#define EADDRNOTAVAIL 0x40000031 /* Cannot assign requested address */
+#define ENETDOWN 0x40000032 /* Network is down */
+#define ENETUNREACH 0x40000033 /* Network is unreachable */
+#define ENETRESET 0x40000034 /* Network dropped connection on reset */
+#define ECONNABORTED 0x40000035 /* Software caused connection abort */
+#define ECONNRESET 0x40000036 /* Connection reset by peer */
+#define ENOBUFS 0x40000037 /* No buffer space available */
+#define EISCONN 0x40000038 /* Transport endpoint is already connected */
+#define ENOTCONN 0x40000039 /* Transport endpoint is not connected */
+#define EDESTADDRREQ 0x40000027 /* Destination address required */
+#define ESHUTDOWN 0x4000003a /* Cannot send after transport endpoint shutdown */
+#define ETOOMANYREFS 0x4000003b /* Too many references: cannot splice */
+#define ETIMEDOUT 0x4000003c /* Connection timed out */
+#define ECONNREFUSED 0x4000003d /* Connection refused */
+#define ELOOP 0x4000003e /* Too many levels of symbolic links */
+#define ENAMETOOLONG 0x4000003f /* File name too long */
+#define EHOSTDOWN 0x40000040 /* Host is down */
+#define EHOSTUNREACH 0x40000041 /* No route to host */
+#define ENOTEMPTY 0x40000042 /* Directory not empty */
+#define EPROCLIM 0x40000043 /* Too many processes */
+#define EUSERS 0x40000044 /* Too many users */
+#define EDQUOT 0x40000045 /* Disk quota exceeded */
+#define ESTALE 0x40000046 /* Stale file handle */
+#define EREMOTE 0x40000047 /* Object is remote */
+#define EBADRPC 0x40000048 /* RPC struct is bad */
+#define ERPCMISMATCH 0x40000049 /* RPC version wrong */
+#define EPROGUNAVAIL 0x4000004a /* RPC program not available */
+#define EPROGMISMATCH 0x4000004b /* RPC program version wrong */
+#define EPROCUNAVAIL 0x4000004c /* RPC bad procedure for program */
+#define ENOLCK 0x4000004d /* No locks available */
+#define EFTYPE 0x4000004f /* Inappropriate file type or format */
+#define EAUTH 0x40000050 /* Authentication error */
+#define ENEEDAUTH 0x40000051 /* Need authenticator */
+#define ENOSYS 0x4000004e /* Function not implemented */
+#define ENOTSUP 0x40000076 /* Not supported */
+#define EILSEQ 0x4000006a /* Invalid or incomplete multibyte or wide character */
+#define EBACKGROUND 0x40000064 /* Inappropriate operation for background process */
+#define EDIED 0x40000065 /* Translator died */
+#define ED 0x40000066 /* ? */
+#define EGREGIOUS 0x40000067 /* You really blew it this time */
+#define EIEIO 0x40000068 /* Computer bought the farm */
+#define EGRATUITOUS 0x40000069 /* Gratuitous error */
+#define EBADMSG 0x4000006b /* Bad message */
+#define EIDRM 0x4000006c /* Identifier removed */
+#define EMULTIHOP 0x4000006d /* Multihop attempted */
+#define ENODATA 0x4000006e /* No data available */
+#define ENOLINK 0x4000006f /* Link has been severed */
+#define ENOMSG 0x40000070 /* No message of desired type */
+#define ENOSR 0x40000071 /* Out of streams resources */
+#define ENOSTR 0x40000072 /* Device not a stream */
+#define EOVERFLOW 0x40000073 /* Value too large for defined data type */
+#define EPROTO 0x40000074 /* Protocol error */
+#define ETIME 0x40000075 /* Timer expired */
+#define ECANCELED 0x40000077 /* Operation canceled */
- /* Errors from <mach/kern_return.h>. */
- EKERN_INVALID_ADDRESS = 1,
- EKERN_PROTECTION_FAILURE = 2,
- EKERN_NO_SPACE = 3,
- EKERN_INVALID_ARGUMENT = 4,
- EKERN_FAILURE = 5,
- EKERN_RESOURCE_SHORTAGE = 6,
- EKERN_NOT_RECEIVER = 7,
- EKERN_NO_ACCESS = 8,
- EKERN_MEMORY_FAILURE = 9,
- EKERN_MEMORY_ERROR = 10,
- EKERN_NOT_IN_SET = 12,
- EKERN_NAME_EXISTS = 13,
- EKERN_ABORTED = 14,
- EKERN_INVALID_NAME = 15,
- EKERN_INVALID_TASK = 16,
- EKERN_INVALID_RIGHT = 17,
- EKERN_INVALID_VALUE = 18,
- EKERN_UREFS_OVERFLOW = 19,
- EKERN_INVALID_CAPABILITY = 20,
- EKERN_RIGHT_EXISTS = 21,
- EKERN_INVALID_HOST = 22,
- EKERN_MEMORY_PRESENT = 23,
- EKERN_WRITE_PROTECTION_FAILURE = 24,
- EKERN_TERMINATED = 26,
+/* Errors from <mach/message.h>. */
+#define EMACH_SEND_IN_PROGRESS 0x10000001
+#define EMACH_SEND_INVALID_DATA 0x10000002
+#define EMACH_SEND_INVALID_DEST 0x10000003
+#define EMACH_SEND_TIMED_OUT 0x10000004
+#define EMACH_SEND_WILL_NOTIFY 0x10000005
+#define EMACH_SEND_NOTIFY_IN_PROGRESS 0x10000006
+#define EMACH_SEND_INTERRUPTED 0x10000007
+#define EMACH_SEND_MSG_TOO_SMALL 0x10000008
+#define EMACH_SEND_INVALID_REPLY 0x10000009
+#define EMACH_SEND_INVALID_RIGHT 0x1000000a
+#define EMACH_SEND_INVALID_NOTIFY 0x1000000b
+#define EMACH_SEND_INVALID_MEMORY 0x1000000c
+#define EMACH_SEND_NO_BUFFER 0x1000000d
+#define EMACH_SEND_NO_NOTIFY 0x1000000e
+#define EMACH_SEND_INVALID_TYPE 0x1000000f
+#define EMACH_SEND_INVALID_HEADER 0x10000010
+#define EMACH_RCV_IN_PROGRESS 0x10004001
+#define EMACH_RCV_INVALID_NAME 0x10004002
+#define EMACH_RCV_TIMED_OUT 0x10004003
+#define EMACH_RCV_TOO_LARGE 0x10004004
+#define EMACH_RCV_INTERRUPTED 0x10004005
+#define EMACH_RCV_PORT_CHANGED 0x10004006
+#define EMACH_RCV_INVALID_NOTIFY 0x10004007
+#define EMACH_RCV_INVALID_DATA 0x10004008
+#define EMACH_RCV_PORT_DIED 0x10004009
+#define EMACH_RCV_IN_SET 0x1000400a
+#define EMACH_RCV_HEADER_ERROR 0x1000400b
+#define EMACH_RCV_BODY_ERROR 0x1000400c
- /* Errors from <mach/mig_errors.h>. */
- EMIG_TYPE_ERROR = -300 /* client type check failure */,
- EMIG_REPLY_MISMATCH = -301 /* wrong reply message ID */,
- EMIG_REMOTE_ERROR = -302 /* server detected error */,
- EMIG_BAD_ID = -303 /* bad request message ID */,
- EMIG_BAD_ARGUMENTS = -304 /* server type check failure */,
- EMIG_NO_REPLY = -305 /* no reply should be sent */,
- EMIG_EXCEPTION = -306 /* server raised exception */,
- EMIG_ARRAY_TOO_LARGE = -307 /* array not large enough */,
- EMIG_SERVER_DIED = -308 /* server died */,
- EMIG_DESTROY_REQUEST = -309 /* destroy request with no reply */,
+/* Errors from <mach/kern_return.h>. */
+#define EKERN_INVALID_ADDRESS 1
+#define EKERN_PROTECTION_FAILURE 2
+#define EKERN_NO_SPACE 3
+#define EKERN_INVALID_ARGUMENT 4
+#define EKERN_FAILURE 5
+#define EKERN_RESOURCE_SHORTAGE 6
+#define EKERN_NOT_RECEIVER 7
+#define EKERN_NO_ACCESS 8
+#define EKERN_MEMORY_FAILURE 9
+#define EKERN_MEMORY_ERROR 10
+#define EKERN_NOT_IN_SET 12
+#define EKERN_NAME_EXISTS 13
+#define EKERN_ABORTED 14
+#define EKERN_INVALID_NAME 15
+#define EKERN_INVALID_TASK 16
+#define EKERN_INVALID_RIGHT 17
+#define EKERN_INVALID_VALUE 18
+#define EKERN_UREFS_OVERFLOW 19
+#define EKERN_INVALID_CAPABILITY 20
+#define EKERN_RIGHT_EXISTS 21
+#define EKERN_INVALID_HOST 22
+#define EKERN_MEMORY_PRESENT 23
+#define EKERN_WRITE_PROTECTION_FAILURE 24
+#define EKERN_TERMINATED 26
+#define EKERN_TIMEDOUT 27
+#define EKERN_INTERRUPTED 28
- /* Errors from <device/device_types.h>. */
- ED_IO_ERROR = 2500 /* hardware IO error */,
- ED_WOULD_BLOCK = 2501 /* would block, but D_NOWAIT set */,
- ED_NO_SUCH_DEVICE = 2502 /* no such device */,
- ED_ALREADY_OPEN = 2503 /* exclusive-use device already open */,
- ED_DEVICE_DOWN = 2504 /* device has been shut down */,
- ED_INVALID_OPERATION = 2505 /* bad operation for device */,
- ED_INVALID_RECNUM = 2506 /* invalid record (block) number */,
- ED_INVALID_SIZE = 2507 /* invalid IO size */,
- ED_NO_MEMORY = 2508 /* memory allocation failure */,
- ED_READ_ONLY = 2509 /* device cannot be written to */
+/* Errors from <mach/mig_errors.h>. */
+#define EMIG_TYPE_ERROR (-300) /* client type check failure */
+#define EMIG_REPLY_MISMATCH (-301) /* wrong reply message ID */
+#define EMIG_REMOTE_ERROR (-302) /* server detected error */
+#define EMIG_BAD_ID (-303) /* bad request message ID */
+#define EMIG_BAD_ARGUMENTS (-304) /* server type check failure */
+#define EMIG_NO_REPLY (-305) /* no reply should be sent */
+#define EMIG_EXCEPTION (-306) /* server raised exception */
+#define EMIG_ARRAY_TOO_LARGE (-307) /* array not large enough */
+#define EMIG_SERVER_DIED (-308) /* server died */
+#define EMIG_DESTROY_REQUEST (-309) /* destroy request with no reply */
-};
+/* Errors from <device/device_types.h>. */
+#define ED_IO_ERROR 2500 /* hardware IO error */
+#define ED_WOULD_BLOCK 2501 /* would block, but D_NOWAIT set */
+#define ED_NO_SUCH_DEVICE 2502 /* no such device */
+#define ED_ALREADY_OPEN 2503 /* exclusive-use device already open */
+#define ED_DEVICE_DOWN 2504 /* device has been shut down */
+#define ED_INVALID_OPERATION 2505 /* bad operation for device */
+#define ED_INVALID_RECNUM 2506 /* invalid record (block) number */
+#define ED_INVALID_SIZE 2507 /* invalid IO size */
+#define ED_NO_MEMORY 2508 /* memory allocation failure */
+#define ED_READ_ONLY 2509 /* device cannot be written to */
#define _HURD_ERRNOS 120
-/* User-visible type of error codes. It is ok to use `int' or
- `kern_return_t' for these, but with `error_t' the debugger prints
- symbolic values. */
-#ifdef __USE_GNU
-typedef enum __error_t_codes error_t;
-#define __error_t_defined 1
-#endif
-
-/* Return the current thread's location for `errno'.
- The syntax of this function allows redeclarations like `int errno'. */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-#define errno (*__errno_location ())
-
-#endif /* <errno.h> included. */
-
-#if !defined (_ERRNO_H) && defined (__need_Emath)
-#define EDOM _HURD_ERRNO (33)/* Numerical argument out of domain */
-#define ERANGE _HURD_ERRNO (34)/* Numerical result out of range */
-#endif /* <errno.h> not included and need math error codes. */
+#endif /* bits/errno.h. */
diff --git a/sysdeps/mach/hurd/errnos.awk b/sysdeps/mach/hurd/errnos.awk
index 1cd2a0a..1459244 100644
--- a/sysdeps/mach/hurd/errnos.awk
+++ b/sysdeps/mach/hurd/errnos.awk
@@ -21,26 +21,17 @@
BEGIN {
print "/* This file generated by errnos.awk. */";
print "";
- print "/* The Hurd uses Mach error system 0x10, currently only subsystem 0. */";
- print "#ifndef _HURD_ERRNO";
- print "#define _HURD_ERRNO(n)\t((0x10 << 26) | ((n) & 0x3fff))";
- print "#endif";
+ print "#ifndef _BITS_ERRNO_H";
+ print "#define _BITS_ERRNO_H 1";
print "";
- print "#ifdef _ERRNO_H\n";
- print "enum __error_t_codes\n{";
- print "\t/* The value zero always means success and it is perfectly fine for";
- print "\t code to use 0 explicitly (or implicitly, e.g. via Boolean coercion).";
- print "\t Having an enum entry for zero both makes the debugger print the name";
- print "\t for error_t-typed zero values, and prevents the compiler from";
- print "\t issuing warnings about 'case 0:' in a switch on an error_t-typed";
- print "\t value. */";
- print "\tESUCCESS = 0,"
+ print "#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H";
+ print "#error \"Never include <bits/errno.h> directly; use <errno.h> instead.\"";
+ print "#endif";
print "";
+ print "/* The Hurd uses Mach error system 0x10, currently only subsystem 0. */";
maxerrno = 0;
in_mach_errors = "";
in_math = 0;
- edom = erange = "";
- print "#undef EDOM\n#undef ERANGE";
lno = 0;
}
@@ -49,41 +40,41 @@ BEGIN {
etext = "";
for (i = 3; i <= NF; ++i)
etext = etext " " $i;
- etext = substr(etext, 1, length(etext)-1)
+ etext = substr(etext, 1, length(etext)-1);
- e = substr($1, 8, length($1)-8)
- if (e == "EWOULDBLOCK")
+ e = substr($1, 8, length($1)-8);
+ errno = substr($2, 1, length($2)-1);
+ if (errno ~ /^E[A-Z0-9_]*$/)
{
- lines[lno++]="#define EWOULDBLOCK EAGAIN /* Operation would block */";
+ printf ("#define %-30s %-10s /*%s */\n", e, errno, etext);
next;
}
- errno = substr($2, 1, length($2)-1) + 0
+ errno = errno + 0;
if (errno == 0)
next;
- if (errno > maxerrno) maxerrno = errno;
- x = sprintf ("%-40s/*%s */", sprintf ("%-24s%s", "#define\t" e,
- "_HURD_ERRNO (" errno ")"),
- etext);
- if (e == "EDOM")
- edom = x;
- else if (e == "ERANGE")
- erange = x;
- comma[lno] = 1;
- lines[lno++] = sprintf("\t%-16s= _HURD_ERRNO (%d)", e, errno);
- lines[lno++] = x;
+ if (errno > 0x3fff)
+ {
+ printf("%s:%d: errno value %d too large for the Hurd\n",
+ FILENAME, NR, errno) >> "/dev/stderr";
+ exit 1;
+ }
+ if (errno > maxerrno)
+ maxerrno = errno;
+ printf ("#define %-30s 0x%08x /*%s */\n",
+ e, 0x40000000 + errno, etext);
next;
}
NF == 3 && $1 == "#define" && $2 == "MACH_SEND_IN_PROGRESS" \
{
in_mach_errors = FILENAME;
- lines[lno++] = "\n\t/* Errors from <mach/message.h>. */";
+ print "\n/* Errors from <mach/message.h>. */";
}
NF == 3 && $1 == "#define" && $2 == "KERN_SUCCESS" \
{
in_mach_errors = FILENAME;
- lines[lno++] = "\n\t/* Errors from <mach/kern_return.h>. */";
+ print "\n/* Errors from <mach/kern_return.h>. */";
next;
}
@@ -94,14 +85,13 @@ in_mach_errors != "" && $2 == "MACH_IPC_COMPAT" \
in_mach_errors == FILENAME && NF == 3 && $1 == "#define" \
{
- comma[lno] = 1;
- lines[lno++] = sprintf("\t%-32s= %s", "E" $2, $3);
+ printf("#define %-30s %s\n", "E" $2, $3);
}
$1 == "#define" && $2 == "_MACH_MIG_ERRORS_H_" \
{
in_mig_errors = 1;
- lines[lno++] = "\n\t/* Errors from <mach/mig_errors.h>. */";
+ print "\n/* Errors from <mach/mig_errors.h>. */";
next;
}
in_mig_errors && $1 == "#endif" && $3 == "_MACH_MIG_ERRORS_H_" \
@@ -115,14 +105,17 @@ in_mig_errors && $1 == "#endif" && $3 == "_MACH_MIG_ERRORS_H_" \
comment = "";
for (i = 4; i <= NF; ++i)
comment = comment " " $i;
- comma[lno] = 1;
- lines[lno++] = sprintf("%-32s", sprintf ("\t%-24s= %s", "E" $2, $3)) comment;
+ if ($3 < 0)
+ val = "(" $3 ")";
+ else
+ val = $3;
+ printf("#define %-30s %6s%s\n", "E" $2, val, comment);
}
$1 == "#define" && $2 == "D_SUCCESS" \
{
in_device_errors = 1;
- lines[lno++] = "\n\t/* Errors from <device/device_types.h>. */";
+ print "\n/* Errors from <device/device_types.h>. */";
next;
}
in_device_errors && $1 == "#endif" \
@@ -131,35 +124,9 @@ in_device_errors && $1 == "#endif" \
}
-END \
- {
- for (i = 0; i < lno - 1; ++i)
- printf "%s%s\n", lines[i], (comma[i] ? "," : "");
- print lines[i];
- print "";
- print "};";
+END {
print "";
printf "#define\t_HURD_ERRNOS\t%d\n", maxerrno+1;
print "";
- print "\
-/* User-visible type of error codes. It is ok to use `int' or\n\
- `kern_return_t' for these, but with `error_t' the debugger prints\n\
- symbolic values. */";
- print "#ifdef __USE_GNU";
- print "typedef enum __error_t_codes error_t;"
- print "#define __error_t_defined\t1"
- print "#endif";
- print "";
- print "\
-/* Return the current thread's location for `errno'.\n\
- The syntax of this function allows redeclarations like `int errno'. */\n\
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));\n\
-\n\
-#define errno (*__errno_location ())\n\
-";
- print "#endif /* <errno.h> included. */";
- print "";
- print "#if !defined (_ERRNO_H) && defined (__need_Emath)";
- print edom; print erange;
- print "#endif /* <errno.h> not included and need math error codes. */";
+ print "#endif /* bits/errno.h. */";
}
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/errno.h b/sysdeps/unix/sysv/linux/alpha/bits/errno.h
index 3338621..bcab228 100644
--- a/sysdeps/unix/sysv/linux/alpha/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/alpha/bits/errno.h
@@ -16,23 +16,29 @@
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
# include <linux/errno.h>
-/* Linux has no ENOTSUP error code. */
-# define ENOTSUP EOPNOTSUPP
+/* Older Linux headers do not define these constants. */
+# ifndef ENOTSUP
+# define ENOTSUP EOPNOTSUPP
+# endif
# ifndef ECANCELED
-# define ECANCELED 131
+# define ECANCELED 131
# endif
-/* Support for error codes to support robust mutexes was added later, too. */
# ifndef EOWNERDEAD
# define EOWNERDEAD 136
+# endif
+
+# ifndef ENOTRECOVERABLE
# define ENOTRECOVERABLE 137
# endif
@@ -44,22 +50,4 @@
# define EHWPOISON 139
# endif
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable. */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-# if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value. */
-# define errno (*__errno_location ())
-# endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough. We must
- define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
- defined. */
-# define EDOM 33 /* Math argument out of domain of function. */
-# define EILSEQ 116 /* Illegal byte sequence. */
-# define ERANGE 34 /* Math result not representable. */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h. */
diff --git a/sysdeps/unix/sysv/linux/bits/errno.h b/sysdeps/unix/sysv/linux/bits/errno.h
index c0f4d20..38019b7 100644
--- a/sysdeps/unix/sysv/linux/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/bits/errno.h
@@ -16,24 +16,29 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
# include <linux/errno.h>
-/* Linux has no ENOTSUP error code. */
-# define ENOTSUP EOPNOTSUPP
+/* Older Linux headers do not define these constants. */
+# ifndef ENOTSUP
+# define ENOTSUP EOPNOTSUPP
+# endif
-/* Older Linux versions also had no ECANCELED error code. */
# ifndef ECANCELED
-# define ECANCELED 125
+# define ECANCELED 125
# endif
-/* Support for error codes to support robust mutexes was added later, too. */
# ifndef EOWNERDEAD
# define EOWNERDEAD 130
+# endif
+
+#ifndef ENOTRECOVERABLE
# define ENOTRECOVERABLE 131
# endif
@@ -45,22 +50,4 @@
# define EHWPOISON 133
# endif
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable. */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-# if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value. */
-# define errno (*__errno_location ())
-# endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough. We must
- define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
- defined. */
-# define EDOM 33 /* Math argument out of domain of function. */
-# define EILSEQ 84 /* Illegal byte sequence. */
-# define ERANGE 34 /* Math result not representable. */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h. */
diff --git a/sysdeps/unix/sysv/linux/hppa/bits/errno.h b/sysdeps/unix/sysv/linux/hppa/bits/errno.h
index ce6bebe..241b696 100644
--- a/sysdeps/unix/sysv/linux/hppa/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/hppa/bits/errno.h
@@ -16,17 +16,22 @@
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
# include <linux/errno.h>
-/* Linux also has no ECANCELED error code. Since it is not used here
- we define it to an invalid value. */
+/* Older Linux headers do not define these constants. */
+# ifndef ENOTSUP
+# define ENOTSUP EOPNOTSUPP
+# endif
+
# ifndef ECANCELED
-# define ECANCELED ECANCELLED
+# define ECANCELED 253
# endif
# ifndef EOWNERDEAD
@@ -45,22 +50,4 @@
# define EHWPOISON 257
# endif
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable. */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-# if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value. */
-# define errno (*__errno_location ())
-# endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough. We must
- define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
- defined. */
-# define EDOM 33 /* Math argument out of domain of function. */
-# define EILSEQ 47 /* Illegal byte sequence. */
-# define ERANGE 34 /* Math result not representable. */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h. */
diff --git a/sysdeps/unix/sysv/linux/mips/bits/errno.h b/sysdeps/unix/sysv/linux/mips/bits/errno.h
index fa62e1f..55df83d 100644
--- a/sysdeps/unix/sysv/linux/mips/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/mips/bits/errno.h
@@ -16,23 +16,28 @@
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
# include <linux/errno.h>
-/* Linux has no ENOTSUP error code. */
-# define ENOTSUP EOPNOTSUPP
+/* Older Linux headers do not define these constants. */
+# ifndef ENOTSUP
+# define ENOTSUP EOPNOTSUPP
+# endif
# ifndef ECANCELED
-# define ECANCELED 158
+# define ECANCELED 158
# endif
-/* Support for error codes to support robust mutexes was added later, too. */
# ifndef EOWNERDEAD
# define EOWNERDEAD 165
+# endif
+
+# ifndef ENOTRECOVERABLE
# define ENOTRECOVERABLE 166
# endif
@@ -44,22 +49,4 @@
# define EHWPOISON 168
# endif
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable. */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-# if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value. */
-# define errno (*__errno_location ())
-# endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough. We must
- define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
- defined. */
-# define EDOM 33 /* Math argument out of domain of function. */
-# define EILSEQ 88 /* Illegal byte sequence. */
-# define ERANGE 34 /* Math result not representable. */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h. */
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/errno.h b/sysdeps/unix/sysv/linux/sparc/bits/errno.h
index 4a8d8a0..9e13e66 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/errno.h
@@ -16,23 +16,29 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
# include <linux/errno.h>
-/* Linux has no ENOTSUP error code. */
-# define ENOTSUP EOPNOTSUPP
+/* Older Linux headers do not define these constants. */
+# ifndef ENOTSUP
+# define ENOTSUP EOPNOTSUPP
+# endif
# ifndef ECANCELED
-# define ECANCELED 127
+# define ECANCELED 127
# endif
-/* Support for error codes to support robust mutexes was added later, too. */
# ifndef EOWNERDEAD
# define EOWNERDEAD 132
+# endif
+
+# ifndef ENOTRECOVERABLE
# define ENOTRECOVERABLE 133
# endif
@@ -44,22 +50,4 @@
# define EHWPOISON 135
# endif
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable. */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-# if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value. */
-# define errno (*__errno_location ())
-# endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough. We must
- define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
- defined. */
-# define EDOM 33 /* Math argument out of domain of function. */
-# define EILSEQ 122 /* Illegal byte sequence. */
-# define ERANGE 34 /* Math result not representable. */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h. */
diff --git a/sysdeps/x86_64/fpu/s_cosf.S b/sysdeps/x86_64/fpu/s_cosf.S
index e9fdc7e..7acafcd 100644
--- a/sysdeps/x86_64/fpu/s_cosf.S
+++ b/sysdeps/x86_64/fpu/s_cosf.S
@@ -17,8 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
/* Short algorithm description:
*
diff --git a/sysdeps/x86_64/fpu/s_sincosf.S b/sysdeps/x86_64/fpu/s_sincosf.S
index e6ed81e..fd35a31 100644
--- a/sysdeps/x86_64/fpu/s_sincosf.S
+++ b/sysdeps/x86_64/fpu/s_sincosf.S
@@ -17,8 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
/* Short algorithm description:
*
diff --git a/sysdeps/x86_64/fpu/s_sinf.S b/sysdeps/x86_64/fpu/s_sinf.S
index 0aa5d43..253ba7d 100644
--- a/sysdeps/x86_64/fpu/s_sinf.S
+++ b/sysdeps/x86_64/fpu/s_sinf.S
@@ -17,8 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
/* Short algorithm description:
*
-----------------------------------------------------------------------
hooks/post-receive
--
GNU C Library master sources