]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Remove __need macros from errno.h (__need_Emath, __need_error_t).
authorZack Weinberg <zackw@panix.com>
Tue, 21 Mar 2017 20:30:53 +0000 (16:30 -0400)
committerZack Weinberg <zackw@panix.com>
Wed, 14 Jun 2017 12:14:34 +0000 (08:14 -0400)
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_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.  There is no reason why
these nonstandard headers cannot just go ahead and include all of
errno.h; so we do that.

__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.  The Hurd bits/errno.h must also take care not to define
error_t when __ASSEMBLER__ is defined, which involves repeating all of
the definitions twice, but it's a generated file so that's okay.

* stdlib/errno.h: Remove __need_Emath and __need_error_t logic.
Reorganize file.  Declare errno here.  When __ASSEMBLER__ is
defined, don't declare anything other than the E-constants.

* include/errno.h: Change conditional for exposing internal
declarations to (not _ISOMAC and not __ASSEMBLER__).
* bits/errno.h: Remove logic for __need_Emath.  Document
requirements for a port-specific bits/errno.h.

* 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.  Consistent
formatting.
* sysdeps/mach/hurd/errnos.awk: Likewise.  Only define error_t and
enum __error_t_codes if __ASSEMBLER__ is not defined.
* sysdeps/mach/hurd/bits/errno.h: Regenerate.

* argp/argp.h, string/argz.h: Don't define __need_error_t before
including errno.h.
* 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.

20 files changed:
ChangeLog
NEWS
argp/argp.h
bits/errno.h
include/errno.h
stdlib/errno.h
string/argz.h
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/mach/hurd/bits/errno.h
sysdeps/mach/hurd/errnos.awk
sysdeps/unix/sysv/linux/alpha/bits/errno.h
sysdeps/unix/sysv/linux/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
sysdeps/x86_64/fpu/s_cosf.S
sysdeps/x86_64/fpu/s_sincosf.S
sysdeps/x86_64/fpu/s_sinf.S

index f7c9635aa36f4a9fb7a96c46548b5461fe6e860d..0d63b39b2ee54c8b89fd4cf874af242c90a4303f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,38 @@
+2017-06-14  Zack Weinberg  <zackw@panix.com>
+
+       * stdlib/errno.h: Remove __need_Emath and __need_error_t logic.
+       Reorganize file.  Declare errno here.  When __ASSEMBLER__ is
+       defined, don't declare anything other than the E-constants.
+
+       * include/errno.h: Change conditional for exposing internal
+       declarations to (not _ISOMAC and not __ASSEMBLER__).
+       * bits/errno.h: Remove logic for __need_Emath.  Document
+       requirements for a port-specific bits/errno.h.
+
+       * 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.  Consistent
+       formatting.
+       * sysdeps/mach/hurd/errnos.awk: Likewise.  Only define error_t and
+       enum __error_t_codes if __ASSEMBLER__ is not defined.
+       * sysdeps/mach/hurd/bits/errno.h: Regenerate.
+
+       * argp/argp.h, string/argz.h: Don't define __need_error_t before
+       including errno.h.
+       * 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.
+
 2017-06-14  Zack Weinberg  <zackw@panix.com>
 
        * bits/uio_lim.h, sysdeps/unix/sysv/linux/bits/uio_lim.h
diff --git a/NEWS b/NEWS
index 991ee63f7c1b03a561e7c386e6c7c582a76bac24..8d35bd6c957d4f11fa1cd1db1068998261ddc14e 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,10 @@ 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.
+
 * 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
index 86b8e5a1e968a7ef0eb617965cca921e6dcc4b01..08b48e1cf154c4c7ba0c4b908211d6b365cf4d76 100644 (file)
 #include <ctype.h>
 #include <getopt.h>
 #include <limits.h>
-
-#define __need_error_t
 #include <errno.h>
+\f
+__BEGIN_DECLS
 
+/* error_t may or may not be available from errno.h, depending on the
+   operating system.  */
 #ifndef __error_t_defined
+# define __error_t_defined 1
 typedef int error_t;
-# define __error_t_defined
 #endif
