* [PATCH 5/6] Make error_t an enumeration on all supported OSes.
2017-06-10 17:17 [PATCH 0/6] Header file cleanups revised again Zack Weinberg
2017-06-10 17:17 ` [PATCH 6/6] Deprecate xlocale.h and add bits/types/locale_t.h Zack Weinberg
@ 2017-06-10 17:17 ` Zack Weinberg
2017-06-14 11:08 ` Florian Weimer
2017-06-14 13:10 ` Florian Weimer
2017-06-10 17:17 ` [PATCH 1/6] Factor out shared definitions from bits/signum.h Zack Weinberg
` (3 subsequent siblings)
5 siblings, 2 replies; 30+ messages in thread
From: Zack Weinberg @ 2017-06-10 17:17 UTC (permalink / raw)
To: libc-alpha; +Cc: joseph
It occurred to me that by using a GCC 4.5 feature (pragma push_macro)
we could make error_t an enum on all supported OSes, without having
to stop using asm/errno.h on Linux. bits/errno-enum.h is a generated
file that constructs the error_t enumeration from the macros. This is
not possible without pragma push_macro, so errno.h falls back to using
'int' for error_t when the compiler feature is unavailable. You
probably don't want to read the generated bits/errno-enum.h.
We could conceivably change __errno_location to return an error_t,
which would mean 'p errno' in GDB would print symbolic values without
needing to cast it, but I hesitate to make the apparent type of errno
not be 'int'.
* scripts/make-errno-enum.sh: New script.
* Makeconfig: Generate bits/errno-enum.h in before-compile phase.
* stdlib/Makefile: Install bits/errno-enum.h.
* stdlib/errno.h: Define error_t here, using bits/errno-enum.h when
possible.
* sysdeps/mach/hurd/errnos.awk: Do not define enum __errno_codes
nor error_t.
* sysdeps/mach/hurd/bits/errno.h: Regenerate.
---
Makeconfig | 13 ++
NEWS | 5 +
scripts/make-errno-enum.sh | 69 +++++++
stdlib/Makefile | 2 +-
stdlib/errno.h | 11 +-
sysdeps/mach/hurd/bits/errno.h | 458 +++++++++++------------------------------
sysdeps/mach/hurd/errnos.awk | 67 +-----
7 files changed, 227 insertions(+), 398 deletions(-)
create mode 100644 scripts/make-errno-enum.sh
diff --git a/Makeconfig b/Makeconfig
index 80aed2a987..a282b1f65a 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -1139,6 +1139,19 @@ $(common-objpfx)dl-tunable-list.stmp: \
touch $@
endif
+# 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'
# names the SVR4/ELF ABI-compliant dynamic linker.
diff --git a/NEWS b/NEWS
index 71a9ad6053..1b96b3897d 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,11 @@ Version 2.26
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/scripts/make-errno-enum.sh b/scripts/make-errno-enum.sh
new file mode 100644
index 0000000000..30b00a5b42
--- /dev/null
+++ b/scripts/make-errno-enum.sh
@@ -0,0 +1,69 @@
+#! /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
+
+# Note: the expansion of $CC should be word-split, as it may contain
+# command line switches (e.g. "gcc -m32 -march=i486").
+# We cannot include errno.h at this point because it will try to include
+# the file we haven't yet generated.
+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 -n -k3 < "$tmp1" | "$AWK" > "$tmp2" '
+ /^#define E[A-Z0-9][A-Z0-9_]* [^E]/ {
+ 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 'enum __error_t_codes'
+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 ' /* Force the enum to be a signed type. */'
+echo ' __FORCE_ERROR_T_CODES_SIGNED = -1'
+echo '};'
+echo
+echo '#endif /* bits/errno-enum.h. */'
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 9b0acce8cc..5e3d6e61ed 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -25,7 +25,7 @@ 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 \
ucontext.h sys/ucontext.h \
alloca.h fmtmsg.h \
bits/stdlib-bsearch.h sys/random.h bits/stdint-intn.h \
diff --git a/stdlib/errno.h b/stdlib/errno.h
index 118525c8fd..4514da4eb9 100644
--- a/stdlib/errno.h
+++ b/stdlib/errno.h
@@ -45,11 +45,18 @@ extern int *__errno_location (void) __THROW __attribute_const__;
extern char *program_invocation_name;
extern char *program_invocation_short_name;
-/* bits/errno.h may have defined this type. If it didn't, provide a
- fallback definition. */
+/* 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. Also used to make the return value of certain
+ GNU extension functions more self-documenting. */
# ifndef __error_t_defined
# define __error_t_defined 1
+# if __GNUC_PREREQ (4, 5)
+# include <bits/errno-enum.h>
+typedef enum __error_t_codes error_t;
+# else
typedef int error_t;
+# endif
# endif
# endif /* __USE_GNU */
diff --git a/sysdeps/mach/hurd/bits/errno.h b/sysdeps/mach/hurd/bits/errno.h
index 8f3c210001..81e76be70d 100644
--- a/sysdeps/mach/hurd/bits/errno.h
+++ b/sysdeps/mach/hurd/bits/errno.h
@@ -13,323 +13,109 @@
# error "Never include <bits/errno.h> directly; use <errno.h> instead."
#endif
-#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 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/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 <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
-};
-
-/* 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. */
-# if !defined __error_t_defined && defined __USE_GNU
-# define __error_t_defined 1
-typedef enum __error_t_codes error_t;
-# 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
+/* The Hurd uses Mach error system 0x10, 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
-#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
+#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/message.h>. */
#define EMACH_SEND_IN_PROGRESS 0x10000001
@@ -390,28 +176,28 @@ typedef enum __error_t_codes error_t;
#define EKERN_INTERRUPTED 28
/* 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 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
-#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
+#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
diff --git a/sysdeps/mach/hurd/errnos.awk b/sysdeps/mach/hurd/errnos.awk
index d1ed8c4877..daf2943c83 100644
--- a/sysdeps/mach/hurd/errnos.awk
+++ b/sysdeps/mach/hurd/errnos.awk
@@ -147,73 +147,22 @@ in_device_errors && $1 == "#endif" \
in_device_errors = 0;
}
-function print_errno_enum(maxseq)
+END \
{
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++)
+ print "/* The Hurd uses Mach error system 0x10, subsystem 0. */";
+ for (i = 0; i < seq; i++)
{
if (i in annot)
print annot[i];
+ else if (i in etexts && etexts[i] != "")
+ printf("#define %-*s %s\t/* %s */\n",
+ maxerrlen, econsts[i], errnos[i], etexts[i]);
else
printf("#define %-*s %s\n", maxerrlen, econsts[i], errnos[i]);
}
print "";
printf("#define _HURD_ERRNOS %d\n", maxerrno+1);
+ print "";
+ print "#endif /* bits/errno.h. */";
}
-
-END \
- {
- print_errno_enum(seq);
- print_errno_defines(seq);
-
- print "";
- print "#endif /* bits/errno.h. */";
- }
--
2.11.0
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 3/6] Remove __need_IOV_MAX and __need_FOPEN_MAX.
2017-06-10 17:17 [PATCH 0/6] Header file cleanups revised again Zack Weinberg
` (3 preceding siblings ...)
2017-06-10 17:17 ` [PATCH 4/6] Remove __need macros from errno.h (__need_Emath, __need_error_t) Zack Weinberg
@ 2017-06-10 17:17 ` Zack Weinberg
2017-06-13 16:48 ` Joseph Myers
2017-06-10 17:17 ` [PATCH 2/6] Remove __need_schedparam and __cpu_set_t_defined Zack Weinberg
5 siblings, 1 reply; 30+ messages in thread
From: Zack Weinberg @ 2017-06-10 17:17 UTC (permalink / raw)
To: libc-alpha; +Cc: joseph
__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 bits/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
* bits/uio-ext.h, sysdeps/unix/sysv/linux/bits/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 bits/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 bits/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.
---
Makerules | 10 +----
bits/uio-ext.h | 27 ++++++++++++
bits/{uio.h => uio_lim.h} | 12 ++---
include/bits/xopen_lim.h | 13 +++---
misc/Makefile | 3 +-
misc/sys/uio.h | 18 +++++---
stdio-common/stdio_lim.h.in | 31 ++++++-------
sysdeps/unix/sysv/linux/bits/fcntl-linux.h | 54 +++++++++++------------
sysdeps/unix/sysv/linux/bits/{uio.h => uio-ext.h} | 43 ++++--------------
sysdeps/unix/sysv/linux/bits/uio_lim.h | 31 +++++++++++++
10 files changed, 138 insertions(+), 104 deletions(-)
create mode 100644 bits/uio-ext.h
rename bits/{uio.h => uio_lim.h} (79%)
rename sysdeps/unix/sysv/linux/bits/{uio.h => uio-ext.h} (61%)
create mode 100644 sysdeps/unix/sysv/linux/bits/uio_lim.h
diff --git a/Makerules b/Makerules
index 7656c492da..f23f5b7896 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-ext.h b/bits/uio-ext.h
new file mode 100644
index 0000000000..8f36e960bf
--- /dev/null
+++ b/bits/uio-ext.h
@@ -0,0 +1,27 @@
+/* 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
+ 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 _BITS_UIO_EXT_H
+#define _BITS_UIO_EXT_H 1
+
+#ifndef _SYS_UIO_H
+# error "Never include <bits/uio-ext.h> directly; use <sys/uio.h> instead."
+#endif
+
+/* This operating system does not extend sys/uio.h. */
+
+#endif /* sys/uio_ext.h */
diff --git a/bits/uio.h b/bits/uio_lim.h
similarity index 79%
rename from bits/uio.h
rename to bits/uio_lim.h
index 96a3a71d42..f6919f093c 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."
+#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
+
#endif
-
-
-#include <bits/types/struct_iovec.h>
diff --git a/include/bits/xopen_lim.h b/include/bits/xopen_lim.h
index 2ae7cb3652..4c5e62f71b 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 46072e62d9..8660b6fc74 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 bits/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 66c22f04f6..2ae918a8d4 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 <bits/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 510bf008aa..5288907469 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/sysdeps/unix/sysv/linux/bits/fcntl-linux.h b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
index 59d663196a..6bf891b67a 100644
--- a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
+++ b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
@@ -35,7 +35,7 @@
*/
#ifdef __USE_GNU
-# include <bits/uio.h>
+# include <bits/types/struct_iovec.h>
#endif
/* open/fcntl. */
@@ -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,9 +104,9 @@
# 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_GETLK F_GETLK64 /* Get record locking info. */
# define F_SETLK F_SETLK64 /* Set record locking info (non-blocking).*/
# define F_SETLKW F_SETLKW64 /* Set record locking info (blocking). */
# endif
@@ -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
@@ -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-ext.h
similarity index 61%
rename from sysdeps/unix/sysv/linux/bits/uio.h
rename to sysdeps/unix/sysv/linux/bits/uio-ext.h
index d5701f8171..a8a0a7116c 100644
--- a/sysdeps/unix/sysv/linux/bits/uio.h
+++ b/sysdeps/unix/sysv/linux/bits/uio-ext.h
@@ -15,39 +15,13 @@
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."
+#ifndef _BITS_UIO_EXT_H
+#define _BITS_UIO_EXT_H 1
+
+#ifndef _SYS_UIO_H
+# error "Never include <bits/uio-ext.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. */
@@ -66,13 +40,12 @@ extern ssize_t process_vm_writev (pid_t __pid, const struct iovec *__lvec,
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
+__END_DECLS
+
+#endif /* bits/uio-ext.h */
diff --git a/sysdeps/unix/sysv/linux/bits/uio_lim.h b/sysdeps/unix/sysv/linux/bits/uio_lim.h
new file mode 100644
index 0000000000..7c69b93d31
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/uio_lim.h
@@ -0,0 +1,31 @@
+/* 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 _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
+
+#endif
--
2.11.0
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 0/6] Header file cleanups revised again
@ 2017-06-10 17:17 Zack Weinberg
2017-06-10 17:17 ` [PATCH 6/6] Deprecate xlocale.h and add bits/types/locale_t.h Zack Weinberg
` (5 more replies)
0 siblings, 6 replies; 30+ messages in thread
From: Zack Weinberg @ 2017-06-10 17:17 UTC (permalink / raw)
To: libc-alpha; +Cc: joseph
Patches 1-4 should be uncontroversial. In particular, patch 3's new
header is now called bits/uio-ext.h instead of sys/uio_ext.h and
refuses to be included in isolation.
Patches 5 and 6 make user-visible changes that may be controversial:
error_t is an enumeration on non-Hurd, and xlocale.h is deprecated,
respectively. Note that errno.h already defines error_t (when
_GNU_SOURCE) on all supported operating systems; it is only the
enumeration that is new.
zw
Zack Weinberg (6):
Factor out shared definitions from bits/signum.h.
Remove __need_schedparam and __cpu_set_t_defined.
Remove __need_IOV_MAX and __need_FOPEN_MAX.
Remove __need macros from errno.h (__need_Emath, __need_error_t).
Make error_t an enumeration on all supported OSes.
Deprecate xlocale.h and add bits/types/locale_t.h.
Makeconfig | 13 +
Makerules | 10 +-
NEWS | 14 +
argp/argp.h | 14 +-
bits/errno.h | 40 +-
bits/sched.h | 121 +----
bits/signum-generic.h | 102 +++++
bits/signum.h | 72 +--
bits/uio-ext.h | 27 ++
bits/{uio.h => uio_lim.h} | 12 +-
ctype/ctype.h | 16 +-
include/bits/cpu-set.h | 1 +
include/bits/types/locale_t.h | 1 +
include/bits/xopen_lim.h | 13 +-
include/errno.h | 11 +-
include/printf.h | 2 +-
include/time.h | 2 +-
include/xlocale.h | 1 -
locale/Makefile | 3 +-
locale/bits/types/locale_t.h | 44 ++
locale/langinfo.h | 7 +-
locale/locale.h | 20 +-
locale/xlocale.h | 50 +--
misc/Makefile | 3 +-
misc/sys/uio.h | 18 +-
posix/Makefile | 4 +-
posix/bits/cpu-set.h | 124 ++++++
posix/sched.h | 8 +-
scripts/check-installed-headers.sh | 4 +
scripts/make-errno-enum.sh | 69 +++
signal/Makefile | 3 +-
signal/signal.h | 3 +
stdio-common/stdio_lim.h.in | 31 +-
stdlib/Makefile | 2 +-
stdlib/errno.h | 69 ++-
stdlib/monetary.h | 3 +-
stdlib/stdlib.h | 20 +-
stdlib/strtod_l.c | 3 +-
stdlib/strtof_l.c | 2 +-
stdlib/strtol_l.c | 1 -
stdlib/strtold_l.c | 6 +-
stdlib/strtoll_l.c | 2 +-
stdlib/strtoul_l.c | 2 +-
stdlib/strtoull_l.c | 2 +-
string/argz.h | 10 +-
string/string.h | 3 +-
string/strings.h | 3 +-
sysdeps/generic/siglist.h | 24 +-
sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S | 3 +-
sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S | 3 +-
sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S | 3 +-
sysdeps/ieee754/ldbl-128ibm/strtold_l.c | 1 -
sysdeps/ieee754/ldbl-64-128/strtold_l.c | 1 -
sysdeps/mach/hurd/bits/errno.h | 515 ++++++++--------------
sysdeps/mach/hurd/errnos.awk | 163 +++----
sysdeps/unix/bsd/bits/signum.h | 58 +--
sysdeps/unix/sysv/linux/Makefile | 14 +
sysdeps/unix/sysv/linux/alpha/bits/errno.h | 46 +-
sysdeps/unix/sysv/linux/alpha/bits/signum.h | 69 +--
sysdeps/unix/sysv/linux/bits/errno.h | 47 +-
sysdeps/unix/sysv/linux/bits/fcntl-linux.h | 54 +--
sysdeps/unix/sysv/linux/bits/sched.h | 130 +-----
sysdeps/unix/sysv/linux/bits/signum.h | 83 ++--
sysdeps/unix/sysv/linux/bits/{uio.h => uio-ext.h} | 43 +-
sysdeps/unix/sysv/linux/bits/uio_lim.h | 31 ++
sysdeps/unix/sysv/linux/hppa/bits/errno.h | 39 +-
sysdeps/unix/sysv/linux/hppa/bits/signum.h | 110 ++---
sysdeps/unix/sysv/linux/mips/bits/errno.h | 45 +-
sysdeps/unix/sysv/linux/mips/bits/signum.h | 94 ++--
sysdeps/unix/sysv/linux/sparc/bits/errno.h | 46 +-
sysdeps/unix/sysv/linux/sparc/bits/signum.h | 70 +--
sysdeps/unix/sysv/linux/tst-signal-numbers.sh | 69 +++
sysdeps/x86_64/fpu/s_cosf.S | 3 +-
sysdeps/x86_64/fpu/s_sincosf.S | 3 +-
sysdeps/x86_64/fpu/s_sinf.S | 3 +-
time/time.h | 2 +-
wcsmbs/wchar.h | 27 +-
wcsmbs/wcstod.c | 2 +-
wcsmbs/wcstod_l.c | 2 +-
wcsmbs/wcstof.c | 2 +-
wcsmbs/wcstof_l.c | 2 +-
wcsmbs/wcstold.c | 2 +-
wcsmbs/wcstold_l.c | 2 +-
wctype/wctype.h | 4 +-
84 files changed, 1292 insertions(+), 1514 deletions(-)
create mode 100644 bits/signum-generic.h
create mode 100644 bits/uio-ext.h
rename bits/{uio.h => uio_lim.h} (79%)
create mode 100644 include/bits/cpu-set.h
create mode 100644 include/bits/types/locale_t.h
delete mode 100644 include/xlocale.h
create mode 100644 locale/bits/types/locale_t.h
create mode 100644 posix/bits/cpu-set.h
create mode 100644 scripts/make-errno-enum.sh
rename sysdeps/unix/sysv/linux/bits/{uio.h => uio-ext.h} (61%)
create mode 100644 sysdeps/unix/sysv/linux/bits/uio_lim.h
create mode 100644 sysdeps/unix/sysv/linux/tst-signal-numbers.sh
--
2.11.0
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 6/6] Deprecate xlocale.h and add bits/types/locale_t.h.
2017-06-10 17:17 [PATCH 0/6] Header file cleanups revised again Zack Weinberg
@ 2017-06-10 17:17 ` Zack Weinberg
2017-06-14 11:11 ` Florian Weimer
2017-06-10 17:17 ` [PATCH 5/6] Make error_t an enumeration on all supported OSes Zack Weinberg
` (4 subsequent siblings)
5 siblings, 1 reply; 30+ messages in thread
From: Zack Weinberg @ 2017-06-10 17:17 UTC (permalink / raw)
To: libc-alpha; +Cc: joseph
xlocale.h is already a single-type micro-header, defining locale_t, so
it would be nice to bring it into the overall bits/types/ scheme.
Unfortunately, it's in the top level of the system-header namespace
and, despite the comment saying "This file is not standardized, don't
rely on it, it can go away without warning", there are a lot of
external uses, so we need to deprecate it first, which is what this
patch does.
The implementation-namespace alias, __locale_t, may not actually be
necessary; there are no situations where it is available but locale_t
isn't, and I did not find any cases in Issue 7 where a header that
defines functions taking a locale_t argument is not also supposed to
declare locale_t. However, like xlocale.h it seems to have a fair
number of external uses, so we are probably stuck with it.
I also took the opportunity to clean up comments in various public
header files that still talk about the *_l interfaces as though they
were completely nonstandard. There are a few of them, notably the
strtoX_l and wcstoX_l families, that haven't been standardized, but
the bulk are in POSIX.1-2008.
* locale/bits/types/locale_t.h: New file containing former
contents of locale/xlocale.h, with minor adjustments to commentary.
* locale/xlocale.h: Replace with deprecation shim that issues a
warning and includes <locale.h>.
* locale/Makefile: Install bits/types/locale_t.h.
* scripts/check-installed-headers.sh: Skip xlocale.h.
* include/xlocale.h: Delete wrapper.
* include/bits/types/locale_t.h: New wrapper.
* ctype/ctype.h, include/printf.h, include/time.h
* locale/langinfo.h, locale/locale.h, stdlib/monetary.h
* stdlib/stdlib.h, string/string.h, string/strings.h, time/time.h
* wcsmbs/wchar.h, wctype/wctype.h: Use bits/types/locale_t.h.
Correct outdated comments regarding the standardization status of
the functions that take locale_t arguments.
* stdlib/strtod_l.c, stdlib/strtof_l.c, stdlib/strtol_l.c
* stdlib/strtold_l.c, stdlib/strtoul_l.c, stdlib/strtoull_l.c
* sysdeps/ieee754/ldbl-128ibm/strtold_l.c
* sysdeps/ieee754/ldbl-64-128/strtold_l.c
* wcsmbs/wcstod.c, wcsmbs/wcstod_l.c, wcsmbs/wcstof.c
* wcsmbs/wcstof_l.c, wcsmbs/wcstold.c, wcsmbs/wcstold_l.c:
Don't include xlocale.h. If necessary, include locale.h instead.
* stdlib/strtold_l.c: Unconditionally include wchar.h.
---
NEWS | 3 ++
ctype/ctype.h | 16 ++---------
include/bits/types/locale_t.h | 1 +
include/printf.h | 2 +-
include/time.h | 2 +-
include/xlocale.h | 1 -
locale/Makefile | 3 +-
locale/bits/types/locale_t.h | 44 +++++++++++++++++++++++++++++
locale/langinfo.h | 7 ++---
locale/locale.h | 20 +++++--------
locale/xlocale.h | 50 +++++++--------------------------
| 4 +++
stdlib/monetary.h | 3 +-
stdlib/stdlib.h | 20 +++----------
stdlib/strtod_l.c | 3 +-
stdlib/strtof_l.c | 2 +-
stdlib/strtol_l.c | 1 -
stdlib/strtold_l.c | 6 +---
stdlib/strtoll_l.c | 2 +-
stdlib/strtoul_l.c | 2 +-
stdlib/strtoull_l.c | 2 +-
string/string.h | 3 +-
string/strings.h | 3 +-
sysdeps/ieee754/ldbl-128ibm/strtold_l.c | 1 -
sysdeps/ieee754/ldbl-64-128/strtold_l.c | 1 -
time/time.h | 2 +-
wcsmbs/wchar.h | 27 ++++--------------
wcsmbs/wcstod.c | 2 +-
wcsmbs/wcstod_l.c | 2 +-
wcsmbs/wcstof.c | 2 +-
wcsmbs/wcstof_l.c | 2 +-
wcsmbs/wcstold.c | 2 +-
wcsmbs/wcstold_l.c | 2 +-
wctype/wctype.h | 4 +--
34 files changed, 108 insertions(+), 139 deletions(-)
create mode 100644 include/bits/types/locale_t.h
delete mode 100644 include/xlocale.h
create mode 100644 locale/bits/types/locale_t.h
diff --git a/NEWS b/NEWS
index 1b96b3897d..cbb0c80d78 100644
--- a/NEWS
+++ b/NEWS
@@ -77,6 +77,9 @@ Version 2.26
* The obsolete signal constant SIGUNUSED is no longer defined by <signal.h>.
+* The nonstandard header <xlocale.h> is deprecated, and will be removed in a
+ future release. Most programs should use <locale.h> instead.
+
* The reallocarray function has been added to libc. It is a realloc
replacement with a check for integer overflow when calculating total
allocation size.
diff --git a/ctype/ctype.h b/ctype/ctype.h
index 1fe89cf836..ce598d53e5 100644
--- a/ctype/ctype.h
+++ b/ctype/ctype.h
@@ -233,20 +233,8 @@ __NTH (toupper (int __c))
#ifdef __USE_XOPEN2K8
-/* The concept of one static locale per category is not very well
- thought out. Many applications will need to process its data using
- information from several different locales. Another application is
- the implementation of the internationalization handling in the
- upcoming ISO C++ standard library. To support this another set of
- the functions using locale data exist which have an additional
- argument.
-
- Attention: all these functions are *not* standardized in any form.
- This is a proof-of-concept implementation. */
-
-/* Structure for reentrant locale using functions. This is an
- (almost) opaque type for the user level programs. */
-# include <xlocale.h>
+/* POSIX.1-2008 extended locale interface (see locale.h). */
+# include <bits/types/locale_t.h>
/* These definitions are similar to the ones above but all functions
take as an argument a handle for the locale which shall be used. */
diff --git a/include/bits/types/locale_t.h b/include/bits/types/locale_t.h
new file mode 100644
index 0000000000..24b074872f
--- /dev/null
+++ b/include/bits/types/locale_t.h
@@ -0,0 +1 @@
+#include <locale/bits/types/locale_t.h>
diff --git a/include/printf.h b/include/printf.h
index 984f263167..7b4d209c47 100644
--- a/include/printf.h
+++ b/include/printf.h
@@ -4,7 +4,7 @@
# ifndef _ISOMAC
-#include <xlocale.h>
+#include <bits/types/locale_t.h>
/* Now define the internal interfaces. */
extern int __printf_fphex (FILE *, const struct printf_info *,
diff --git a/include/time.h b/include/time.h
index 3a828e0420..0a67cf3a19 100644
--- a/include/time.h
+++ b/include/time.h
@@ -2,7 +2,7 @@
#include <time/time.h>
#ifndef _ISOMAC
-# include <xlocale.h>
+# include <bits/types/locale_t.h>
extern __typeof (strftime_l) __strftime_l;
libc_hidden_proto (__strftime_l)
diff --git a/include/xlocale.h b/include/xlocale.h
deleted file mode 100644
index 5280ef0bc4..0000000000
--- a/include/xlocale.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <locale/xlocale.h>
diff --git a/locale/Makefile b/locale/Makefile
index d9ef48fe93..2f81311a0e 100644
--- a/locale/Makefile
+++ b/locale/Makefile
@@ -22,7 +22,8 @@ subdir := locale
include ../Makeconfig
-headers = locale.h bits/locale.h langinfo.h xlocale.h
+headers = locale.h bits/locale.h bits/types/locale_t.h \
+ langinfo.h xlocale.h
routines = setlocale findlocale loadlocale loadarchive \
localeconv nl_langinfo nl_langinfo_l mb_cur_max \
newlocale duplocale freelocale uselocale
diff --git a/locale/bits/types/locale_t.h b/locale/bits/types/locale_t.h
new file mode 100644
index 0000000000..4d4def583c
--- /dev/null
+++ b/locale/bits/types/locale_t.h
@@ -0,0 +1,44 @@
+/* Definition of locale datatype.
+ Copyright (C) 1997-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ 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 _BITS_TYPES_LOCALE_T_H
+#define _BITS_TYPES_LOCALE_T_H 1
+
+/* POSIX.1-2008: the locale_t type, representing a locale context.
+ This type should be treated as opaque by applications; some details
+ are exposed for the sake of efficiency in e.g. ctype functions. */
+
+struct __locale_struct
+{
+ /* Note: LC_ALL is not a valid index into this array. */
+ struct __locale_data *__locales[13]; /* 13 = __LC_LAST. */
+
+ /* To increase the speed of this solution we add some special members. */
+ const unsigned short int *__ctype_b;
+ const int *__ctype_tolower;
+ const int *__ctype_toupper;
+
+ /* Note: LC_ALL is not a valid index into this array. */
+ const char *__names[13];
+};
+
+typedef struct __locale_struct *__locale_t;
+typedef struct __locale_struct *locale_t;
+
+#endif /* xlocale.h */
diff --git a/locale/langinfo.h b/locale/langinfo.h
index 759adfbd1f..93d84463b5 100644
--- a/locale/langinfo.h
+++ b/locale/langinfo.h
@@ -584,11 +584,8 @@ extern char *nl_langinfo (nl_item __item) __THROW;
#ifdef __USE_XOPEN2K8
-/* This interface is for the extended locale model. See <locale.h> for
- more information. */
-
-/* Get locale datatype definition. */
-# include <xlocale.h>
+/* POSIX.1-2008 extended locale interface (see locale.h). */
+# include <bits/types/locale_t.h>
/* Just like nl_langinfo but get the information from the locale object L. */
extern char *nl_langinfo_l (nl_item __item, __locale_t __l);
diff --git a/locale/locale.h b/locale/locale.h
index 9a5fce9d47..6c1b22051b 100644
--- a/locale/locale.h
+++ b/locale/locale.h
@@ -126,19 +126,13 @@ extern struct lconv *localeconv (void) __THROW;
#ifdef __USE_XOPEN2K8
-/* The concept of one static locale per category is not very well
- thought out. Many applications will need to process its data using
- information from several different locales. Another application is
- the implementation of the internationalization handling in the
- upcoming ISO C++ standard library. To support this another set of
- the functions using locale data exist which have an additional
- argument.
-
- Attention: all these functions are *not* standardized in any form.
- This is a proof-of-concept implementation. */
-
-/* Get locale datatype definition. */
-# include <xlocale.h>
+/* POSIX.1-2008 extends the locale interface with functions for
+ explicit creation and manipulation of 'locale_t' objects
+ representing locale contexts, and a set of parallel
+ locale-sensitive text processing functions that take a locale_t
+ argument. This enables applications to work with data from
+ multiple locales simultaneously and thread-safely. */
+# include <bits/types/locale_t.h>
/* Return a reference to a data structure representing a set of locale
datasets. Unlike for the CATEGORY parameter for `setlocale' the
diff --git a/locale/xlocale.h b/locale/xlocale.h
index 20b2c1109f..d0bc5b040d 100644
--- a/locale/xlocale.h
+++ b/locale/xlocale.h
@@ -1,44 +1,14 @@
-/* Definition of locale datatype.
- Copyright (C) 1997-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
- 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 _XLOCALE_H
-#define _XLOCALE_H 1
+#define _XLOCALE_H
-/* Structure for reentrant locale using functions. This is an
- (almost) opaque type for the user level programs. The file and
- this data structure is not standardized. Don't rely on it. It can
- go away without warning. */
-typedef struct __locale_struct
-{
- /* Note: LC_ALL is not a valid index into this array. */
- struct __locale_data *__locales[13]; /* 13 = __LC_LAST. */
+/* xlocale.h was never intended to be a public header, but it existed
+ for a long time and was widely used enough that we are providing a
+ shim. If you have a concrete reason to want just the definition of
+ locale_t, not anything else from locale.h (for instance, you are a
+ library implementing a standard that places restrictions on what
+ symbols your headers may expose), use <bits/types/locale_t.h>. */
- /* To increase the speed of this solution we add some special members. */
- const unsigned short int *__ctype_b;
- const int *__ctype_tolower;
- const int *__ctype_toupper;
+#warning "xlocale.h is deprecated, use locale.h instead"
+#include <locale.h>
- /* Note: LC_ALL is not a valid index into this array. */
- const char *__names[13];
-} *__locale_t;
-
-/* POSIX 2008 makes locale_t official. */
-typedef __locale_t locale_t;
-
-#endif /* xlocale.h */
+#endif
--git a/scripts/check-installed-headers.sh b/scripts/check-installed-headers.sh
index 4cbef0ea49..30afebb28a 100644
--- a/scripts/check-installed-headers.sh
+++ b/scripts/check-installed-headers.sh
@@ -78,6 +78,10 @@ for header in "$@"; do
(bits/* | regexp.h | rpcsvc/*.x)
continue;;
+ # xlocale.h contains an unconditional deprecation #warning.
+ (xlocale.h)
+ continue;;
+
# All extant versions of sys/elf.h contain nothing more than an
# exhortation (either a #warning or an #error) to use sys/procfs.h
# instead, plus an inclusion of that header.
diff --git a/stdlib/monetary.h b/stdlib/monetary.h
index dcfbfc5262..c1fcbf06d1 100644
--- a/stdlib/monetary.h
+++ b/stdlib/monetary.h
@@ -40,7 +40,8 @@ extern ssize_t strfmon (char *__restrict __s, size_t __maxsize,
__THROW __attribute_format_strfmon__ (3, 4);
#ifdef __USE_XOPEN2K8
-# include <xlocale.h>
+/* POSIX.1-2008 extended locale interface (see locale.h). */
+# include <bits/types/locale_t.h>
/* Formatting a monetary value according to the given locale. */
extern ssize_t strfmon_l (char *__restrict __s, size_t __maxsize,
diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h
index 0a693c2b41..ad56bf3648 100644
--- a/stdlib/stdlib.h
+++ b/stdlib/stdlib.h
@@ -186,23 +186,11 @@ extern int strfromf128 (char *__dest, size_t __size, const char * __format,
#ifdef __USE_GNU
-/* The concept of one static locale per category is not very well
- thought out. Many applications will need to process its data using
- information from several different locales. Another problem is
- the implementation of the internationalization handling in the
- ISO C++ standard library. To support this another set of
- the functions using locale data exist which take an additional
- argument.
+/* Parallel versions of the functions above which take the locale to
+ use as an additional parameter. These are GNU extensions inspired
+ by the POSIX.1-2008 extended locale API. */
+# include <bits/types/locale_t.h>
- Attention: even though several *_l interfaces are part of POSIX:2008,
- these are not. */
-
-/* Structure for reentrant locale using functions. This is an
- (almost) opaque type for the user level programs. */
-# include <xlocale.h>
-
-/* Special versions of the functions above which take the locale to
- use as an additional parameter. */
extern long int strtol_l (const char *__restrict __nptr,
char **__restrict __endptr, int __base,
__locale_t __loc) __THROW __nonnull ((1, 4));
diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c
index 99c2af357e..a782a2434b 100644
--- a/stdlib/strtod_l.c
+++ b/stdlib/strtod_l.c
@@ -17,7 +17,7 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <xlocale.h>
+#include <locale.h>
extern double ____strtod_l_internal (const char *, char **, int, __locale_t);
@@ -46,7 +46,6 @@ extern double ____strtod_l_internal (const char *, char **, int, __locale_t);
#include <errno.h>
#include <float.h>
#include "../locale/localeinfo.h"
-#include <locale.h>
#include <math.h>
#include <math_private.h>
#include <stdlib.h>
diff --git a/stdlib/strtof_l.c b/stdlib/strtof_l.c
index 57e557516a..ea76c344f4 100644
--- a/stdlib/strtof_l.c
+++ b/stdlib/strtof_l.c
@@ -17,7 +17,7 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <xlocale.h>
+#include <locale.h>
extern float ____strtof_l_internal (const char *, char **, int, __locale_t);
diff --git a/stdlib/strtol_l.c b/stdlib/strtol_l.c
index 5a0683b2bb..48e9ab5310 100644
--- a/stdlib/strtol_l.c
+++ b/stdlib/strtol_l.c
@@ -41,7 +41,6 @@
#include <stdlib.h>
#include <string.h>
#include <locale.h>
-#include <xlocale.h>
#include <stdint.h>
#include <bits/wordsize.h>
diff --git a/stdlib/strtold_l.c b/stdlib/strtold_l.c
index bef2a4d3d7..7b9efd8819 100644
--- a/stdlib/strtold_l.c
+++ b/stdlib/strtold_l.c
@@ -17,11 +17,7 @@
#include <math.h>
#include <stdlib.h>
-#include <xlocale.h>
-
-#if defined _LIBC || defined HAVE_WCHAR_H
-# include <wchar.h>
-#endif
+#include <wchar.h>
#ifdef USE_WIDE_CHAR
# define STRING_TYPE wchar_t
diff --git a/stdlib/strtoll_l.c b/stdlib/strtoll_l.c
index 2a712eb80e..003f425db8 100644
--- a/stdlib/strtoll_l.c
+++ b/stdlib/strtoll_l.c
@@ -19,7 +19,7 @@
#define QUAD 1
-#include <xlocale.h>
+#include <locale.h>
extern long long int ____strtoll_l_internal (const char *, char **, int, int,
__locale_t);
diff --git a/stdlib/strtoul_l.c b/stdlib/strtoul_l.c
index 6d23ee2964..45b0585342 100644
--- a/stdlib/strtoul_l.c
+++ b/stdlib/strtoul_l.c
@@ -19,7 +19,7 @@
#define UNSIGNED 1
-#include <xlocale.h>
+#include <locale.h>
extern unsigned long int ____strtoul_l_internal (const char *, char **, int,
int, __locale_t);
diff --git a/stdlib/strtoull_l.c b/stdlib/strtoull_l.c
index 53ecb916df..da6d7cde8c 100644
--- a/stdlib/strtoull_l.c
+++ b/stdlib/strtoull_l.c
@@ -20,7 +20,7 @@
#define QUAD 1
#define UNSIGNED 1
-#include <xlocale.h>
+#include <locale.h>
extern unsigned long long int ____strtoull_l_internal (const char *, char **,
int, int, __locale_t);
diff --git a/string/string.h b/string/string.h
index 8eed67d77d..e623f81052 100644
--- a/string/string.h
+++ b/string/string.h
@@ -148,7 +148,8 @@ extern size_t strxfrm (char *__restrict __dest,
__THROW __nonnull ((2));
#ifdef __USE_XOPEN2K8
-# include <xlocale.h>
+/* POSIX.1-2008 extended locale interface (see locale.h). */
+# include <bits/types/locale_t.h>
/* Compare the collated forms of S1 and S2, using sorting rules from L. */
extern int strcoll_l (const char *__s1, const char *__s2, __locale_t __l)
diff --git a/string/strings.h b/string/strings.h
index 43207af09c..53d1b5c944 100644
--- a/string/strings.h
+++ b/string/strings.h
@@ -121,7 +121,8 @@ extern int strncasecmp (const char *__s1, const char *__s2, size_t __n)
__THROW __attribute_pure__ __nonnull ((1, 2));
#ifdef __USE_XOPEN2K8
-# include <xlocale.h>
+/* POSIX.1-2008 extended locale interface (see locale.h). */
+# include <bits/types/locale_t.h>
/* Compare S1 and S2, ignoring case, using collation rules from LOC. */
extern int strcasecmp_l (const char *__s1, const char *__s2, __locale_t __loc)
diff --git a/sysdeps/ieee754/ldbl-128ibm/strtold_l.c b/sysdeps/ieee754/ldbl-128ibm/strtold_l.c
index 37034cb254..341de78063 100644
--- a/sysdeps/ieee754/ldbl-128ibm/strtold_l.c
+++ b/sysdeps/ieee754/ldbl-128ibm/strtold_l.c
@@ -18,7 +18,6 @@
#include <math.h>
#include <stdlib.h>
#include <wchar.h>
-#include <xlocale.h>
/* The actual implementation for all floating point sizes is in strtod.c.
These macros tell it to produce the `long double' version, `strtold'. */
diff --git a/sysdeps/ieee754/ldbl-64-128/strtold_l.c b/sysdeps/ieee754/ldbl-64-128/strtold_l.c
index 37034cb254..341de78063 100644
--- a/sysdeps/ieee754/ldbl-64-128/strtold_l.c
+++ b/sysdeps/ieee754/ldbl-64-128/strtold_l.c
@@ -18,7 +18,6 @@
#include <math.h>
#include <stdlib.h>
#include <wchar.h>
-#include <xlocale.h>
/* The actual implementation for all floating point sizes is in strtod.c.
These macros tell it to produce the `long double' version, `strtold'. */
diff --git a/time/time.h b/time/time.h
index bb4994feee..17cc1e6614 100644
--- a/time/time.h
+++ b/time/time.h
@@ -57,7 +57,7 @@ typedef __pid_t pid_t;
#endif
#ifdef __USE_XOPEN2K8
-# include <xlocale.h>
+# include <bits/types/locale_t.h>
#endif
#ifdef __USE_ISOC11
diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
index d389428daa..a5ed1738dc 100644
--- a/wcsmbs/wchar.h
+++ b/wcsmbs/wchar.h
@@ -42,6 +42,9 @@
#if defined __USE_UNIX98 || defined __USE_XOPEN2K
# include <bits/types/FILE.h>
#endif
+#ifdef __USE_XOPEN2K8
+# include <bits/types/locale_t.h>
+#endif
/* Tell the caller that we provide correct C++ prototypes. */
#if defined __cplusplus && __GNUC_PREREQ (4, 4)
@@ -113,8 +116,6 @@ extern int wcsncasecmp (const wchar_t *__s1, const wchar_t *__s2,
/* Similar to the two functions above but take the information from
the provided locale and not the global locale. */
-# include <xlocale.h>
-
extern int wcscasecmp_l (const wchar_t *__s1, const wchar_t *__s2,
__locale_t __loc) __THROW;
@@ -426,23 +427,9 @@ extern unsigned long long int wcstouq (const wchar_t *__restrict __nptr,
#endif /* Use GNU. */
#ifdef __USE_GNU
-/* The concept of one static locale per category is not very well
- thought out. Many applications will need to process its data using
- information from several different locales. Another application is
- the implementation of the internationalization handling in the
- upcoming ISO C++ standard library. To support this another set of
- the functions using locale data exist which have an additional
- argument.
-
- Attention: all these functions are *not* standardized in any form.
- This is a proof-of-concept implementation. */
-
-/* Structure for reentrant locale using functions. This is an
- (almost) opaque type for the user level programs. */
-# include <xlocale.h>
-
-/* Special versions of the functions above which take the locale to
- use as an additional parameter. */
+/* Parallel versions of the functions above which take the locale to
+ use as an additional parameter. These are GNU extensions inspired
+ by the POSIX.1-2008 extended locale API. */
extern long int wcstol_l (const wchar_t *__restrict __nptr,
wchar_t **__restrict __endptr, int __base,
__locale_t __loc) __THROW;
@@ -768,8 +755,6 @@ extern size_t wcsftime (wchar_t *__restrict __s, size_t __maxsize,
const struct tm *__restrict __tp) __THROW;
# ifdef __USE_GNU
-# include <xlocale.h>
-
/* Similar to `wcsftime' but takes the information from
the provided locale and not the global locale. */
extern size_t wcsftime_l (wchar_t *__restrict __s, size_t __maxsize,
diff --git a/wcsmbs/wcstod.c b/wcsmbs/wcstod.c
index b7db11b935..72fa7eaaa4 100644
--- a/wcsmbs/wcstod.c
+++ b/wcsmbs/wcstod.c
@@ -17,7 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <stddef.h>
-#include <xlocale.h>
+#include <locale.h>
#define USE_WIDE_CHAR 1
diff --git a/wcsmbs/wcstod_l.c b/wcsmbs/wcstod_l.c
index 5f7498c4f8..1d5c67cf36 100644
--- a/wcsmbs/wcstod_l.c
+++ b/wcsmbs/wcstod_l.c
@@ -18,7 +18,7 @@
<http://www.gnu.org/licenses/>. */
#include <stddef.h>
-#include <xlocale.h>
+#include <locale.h>
extern double ____wcstod_l_internal (const wchar_t *, wchar_t **, int,
diff --git a/wcsmbs/wcstof.c b/wcsmbs/wcstof.c
index 29cdec3a98..67c16e0cfd 100644
--- a/wcsmbs/wcstof.c
+++ b/wcsmbs/wcstof.c
@@ -17,7 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <stddef.h>
-#include <xlocale.h>
+#include <locale.h>
#define USE_WIDE_CHAR 1
diff --git a/wcsmbs/wcstof_l.c b/wcsmbs/wcstof_l.c
index 23d402d7ea..d430bf1c3b 100644
--- a/wcsmbs/wcstof_l.c
+++ b/wcsmbs/wcstof_l.c
@@ -18,7 +18,7 @@
<http://www.gnu.org/licenses/>. */
#include <stddef.h>
-#include <xlocale.h>
+#include <locale.h>
#define USE_WIDE_CHAR 1
diff --git a/wcsmbs/wcstold.c b/wcsmbs/wcstold.c
index e5c1cc3071..816f43bf69 100644
--- a/wcsmbs/wcstold.c
+++ b/wcsmbs/wcstold.c
@@ -17,7 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <stddef.h>
-#include <xlocale.h>
+#include <locale.h>
#define USE_WIDE_CHAR 1
diff --git a/wcsmbs/wcstold_l.c b/wcsmbs/wcstold_l.c
index 3dd33a729a..86f63e8801 100644
--- a/wcsmbs/wcstold_l.c
+++ b/wcsmbs/wcstold_l.c
@@ -18,7 +18,7 @@
<http://www.gnu.org/licenses/>. */
#include <stddef.h>
-#include <xlocale.h>
+#include <locale.h>
#define USE_WIDE_CHAR 1
diff --git a/wctype/wctype.h b/wctype/wctype.h
index 962aef1de6..7945795b44 100644
--- a/wctype/wctype.h
+++ b/wctype/wctype.h
@@ -55,8 +55,8 @@ extern wctrans_t wctrans (const char *__property) __THROW;
extern wint_t towctrans (wint_t __wc, wctrans_t __desc) __THROW;
# ifdef __USE_XOPEN2K8
-/* Declare the interface to extended locale model. */
-# include <xlocale.h>
+/* POSIX.1-2008 extended locale interface (see locale.h). */
+# include <bits/types/locale_t.h>
/* Test for any wide character for which `iswalpha' or `iswdigit' is
true. */
--
2.11.0
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 4/6] Remove __need macros from errno.h (__need_Emath, __need_error_t).
2017-06-10 17:17 [PATCH 0/6] Header file cleanups revised again Zack Weinberg
` (2 preceding siblings ...)
2017-06-10 17:17 ` [PATCH 1/6] Factor out shared definitions from bits/signum.h Zack Weinberg
@ 2017-06-10 17:17 ` Zack Weinberg
2017-06-13 22:21 ` Joseph Myers
2017-06-10 17:17 ` [PATCH 3/6] Remove __need_IOV_MAX and __need_FOPEN_MAX Zack Weinberg
2017-06-10 17:17 ` [PATCH 2/6] Remove __need_schedparam and __cpu_set_t_defined Zack Weinberg
5 siblings, 1 reply; 30+ messages in thread
From: Zack Weinberg @ 2017-06-10 17:17 UTC (permalink / raw)
To: libc-alpha; +Cc: joseph
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
enum __error_t_codes and error_t 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.
---
NEWS | 4 +
argp/argp.h | 14 +-
bits/errno.h | 40 +-
include/errno.h | 11 +-
stdlib/errno.h | 62 +-
string/argz.h | 10 +-
sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S | 3 +-
sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S | 3 +-
sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S | 3 +-
sysdeps/mach/hurd/bits/errno.h | 715 +++++++++++++----------
sysdeps/mach/hurd/errnos.awk | 206 ++++---
sysdeps/unix/sysv/linux/alpha/bits/errno.h | 46 +-
sysdeps/unix/sysv/linux/bits/errno.h | 47 +-
sysdeps/unix/sysv/linux/hppa/bits/errno.h | 39 +-
sysdeps/unix/sysv/linux/mips/bits/errno.h | 45 +-
sysdeps/unix/sysv/linux/sparc/bits/errno.h | 46 +-
sysdeps/x86_64/fpu/s_cosf.S | 3 +-
sysdeps/x86_64/fpu/s_sincosf.S | 3 +-
sysdeps/x86_64/fpu/s_sinf.S | 3 +-
19 files changed, 689 insertions(+), 614 deletions(-)
diff --git a/NEWS b/NEWS
index b88a34c718..71a9ad6053 100644
--- 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
diff --git a/argp/argp.h b/argp/argp.h
index 86b8e5a1e9..08b48e1cf1 100644
--- a/argp/argp.h
+++ b/argp/argp.h
@@ -24,17 +24,17 @@
#include <ctype.h>
#include <getopt.h>
#include <limits.h>
-
-#define __need_error_t
#include <errno.h>
-
-#ifndef __error_t_defined
-typedef int error_t;
-# define __error_t_defined
-#endif
\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;
+#endif
+
/* 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
entry can correspond to one long option and/or one short option; more
diff --git a/bits/errno.h b/bits/errno.h
index cd4fcfa428..0336a50bb7 100644
--- a/bits/errno.h
+++ b/bits/errno.h
@@ -15,20 +15,34 @@
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.
+
+ errno.h is sometimes included from assembly language.
+ When __ASSEMBLER__ is defined, 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/errno.h b/include/errno.h
index f140631b31..3c3d2288c8 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__
# 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/stdlib/errno.h b/stdlib/errno.h
index c42514b448..118525c8fd 100644
--- a/stdlib/errno.h
+++ b/stdlib/errno.h
@@ -20,53 +20,41 @@
*/
#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
+
+/* 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__
__BEGIN_DECLS
-/* 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
+/* The error code set by various library functions. */
+extern int *__errno_location (void) __THROW __attribute_const__;
+# define errno (*__errno_location ())
-#ifdef _ERRNO_H
-
-/* 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
/* 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;
+
+/* 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 /* __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 f9d0ac9950..e07d74208a 100644
--- a/string/argz.h
+++ b/string/argz.h
@@ -20,18 +20,18 @@
#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. */
diff --git a/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S b/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S
index f37850d0b3..a5b76e9fb2 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 f31a925522..1e99ee6416 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 ee96018061..03b925491e 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 d20ffe654a..8f3c210001 100644
--- a/sysdeps/mach/hurd/bits/errno.h
+++ b/sysdeps/mach/hurd/bits/errno.h
@@ -1,329 +1,418 @@
-/* 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 */
-
- /* 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/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 */
+ /* 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/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 <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
-/* 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__));
+#endif /* not __ASSEMBLER__ */
-#define errno (*__errno_location ())
+/* The C standard requires that all of the E-constants be
+ defined as macros. */
-#endif /* <errno.h> included. */
+#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
-#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. */
+/* 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
+
+/* 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
+
+/* 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
+
+#define _HURD_ERRNOS 120
+
+#endif /* bits/errno.h. */
diff --git a/sysdeps/mach/hurd/errnos.awk b/sysdeps/mach/hurd/errnos.awk
index 1cd2a0ac96..d1ed8c4877 100644
--- a/sysdeps/mach/hurd/errnos.awk
+++ b/sysdeps/mach/hurd/errnos.awk
@@ -19,71 +19,74 @@
# @errno{ENOSYS, 123, Function not implemented}
BEGIN {
- print "/* This file generated by errnos.awk. */";
+ 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 "/* 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 "#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";
- 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 "";
+
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_errno_enum(seq);
+ print_errno_defines(seq);
+
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 "";
- 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 3338621710..6a8730165e 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
+# 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
-
-# ifndef ECANCELED
-# define ECANCELED 131
+/* Older Linux headers do not define these constants. */
+# ifndef ENOTSUP
+# define ENOTSUP EOPNOTSUPP
+# endif
+
+# ifndef ECANCELED
+# 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 c0f4d20fe7..66cfb483c5 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
+# 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 versions also had no ECANCELED error code. */
-# ifndef ECANCELED
-# define ECANCELED 125
+/* Older Linux headers do not define these constants. */
+# ifndef ENOTSUP
+# define ENOTSUP EOPNOTSUPP
+# endif
+
+# ifndef ECANCELED
+# 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 ce6bebe8b0..2ccc30ac75 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
+# 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 fa62e1fc83..84dcf0204d 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
+# 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
-
-# ifndef ECANCELED
-# define ECANCELED 158
+/* Older Linux headers do not define these constants. */
+# ifndef ENOTSUP
+# define ENOTSUP EOPNOTSUPP
+# endif
+
+# ifndef ECANCELED
+# 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 4a8d8a0879..afa22beb15 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
+# 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
-
-# ifndef ECANCELED
-# define ECANCELED 127
+/* Older Linux headers do not define these constants. */
+# ifndef ENOTSUP
+# define ENOTSUP EOPNOTSUPP
+# endif
+
+# ifndef ECANCELED
+# 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 e9fdc7e56e..7acafcd1be 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 e6ed81ed91..fd35a3153b 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 0aa5d43d8c..253ba7d6f0 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:
*
--
2.11.0
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 1/6] Factor out shared definitions from bits/signum.h.
2017-06-10 17:17 [PATCH 0/6] Header file cleanups revised again Zack Weinberg
2017-06-10 17:17 ` [PATCH 6/6] Deprecate xlocale.h and add bits/types/locale_t.h Zack Weinberg
2017-06-10 17:17 ` [PATCH 5/6] Make error_t an enumeration on all supported OSes Zack Weinberg
@ 2017-06-10 17:17 ` Zack Weinberg
2017-06-20 12:18 ` Zack Weinberg
` (2 more replies)
2017-06-10 17:17 ` [PATCH 4/6] Remove __need macros from errno.h (__need_Emath, __need_error_t) Zack Weinberg
` (2 subsequent siblings)
5 siblings, 3 replies; 30+ messages in thread
From: Zack Weinberg @ 2017-06-10 17:17 UTC (permalink / raw)
To: libc-alpha; +Cc: joseph
Many of the things defined by bits/signum.h are invariant across all
supported operating systems. This patch factors out all of them to a
new header bits/signum-generic.h, which each bits/signum.h will include
and then override whichever things need adjustment. Normally that will
mean, at most, adding or changing a few signal numbers.
A user-visible side effect is that the obsolete signal constant SIGUNUSED
(which is an alias for SIGSYS on all platforms that define it) is no
longer exposed by any version of bits/signum.h.
A side effect only relevant to glibc hackers is that _NSIG is now defined
in terms of __SIGRTMAX, instead of the other way around. This is because
__SIGRTMAX varies from platform to platform, but _NSIG==__SIGRTMAX+1 is
true universally. If your platform doesn't support realtime signals,
leave __SIGRTMAX equal to __SIGRTMIN.
I also added a Linux-specific test to make sure that our signal constants
match the ones in <asm/signal.h>, since we can't use that header (it's
not even vaguely namespace-clean).
* bits/signum-generic.h: Renamed from bits/signum.h.
Add proper multiple include guard and misuse check.
Define __SIGRTMIN = __SIGRTMAX = 32, and define _NSIG = __SIGRTMAX+1.
Move definition of SIGIO to "archaic names for compatibility" section.
* bits/signum.h: New file which just includes bits/signum-generic.h.
* sysdeps/unix/bsd/bits/signum.h
* sysdeps/unix/sysv/linux/bits/signum.h
* sysdeps/unix/sysv/linux/alpha/bits/signum.h
* sysdeps/unix/sysv/linux/hppa/bits/signum.h
* sysdeps/unix/sysv/linux/mips/bits/signum.h
* sysdeps/unix/sysv/linux/sparc/bits/signum.h
Just include <bits/signum-generic.h> and then add or adjust
signal constants. Do not define SIGUNUSED, SIGRTMIN, or SIGRTMAX.
* signal/Makefile: Install bits/signum-generic.h.
* signal/signal.h: Define SIGRTMIN and SIGRTMAX here.
* sysdeps/generic/siglist.h: SIGSYS and SIGWINCH are
universal. Prefer SIGPOLL to SIGIO. Simplify #ifdeffage.
* sysdeps/unix/sysv/linux/tst-signal-numbers.sh: New test.
* sysdeps/unix/sysv/linux/Makefile: Run it.
---
NEWS | 2 +
bits/signum-generic.h | 102 ++++++++++++++++++++++++
bits/signum.h | 72 +++--------------
signal/Makefile | 3 +-
signal/signal.h | 3 +
sysdeps/generic/siglist.h | 24 +++---
sysdeps/unix/bsd/bits/signum.h | 58 +++-----------
sysdeps/unix/sysv/linux/Makefile | 14 ++++
sysdeps/unix/sysv/linux/alpha/bits/signum.h | 69 ++++------------
sysdeps/unix/sysv/linux/bits/signum.h | 83 ++++++++-----------
sysdeps/unix/sysv/linux/hppa/bits/signum.h | 110 +++++++++++---------------
sysdeps/unix/sysv/linux/mips/bits/signum.h | 94 ++++++++++------------
sysdeps/unix/sysv/linux/sparc/bits/signum.h | 70 +++-------------
sysdeps/unix/sysv/linux/tst-signal-numbers.sh | 69 ++++++++++++++++
14 files changed, 371 insertions(+), 402 deletions(-)
create mode 100644 bits/signum-generic.h
create mode 100644 sysdeps/unix/sysv/linux/tst-signal-numbers.sh
diff --git a/NEWS b/NEWS
index 991ee63f7c..b88a34c718 100644
--- a/NEWS
+++ b/NEWS
@@ -66,6 +66,8 @@ Version 2.26
* The port to Native Client running on ARMv7-A (--host=arm-nacl) has been
removed.
+* The obsolete signal constant SIGUNUSED is no longer defined by <signal.h>.
+
* The reallocarray function has been added to libc. It is a realloc
replacement with a check for integer overflow when calculating total
allocation size.
diff --git a/bits/signum-generic.h b/bits/signum-generic.h
new file mode 100644
index 0000000000..5a5683e753
--- /dev/null
+++ b/bits/signum-generic.h
@@ -0,0 +1,102 @@
+/* Signal number constants. Generic template.
+ 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
+ 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 _BITS_SIGNUM_GENERIC_H
+#define _BITS_SIGNUM_GENERIC_H 1
+
+#ifndef _SIGNAL_H
+#error "Never include <bits/signum-generic.h> directly; use <signal.h> instead."
+#endif
+
+/* Fake signal functions. */
+
+#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
+#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
+#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
+
+#ifdef __USE_XOPEN
+# define SIG_HOLD ((__sighandler_t) 2) /* Add signal to hold mask. */
+#endif
+
+/* We define here all the signal names listed in POSIX (1003.1-2008);
+ as of 1003.1-2013, no additional signals have been added by POSIX.
+ We also define here signal names that historically exist in every
+ real-world POSIX variant (e.g. SIGWINCH).
+
+ Signals in the 1-15 range are defined with their historical numbers.
+ For other signals, we use the BSD numbers.
+ There are two unallocated signal numbers in the 1-31 range: 7 and 29.
+ Signal number 0 is reserved for use as kill(pid, 0), to test whether
+ a process exists without sending it a signal. */
+
+/* ISO C99 signals. */
+#define SIGINT 2 /* Interactive attention signal. */
+#define SIGILL 4 /* Illegal instruction. */
+#define SIGABRT 6 /* Abnormal termination. */
+#define SIGFPE 8 /* Erroneous arithmetic operation. */
+#define SIGSEGV 11 /* Invalid access to storage. */
+#define SIGTERM 15 /* Termination request. */
+
+/* Historical signals specified by POSIX. */
+#define SIGHUP 1 /* Hangup. */
+#define SIGQUIT 3 /* Quit. */
+#define SIGTRAP 5 /* Trace/breakpoint trap. */
+#define SIGKILL 9 /* Killed. */
+#define SIGBUS 10 /* Bus error. */
+#define SIGSYS 12 /* Bad system call. */
+#define SIGPIPE 13 /* Broken pipe. */
+#define SIGALRM 14 /* Alarm clock. */
+
+/* New(er) POSIX signals (1003.1-2008, 1003.1-2013). */
+#define SIGURG 16 /* Urgent data is available at a socket. */
+#define SIGSTOP 17 /* Stop, unblockable. */
+#define SIGTSTP 18 /* Keyboard stop. */
+#define SIGCONT 19 /* Continue. */
+#define SIGCHLD 20 /* Child terminated or stopped. */
+#define SIGTTIN 21 /* Background read from control terminal. */
+#define SIGTTOU 22 /* Background write to control terminal. */
+#define SIGPOLL 23 /* Pollable event occurred (System V). */
+#define SIGXCPU 24 /* CPU time limit exceeded. */
+#define SIGXFSZ 25 /* File size limit exceeded. */
+#define SIGVTALRM 26 /* Virtual timer expired. */
+#define SIGPROF 27 /* Profiling timer expired. */
+#define SIGUSR1 30 /* User-defined signal 1. */
+#define SIGUSR2 31 /* User-defined signal 2. */
+
+/* Nonstandard signals found in all modern POSIX systems
+ (including both BSD and Linux). */
+#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */
+
+/* Archaic names for compatibility. */
+#define SIGIO SIGPOLL /* I/O now possible (4.2 BSD). */
+#define SIGIOT SIGABRT /* IOT instruction, abort() on a PDP-11. */
+#define SIGCLD SIGCHLD /* Old System V name */
+
+/* Not all systems support real-time signals. bits/signum.h indicates
+ that they are supported by overriding __SIGRTMAX to a value greater
+ than __SIGRTMIN. These constants give the kernel-level hard limits,
+ but some real-time signals may be used internally by glibc. Do not
+ use these constants in application code; use SIGRTMIN and SIGRTMAX
+ (defined in signal.h) instead. */
+#define __SIGRTMIN 32
+#define __SIGRTMAX __SIGRTMIN
+
+/* Biggest signal number + 1 (including real-time signals). */
+#define _NSIG (__SIGRTMAX + 1)
+
+#endif /* bits/signum-generic.h. */
diff --git a/bits/signum.h b/bits/signum.h
index cfbc7ac8bb..8d6d03c918 100644
--- a/bits/signum.h
+++ b/bits/signum.h
@@ -1,5 +1,5 @@
/* Signal number constants. Generic version.
- Copyright (C) 1991-2017 Free Software Foundation, Inc.
+ 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
@@ -16,69 +16,17 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef _SIGNAL_H
+#ifndef _BITS_SIGNUM_H
+#define _BITS_SIGNUM_H 1
-/* Fake signal functions. */
-
-#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
-#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
-#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
-
-#ifdef __USE_XOPEN
-# define SIG_HOLD ((__sighandler_t) 2) /* Add signal to hold mask. */
+#ifndef _SIGNAL_H
+#error "Never include <bits/signum.h> directly; use <signal.h> instead."
#endif
-/* We define here all the signal names listed in POSIX (1003.1-2008);
- as of 1003.1-2013, no additional signals have been added by POSIX.
- We also define here signal names that historically exist in every
- real-world POSIX variant (e.g. SIGWINCH).
+#include <bits/signum-generic.h>
- Signals in the 1-15 range are defined with their historical numbers.
- For other signals, we use the BSD numbers. */
+/* This operating system does not need to override any of the generic
+ signal number assignments in bits/signum-generic.h, nor to add any
+ additional signal constants. */
-/* ISO C99 signals. */
-#define SIGINT 2 /* Interactive attention signal. */
-#define SIGILL 4 /* Illegal instruction. */
-#define SIGABRT 6 /* Abnormal termination. */
-#define SIGFPE 8 /* Erroneous arithmetic operation. */
-#define SIGSEGV 11 /* Invalid access to storage. */
-#define SIGTERM 15 /* Termination request. */
-
-/* Historical signals specified by POSIX. */
-#define SIGHUP 1 /* Hangup. */
-#define SIGQUIT 3 /* Quit. */
-#define SIGTRAP 5 /* Trace/breakpoint trap. */
-#define SIGKILL 9 /* Killed. */
-#define SIGBUS 10 /* Bus error. */
-#define SIGSYS 12 /* Bad system call. */
-#define SIGPIPE 13 /* Broken pipe. */
-#define SIGALRM 14 /* Alarm clock. */
-
-/* New(er) POSIX signals (1003.1-2008, 1003.1-2013). */
-#define SIGURG 16 /* High bandwidth data is available at a socket. */
-#define SIGSTOP 17 /* Stopped (signal). */
-#define SIGTSTP 18 /* Stopped. */
-#define SIGCONT 19 /* Continued. */
-#define SIGCHLD 20 /* Child terminated or stopped. */
-#define SIGTTIN 21 /* Background read from control terminal. */
-#define SIGTTOU 22 /* Background write to control terminal. */
-#define SIGPOLL 23 /* Pollable event occurred (System V). */
-#define SIGIO SIGPOLL /* I/O now possible (4.2 BSD). */
-#define SIGXCPU 24 /* CPU time limit exceeded. */
-#define SIGXFSZ 25 /* File size limit exceeded. */
-#define SIGVTALRM 26 /* Virtual timer expired. */
-#define SIGPROF 27 /* Profiling timer expired. */
-#define SIGUSR1 30 /* User-defined signal 1. */
-#define SIGUSR2 31 /* User-defined signal 2. */
-
-/* Nonstandard signals found in all modern POSIX systems
- (including both BSD and Linux). */
-#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */
-
-#define _NSIG 32
-
-/* Archaic names for compatibility. */
-#define SIGIOT SIGABRT /* IOT instruction, abort() on a PDP-11. */
-#define SIGCLD SIGCHLD /* Old System V name */
-
-#endif /* <signal.h> included. */
+#endif /* bits/signum.h. */
diff --git a/signal/Makefile b/signal/Makefile
index 9ce8232d43..8c9a7d1844 100644
--- a/signal/Makefile
+++ b/signal/Makefile
@@ -23,7 +23,8 @@ subdir := signal
include ../Makeconfig
headers := signal.h sys/signal.h \
- bits/signum.h bits/sigcontext.h bits/sigaction.h \
+ bits/signum.h bits/signum-generic.h \
+ bits/sigcontext.h bits/sigaction.h \
bits/sigevent-consts.h bits/siginfo-consts.h \
bits/sigstack.h bits/sigthread.h bits/ss_flags.h \
bits/types/__sigset_t.h bits/types/sig_atomic_t.h \
diff --git a/signal/signal.h b/signal/signal.h
index a43f8887e3..443383d013 100644
--- a/signal/signal.h
+++ b/signal/signal.h
@@ -359,6 +359,9 @@ extern int __libc_current_sigrtmin (void) __THROW;
/* Return number of available real-time signal with lowest priority. */
extern int __libc_current_sigrtmax (void) __THROW;
+#define SIGRTMIN (__libc_current_sigrtmin ())
+#define SIGRTMAX (__libc_current_sigrtmax ())
+
__END_DECLS
#endif /* not signal.h */
diff --git a/sysdeps/generic/siglist.h b/sysdeps/generic/siglist.h
index dd72929ed5..022be56059 100644
--- a/sysdeps/generic/siglist.h
+++ b/sysdeps/generic/siglist.h
@@ -24,7 +24,8 @@
/* This file is included multiple times. */
-/* Standard signals */
+/* Standard signals, in the numerical order defined in
+ bits/signum-generic.h. */
init_sig (SIGHUP, "HUP", N_("Hangup"))
init_sig (SIGINT, "INT", N_("Interrupt"))
init_sig (SIGQUIT, "QUIT", N_("Quit"))
@@ -34,6 +35,7 @@
init_sig (SIGFPE, "FPE", N_("Floating point exception"))
init_sig (SIGKILL, "KILL", N_("Killed"))
init_sig (SIGBUS, "BUS", N_("Bus error"))
+ init_sig (SIGSYS, "SYS", N_("Bad system call"))
init_sig (SIGSEGV, "SEGV", N_("Segmentation fault"))
init_sig (SIGPIPE, "PIPE", N_("Broken pipe"))
init_sig (SIGALRM, "ALRM", N_("Alarm clock"))
@@ -45,32 +47,28 @@
init_sig (SIGCHLD, "CHLD", N_("Child exited"))
init_sig (SIGTTIN, "TTIN", N_("Stopped (tty input)"))
init_sig (SIGTTOU, "TTOU", N_("Stopped (tty output)"))
- init_sig (SIGIO, "IO", N_("I/O possible"))
+ init_sig (SIGPOLL, "POLL", N_("I/O possible"))
init_sig (SIGXCPU, "XCPU", N_("CPU time limit exceeded"))
init_sig (SIGXFSZ, "XFSZ", N_("File size limit exceeded"))
init_sig (SIGVTALRM, "VTALRM", N_("Virtual timer expired"))
init_sig (SIGPROF, "PROF", N_("Profiling timer expired"))
init_sig (SIGUSR1, "USR1", N_("User defined signal 1"))
init_sig (SIGUSR2, "USR2", N_("User defined signal 2"))
+ init_sig (SIGWINCH, "WINCH", N_("Window changed"))
-/* Variations */
+/* Signals that are not present on all supported platforms. */
#ifdef SIGEMT
init_sig (SIGEMT, "EMT", N_("EMT trap"))
#endif
-#ifdef SIGSYS
- init_sig (SIGSYS, "SYS", N_("Bad system call"))
-#endif
#ifdef SIGSTKFLT
init_sig (SIGSTKFLT, "STKFLT", N_("Stack fault"))
#endif
-#ifdef SIGINFO
- init_sig (SIGINFO, "INFO", N_("Information request"))
-#elif defined(SIGPWR) && (!defined(SIGLOST) || (SIGPWR != SIGLOST))
+#ifdef SIGPWR
init_sig (SIGPWR, "PWR", N_("Power failure"))
#endif
-#ifdef SIGLOST
+#if defined SIGINFO && (!defined SIGPWR || SIGPWR != SIGINFO)
+ init_sig (SIGINFO, "INFO", N_("Information request"))
+#endif
+#if defined SIGLOST && (!defined SIGPWR || SIGPWR != SIGLOST)
init_sig (SIGLOST, "LOST", N_("Resource lost"))
#endif
-#ifdef SIGWINCH
- init_sig (SIGWINCH, "WINCH", N_("Window changed"))
-#endif
diff --git a/sysdeps/unix/bsd/bits/signum.h b/sysdeps/unix/bsd/bits/signum.h
index 268c24a702..f55edc93a3 100644
--- a/sysdeps/unix/bsd/bits/signum.h
+++ b/sysdeps/unix/bsd/bits/signum.h
@@ -16,58 +16,20 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef _SIGNAL_H
+#ifndef _BITS_SIGNUM_H
+#define _BITS_SIGNUM_H 1
-/* This file defines the fake signal functions and signal
- number constants for 4.2 or 4.3 BSD-derived Unix system. */
-
-/* Fake signal functions. */
-#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
-#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
-#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
-
-#ifdef __USE_XOPEN
-# define SIG_HOLD ((__sighandler_t) 2) /* Add signal to hold mask. */
+#ifndef _SIGNAL_H
+#error "Never include <bits/signum.h> directly; use <signal.h> instead."
#endif
+#include <bits/signum-generic.h>
-/* Signals. */
-#define SIGHUP 1 /* Hangup (POSIX). */
-#define SIGINT 2 /* Interrupt (ANSI). */
-#define SIGQUIT 3 /* Quit (POSIX). */
-#define SIGILL 4 /* Illegal instruction (ANSI). */
-#define SIGABRT SIGIOT /* Abort (ANSI). */
-#define SIGTRAP 5 /* Trace trap (POSIX). */
-#define SIGIOT 6 /* IOT trap (4.2 BSD). */
-#define SIGEMT 7 /* EMT trap (4.2 BSD). */
-#define SIGFPE 8 /* Floating-point exception (ANSI). */
-#define SIGKILL 9 /* Kill, unblockable (POSIX). */
-#define SIGBUS 10 /* Bus error (4.2 BSD). */
-#define SIGSEGV 11 /* Segmentation violation (ANSI). */
-#define SIGSYS 12 /* Bad argument to system call (4.2 BSD). */
-#define SIGPIPE 13 /* Broken pipe (POSIX). */
-#define SIGALRM 14 /* Alarm clock (POSIX). */
-#define SIGTERM 15 /* Termination (ANSI). */
-#define SIGURG 16 /* Urgent condition on socket (4.2 BSD). */
-#define SIGSTOP 17 /* Stop, unblockable (POSIX). */
-#define SIGTSTP 18 /* Keyboard stop (POSIX). */
-#define SIGCONT 19 /* Continue (POSIX). */
-#define SIGCHLD 20 /* Child status has changed (POSIX). */
-#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
-#define SIGTTIN 21 /* Background read from tty (POSIX). */
-#define SIGTTOU 22 /* Background write to tty (POSIX). */
-#define SIGIO 23 /* I/O now possible (4.2 BSD). */
-#define SIGPOLL SIGIO /* Same as SIGIO? (SVID). */
-#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */
-#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */
-#define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */
-#define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */
-#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */
+/* Adjustments and additions to the signal number constants for
+ 4.2 or 4.3 BSD-derived Unix systems. */
+
+#define SIGEMT 7 /* Emulator trap (4.2 BSD). */
#define SIGINFO 29 /* Information request (4.4 BSD). */
-#define SIGUSR1 30 /* User-defined signal 1 (POSIX). */
-#define SIGUSR2 31 /* User-defined signal 2 (POSIX). */
#define SIGLOST 32 /* Resource lost (Sun); server died (GNU). */
-#endif /* <signal.h> included. */
-
-#define _NSIG 33 /* Biggest signal number + 1. */
+#endif /* bits/signum.h. */
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 99b3f9d346..7ce5b38770 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -127,6 +127,20 @@ sysdep_headers += sys/timex.h bits/timex.h
sysdep_routines += ntp_gettime ntp_gettimex
endif
+ifeq ($(subdir),signal)
+tests-special += $(objpfx)tst-signal-numbers.out
+# Depending on signal.o* is a hack. What we actually want is a dependency
+# on signal.h and everything it includes. That's impractical to write
+# in this context, but signal.c includes signal.h and not much else so it'll
+# be conservatively correct.
+$(objpfx)tst-signal-numbers.out: \
+ ../sysdeps/unix/sysv/linux/tst-signal-numbers.sh \
+ $(objpfx)signal.o*
+ AWK=$(AWK) $(SHELL) ../sysdeps/unix/sysv/linux/tst-signal-numbers.sh \
+ $(CC) $(patsubst -DMODULE_NAME=%,-DMODULE_NAME=testsuite,$(CPPFLAGS)) \
+ < /dev/null > $@; $(evaluate-test)
+endif
+
ifeq ($(subdir),socket)
sysdep_headers += net/if_ppp.h net/ppp-comp.h \
net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/signum.h b/sysdeps/unix/sysv/linux/alpha/bits/signum.h
index e5cc5218e3..8227be91b5 100644
--- a/sysdeps/unix/sysv/linux/alpha/bits/signum.h
+++ b/sysdeps/unix/sysv/linux/alpha/bits/signum.h
@@ -16,66 +16,25 @@
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
-#ifdef _SIGNAL_H
+#ifndef _BITS_SIGNUM_H
+#define _BITS_SIGNUM_H 1
-/* Fake signal functions. */
-#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
-#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
-#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
-
-#ifdef __USE_XOPEN
-# define SIG_HOLD ((__sighandler_t) 2) /* Add signal to hold mask. */
+#ifndef _SIGNAL_H
+#error "Never include <bits/signum.h> directly; use <signal.h> instead."
#endif
-/*
- * Linux/AXP has different signal numbers that Linux/i386: I'm trying
- * to make it OSF/1 binary compatible, at least for normal binaries.
- */
-#define SIGHUP 1
-#define SIGINT 2
-#define SIGQUIT 3
-#define SIGILL 4
-#define SIGTRAP 5
-#define SIGABRT 6
-#define SIGEMT 7
-#define SIGFPE 8
-#define SIGKILL 9
-#define SIGBUS 10
-#define SIGSEGV 11
-#define SIGSYS 12
-#define SIGPIPE 13
-#define SIGALRM 14
-#define SIGTERM 15
-#define SIGURG 16
-#define SIGSTOP 17
-#define SIGTSTP 18
-#define SIGCONT 19
-#define SIGCHLD 20
-#define SIGCLD SIGCHLD
-#define SIGTTIN 21
-#define SIGTTOU 22
-#define SIGIO 23
-#define SIGXCPU 24
-#define SIGXFSZ 25
-#define SIGVTALRM 26
-#define SIGPROF 27
-#define SIGWINCH 28
-#define SIGINFO 29
-#define SIGUSR1 30
-#define SIGUSR2 31
+#include <bits/signum-generic.h>
-#define SIGPOLL SIGIO
-#define SIGPWR SIGINFO
-#define SIGIOT SIGABRT
+/* Adjustments and additions to the signal number constants for
+ Linux/Alpha. Signal values on this platform were chosen for OSF/1
+ binary compatibility, and are therefore almost identical to the
+ BSD-derived defaults. */
-#define _NSIG 65 /* Biggest signal number + 1. */
+#define SIGEMT 7 /* Emulator trap (4.2 BSD). */
+#define SIGINFO 29 /* Information request (BSD). */
+#define SIGPWR SIGINFO /* Power failure imminent (System V). */
-#define SIGRTMIN (__libc_current_sigrtmin ())
-#define SIGRTMAX (__libc_current_sigrtmax ())
-
-/* These are the hard limits of the kernel. These values should not be
- used directly at user level. */
-#define __SIGRTMIN 32
-#define __SIGRTMAX (_NSIG - 1)
+#undef __SIGRTMAX
+#define __SIGRTMAX 64
#endif /* <signal.h> included. */
diff --git a/sysdeps/unix/sysv/linux/bits/signum.h b/sysdeps/unix/sysv/linux/bits/signum.h
index e30efead0d..1a68255d02 100644
--- a/sysdeps/unix/sysv/linux/bits/signum.h
+++ b/sysdeps/unix/sysv/linux/bits/signum.h
@@ -16,64 +16,43 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef _SIGNAL_H
+#ifndef _BITS_SIGNUM_H
+#define _BITS_SIGNUM_H 1
-/* Fake signal functions. */
-#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
-#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
-#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
-
-#ifdef __USE_XOPEN
-# define SIG_HOLD ((__sighandler_t) 2) /* Add signal to hold mask. */
+#ifndef _SIGNAL_H
+#error "Never include <bits/signum.h> directly; use <signal.h> instead."
#endif
+#include <bits/signum-generic.h>
-/* Signals. */
-#define SIGHUP 1 /* Hangup (POSIX). */
-#define SIGINT 2 /* Interrupt (ANSI). */
-#define SIGQUIT 3 /* Quit (POSIX). */
-#define SIGILL 4 /* Illegal instruction (ANSI). */
-#define SIGTRAP 5 /* Trace trap (POSIX). */
-#define SIGABRT 6 /* Abort (ANSI). */
-#define SIGIOT 6 /* IOT trap (4.2 BSD). */
-#define SIGBUS 7 /* BUS error (4.2 BSD). */
-#define SIGFPE 8 /* Floating-point exception (ANSI). */
-#define SIGKILL 9 /* Kill, unblockable (POSIX). */
-#define SIGUSR1 10 /* User-defined signal 1 (POSIX). */
-#define SIGSEGV 11 /* Segmentation violation (ANSI). */
-#define SIGUSR2 12 /* User-defined signal 2 (POSIX). */
-#define SIGPIPE 13 /* Broken pipe (POSIX). */
-#define SIGALRM 14 /* Alarm clock (POSIX). */
-#define SIGTERM 15 /* Termination (ANSI). */
-#define SIGSTKFLT 16 /* Stack fault. */
-#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
-#define SIGCHLD 17 /* Child status has changed (POSIX). */
-#define SIGCONT 18 /* Continue (POSIX). */
-#define SIGSTOP 19 /* Stop, unblockable (POSIX). */
-#define SIGTSTP 20 /* Keyboard stop (POSIX). */
-#define SIGTTIN 21 /* Background read from tty (POSIX). */
-#define SIGTTOU 22 /* Background write to tty (POSIX). */
-#define SIGURG 23 /* Urgent condition on socket (4.2 BSD). */
-#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */
-#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */
-#define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */
-#define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */
-#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */
-#define SIGPOLL SIGIO /* Pollable event occurred (System V). */
-#define SIGIO 29 /* I/O now possible (4.2 BSD). */
-#define SIGPWR 30 /* Power failure restart (System V). */
-#define SIGSYS 31 /* Bad system call. */
-#define SIGUNUSED 31
+/* Adjustments and additions to the signal number constants for
+ most Linux systems. */
-#define _NSIG 65 /* Biggest signal number + 1
- (including real-time signals). */
+#define SIGSTKFLT 16 /* Stack fault (obsolete). */
+#define SIGPWR 30 /* Power failure imminent. */
-#define SIGRTMIN (__libc_current_sigrtmin ())
-#define SIGRTMAX (__libc_current_sigrtmax ())
+#undef SIGBUS
+#define SIGBUS 7
+#undef SIGUSR1
+#define SIGUSR1 10
+#undef SIGUSR2
+#define SIGUSR2 12
+#undef SIGCHLD
+#define SIGCHLD 17
+#undef SIGCONT
+#define SIGCONT 18
+#undef SIGSTOP
+#define SIGSTOP 19
+#undef SIGTSTP
+#define SIGTSTP 20
+#undef SIGURG
+#define SIGURG 23
+#undef SIGPOLL
+#define SIGPOLL 29
+#undef SIGSYS
+#define SIGSYS 31
-/* These are the hard limits of the kernel. These values should not be
- used directly at user level. */
-#define __SIGRTMIN 32
-#define __SIGRTMAX (_NSIG - 1)
+#undef __SIGRTMAX
+#define __SIGRTMAX 64
#endif /* <signal.h> included. */
diff --git a/sysdeps/unix/sysv/linux/hppa/bits/signum.h b/sysdeps/unix/sysv/linux/hppa/bits/signum.h
index 20c0b60c9f..5f54d1c893 100644
--- a/sysdeps/unix/sysv/linux/hppa/bits/signum.h
+++ b/sysdeps/unix/sysv/linux/hppa/bits/signum.h
@@ -16,74 +16,60 @@
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
-#ifdef _SIGNAL_H
+#ifndef _BITS_SIGNUM_H
+#define _BITS_SIGNUM_H 1
-/* Fake signal functions. */
-#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
-#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
-#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
-
-#ifdef __USE_XOPEN
-# define SIG_HOLD ((__sighandler_t) 2) /* Add signal to hold mask. */
+#ifndef _SIGNAL_H
+#error "Never include <bits/signum.h> directly; use <signal.h> instead."
#endif
+#include <bits/signum-generic.h>
-/* Signals. */
-#define SIGHUP 1 /* Hangup (POSIX). */
-#define SIGINT 2 /* Interrupt (ANSI). */
-#define SIGQUIT 3 /* Quit (POSIX). */
-#define SIGILL 4 /* Illegal instruction (ANSI). */
-#define SIGTRAP 5 /* Trace trap (POSIX). */
-#define SIGABRT 6 /* Abort (ANSI). */
-#define SIGIOT 6 /* IOT trap (4.2 BSD). */
-#define SIGSTKFLT 7 /* Stack fault. */
-#define SIGFPE 8 /* Floating-point exception (ANSI). */
-#define SIGKILL 9 /* Kill, unblockable (POSIX). */
-#define SIGBUS 10 /* BUS error (4.2 BSD). */
-#define SIGSEGV 11 /* Segmentation violation (ANSI). */
-#define SIGXCPU 12 /* CPU limit exceeded (4.2 BSD). */
-#define SIGPIPE 13 /* Broken pipe (POSIX). */
-#define SIGALRM 14 /* Alarm clock (POSIX). */
-#define SIGTERM 15 /* Termination (ANSI). */
-#define SIGUSR1 16 /* User-defined signal 1 (POSIX). */
-#define SIGUSR2 17 /* User-defined signal 2 (POSIX). */
-#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
-#define SIGCHLD 18 /* Child status has changed (POSIX). */
-#define SIGPWR 19 /* Power failure restart (System V). */
-#define SIGVTALRM 20 /* Virtual alarm clock (4.2 BSD). */
-#define SIGPROF 21 /* Profiling alarm clock (4.2 BSD). */
-#define SIGPOLL SIGIO /* Pollable event occurred (System V). */
-#define SIGIO 22 /* I/O now possible (4.2 BSD). */
-#define SIGWINCH 23 /* Window size change (4.3 BSD, Sun). */
-#define SIGSTOP 24 /* Stop, unblockable (POSIX). */
-#define SIGTSTP 25 /* Keyboard stop (POSIX). */
-#define SIGCONT 26 /* Continue (POSIX). */
-#define SIGTTIN 27 /* Background read from tty (POSIX). */
-#define SIGTTOU 28 /* Background write to tty (POSIX). */
-#define SIGURG 29 /* Urgent condition on socket (4.2 BSD). */
-#define SIGXFSZ 30 /* File size limit exceeded (4.2 BSD). */
-#define SIGSYS 31 /* Bad system call. */
-#define SIGUNUSED 31
+/* Adjustments and additions to the signal number constants for
+ Linux/HPPA. These values were originally chosen for HP/UX
+ compatibility, but were renumbered as of kernel 3.17 and glibc 2.21
+ to accommodate software (notably systemd) that assumed at least 29
+ real-time signal numbers would be available. SIGEMT and SIGLOST
+ were removed, and the values of SIGSTKFLT, SIGXCPU, XIGXFSZ, and
+ SIGSYS were changed, enabling __SIGRTMIN to be 32. */
-#define _NSIG 65 /* Biggest signal number + 1
- (including real-time signals). */
+#define SIGSTKFLT 7 /* Stack fault (obsolete). */
+#define SIGPWR 19 /* Power failure imminent. */
-#define SIGRTMIN (__libc_current_sigrtmin ())
-#define SIGRTMAX (__libc_current_sigrtmax ())
+#undef SIGXCPU
+#define SIGXCPU 12
+#undef SIGUSR1
+#define SIGUSR1 16
+#undef SIGUSR2
+#define SIGUSR2 17
+#undef SIGCHLD
+#define SIGCHLD 18
+#undef SIGVTALRM
+#define SIGVTALRM 20
+#undef SIGPROF
+#define SIGPROF 21
+#undef SIGPOLL
+#define SIGPOLL 22
+#undef SIGWINCH
+#define SIGWINCH 23
+#undef SIGSTOP
+#define SIGSTOP 24
+#undef SIGTSTP
+#define SIGTSTP 25
+#undef SIGCONT
+#define SIGCONT 26
+#undef SIGTTIN
+#define SIGTTIN 27
+#undef SIGTTOU
+#define SIGTTOU 28
+#undef SIGURG
+#define SIGURG 29
+#undef SIGXFSZ
+#define SIGXFSZ 30
+#undef SIGSYS
+#define SIGSYS 31
-/* These are the hard limits of the kernel. These values should not be
- used directly at user level. */
-/* In the Linux kernel version 3.17, and glibc 2.21, the signal numbers
- were rearranged in order to make hppa like every other arch. Previously
- we started __SIGRTMIN at 37, and that meant several pieces of important
- software, including systemd, would fail to build. To support systemd we
- removed SIGEMT and SIGLOST, and rearranged the others according to
- expected values. This is technically an ABI incompatible change, but
- because zero applications use SIGSTKFLT, SIGXCPU, SIGXFSZ and SIGSYS
- nothing broke. Nothing uses SIGEMT and SIGLOST, and they were present
- for HPUX compatibility which is no longer supported. Thus because
- nothing breaks we don't do any compatibility work here. */
-#define __SIGRTMIN 32 /* Kernel > 3.17. */
-#define __SIGRTMAX (_NSIG - 1)
+#undef __SIGRTMAX
+#define __SIGRTMAX 64
#endif /* <signal.h> included. */
diff --git a/sysdeps/unix/sysv/linux/mips/bits/signum.h b/sysdeps/unix/sysv/linux/mips/bits/signum.h
index 6c31e01cd7..1672847212 100644
--- a/sysdeps/unix/sysv/linux/mips/bits/signum.h
+++ b/sysdeps/unix/sysv/linux/mips/bits/signum.h
@@ -1,4 +1,4 @@
-/* Signal number definitions. Linux version.
+/* Signal number definitions. Linux/MIPS version.
Copyright (C) 1995-2017 Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -16,63 +16,53 @@
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
-#ifdef _SIGNAL_H
+#ifndef _BITS_SIGNUM_H
+#define _BITS_SIGNUM_H 1
-/* Fake signal functions. */
-#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
-#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
-#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
-
-#ifdef __USE_XOPEN
-# define SIG_HOLD ((__sighandler_t) 2) /* Add signal to hold mask. */
+#ifndef _SIGNAL_H
+#error "Never include <bits/signum.h> directly; use <signal.h> instead."
#endif
+#include <bits/signum-generic.h>
-#define SIGHUP 1 /* Hangup (POSIX). */
-#define SIGINT 2 /* Interrupt (ANSI). */
-#define SIGQUIT 3 /* Quit (POSIX). */
-#define SIGILL 4 /* Illegal instruction (ANSI). */
-#define SIGTRAP 5 /* Trace trap (POSIX). */
-#define SIGIOT 6 /* IOT trap (4.2 BSD). */
-#define SIGABRT SIGIOT /* Abort (ANSI). */
-#define SIGEMT 7
-#define SIGFPE 8 /* Floating-point exception (ANSI). */
-#define SIGKILL 9 /* Kill, unblockable (POSIX). */
-#define SIGBUS 10 /* BUS error (4.2 BSD). */
-#define SIGSEGV 11 /* Segmentation violation (ANSI). */
-#define SIGSYS 12
-#define SIGPIPE 13 /* Broken pipe (POSIX). */
-#define SIGALRM 14 /* Alarm clock (POSIX). */
-#define SIGTERM 15 /* Termination (ANSI). */
-#define SIGUSR1 16 /* User-defined signal 1 (POSIX). */
-#define SIGUSR2 17 /* User-defined signal 2 (POSIX). */
-#define SIGCHLD 18 /* Child status has changed (POSIX). */
-#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
-#define SIGPWR 19 /* Power failure restart (System V). */
-#define SIGWINCH 20 /* Window size change (4.3 BSD, Sun). */
-#define SIGURG 21 /* Urgent condition on socket (4.2 BSD). */
-#define SIGIO 22 /* I/O now possible (4.2 BSD). */
-#define SIGPOLL SIGIO /* Pollable event occurred (System V). */
-#define SIGSTOP 23 /* Stop, unblockable (POSIX). */
-#define SIGTSTP 24 /* Keyboard stop (POSIX). */
-#define SIGCONT 25 /* Continue (POSIX). */
-#define SIGTTIN 26 /* Background read from tty (POSIX). */
-#define SIGTTOU 27 /* Background write to tty (POSIX). */
-#define SIGVTALRM 28 /* Virtual alarm clock (4.2 BSD). */
-#define SIGPROF 29 /* Profiling alarm clock (4.2 BSD). */
-#define SIGXCPU 30 /* CPU limit exceeded (4.2 BSD). */
-#define SIGXFSZ 31 /* File size limit exceeded (4.2 BSD). */
+/* Adjustments and additions to the signal number constants for
+ Linux/MIPS. */
+#define SIGEMT 7 /* Emulator trap. */
+#define SIGPWR 19 /* Power failure imminent. */
-#define _NSIG 128 /* Biggest signal number + 1
- (including real-time signals). */
+#undef SIGUSR1
+#define SIGUSR1 16
+#undef SIGUSR2
+#define SIGUSR2 17
+#undef SIGCHLD
+#define SIGCHLD 18
+#undef SIGWINCH
+#define SIGWINCH 20
+#undef SIGURG
+#define SIGURG 21
+#undef SIGPOLL
+#define SIGPOLL 22
+#undef SIGSTOP
+#define SIGSTOP 23
+#undef SIGTSTP
+#define SIGTSTP 24
+#undef SIGCONT
+#define SIGCONT 25
+#undef SIGTTIN
+#define SIGTTIN 26
+#undef SIGTTOU
+#define SIGTTOU 27
+#undef SIGVTALRM
+#define SIGVTALRM 28
+#undef SIGPROF
+#define SIGPROF 29
+#undef SIGXCPU
+#define SIGXCPU 30
+#undef SIGXFSZ
+#define SIGXFSZ 31
-#define SIGRTMIN (__libc_current_sigrtmin ())
-#define SIGRTMAX (__libc_current_sigrtmax ())
-
-/* These are the hard limits of the kernel. These values should not be
- used directly at user level. */
-#define __SIGRTMIN 32
-#define __SIGRTMAX (_NSIG - 1)
+#undef __SIGRTMAX
+#define __SIGRTMAX 127
#endif /* <signal.h> included. */
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/signum.h b/sysdeps/unix/sysv/linux/sparc/bits/signum.h
index a0c5be5fa5..25341ee42b 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/signum.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/signum.h
@@ -16,68 +16,24 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef _SIGNAL_H
+#ifndef _BITS_SIGNUM_H
+#define _BITS_SIGNUM_H 1
-/* Fake signal functions. */
-#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
-#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
-#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
-
-#ifdef __USE_XOPEN
-# define SIG_HOLD ((__sighandler_t) 2) /* Add signal to hold mask. */
+#ifndef _SIGNAL_H
+#error "Never include <bits/signum.h> directly; use <signal.h> instead."
#endif
-/*
- * Linux/SPARC has different signal numbers that Linux/i386: I'm trying
- * to make it OSF/1 binary compatible, at least for normal binaries.
- */
-#define SIGHUP 1
-#define SIGINT 2
-#define SIGQUIT 3
-#define SIGILL 4
-#define SIGTRAP 5
-#define SIGABRT 6
-#define SIGIOT 6
-#define SIGEMT 7
-#define SIGFPE 8
-#define SIGKILL 9
-#define SIGBUS 10
-#define SIGSEGV 11
-#define SIGSYS 12
-#define SIGPIPE 13
-#define SIGALRM 14
-#define SIGTERM 15
-#define SIGURG 16
+#include <bits/signum-generic.h>
-/* SunOS values which deviate from the Linux/i386 ones */
-#define SIGSTOP 17
-#define SIGTSTP 18
-#define SIGCONT 19
-#define SIGCHLD 20
-#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
-#define SIGTTIN 21
-#define SIGTTOU 22
-#define SIGIO 23
-#define SIGPOLL SIGIO /* SysV name for SIGIO */
-#define SIGXCPU 24
-#define SIGXFSZ 25
-#define SIGVTALRM 26
-#define SIGPROF 27
-#define SIGWINCH 28
-#define SIGLOST 29
-#define SIGPWR SIGLOST
-#define SIGUSR1 30
-#define SIGUSR2 31
+/* Adjustments and additions to the signal number constants for
+ Linux/SPARC systems. Signal values on this platform were chosen
+ for SunOS binary compatibility. */
-#define _NSIG 65 /* Biggest signal number + 1
- (including real-time signals). */
+#define SIGEMT 7 /* Emulator trap. */
+#define SIGLOST 29 /* Resource lost (Sun); server died (GNU). */
+#define SIGPWR SIGLOST /* Power failure imminent (SysV). */
-#define SIGRTMIN (__libc_current_sigrtmin ())
-#define SIGRTMAX (__libc_current_sigrtmax ())
-
-/* These are the hard limits of the kernel. These values should not be
- used directly at user level. */
-#define __SIGRTMIN 32
-#define __SIGRTMAX (_NSIG - 1)
+#undef __SIGRTMAX
+#define __SIGRTMAX 64
#endif /* <signal.h> included. */
diff --git a/sysdeps/unix/sysv/linux/tst-signal-numbers.sh b/sysdeps/unix/sysv/linux/tst-signal-numbers.sh
new file mode 100644
index 0000000000..4f02406164
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tst-signal-numbers.sh
@@ -0,0 +1,69 @@
+#! /bin/sh
+
+set -e
+if [ -n "$BASH_VERSION" ]; then set -o pipefail; fi
+LC_ALL=C; export LC_ALL
+
+# We cannot use Linux's asm/signal.h to define signal numbers, because
+# it isn't sufficiently namespace-clean. Instead, this test checks
+# that our signal numbers match the kernel's. This script expects
+# "$@" to be $(CC) $(CPPFLAGS) as set by glibc's Makefiles, and $AWK
+# to be set in the environment.
+
+# Before doing anything else, fail if the compiler doesn't work.
+"$@" -E -xc -dM - < /dev/null > /dev/null
+
+tmpG=`mktemp -t signums_glibc.XXXXXXXXX`
+tmpK=`mktemp -t signums_kernel.XXXXXXXXX`
+trap "rm -f '$tmpG' '$tmpK'" 0
+
+# Filter out constants that aren't signal numbers.
+# If SIGPOLL is defined as SIGIO, swap it around so SIGIO is defined as
+# SIGPOLL. Similarly for SIGABRT and SIGIOT.
+# Discard obsolete signal numbers and unrelated constants:
+# SIGCLD, SIGIOT, SIGSWI, SIGUNUSED.
+# SIGSTKSZ, SIGRTMIN, SIGRTMAX.
+# Then sort the list.
+filter_defines ()
+{
+ $AWK '
+/^#define SIG[A-Z]+ ([0-9]+|SIG[A-Z0-9]+)$/ { signals[$2] = $3 }
+END {
+ if ("SIGPOLL" in signals && "SIGIO" in signals &&
+ signals["SIGPOLL"] == "SIGIO") {
+ signals["SIGPOLL"] = signals["SIGIO"]
+ signals["SIGIO"] = "SIGPOLL"
+ }
+ if ("SIGABRT" in signals && "SIGIOT" in signals &&
+ signals["SIGABRT"] == "SIGIOT") {
+ signals["SIGABRT"] = signals["SIGIOT"]
+ signals["SIGIOT"] = "SIGABRT"
+ }
+ for (sig in signals) {
+ if (sig !~ /^SIG(CLD|IOT|RT(MIN|MAX)|STKSZ|SWI|UNUSED)$/) {
+ printf("#define %s %s\n", sig, signals[sig])
+ }
+ }
+}' | sort
+}
+
+# $CC may contain command-line switches, so it should be word-split.
+printf '%s' '#define _GNU_SOURCE 1
+#include <signal.h>
+' |
+ "$@" -E -xc -dM - |
+ filter_defines > "$tmpG"
+
+printf '%s' '#define _GNU_SOURCE 1
+#define __ASSEMBLER__ 1
+#include <asm/signal.h>
+' |
+ "$@" -E -xc -dM - |
+ filter_defines > "$tmpK"
+
+if cmp -s "$tmpG" "$tmpK"; then
+ exit 0
+else
+ diff -u "$tmpG" "$tmpK"
+ exit 1
+fi
--
2.11.0
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 2/6] Remove __need_schedparam and __cpu_set_t_defined.
2017-06-10 17:17 [PATCH 0/6] Header file cleanups revised again Zack Weinberg
` (4 preceding siblings ...)
2017-06-10 17:17 ` [PATCH 3/6] Remove __need_IOV_MAX and __need_FOPEN_MAX Zack Weinberg
@ 2017-06-10 17:17 ` Zack Weinberg
2017-06-12 20:22 ` Joseph Myers
2017-06-13 8:14 ` Andreas Schwab
5 siblings, 2 replies; 30+ messages in thread
From: Zack Weinberg @ 2017-06-10 17:17 UTC (permalink / raw)
To: libc-alpha; +Cc: joseph
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.
---
bits/sched.h | 121 ++------------------------------
include/bits/cpu-set.h | 1 +
posix/Makefile | 4 +-
posix/bits/cpu-set.h | 124 +++++++++++++++++++++++++++++++++
posix/sched.h | 8 ++-
sysdeps/unix/sysv/linux/bits/sched.h | 130 +++--------------------------------
6 files changed, 145 insertions(+), 243 deletions(-)
create mode 100644 include/bits/cpu-set.h
create mode 100644 posix/bits/cpu-set.h
diff --git a/bits/sched.h b/bits/sched.h
index c36c569db3..0588f3142e 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 0000000000..388f03cfbd
--- /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 52b022cf66..1c328b81af 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/posix/bits/cpu-set.h b/posix/bits/cpu-set.h
new file mode 100644
index 0000000000..f9b11b9714
--- /dev/null
+++ b/posix/bits/cpu-set.h
@@ -0,0 +1,124 @@
+/* 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.
+
+ 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 _BITS_CPU_SET_H
+#define _BITS_CPU_SET_H 1
+
+#ifndef _SCHED_H
+# error "Never include <bits/cpu-set.h> directly; use <sched.h> instead."
+#endif
+
+/* 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 /* bits/cpu-set.h */
diff --git a/posix/sched.h b/posix/sched.h
index 7037ab398d..d5cdac37b0 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 cc0d698f34..6d23e94ae6 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 */
--
2.11.0
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 2/6] Remove __need_schedparam and __cpu_set_t_defined.
2017-06-10 17:17 ` [PATCH 2/6] Remove __need_schedparam and __cpu_set_t_defined Zack Weinberg
@ 2017-06-12 20:22 ` Joseph Myers
2017-06-13 8:14 ` Andreas Schwab
1 sibling, 0 replies; 30+ messages in thread
From: Joseph Myers @ 2017-06-12 20:22 UTC (permalink / raw)
To: Zack Weinberg; +Cc: libc-alpha
This patch is OK.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 2/6] Remove __need_schedparam and __cpu_set_t_defined.
2017-06-10 17:17 ` [PATCH 2/6] Remove __need_schedparam and __cpu_set_t_defined Zack Weinberg
2017-06-12 20:22 ` Joseph Myers
@ 2017-06-13 8:14 ` Andreas Schwab
2017-06-13 11:28 ` Zack Weinberg
1 sibling, 1 reply; 30+ messages in thread
From: Andreas Schwab @ 2017-06-13 8:14 UTC (permalink / raw)
To: Zack Weinberg; +Cc: libc-alpha, joseph
On Jun 10 2017, Zack Weinberg <zackw@panix.com> wrote:
> diff --git a/posix/bits/cpu-set.h b/posix/bits/cpu-set.h
> new file mode 100644
> index 0000000000..f9b11b9714
> --- /dev/null
> +++ b/posix/bits/cpu-set.h
> @@ -0,0 +1,124 @@
> +/* 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.
> +
> + 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 _BITS_CPU_SET_H
> +#define _BITS_CPU_SET_H 1
> +
> +#ifndef _SCHED_H
> +# error "Never include <bits/cpu-set.h> directly; use <sched.h> instead."
> +#endif
> +
> +/* Size definition for CPU sets. */
> +# define __CPU_SETSIZE 1024
> +# define __NCPUBITS (8 * sizeof (__cpu_mask))
The directives should not be indented. The MI guard doesn't count for
nesting.
Andreas.
--
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 2/6] Remove __need_schedparam and __cpu_set_t_defined.
2017-06-13 8:14 ` Andreas Schwab
@ 2017-06-13 11:28 ` Zack Weinberg
0 siblings, 0 replies; 30+ messages in thread
From: Zack Weinberg @ 2017-06-13 11:28 UTC (permalink / raw)
To: Andreas Schwab; +Cc: GNU C Library, Joseph Myers
On Tue, Jun 13, 2017 at 4:14 AM, Andreas Schwab <schwab@suse.de> wrote:
> On Jun 10 2017, Zack Weinberg <zackw@panix.com> wrote:
>> +/* Size definition for CPU sets. */
>> +# define __CPU_SETSIZE 1024
>> +# define __NCPUBITS (8 * sizeof (__cpu_mask))
>
> The directives should not be indented. The MI guard doesn't count for
> nesting.
Fixed now. This is because I copied the text verbatim from the old
bits/sched.h.
zw
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 3/6] Remove __need_IOV_MAX and __need_FOPEN_MAX.
2017-06-10 17:17 ` [PATCH 3/6] Remove __need_IOV_MAX and __need_FOPEN_MAX Zack Weinberg
@ 2017-06-13 16:48 ` Joseph Myers
0 siblings, 0 replies; 30+ messages in thread
From: Joseph Myers @ 2017-06-13 16:48 UTC (permalink / raw)
To: Zack Weinberg; +Cc: libc-alpha
On Sat, 10 Jun 2017, Zack Weinberg wrote:
> diff --git a/bits/uio-ext.h b/bits/uio-ext.h
> new file mode 100644
> index 0000000000..8f36e960bf
> --- /dev/null
> +++ b/bits/uio-ext.h
> @@ -0,0 +1,27 @@
> +/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
Should have a descriptive comment before the copyright notice.
> diff --git a/sysdeps/unix/sysv/linux/bits/uio_lim.h b/sysdeps/unix/sysv/linux/bits/uio_lim.h
> new file mode 100644
> index 0000000000..7c69b93d31
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/bits/uio_lim.h
> @@ -0,0 +1,31 @@
> +/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
Likewise.
OK with that fixed and with the ChangeLog entry updated so it only
mentions those struct_iovec.h-related changes that are actually new, not
things such as adding that header in the first place that are already in
the tree.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 4/6] Remove __need macros from errno.h (__need_Emath, __need_error_t).
2017-06-10 17:17 ` [PATCH 4/6] Remove __need macros from errno.h (__need_Emath, __need_error_t) Zack Weinberg
@ 2017-06-13 22:21 ` Joseph Myers
0 siblings, 0 replies; 30+ messages in thread
From: Joseph Myers @ 2017-06-13 22:21 UTC (permalink / raw)
To: Zack Weinberg; +Cc: libc-alpha
This patch is OK.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 5/6] Make error_t an enumeration on all supported OSes.
2017-06-10 17:17 ` [PATCH 5/6] Make error_t an enumeration on all supported OSes Zack Weinberg
@ 2017-06-14 11:08 ` Florian Weimer
2017-06-14 11:23 ` Zack Weinberg
2017-06-14 13:10 ` Florian Weimer
1 sibling, 1 reply; 30+ messages in thread
From: Florian Weimer @ 2017-06-14 11:08 UTC (permalink / raw)
To: Zack Weinberg, libc-alpha; +Cc: joseph
On 06/10/2017 07:17 PM, Zack Weinberg wrote:
> +printf '#include <features.h>\n#include <bits/errno.h>\n' |
> + $CC -E -dM -xc -D_GNU_SOURCE -D_ERRNO_H "$@" - > "$tmp1"
I'm worried this fails to produce a header which is multi-arch-clean
(i.e., on x86-64, produce something which is compatible with x86-64,
i386, and x32). Maybe the situation is better than with the system call
list; at least a cursory glimpse at the kernel sources suggests that
these headers don't have multi-arch preprocessor conditionals there.
It would be safer to have a built-in list of possible errno constant
names and generate a header from that, similar to what I did for the
system call names (but for which we failed to reach consensus).
Thanks,
Florian
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 6/6] Deprecate xlocale.h and add bits/types/locale_t.h.
2017-06-10 17:17 ` [PATCH 6/6] Deprecate xlocale.h and add bits/types/locale_t.h Zack Weinberg
@ 2017-06-14 11:11 ` Florian Weimer
2017-06-14 11:25 ` Zack Weinberg
0 siblings, 1 reply; 30+ messages in thread
From: Florian Weimer @ 2017-06-14 11:11 UTC (permalink / raw)
To: Zack Weinberg, libc-alpha; +Cc: joseph
On 06/10/2017 07:17 PM, Zack Weinberg wrote:
> xlocale.h is already a single-type micro-header, defining locale_t, so
> it would be nice to bring it into the overall bits/types/ scheme.
> Unfortunately, it's in the top level of the system-header namespace
> and, despite the comment saying "This file is not standardized, don't
> rely on it, it can go away without warning", there are a lot of
> external uses, so we need to deprecate it first, which is what this
> patch does.
I would suggest to remove it outright. I saw quite a few references to
<xlocale.h> covered under autoconf tests. Removal means that the tests
fail, and the #include <xlocale.h> is #ifdef'ed out in the actual
sources. A deprecation warning will cause the autoconf test to fail,
but then the #include may still fail due to the deprecation warning and
-Werror.
Thanks,
Florian
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 5/6] Make error_t an enumeration on all supported OSes.
2017-06-14 11:08 ` Florian Weimer
@ 2017-06-14 11:23 ` Zack Weinberg
2017-06-14 12:24 ` Zack Weinberg
0 siblings, 1 reply; 30+ messages in thread
From: Zack Weinberg @ 2017-06-14 11:23 UTC (permalink / raw)
To: Florian Weimer; +Cc: GNU C Library, Joseph Myers
On Wed, Jun 14, 2017 at 7:08 AM, Florian Weimer <fweimer@redhat.com> wrote:
> On 06/10/2017 07:17 PM, Zack Weinberg wrote:
>> +printf '#include <features.h>\n#include <bits/errno.h>\n' |
>> + $CC -E -dM -xc -D_GNU_SOURCE -D_ERRNO_H "$@" - > "$tmp1"
>
> I'm worried this fails to produce a header which is multi-arch-clean
> (i.e., on x86-64, produce something which is compatible with x86-64,
> i386, and x32). Maybe the situation is better than with the system call
> list; at least a cursory glimpse at the kernel sources suggests that
> these headers don't have multi-arch preprocessor conditionals there.
Hmm, yes. Right now, at least on x86-64, the set of errno constant
*names* is consistent across all three subarchitectures, but there's
no guarantee of that.
> It would be safer to have a built-in list of possible errno constant
> names and generate a header from that, similar to what I did for the
> system call names (but for which we failed to reach consensus).
Come to think of it, we already have such a list - errnos.texi - and
it already has to be exhaustive, otherwise strerror() won't work for
all error numbers. OK, I'll make that change.
zw
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 6/6] Deprecate xlocale.h and add bits/types/locale_t.h.
2017-06-14 11:11 ` Florian Weimer
@ 2017-06-14 11:25 ` Zack Weinberg
2017-06-14 11:27 ` Florian Weimer
2017-06-14 15:20 ` Joseph Myers
0 siblings, 2 replies; 30+ messages in thread
From: Zack Weinberg @ 2017-06-14 11:25 UTC (permalink / raw)
To: Florian Weimer; +Cc: GNU C Library, Joseph Myers
On Wed, Jun 14, 2017 at 7:11 AM, Florian Weimer <fweimer@redhat.com> wrote:
> On 06/10/2017 07:17 PM, Zack Weinberg wrote:
>> xlocale.h is already a single-type micro-header, defining locale_t, so
>> it would be nice to bring it into the overall bits/types/ scheme.
>> Unfortunately, it's in the top level of the system-header namespace
>> and, despite the comment saying "This file is not standardized, don't
>> rely on it, it can go away without warning", there are a lot of
>> external uses, so we need to deprecate it first, which is what this
>> patch does.
>
> I would suggest to remove it outright. I saw quite a few references to
> <xlocale.h> covered under autoconf tests. Removal means that the tests
> fail, and the #include <xlocale.h> is #ifdef'ed out in the actual
> sources. A deprecation warning will cause the autoconf test to fail,
> but then the #include may still fail due to the deprecation warning and
> -Werror.
(I assume you meant "the autoconf test will succeed".)
I'm willing to do that if there is general agreement but I'd like to
hear from some more people first.
zw
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 6/6] Deprecate xlocale.h and add bits/types/locale_t.h.
2017-06-14 11:25 ` Zack Weinberg
@ 2017-06-14 11:27 ` Florian Weimer
2017-06-14 15:20 ` Joseph Myers
1 sibling, 0 replies; 30+ messages in thread
From: Florian Weimer @ 2017-06-14 11:27 UTC (permalink / raw)
To: Zack Weinberg; +Cc: GNU C Library, Joseph Myers
On 06/14/2017 01:25 PM, Zack Weinberg wrote:
> On Wed, Jun 14, 2017 at 7:11 AM, Florian Weimer <fweimer@redhat.com> wrote:
>> On 06/10/2017 07:17 PM, Zack Weinberg wrote:
>>> xlocale.h is already a single-type micro-header, defining locale_t, so
>>> it would be nice to bring it into the overall bits/types/ scheme.
>>> Unfortunately, it's in the top level of the system-header namespace
>>> and, despite the comment saying "This file is not standardized, don't
>>> rely on it, it can go away without warning", there are a lot of
>>> external uses, so we need to deprecate it first, which is what this
>>> patch does.
>>
>> I would suggest to remove it outright. I saw quite a few references to
>> <xlocale.h> covered under autoconf tests. Removal means that the tests
>> fail, and the #include <xlocale.h> is #ifdef'ed out in the actual
>> sources. A deprecation warning will cause the autoconf test to fail,
>> but then the #include may still fail due to the deprecation warning and
>> -Werror.
>
> (I assume you meant "the autoconf test will succeed".)
Right.
> I'm willing to do that if there is general agreement but I'd like to
> hear from some more people first.
Good idea, let's wait and see what others have to say.
Thanks,
Florian
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 5/6] Make error_t an enumeration on all supported OSes.
2017-06-14 11:23 ` Zack Weinberg
@ 2017-06-14 12:24 ` Zack Weinberg
2017-06-14 13:04 ` Florian Weimer
0 siblings, 1 reply; 30+ messages in thread
From: Zack Weinberg @ 2017-06-14 12:24 UTC (permalink / raw)
To: Florian Weimer; +Cc: GNU C Library, Joseph Myers
On Wed, Jun 14, 2017 at 7:23 AM, Zack Weinberg <zackw@panix.com> wrote:
> On Wed, Jun 14, 2017 at 7:08 AM, Florian Weimer <fweimer@redhat.com> wrote:
>> It would be safer to have a built-in list of possible errno constant
>> names and generate a header from that, similar to what I did for the
>> system call names (but for which we failed to reach consensus).
>
> Come to think of it, we already have such a list - errnos.texi - and
> it already has to be exhaustive, otherwise strerror() won't work for
> all error numbers. OK, I'll make that change.
This turns out not to work for the Hurd, which has a number of errors
that are copied from Mach kernel headers and not defined in
errnos.texi (see sysdeps/mach/hurd/bits/errno.h - the constants
beginning with EMACH_, EKERN_, EMIG_, and ED_). These are already
problematic, strerror() doesn't work for them and some of them violate
the ISO C requirement for all error constants to be positive numbers,
but since error_t was invented for the Hurd in the first place, I'm
reluctant to drop their error codes out of their enum... I suppose I
could invent some sort of hook for extending the list of errno
constant names in sysdeps, but does anyone have a better idea?
zw
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 5/6] Make error_t an enumeration on all supported OSes.
2017-06-14 12:24 ` Zack Weinberg
@ 2017-06-14 13:04 ` Florian Weimer
0 siblings, 0 replies; 30+ messages in thread
From: Florian Weimer @ 2017-06-14 13:04 UTC (permalink / raw)
To: Zack Weinberg; +Cc: GNU C Library, Joseph Myers
Zack Weinberg <zackw@panix.com> writes:
> On Wed, Jun 14, 2017 at 7:23 AM, Zack Weinberg <zackw@panix.com> wrote:
>> On Wed, Jun 14, 2017 at 7:08 AM, Florian Weimer <fweimer@redhat.com> wrote:
>>> It would be safer to have a built-in list of possible errno constant
>>> names and generate a header from that, similar to what I did for the
>>> system call names (but for which we failed to reach consensus).
>>
>> Come to think of it, we already have such a list - errnos.texi - and
>> it already has to be exhaustive, otherwise strerror() won't work for
>> all error numbers. OK, I'll make that change.
>
> This turns out not to work for the Hurd, which has a number of errors
> that are copied from Mach kernel headers and not defined in
> errnos.texi (see sysdeps/mach/hurd/bits/errno.h - the constants
> beginning with EMACH_, EKERN_, EMIG_, and ED_). These are already
> problematic, strerror() doesn't work for them and some of them violate
> the ISO C requirement for all error constants to be positive numbers,
> but since error_t was invented for the Hurd in the first place, I'm
> reluctant to drop their error codes out of their enum... I suppose I
> could invent some sort of hook for extending the list of errno
> constant names in sysdeps, but does anyone have a better idea?
Realistically, your only chance is not to change the Hurd code at all
because we currently do not have a way to test it, do we?
So for Linux, you could come up with a separate mechanism and generate
error_t there. But I have no concrete advice in that direction, sorry.
Thanks,
Florian
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 5/6] Make error_t an enumeration on all supported OSes.
2017-06-10 17:17 ` [PATCH 5/6] Make error_t an enumeration on all supported OSes Zack Weinberg
2017-06-14 11:08 ` Florian Weimer
@ 2017-06-14 13:10 ` Florian Weimer
2017-06-14 13:44 ` Joseph Myers
1 sibling, 1 reply; 30+ messages in thread
From: Florian Weimer @ 2017-06-14 13:10 UTC (permalink / raw)
To: Zack Weinberg; +Cc: libc-alpha, joseph
Zack Weinberg <zackw@panix.com> writes:
> We could conceivably change __errno_location to return an error_t,
> which would mean 'p errno' in GDB would print symbolic values without
> needing to cast it, but I hesitate to make the apparent type of errno
> not be 'int'.
That sounds a bit hackish because I'm not sure int * and error_t * are
types with that level of compatibility.
You would get a long list of warnings from code like this:
switch (errno)
{
case ENOSYS:
...
break;
case EINVAL:
...
break;
}
We might also run into problems if the kernel ever adds error constants
with values which change the representation of error_t.
Florian
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 5/6] Make error_t an enumeration on all supported OSes.
2017-06-14 13:10 ` Florian Weimer
@ 2017-06-14 13:44 ` Joseph Myers
2017-06-14 13:57 ` Florian Weimer
0 siblings, 1 reply; 30+ messages in thread
From: Joseph Myers @ 2017-06-14 13:44 UTC (permalink / raw)
To: Florian Weimer; +Cc: Zack Weinberg, libc-alpha
On Wed, 14 Jun 2017, Florian Weimer wrote:
> Zack Weinberg <zackw@panix.com> writes:
>
> > We could conceivably change __errno_location to return an error_t,
> > which would mean 'p errno' in GDB would print symbolic values without
> > needing to cast it, but I hesitate to make the apparent type of errno
> > not be 'int'.
>
> That sounds a bit hackish because I'm not sure int * and error_t * are
> types with that level of compatibility.
Type compatibility is not transitive, and errno is required to have type
int. Thus, if enum foo is an enum whose type is compatible with int
(following the implementation-defined rules for what integer type an enum
is compatible with), then _Generic (errno, enum foo: 0) is a valid C11
expression, which would not be valid if errno had an enum type other than
enum foo (two enum types compatible with the same integer type are not
compatible with each other).
> We might also run into problems if the kernel ever adds error constants
> with values which change the representation of error_t.
If error_t is defined as an enum, I'd expect it to include INT_MIN and
INT_MAX explicitly to ensure (in practice) that the underlying type is
int.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 5/6] Make error_t an enumeration on all supported OSes.
2017-06-14 13:44 ` Joseph Myers
@ 2017-06-14 13:57 ` Florian Weimer
0 siblings, 0 replies; 30+ messages in thread
From: Florian Weimer @ 2017-06-14 13:57 UTC (permalink / raw)
To: Joseph Myers; +Cc: Zack Weinberg, libc-alpha
Joseph Myers <joseph@codesourcery.com> writes:
> On Wed, 14 Jun 2017, Florian Weimer wrote:
>
>> Zack Weinberg <zackw@panix.com> writes:
>>
>> > We could conceivably change __errno_location to return an error_t,
>> > which would mean 'p errno' in GDB would print symbolic values without
>> > needing to cast it, but I hesitate to make the apparent type of errno
>> > not be 'int'.
>>
>> That sounds a bit hackish because I'm not sure int * and error_t * are
>> types with that level of compatibility.
>
> Type compatibility is not transitive, and errno is required to have type
> int. Thus, if enum foo is an enum whose type is compatible with int
> (following the implementation-defined rules for what integer type an enum
> is compatible with), then _Generic (errno, enum foo: 0) is a valid C11
> expression, which would not be valid if errno had an enum type other than
> enum foo (two enum types compatible with the same integer type are not
> compatible with each other).
Wow, interesting.
Perhaps a GDB plugin would be a better way to add this functionality?
Thanks,
Florian
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 6/6] Deprecate xlocale.h and add bits/types/locale_t.h.
2017-06-14 11:25 ` Zack Weinberg
2017-06-14 11:27 ` Florian Weimer
@ 2017-06-14 15:20 ` Joseph Myers
2017-06-14 15:51 ` Zack Weinberg
1 sibling, 1 reply; 30+ messages in thread
From: Joseph Myers @ 2017-06-14 15:20 UTC (permalink / raw)
To: Zack Weinberg; +Cc: Florian Weimer, GNU C Library
On Wed, 14 Jun 2017, Zack Weinberg wrote:
> On Wed, Jun 14, 2017 at 7:11 AM, Florian Weimer <fweimer@redhat.com> wrote:
> > On 06/10/2017 07:17 PM, Zack Weinberg wrote:
> >> xlocale.h is already a single-type micro-header, defining locale_t, so
> >> it would be nice to bring it into the overall bits/types/ scheme.
> >> Unfortunately, it's in the top level of the system-header namespace
> >> and, despite the comment saying "This file is not standardized, don't
> >> rely on it, it can go away without warning", there are a lot of
> >> external uses, so we need to deprecate it first, which is what this
> >> patch does.
> >
> > I would suggest to remove it outright. I saw quite a few references to
> > <xlocale.h> covered under autoconf tests. Removal means that the tests
> > fail, and the #include <xlocale.h> is #ifdef'ed out in the actual
> > sources. A deprecation warning will cause the autoconf test to fail,
> > but then the #include may still fail due to the deprecation warning and
> > -Werror.
>
> (I assume you meant "the autoconf test will succeed".)
>
> I'm willing to do that if there is general agreement but I'd like to
> hear from some more people first.
I'd be fine with getting rid of xlocale.h.
I think __locale_t may well be one of the many interfaces that need
providing under implementation-namespace names for libstdc++ headers to be
namespace-clean and not require _GNU_SOURCE to implement standard C++
functionality (but I haven't checked exactly how it's used in libstdc++).
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 6/6] Deprecate xlocale.h and add bits/types/locale_t.h.
2017-06-14 15:20 ` Joseph Myers
@ 2017-06-14 15:51 ` Zack Weinberg
2017-06-14 15:54 ` Joseph Myers
0 siblings, 1 reply; 30+ messages in thread
From: Zack Weinberg @ 2017-06-14 15:51 UTC (permalink / raw)
To: Joseph Myers; +Cc: Florian Weimer, GNU C Library
On Wed, Jun 14, 2017 at 11:20 AM, Joseph Myers <joseph@codesourcery.com> wrote:
>
> I think __locale_t may well be one of the many interfaces that need
> providing under implementation-namespace names for libstdc++ headers to be
> namespace-clean and not require _GNU_SOURCE to implement standard C++
> functionality (but I haven't checked exactly how it's used in libstdc++).
I don't see any existing uses of locale_t or __locale_t under
/usr/include/c++ but I would have no objection to adding a
bits/types/__locale_t.h that provided *only* the impl-namespace name,
even though nothing needs it right now.
It's just that right now xlocale.h insists on exposing both __locale_t
and locale_t, and I think all of the uses of __locale_t in our own
headers could be locale_t.
zw
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 6/6] Deprecate xlocale.h and add bits/types/locale_t.h.
2017-06-14 15:51 ` Zack Weinberg
@ 2017-06-14 15:54 ` Joseph Myers
2017-06-14 15:58 ` Zack Weinberg
0 siblings, 1 reply; 30+ messages in thread
From: Joseph Myers @ 2017-06-14 15:54 UTC (permalink / raw)
To: Zack Weinberg; +Cc: Florian Weimer, GNU C Library
On Wed, 14 Jun 2017, Zack Weinberg wrote:
> On Wed, Jun 14, 2017 at 11:20 AM, Joseph Myers <joseph@codesourcery.com> wrote:
> >
> > I think __locale_t may well be one of the many interfaces that need
> > providing under implementation-namespace names for libstdc++ headers to be
> > namespace-clean and not require _GNU_SOURCE to implement standard C++
> > functionality (but I haven't checked exactly how it's used in libstdc++).
>
> I don't see any existing uses of locale_t or __locale_t under
> /usr/include/c++ but I would have no objection to adding a
> bits/types/__locale_t.h that provided *only* the impl-namespace name,
> even though nothing needs it right now.
In the GCC 6 compiler I use for building glibc, I see "typedef __locale_t
__c_locale;" in the multilib-specific bits/c++locale.h files.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 6/6] Deprecate xlocale.h and add bits/types/locale_t.h.
2017-06-14 15:54 ` Joseph Myers
@ 2017-06-14 15:58 ` Zack Weinberg
0 siblings, 0 replies; 30+ messages in thread
From: Zack Weinberg @ 2017-06-14 15:58 UTC (permalink / raw)
To: Joseph Myers; +Cc: Florian Weimer, GNU C Library
On Wed, Jun 14, 2017 at 11:54 AM, Joseph Myers <joseph@codesourcery.com> wrote:
> On Wed, 14 Jun 2017, Zack Weinberg wrote:
>> On Wed, Jun 14, 2017 at 11:20 AM, Joseph Myers <joseph@codesourcery.com> wrote:
>> > I think __locale_t may well be one of the many interfaces that need
>> > providing under implementation-namespace names for libstdc++ headers to be
>> > namespace-clean and not require _GNU_SOURCE to implement standard C++
>> > functionality (but I haven't checked exactly how it's used in libstdc++).
>>
>> I don't see any existing uses of locale_t or __locale_t under
>> /usr/include/c++ but I would have no objection to adding a
>> bits/types/__locale_t.h that provided *only* the impl-namespace name,
>> even though nothing needs it right now.
>
> In the GCC 6 compiler I use for building glibc, I see "typedef __locale_t
> __c_locale;" in the multilib-specific bits/c++locale.h files.
Doh, I forgot to check /usr/include/x86_64-linux-gnu/c++. Yes, I see
that now as well.
zw
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 1/6] Factor out shared definitions from bits/signum.h.
2017-06-10 17:17 ` [PATCH 1/6] Factor out shared definitions from bits/signum.h Zack Weinberg
@ 2017-06-20 12:18 ` Zack Weinberg
2017-06-20 21:19 ` Joseph Myers
2017-06-20 21:20 ` Joseph Myers
2 siblings, 0 replies; 30+ messages in thread
From: Zack Weinberg @ 2017-06-20 12:18 UTC (permalink / raw)
To: libc-alpha
On 06/10/2017 01:17 PM, Zack Weinberg wrote:
> Many of the things defined by bits/signum.h are invariant across all
> supported operating systems. This patch factors out all of them to a
> new header bits/signum-generic.h, which each bits/signum.h will include
> and then override whichever things need adjustment. Normally that will
> mean, at most, adding or changing a few signal numbers.
Ping.
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 1/6] Factor out shared definitions from bits/signum.h.
2017-06-10 17:17 ` [PATCH 1/6] Factor out shared definitions from bits/signum.h Zack Weinberg
2017-06-20 12:18 ` Zack Weinberg
@ 2017-06-20 21:19 ` Joseph Myers
2017-06-20 21:20 ` Joseph Myers
2 siblings, 0 replies; 30+ messages in thread
From: Joseph Myers @ 2017-06-20 21:19 UTC (permalink / raw)
To: Zack Weinberg; +Cc: libc-alpha
OK.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 1/6] Factor out shared definitions from bits/signum.h.
2017-06-10 17:17 ` [PATCH 1/6] Factor out shared definitions from bits/signum.h Zack Weinberg
2017-06-20 12:18 ` Zack Weinberg
2017-06-20 21:19 ` Joseph Myers
@ 2017-06-20 21:20 ` Joseph Myers
2017-06-21 0:34 ` Zack Weinberg
2 siblings, 1 reply; 30+ messages in thread
From: Joseph Myers @ 2017-06-20 21:20 UTC (permalink / raw)
To: Zack Weinberg; +Cc: libc-alpha
On Sat, 10 Jun 2017, Zack Weinberg wrote:
> diff --git a/sysdeps/unix/sysv/linux/tst-signal-numbers.sh b/sysdeps/unix/sysv/linux/tst-signal-numbers.sh
> new file mode 100644
> index 0000000000..4f02406164
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/tst-signal-numbers.sh
> @@ -0,0 +1,69 @@
> +#! /bin/sh
This test should have a copyright / license notice.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 1/6] Factor out shared definitions from bits/signum.h.
2017-06-20 21:20 ` Joseph Myers
@ 2017-06-21 0:34 ` Zack Weinberg
0 siblings, 0 replies; 30+ messages in thread
From: Zack Weinberg @ 2017-06-21 0:34 UTC (permalink / raw)
To: Joseph Myers; +Cc: GNU C Library
On Tue, Jun 20, 2017 at 5:19 PM, Joseph Myers <joseph@codesourcery.com> wrote:
> On Sat, 10 Jun 2017, Zack Weinberg wrote:
>> diff --git a/sysdeps/unix/sysv/linux/tst-signal-numbers.sh b/sysdeps/unix/sysv/linux/tst-signal-numbers.sh
>> new file mode 100644
>> index 0000000000..4f02406164
>> --- /dev/null
>> +++ b/sysdeps/unix/sysv/linux/tst-signal-numbers.sh
>> @@ -0,0 +1,69 @@
>> +#! /bin/sh
>
> This test should have a copyright / license notice.
Fixed and committed. Thanks.
zw
^ permalink raw reply [flat|nested] 30+ messages in thread
end of thread, other threads:[~2017-06-21 0:34 UTC | newest]
Thread overview: 30+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-10 17:17 [PATCH 0/6] Header file cleanups revised again Zack Weinberg
2017-06-10 17:17 ` [PATCH 6/6] Deprecate xlocale.h and add bits/types/locale_t.h Zack Weinberg
2017-06-14 11:11 ` Florian Weimer
2017-06-14 11:25 ` Zack Weinberg
2017-06-14 11:27 ` Florian Weimer
2017-06-14 15:20 ` Joseph Myers
2017-06-14 15:51 ` Zack Weinberg
2017-06-14 15:54 ` Joseph Myers
2017-06-14 15:58 ` Zack Weinberg
2017-06-10 17:17 ` [PATCH 5/6] Make error_t an enumeration on all supported OSes Zack Weinberg
2017-06-14 11:08 ` Florian Weimer
2017-06-14 11:23 ` Zack Weinberg
2017-06-14 12:24 ` Zack Weinberg
2017-06-14 13:04 ` Florian Weimer
2017-06-14 13:10 ` Florian Weimer
2017-06-14 13:44 ` Joseph Myers
2017-06-14 13:57 ` Florian Weimer
2017-06-10 17:17 ` [PATCH 1/6] Factor out shared definitions from bits/signum.h Zack Weinberg
2017-06-20 12:18 ` Zack Weinberg
2017-06-20 21:19 ` Joseph Myers
2017-06-20 21:20 ` Joseph Myers
2017-06-21 0:34 ` Zack Weinberg
2017-06-10 17:17 ` [PATCH 4/6] Remove __need macros from errno.h (__need_Emath, __need_error_t) Zack Weinberg
2017-06-13 22:21 ` Joseph Myers
2017-06-10 17:17 ` [PATCH 3/6] Remove __need_IOV_MAX and __need_FOPEN_MAX Zack Weinberg
2017-06-13 16:48 ` Joseph Myers
2017-06-10 17:17 ` [PATCH 2/6] Remove __need_schedparam and __cpu_set_t_defined Zack Weinberg
2017-06-12 20:22 ` Joseph Myers
2017-06-13 8:14 ` Andreas Schwab
2017-06-13 11:28 ` Zack Weinberg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).