-\f
-__BEGIN_DECLS
 
 /* A description of a particular option.  A pointer to an array of
    these is passed in the OPTIONS field of an argp structure.  Each option
index cd4fcfa428c25785834b957992692c28b3b054ef..11180711d741c135f5022adc9d80191ce4390bce 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
+/* Error constants.  Generic version.
+   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
    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
+# 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.  It is OK to define
+   macros that are not error constants, but only in the implementation
+   namespace.
+
+   errno.h is sometimes included from assembly language.  Therefore,
+   when __ASSEMBLER__ is defined, bits/errno.h may only define macros;
+   it may not make any other kind of C declaration or definition.
+   Also, the error constants should, if at all possible, expand to
+   simple decimal or hexadecimal numbers.  */
+
+#endif /* bits/errno.h.  */
index f140631b3131fea4a8db24f3b621ee6d1b02fcfb..3c3d2288c8bb2a8dab9f1b49e36b7e06463a3ff1 100644 (file)
@@ -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__
 #  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 */
index c42514b448a5e3161725b147ce48a0b73b3477a4..fe08365e401b495135e30d585edca42a9e9f27b4 100644 (file)
  */
 
 #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
+#include <features.h>
 
-__BEGIN_DECLS
-
-/* Get the error number constants from the system-specific file.
-   This file will test __need_Emath and _ERRNO_H.  */
+/* The system-specific definitions of the E* constants, as macros.  */
 #include <bits/errno.h>
-#undef __need_Emath
 
-#ifdef _ERRNO_H
+/* When included from assembly language, this header only provides the
+   E* constants.  */
+#ifndef __ASSEMBLER__
 
-/* 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
+__BEGIN_DECLS
 
-#ifdef __USE_GNU
+/* The error code set by various library functions.  */
+extern int *__errno_location (void) __THROW __attribute_const__;
+# define errno (*__errno_location ())
+
+# ifdef __USE_GNU
 
 /* 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].  */
-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;
 
-__END_DECLS
+/* bits/errno.h may have defined this type.  If it didn't, provide a
+   fallback definition.  */
+#  ifndef __error_t_defined
+#   define __error_t_defined 1
+typedef int error_t;
+#  endif
 
-#endif /* _ERRNO_H */
+# endif /* __USE_GNU */
 
-/* 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
+__END_DECLS
+
+#endif /* !__ASSEMBLER__ */
+#endif /* errno.h */
index f9d0ac99507a2ff87baf6cd6c6d9af641b3b997f..e07d74208a5bbb9233b8f5eacefcb31c38dc087d 100644 (file)
 #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.  */
 
+__BEGIN_DECLS
+
+/* error_t may or may not be available from errno.h, depending on the
+   operating system.  */
 #ifndef __error_t_defined
+# define __error_t_defined 1
 typedef int error_t;
 #endif
 
-
-__BEGIN_DECLS
-
 /* Make a '\0' separated arg vector from a unix argv vector, returning it in
    ARGZ, and the total length in LEN.  If a memory allocation error occurs,
    ENOMEM is returned, otherwise 0.  The result can be destroyed using free. */
index f37850d0b3f6992bd96ddf36fc98ad85a0ae5bf6..a5b76e9fb2b1cf4fce989983f5ee7c2425dc2bbd 100644 (file)
@@ -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:
  *
index f31a92552267351211c9b57d938a55261bdd8a62..1e99ee6416033caab59902b6ad7eaba5af1fc67f 100644 (file)
@@ -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:
  *
index ee96018061459130e4af9a206681f676af007121..03b925491e6c841071c68b10b00ef6061254707c 100644 (file)
@@ -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:
  *
index d20ffe654a25bbc9daeb0fd9c1f3dd0fcbd87b7f..f0a11af9ea1f46756186de2b4ec13edb35fa8952 100644 (file)
-/* This file generated by errnos.awk.  */
+/* This file generated by errnos.awk from
+     errno.texi
+     mach/message.h
+     mach/kern_return.h
+     mach/mig_errors.h
+     device/device_types.h
+   Do not edit this file; edit errnos.awk and regenerate it.  */
 
-/* The Hurd uses Mach error system 0x10, currently only subsystem 0. */
-#ifndef _HURD_ERRNO
-#define _HURD_ERRNO(n) ((0x10 << 26) | ((n) & 0x3fff))
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H
+# error "Never include <bits/errno.h> directly; use <errno.h> instead."
 #endif
 
-#ifdef _ERRNO_H
+#ifndef __ASSEMBLER__
 
 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,
+  /* 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 */
+  /* The Hurd uses Mach error system 0x10, subsystem 0. */
+  EPERM                          = 0x40000001, /* Operation not permitted */
+  ENOENT                         = 0x40000002, /* No such file or directory */
+  ESRCH                          = 0x40000003, /* No such process */
+  EINTR                          = 0x40000004, /* Interrupted system call */
+  EIO                            = 0x40000005, /* Input/output error */
+  ENXIO                          = 0x40000006, /* No such device or address */
+  E2BIG                          = 0x40000007, /* Argument list too long */
+  ENOEXEC                        = 0x40000008, /* Exec format error */
+  EBADF                          = 0x40000009, /* Bad file descriptor */
+  ECHILD                         = 0x4000000a, /* No child processes */
+  EDEADLK                        = 0x4000000b, /* Resource deadlock avoided */
+  ENOMEM                         = 0x4000000c, /* Cannot allocate memory */
+  EACCES                         = 0x4000000d, /* Permission denied */
+  EFAULT                         = 0x4000000e, /* Bad address */
+  ENOTBLK                        = 0x4000000f, /* Block device required */
+  EBUSY                          = 0x40000010, /* Device or resource busy */
+  EEXIST                         = 0x40000011, /* File exists */
+  EXDEV                          = 0x40000012, /* Invalid cross-device link */
+  ENODEV                         = 0x40000013, /* No such device */
+  ENOTDIR                        = 0x40000014, /* Not a directory */
+  EISDIR                         = 0x40000015, /* Is a directory */
+  EINVAL                         = 0x40000016, /* Invalid argument */
+  EMFILE                         = 0x40000018, /* Too many open files */
+  ENFILE                         = 0x40000017, /* Too many open files in system */
+  ENOTTY                         = 0x40000019, /* Inappropriate ioctl for device */
+  ETXTBSY                        = 0x4000001a, /* Text file busy */
+  EFBIG                          = 0x4000001b, /* File too large */
+  ENOSPC                         = 0x4000001c, /* No space left on device */
+  ESPIPE                         = 0x4000001d, /* Illegal seek */
+  EROFS                          = 0x4000001e, /* Read-only file system */
+  EMLINK                         = 0x4000001f, /* Too many links */
+  EPIPE                          = 0x40000020, /* Broken pipe */
+  EDOM                           = 0x40000021, /* Numerical argument out of domain */
+  ERANGE                         = 0x40000022, /* Numerical result out of range */
+  EAGAIN                         = 0x40000023, /* Resource temporarily unavailable */
+  EINPROGRESS                    = 0x40000024, /* Operation now in progress */
+  EALREADY                       = 0x40000025, /* Operation already in progress */
+  ENOTSOCK                       = 0x40000026, /* Socket operation on non-socket */
+  EMSGSIZE                       = 0x40000028, /* Message too long */
+  EPROTOTYPE                     = 0x40000029, /* Protocol wrong type for socket */
+  ENOPROTOOPT                    = 0x4000002a, /* Protocol not available */
+  EPROTONOSUPPORT                = 0x4000002b, /* Protocol not supported */
+  ESOCKTNOSUPPORT                = 0x4000002c, /* Socket type not supported */
+  EOPNOTSUPP                     = 0x4000002d, /* Operation not supported */
+  EPFNOSUPPORT                   = 0x4000002e, /* Protocol family not supported */
+  EAFNOSUPPORT                   = 0x4000002f, /* Address family not supported by protocol */
+  EADDRINUSE                     = 0x40000030, /* Address already in use */
+  EADDRNOTAVAIL                  = 0x40000031, /* Cannot assign requested address */
+  ENETDOWN                       = 0x40000032, /* Network is down */
+  ENETUNREACH                    = 0x40000033, /* Network is unreachable */
+  ENETRESET                      = 0x40000034, /* Network dropped connection on reset */
+  ECONNABORTED                   = 0x40000035, /* Software caused connection abort */
+  ECONNRESET                     = 0x40000036, /* Connection reset by peer */
+  ENOBUFS                        = 0x40000037, /* No buffer space available */
+  EISCONN                        = 0x40000038, /* Transport endpoint is already connected */
+  ENOTCONN                       = 0x40000039, /* Transport endpoint is not connected */
+  EDESTADDRREQ                   = 0x40000027, /* Destination address required */
+  ESHUTDOWN                      = 0x4000003a, /* Cannot send after transport endpoint shutdown */
+  ETOOMANYREFS                   = 0x4000003b, /* Too many references: cannot splice */
+  ETIMEDOUT                      = 0x4000003c, /* Connection timed out */
+  ECONNREFUSED                   = 0x4000003d, /* Connection refused */
+  ELOOP                          = 0x4000003e, /* Too many levels of symbolic links */
+  ENAMETOOLONG                   = 0x4000003f, /* File name too long */
+  EHOSTDOWN                      = 0x40000040, /* Host is down */
+  EHOSTUNREACH                   = 0x40000041, /* No route to host */
+  ENOTEMPTY                      = 0x40000042, /* Directory not empty */
+  EPROCLIM                       = 0x40000043, /* Too many processes */
+  EUSERS                         = 0x40000044, /* Too many users */
+  EDQUOT                         = 0x40000045, /* Disk quota exceeded */
+  ESTALE                         = 0x40000046, /* Stale file handle */
+  EREMOTE                        = 0x40000047, /* Object is remote */
+  EBADRPC                        = 0x40000048, /* RPC struct is bad */
+  ERPCMISMATCH                   = 0x40000049, /* RPC version wrong */
+  EPROGUNAVAIL                   = 0x4000004a, /* RPC program not available */
+  EPROGMISMATCH                  = 0x4000004b, /* RPC program version wrong */
+  EPROCUNAVAIL                   = 0x4000004c, /* RPC bad procedure for program */
+  ENOLCK                         = 0x4000004d, /* No locks available */
+  EFTYPE                         = 0x4000004f, /* Inappropriate file type or format */
+  EAUTH                          = 0x40000050, /* Authentication error */
+  ENEEDAUTH                      = 0x40000051, /* Need authenticator */
+  ENOSYS                         = 0x4000004e, /* Function not implemented */
+  ENOTSUP                        = 0x40000076, /* Not supported */
+  EILSEQ                         = 0x4000006a, /* Invalid or incomplete multibyte or wide character */
+  EBACKGROUND                    = 0x40000064, /* Inappropriate operation for background process */
+  EDIED                          = 0x40000065, /* Translator died */
+  ED                             = 0x40000066, /* ? */
+  EGREGIOUS                      = 0x40000067, /* You really blew it this time */
+  EIEIO                          = 0x40000068, /* Computer bought the farm */
+  EGRATUITOUS                    = 0x40000069, /* Gratuitous error */
+  EBADMSG                        = 0x4000006b, /* Bad message */
+  EIDRM                          = 0x4000006c, /* Identifier removed */
+  EMULTIHOP                      = 0x4000006d, /* Multihop attempted */
+  ENODATA                        = 0x4000006e, /* No data available */
+  ENOLINK                        = 0x4000006f, /* Link has been severed */
+  ENOMSG                         = 0x40000070, /* No message of desired type */
+  ENOSR                          = 0x40000071, /* Out of streams resources */
+  ENOSTR                         = 0x40000072, /* Device not a stream */
+  EOVERFLOW                      = 0x40000073, /* Value too large for defined data type */
+  EPROTO                         = 0x40000074, /* Protocol error */
+  ETIME                          = 0x40000075, /* Timer expired */
+  ECANCELED                      = 0x40000077, /* Operation canceled */
 
-       /* 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,
+/* 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,
 
-       /* 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/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,
+  EKERN_TIMEDOUT                 = 27,
+  EKERN_INTERRUPTED              = 28,
 
-       /* 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/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 <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 <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 */
 
+  /* Because the C standard requires that errno have type 'int',
+     this enumeration must be a signed type.  */
+  __FORCE_ERROR_T_CODES_SIGNED = -1
 };
 
-#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
+/* 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
+# if !defined __error_t_defined && defined __USE_GNU
+#  define __error_t_defined 1
 typedef enum __error_t_codes error_t;
-#define __error_t_defined      1
-#endif
+# endif
+
+#endif /* not __ASSEMBLER__ */
+
+/* The C standard requires that all of the E-constants be
+   defined as macros.  */
+
+#define EPERM                          0x40000001
+#define ENOENT                         0x40000002
+#define ESRCH                          0x40000003
+#define EINTR                          0x40000004
+#define EIO                            0x40000005
+#define ENXIO                          0x40000006
+#define E2BIG                          0x40000007
+#define ENOEXEC                        0x40000008
+#define EBADF                          0x40000009
+#define ECHILD                         0x4000000a
+#define EDEADLK                        0x4000000b
+#define ENOMEM                         0x4000000c
+#define EACCES                         0x4000000d
+#define EFAULT                         0x4000000e
+#define ENOTBLK                        0x4000000f
+#define EBUSY                          0x40000010
+#define EEXIST                         0x40000011
+#define EXDEV                          0x40000012
+#define ENODEV                         0x40000013
+#define ENOTDIR                        0x40000014
+#define EISDIR                         0x40000015
+#define EINVAL                         0x40000016
+#define EMFILE                         0x40000018
+#define ENFILE                         0x40000017
+#define ENOTTY                         0x40000019
+#define ETXTBSY                        0x4000001a
+#define EFBIG                          0x4000001b
+#define ENOSPC                         0x4000001c
+#define ESPIPE                         0x4000001d
+#define EROFS                          0x4000001e
+#define EMLINK                         0x4000001f
+#define EPIPE                          0x40000020
+#define EDOM                           0x40000021
+#define ERANGE                         0x40000022
+#define EAGAIN                         0x40000023
+#define EWOULDBLOCK                    EAGAIN
+#define EINPROGRESS                    0x40000024
+#define EALREADY                       0x40000025
+#define ENOTSOCK                       0x40000026
+#define EMSGSIZE                       0x40000028
+#define EPROTOTYPE                     0x40000029
+#define ENOPROTOOPT                    0x4000002a
+#define EPROTONOSUPPORT                0x4000002b
+#define ESOCKTNOSUPPORT                0x4000002c
+#define EOPNOTSUPP                     0x4000002d
+#define EPFNOSUPPORT                   0x4000002e
+#define EAFNOSUPPORT                   0x4000002f
+#define EADDRINUSE                     0x40000030
+#define EADDRNOTAVAIL                  0x40000031
+#define ENETDOWN                       0x40000032
+#define ENETUNREACH                    0x40000033
+#define ENETRESET                      0x40000034
+#define ECONNABORTED                   0x40000035
+#define ECONNRESET                     0x40000036
+#define ENOBUFS                        0x40000037
+#define EISCONN                        0x40000038
+#define ENOTCONN                       0x40000039
+#define EDESTADDRREQ                   0x40000027
+#define ESHUTDOWN                      0x4000003a
+#define ETOOMANYREFS                   0x4000003b
+#define ETIMEDOUT                      0x4000003c
+#define ECONNREFUSED                   0x4000003d
+#define ELOOP                          0x4000003e
+#define ENAMETOOLONG                   0x4000003f
+#define EHOSTDOWN                      0x40000040
+#define EHOSTUNREACH                   0x40000041
+#define ENOTEMPTY                      0x40000042
+#define EPROCLIM                       0x40000043
+#define EUSERS                         0x40000044
+#define EDQUOT                         0x40000045
+#define ESTALE                         0x40000046
+#define EREMOTE                        0x40000047
+#define EBADRPC                        0x40000048
+#define ERPCMISMATCH                   0x40000049
+#define EPROGUNAVAIL                   0x4000004a
+#define EPROGMISMATCH                  0x4000004b
+#define EPROCUNAVAIL                   0x4000004c
+#define ENOLCK                         0x4000004d
+#define EFTYPE                         0x4000004f
+#define EAUTH                          0x40000050
+#define ENEEDAUTH                      0x40000051
+#define ENOSYS                         0x4000004e
+#define ENOTSUP                        0x40000076
+#define EILSEQ                         0x4000006a
+#define EBACKGROUND                    0x40000064
+#define EDIED                          0x40000065
+#define ED                             0x40000066
+#define EGREGIOUS                      0x40000067
+#define EIEIO                          0x40000068
+#define EGRATUITOUS                    0x40000069
+#define EBADMSG                        0x4000006b
+#define EIDRM                          0x4000006c
+#define EMULTIHOP                      0x4000006d
+#define ENODATA                        0x4000006e
+#define ENOLINK                        0x4000006f
+#define ENOMSG                         0x40000070
+#define ENOSR                          0x40000071
+#define ENOSTR                         0x40000072
+#define EOVERFLOW                      0x40000073
+#define EPROTO                         0x40000074
+#define ETIME                          0x40000075
+#define ECANCELED                      0x40000077
+
+/* 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/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
 
-/* 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__));
+/* Errors from <mach/mig_errors.h>.  */
+#define EMIG_TYPE_ERROR                -300
+#define EMIG_REPLY_MISMATCH            -301
+#define EMIG_REMOTE_ERROR              -302
+#define EMIG_BAD_ID                    -303
+#define EMIG_BAD_ARGUMENTS             -304
+#define EMIG_NO_REPLY                  -305
+#define EMIG_EXCEPTION                 -306
+#define EMIG_ARRAY_TOO_LARGE           -307
+#define EMIG_SERVER_DIED               -308
+#define EMIG_DESTROY_REQUEST           -309
 
-#define errno                  (*__errno_location ())
+/* Errors from <device/device_types.h>.  */
+#define ED_IO_ERROR                    2500
+#define ED_WOULD_BLOCK                 2501
+#define ED_NO_SUCH_DEVICE              2502
+#define ED_ALREADY_OPEN                2503
+#define ED_DEVICE_DOWN                 2504
+#define ED_INVALID_OPERATION           2505
+#define ED_INVALID_RECNUM              2506
+#define ED_INVALID_SIZE                2507
+#define ED_NO_MEMORY                   2508
+#define ED_READ_ONLY                   2509
 
-#endif /* <errno.h> included.  */
+#define _HURD_ERRNOS 120
 
-#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.  */
index 1cd2a0ac9689b8a58b13fb42a266f9fbf6990f82..1fdca40d38ea519e041c23baaa7bb82b19009b91 100644 (file)
 # @errno{ENOSYS, 123, Function not implemented}
 
 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 "/* This file generated by errnos.awk from";
+    for (i = 1; i < ARGC; i++)
+      {
+       arg = ARGV[i];
+       sub(/.*(manual|include)\//, "", arg)
+       print "     " arg;
+      }
+    print "   Do not edit this file; edit errnos.awk and regenerate it.  */";
     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 "#ifndef _BITS_ERRNO_H";
+    print "#define _BITS_ERRNO_H 1";
     print "";
+    print "#if !defined _ERRNO_H";
+    print "# error \"Never include <bits/errno.h> directly; use <errno.h> instead.\"";
+    print "#endif";
+
     maxerrno = 0;
+    maxerrlen = 0;
     in_mach_errors = "";
-    in_math = 0;
-    edom = erange = "";
-    print "#undef EDOM\n#undef ERANGE";
-    lno = 0;
+    seq = 0;
   }
 
 /^@errno\{/ \
   {
-    etext = "";
-    for (i = 3; i <= NF; ++i)
-      etext = etext " " $i;
-    etext = substr(etext, 1, length(etext)-1)
-
     e = substr($1, 8, length($1)-8)
+    if (length(e) > maxerrlen)
+      maxerrlen = length(e);
     if (e == "EWOULDBLOCK")
       {
-       lines[lno++]="#define EWOULDBLOCK EAGAIN /* Operation would block */";
+       econsts[seq] = e;
+       errnos[seq] = "EAGAIN";
+       seq++;
        next;
       }
 
-    errno = substr($2, 1, length($2)-1) + 0
+    errno = substr($2, 1, length($2)-1) + 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 > 0x3ffff)
+      {
+       printf("%s:%d: errno value %d too large for the Hurd\n",
+              FILENAME, NR, errno) >> "/dev/stderr";
+       exit 1;
+      }
+    if (errno > maxerrno)
+      maxerrno = errno;
+
+    etext = "";
+    for (i = 3; i <= NF; ++i)
+      etext = etext " " $i;
+    etext = substr(etext, 2, length(etext)-2);
+
+    econsts[seq] = e;
+    errnos[seq] = sprintf("0x%08x", 0x40000000 + errno);
+    etexts[seq] = etext;
+    seq++;
     next;
   }
 
 NF == 3 && $1 == "#define" && $2 == "MACH_SEND_IN_PROGRESS" \
   {
     in_mach_errors = FILENAME;
-    lines[lno++] = "\n\t/* Errors from <mach/message.h>.  */";
+    annot[seq++] = "\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>.  */";
+    annot[seq++] = "\n/* Errors from <mach/kern_return.h>.  */";
     next;
   }
 
@@ -92,16 +95,24 @@ in_mach_errors != "" && $2 == "MACH_IPC_COMPAT" \
     in_mach_errors = "";
   }
 
+# FIXME: mach/message.h and mach/kern_return.h do include error
+# descriptions which we could slurp, but some of them are very long,
+# we would need to word-wrap them.
 in_mach_errors == FILENAME && NF == 3 && $1 == "#define" \
   {
-    comma[lno] = 1;
-    lines[lno++] = sprintf("\t%-32s= %s", "E" $2, $3);
+    e = "E" $2;
+    if (length(e) > maxerrlen)
+      maxerrlen = length(e);
+    econsts[seq] = e;
+    errnos[seq] = $3;
+    etexts[seq] = "";
+    seq++;
   }
 
 $1 == "#define" && $2 == "_MACH_MIG_ERRORS_H_" \
   {
     in_mig_errors = 1;
-    lines[lno++] = "\n\t/* Errors from <mach/mig_errors.h>.  */";
+    annot[seq++] = "\n/* Errors from <mach/mig_errors.h>.  */";
     next;
   }
 in_mig_errors && $1 == "#endif" && $3 == "_MACH_MIG_ERRORS_H_" \
@@ -112,17 +123,23 @@ in_mig_errors && $1 == "#endif" && $3 == "_MACH_MIG_ERRORS_H_" \
 (in_mig_errors && $1 == "#define" && $3 <= -300) || \
 (in_device_errors && $1 == "#define" && /D_/ && NF > 3) \
   {
-    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;
+    etext = "";
+    for (i = 5; i < NF; ++i)
+      etext = etext " " $i;
+
+    e = "E" $2;
+    if (length(e) > maxerrlen)
+      maxerrlen = length(e);
+    econsts[seq] = e;
+    errnos[seq] = $3;
+    etexts[seq] = substr(etext, 2, length(etext)-1);
+    seq++;
   }
 
 $1 == "#define" && $2 == "D_SUCCESS" \
   {
     in_device_errors = 1;
-    lines[lno++] = "\n\t/* Errors from <device/device_types.h>.  */";
+    annot[seq++] = "\n/* Errors from <device/device_types.h>.  */";
     next;
   }
 in_device_errors && $1 == "#endif" \
@@ -130,36 +147,73 @@ in_device_errors && $1 == "#endif" \
     in_device_errors = 0;
   }
 
+function print_errno_enum(maxseq)
+{
+  print "";
+  print "#ifndef __ASSEMBLER__";
+  print "";
+  print "enum __error_t_codes";
+  print "{";
+  print "  /* The value zero always means success and it is perfectly fine";
+  print "     for code to use 0 explicitly (or implicitly, e.g. via Boolean";
+  print "     coercion.)  Having an enum entry for zero both makes the";
+  print "     debugger print the name for error_t-typed zero values, and";
+  print "     prevents the compiler from issuing warnings about 'case 0:'";
+  print "     in a switch on an error_t-typed value.  */";
+  printf("  %-*s = 0,\n", maxerrlen, "ESUCCESS");
+
+  print "";
+  print "  /* The Hurd uses Mach error system 0x10, subsystem 0. */";
+  for (i = 0; i < maxseq; i++)
+    {
+      if (i in annot)
+       print annot[i];
+      else if (i in etexts && etexts[i] != "")
+       printf("  %-*s = %s,\t/* %s */\n",
+              maxerrlen, econsts[i], errnos[i], etexts[i]);
+      else if (errnos[i] != "EAGAIN")
+       printf("  %-*s = %s,\n", maxerrlen, econsts[i], errnos[i]);
+    }
+
+  print "";
+  print "  /* Because the C standard requires that errno have type 'int',"
+  print "     this enumeration must be a signed type.  */";
+  print "  __FORCE_ERROR_T_CODES_SIGNED = -1";
+  print "};";
+  print "";
+  print "/* User-visible type of error codes.  It is ok to use 'int' or";
+  print "   'kern_return_t' for these, but with 'error_t' the debugger prints";
+  print "   symbolic values.  */";
+  print "# if !defined __error_t_defined && defined __USE_GNU";
+  print "#  define __error_t_defined 1";
+  print "typedef enum __error_t_codes error_t;"
+  print "# endif";
+  print "";
+  print "#endif /* not __ASSEMBLER__ */";
+}
+
+function print_errno_defines(maxseq)
+{
+  print "";
+  print "/* The C standard requires that all of the E-constants be"
+  print "   defined as macros.  */"
+  print "";
+  for (i = 0; i < maxseq; i++)
+    {
+      if (i in annot)
+       print annot[i];
+      else
+       printf("#define %-*s %s\n", maxerrlen, econsts[i], errnos[i]);
+    }
+  print "";
+  printf("#define _HURD_ERRNOS %d\n", maxerrno+1);
+}
 
 END \
   {
-    for (i = 0; i < lno - 1; ++i)
-      printf "%s%s\n", lines[i], (comma[i] ? "," : "");
-    print lines[i];
-    print "";
-    print "};";
-    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_errno_enum(seq);
+    print_errno_defines(seq);
+
     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.  */";
   }
index 3338621710482a297ff11ae3b8e86f0f220b6bbb..6a8730165e8d4c43c71058b7610398e6b4357b82 100644 (file)
    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
+# 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
 
 #  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.  */
index c0f4d20fe75858c6bfcc0eaefbc9ceb55bb78730..66cfb483c56841daf0c70215eddfb4b0af6233ce 100644 (file)
    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
+# 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
 
 #  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.  */
index ce6bebe8b0df7eca27ceb81e012b7ae8c5fb8c96..2ccc30ac75b4aa7c7f53a0e81766b13e7175e1c5 100644 (file)
    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
+# 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
 #  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.  */
index fa62e1fc83e777c266105534382176cca5104dd2..84dcf0204d0884f982e2513769689924264dee41 100644 (file)
    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
+# 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
 
 #  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.  */
index 4a8d8a0879bfe608edd757767f6d3eaafb18e507..afa22beb1543bc67c24e67b7b4327e6657c457f5 100644 (file)
    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
+# 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
 
 #  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.  */
index e9fdc7e56ed8c3c0f4583d4a5ec36c00f80ea073..7acafcd1be747f2bba58822695792c1091f12416 100644 (file)
@@ -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:
  *
index e6ed81ed91b554191bc78849d70d16b3c60333ca..fd35a3153b369e918ea48e8096fe10283e291fdc 100644 (file)
@@ -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:
  *
index 0aa5d43d8cf159da7092a07c3af900bf2da6d519..253ba7d6f0bfa41a67eb14c020c69ad4643397ad 100644 (file)
@@ -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:
  *