This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
ECANCELED, errlist.c (was Re: FreeBSD port (11): a new errno)
- From: Roland McGrath <roland at frob dot com>
- To: Bruno Haible <bruno at clisp dot org>
- Cc: libc-alpha at sources dot redhat dot com
- Date: Mon, 26 Aug 2002 23:00:09 -0700
- Subject: ECANCELED, errlist.c (was Re: FreeBSD port (11): a new errno)
> The FreeBSD kernel knows about one more errno value: ECANCELED.
In fact glibc defines ECANCELED on Linux too. It is a POSIX.1-1996 errno code.
However, it has been missing from the manual and from the sys_errlist list
(i.e. strerror doesn't know about it). It is not a trivial issue to put
it in because this creates a new incompatible sys_errlist symbol in the ABI,
and appropriate versioning magic has to be done to make this safe.
Many moons ago I whipped up some hackery to mostly automate this,
and you have spurred me to dust off that code and make it work.
The following patches add ECANCELED to the manual (text I wrote months
ago), and implement a new automated scheme for the sys_errlist definition.
In short, it mostly takes care of all the details when you change
errno.texi but demands that you explicitly ask for the new symbol version
to be made. This is not fully automated because manual intervention should
be required to introduce new versioned symbols to the ABI; it is not
something you would want done without your noticing it.
How it works is that it figures out the total size of sys_errlist when it
regenerates sysdeps/gnu/errlist.c and barfs on you if sysdeps/gnu/Versions
does not contain a versioned entry that matches the new size. It examines
sysdeps/gnu/Versions for magic comments marking the number of elements in
sys_errlist for each symbol version. For each one found, it generates
compatibility symbols in sysdeps/gnu/errlist-compat.c that have the same
effect as the old hand-written sysdeps/unix/sysv/linux/errlist.c file did.
If it does not find a magic comment matching the current discerned size of
sys_errlist from the newly-generated errlist.c, it refuses to continue
(insert manual intervention here). Note that this always fails in a build
for a configuration that does not define all the macros produced in
errlist.c (i.e. Hurd), but that serves as notice that you need to go do a
GNU/Linux build to update the compatibility symbols and make sure it works.
I have included patches for the generated files so you can see what the
new scripts produce.
Uli, what do you think about putting this in?
It also occurs to me that perhaps we should use link_warning and/or
__attribute__((deprecated)) for sys_errlist and sys_nerr.
Enjoy,
Roland
2002-08-26 Roland McGrath <roland@redhat.com>
* manual/errno.texi (Error Codes): Added ECANCELED (118 for Hurd).
* sysdeps/gnu/Versions: New file.
* sysdeps/unix/sysv/linux/Versions (libc: GLIBC_2.1): Remove
_sys_errlist; sys_errlist; _sys_nerr; sys_nerr; from here.
* sysdeps/gnu/Makefile ($(..)sysdeps/gnu/errlist-compat.c): New target.
($(objpfx)errlist.d): Depend on $(..)sysdeps/gnu/errlist-compat.c.
* sysdeps/gnu/errlist.awk: Make output define _sys_errlist_internal
and _sys_nerr_internal instead of anything else. Make it include
"errlist-compat.c" if [!NOT_IN_libc && !ERRLIST_NO_COMPAT].
Make it emit some asm magic if [EMIT_ERR_MAX].
* sysdeps/gnu/errlist.c: Regenerated.
* sysdeps/gnu/errlist-compat.awk: New file.
* sysdeps/gnu/errlist-compat.c: New file (generated).
* sysdeps/mach/hurd/errlist.c (ERRLIST_NO_COMPAT): New macro.
(_sys_errlist_internal): Define this as a macro for _hurd_errlist.
(_sys_nerr_internal): Define this is a macro for _hurd_nerr.
(SYS_ERRLIST, SYS_NERR): Macros removed.
(sys_nerr, _sys_nerr): Remove these weak aliases.
* sysdeps/unix/sysv/linux/errlist.c: File removed.
* sysdeps/unix/sysv/linux/errlist.h: File removed.
* sysdeps/unix/sysv/linux/arm/errlist.c: File removed.
* include/libc-symbols.h (declare_symbol): New macro.
* config.h.in (ASM_TYPE_DIRECTIVE_PREFIX): New #undef.
* configure.in: New check to define it.
* configure: Regenerated.
Index: manual/errno.texi
===================================================================
RCS file: /cvs/glibc/libc/manual/errno.texi,v
retrieving revision 1.67
diff -p -u -r1.67 errno.texi
--- manual/errno.texi 16 Aug 2001 07:42:04 -0000 1.67
+++ manual/errno.texi 27 Aug 2002 05:57:13 -0000
@@ -981,6 +981,16 @@ This error code has no purpose.
@comment errno 117
@end deftypevr
+@comment errno.h
+@comment POSIX.1: Operation canceled
+@deftypevr Macro int ECANCELED
+@comment errno 118
+Operation canceled; an asynchronous operation was canceled before it
+completed. @xref{Asynchronous I/O}. When you call @code{aio_cancel},
+the normal result is for the operations affected to complete with this
+error; @pxref{Cancel AIO Operations}.
+@end deftypevr
+
@emph{The following error codes are defined by the Linux/i386 kernel.
They are not yet documented.}
Index: configure.in
===================================================================
RCS file: /cvs/glibc/libc/configure.in,v
retrieving revision 1.351
diff -p -u -r1.351 configure.in
--- configure.in 26 Aug 2002 11:36:48 -0000 1.351
+++ configure.in 27 Aug 2002 05:57:14 -0000
@@ -871,6 +871,28 @@ if test $libc_cv_asm_set_directive = yes
AC_DEFINE(HAVE_ASM_SET_DIRECTIVE)
fi
+AC_CACHE_CHECK(for assembler .type directive prefix,
+ libc_cv_asm_type_prefix, [dnl
+libc_cv_asm_type_prefix=no
+for ac_try_prefix in '@' '%' '#'; do
+ cat > conftest.s <<EOF
+ ${libc_cv_dot_text}
+ ${libc_cv_asm_global_directive} foo
+ .type foo, ${ac_try_prefix}object
+ .size foo, 1
+foo:
+ .byte 1
+EOF
+ if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then
+ libc_cv_asm_type_prefix=${ac_try_prefix}
+ fi
+ rm -f conftest*
+ test "x$libc_cv_asm_type_prefix" != xno && break
+done])
+if test "x$libc_cv_asm_type_prefix" != xno; then
+ AC_DEFINE_UNQUOTED(ASM_TYPE_DIRECTIVE_PREFIX, ${libc_cv_asm_type_prefix})
+fi
+
# The Aix ld uses global .symbol_names instead of symbol_names.
case "$os" in
aix4.3*)
Index: config.h.in
===================================================================
RCS file: /cvs/glibc/libc/config.h.in,v
retrieving revision 1.53
diff -p -u -r1.53 config.h.in
--- config.h.in 25 Aug 2002 07:20:43 -0000 1.53
+++ config.h.in 27 Aug 2002 05:57:15 -0000
@@ -51,6 +51,10 @@
declaring a symbol global (default `.globl'). */
#undef ASM_GLOBAL_DIRECTIVE
+/* Define to the prefix before `object' or `function' in the
+ assembler's `.type' directive, if it has one. */
+#undef ASM_TYPE_DIRECTIVE_PREFIX
+
/* Define a symbol_name as a global .symbol_name for ld. */
#undef HAVE_ASM_GLOBAL_DOT_NAME
Index: include/libc-symbols.h
===================================================================
RCS file: /cvs/glibc/libc/include/libc-symbols.h,v
retrieving revision 1.39
diff -p -u -r1.39 libc-symbols.h
--- include/libc-symbols.h 6 Aug 2002 04:29:40 -0000 1.39
+++ include/libc-symbols.h 27 Aug 2002 05:57:15 -0000
@@ -29,6 +29,8 @@
* HAVE_ASM_SET_DIRECTIVE if we have `.set B, A' instead of `A = B'.
* ASM_GLOBAL_DIRECTIVE with `.globl' or `.global'.
+ * ASM_TYPE_DIRECTIVE_PREFIX with `@' or `#' or whatever for .type,
+ or leave it undefined if there is no .type directive.
* HAVE_GNU_LD if using GNU ld, with support for weak symbols in a.out,
and for symbol set and warning messages extensions in a.out and ELF.
* HAVE_ELF if using ELF, which supports weak symbols using `.weak'.
@@ -243,6 +245,34 @@
#define stub_warning(name) \
link_warning (name, \
"warning: " #name " is not implemented and will always fail")
+
+
+/* Declare SYMBOL to be TYPE (`function' or `object') and of SIZE bytes,
+ when the assembler supports such declarations (such as in ELF).
+ This is only necessary when defining something in assembly, or playing
+ funny alias games where the size should be other than what the compiler
+ thinks it is. */
+#define declare_symbol(symbol, type, size) \
+ declare_symbol_1 (symbol, type, size)
+#ifdef ASM_TYPE_DIRECTIVE_PREFIX
+# ifdef __ASSEMBLER__
+# define declare_symbol_1(symbol, type, size) \
+ .type C_SYMBOL_NAME (symbol), \
+ declare_symbol_1_paste (ASM_TYPE_DIRECTIVE_PREFIX, type), size
+# define declare_symbol_1_paste(a, b) declare_symbol_1_paste_1 (a,b)
+# define declare_symbol_1_paste_1(a,b) a##b
+# else /* Not __ASSEMBLER__. */
+# define declare_symbol_1(symbol, type, size) \
+ asm (".type " __SYMBOL_PREFIX #symbol \
+ declare_symbol_1_stringify (ASM_TYPE_DIRECTIVE_PREFIX) #type \
+ "\n\t.size " __SYMBOL_PREFIX #symbol ", " #size);
+# define declare_symbol_1_stringify(x) declare_symbol_1_stringify_1 (x)
+# define declare_symbol_1_stringify_1(x) #x
+# endif /* __ASSEMBLER__ */
+#else
+# define declare_symbol_1(symbol, type, size) /* Nothing. */
+#endif
+
/*
Index: sysdeps/gnu/Makefile
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/gnu/Makefile,v
retrieving revision 1.11
diff -p -u -r1.11 Makefile
--- sysdeps/gnu/Makefile 6 Jul 2001 04:55:51 -0000 1.11
+++ sysdeps/gnu/Makefile 27 Aug 2002 05:57:15 -0000
@@ -1,4 +1,4 @@
-# Copyright (C) 1996, 97, 98, 99 Free Software Foundation, Inc.
+# Copyright (C) 1996,97,98,99,2001,02 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
@@ -27,6 +27,26 @@ $(..)sysdeps/gnu/errlist.c: $(..)sysdeps
mv -f $@-tmp $@
ifeq ($(with-cvs),yes)
test ! -d CVS || cvs commit -m'Regenerated from $^' $@
+endif
+
+vpath errlist.c $(full_config_sysdirs)
+$(..)sysdeps/gnu/errlist-compat.c: errlist.c \
+ $(..)sysdeps/gnu/errlist-compat.awk \
+ $(..)sysdeps/gnu/Versions
+ $(AWK) -v maxerr=`\
+ $(CC) -S $(CPPFLAGS) $(CFLAGS) -DNOT_IN_libc -DEMIT_ERR_MAX $< -o - \
+ | sed -n 's/^.*@@@[^0-9]*\([0-9]*\)[^0-9]*@@@.*$$/\1/p'` \
+ -f $(filter-out $<,$^) > $@T
+# Make it unwritable so noone will edit it by mistake.
+ -chmod a-w $@T
+ mv -f $@T $@
+ifeq ($(with-cvs),yes)
+ test ! -d CVS || cvs commit -m'Regenerated from $^' $@
+endif
+
+ifeq ($(subdir),stdio-common)
+# This will force the generation above to happy if need be.
+$(objpfx)errlist.d: $(..)sysdeps/gnu/errlist-compat.c
endif
ifeq ($(subdir),login)
Index: sysdeps/gnu/Versions
===================================================================
RCS file: sysdeps/gnu/Versions
diff -N sysdeps/gnu/Versions
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ sysdeps/gnu/Versions 27 Aug 2002 05:57:15 -0000
@@ -0,0 +1,19 @@
+libc {
+ # The comment lines with "#errlist-compat" are magic; see errlist-compat.awk.
+ # When you get an error from errlist-compat.awk, you need to add a new
+ # version here. Don't do this blindly, since this means changing the ABI
+ # for all GNU/Linux configurations.
+
+ GLIBC_2.0 {
+ #errlist-compat 123
+ _sys_errlist; sys_errlist; _sys_nerr; sys_nerr;
+ }
+ GLIBC_2.1 {
+ #errlist-compat 125
+ _sys_errlist; sys_errlist; _sys_nerr; sys_nerr;
+ }
+ GLIBC_2.3 {
+ #errlist-compat 126
+ _sys_errlist; sys_errlist; _sys_nerr; sys_nerr;
+ }
+}
Index: sysdeps/gnu/errlist-compat.awk
===================================================================
RCS file: sysdeps/gnu/errlist-compat.awk
diff -N sysdeps/gnu/errlist-compat.awk
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ sysdeps/gnu/errlist-compat.awk 27 Aug 2002 05:57:15 -0000
@@ -0,0 +1,104 @@
+# awk script to generate errlist-compat.c
+# Copyright (C) 2002 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, write to the Free
+# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+# 02111-1307 USA.
+
+#
+# This script takes the Versions file as input and looks for #errlist-compat
+# magic comments, which have the form:
+# #errlist-compat NNN
+# where NNN is the number of elements in the sys_errlist for that version set.
+# We need the awk variable `maxerr' defined to the current size of sys_errlist.
+#
+# If there is no magic comment matching the current size, we barf.
+# Otherwise we generate code (errlist-compat.c) to define all the
+# necessary compatibility symbols for older, smaller versions of sys_errlist.
+#
+
+BEGIN { highest = 0 }
+
+# These two rules catch the Versions file contents.
+NF == 2 && $2 == "{" { last_version = $1; next }
+$1 == "#errlist-compat" {
+ n = $2 + 0;
+ if (n < 100) {
+ print "*** this line seems bogus:", $0 > "/dev/stderr";
+ exit 1;
+ }
+ version[n] = last_version;
+ if (n > highest)
+ highest = n;
+ next;
+}
+
+END {
+ count = maxerr + 1;
+
+ if (highest != count) {
+ printf "*** errlist.c count %d vs Versions sys_errlist@%s count %d\n", \
+ count, version[highest], highest > "/dev/stderr";
+ exit 1;
+ }
+
+ lastv = "";
+ for (n = 0; n <= count; ++n)
+ if (n in version) {
+ v = version[n];
+ gsub(/[^A-Z0-9_]/, "_", v);
+ if (lastv != "")
+ compat[lastv] = v;
+ lastv = v;
+ vcount[v] = n;
+ }
+
+ print "/* This file was generated by errlist-compat.awk; DO NOT EDIT! */\n";
+ print "#include <shlib-compat.h>\n";
+
+ for (old in compat) {
+ new = compat[old];
+ n = vcount[old];
+ printf "#if SHLIB_COMPAT (libc, %s, %s)\n", old, new;
+ printf "extern const char *const __sys_errlist_%s[];\n", old;
+ printf "const int __sys_nerr_%s = %d;\n", old, n;
+ printf "strong_alias (_sys_errlist_internal, __sys_errlist_%s)\n", old;
+ printf "declare_symbol (__sys_errlist_%s, object, __WORDSIZE/8*%d)\n", \
+ old, n;
+ printf "compat_symbol (libc, __sys_errlist_%s, sys_errlist, %s);\n", \
+ old, old;
+ printf "compat_symbol (libc, __sys_nerr_%s, sys_nerr, %s);\n", old, old;
+
+ printf "extern const char *const ___sys_errlist_%s[];\n", old;
+ printf "extern const int __sys_nerr_%s;\n", old;
+ printf "strong_alias (__sys_errlist_%s, ___sys_errlist_%s)\n", old, old;
+ printf "strong_alias (__sys_nerr_%s, ___sys_nerr_%s)\n", old, old;
+ printf "compat_symbol (libc, ___sys_errlist_%s, _sys_errlist, %s);\n", \
+ old, old;
+ printf "compat_symbol (libc, ___sys_nerr_%s, _sys_nerr, %s);\n", old, old;
+ printf "#endif\n\n";
+ }
+
+ printf "\
+extern const char *const __sys_errlist_internal[];\n\
+extern const int __sys_nerr_internal;\n\
+strong_alias (_sys_errlist_internal, __sys_errlist_internal)\n\
+strong_alias (_sys_nerr_internal, __sys_nerr_internal)\n\
+versioned_symbol (libc, _sys_errlist_internal, sys_errlist, %s);\n\
+versioned_symbol (libc, __sys_errlist_internal, _sys_errlist, %s);\n\
+versioned_symbol (libc, _sys_nerr_internal, sys_nerr, %s);\n\
+versioned_symbol (libc, __sys_nerr_internal, _sys_nerr, %s);\n", \
+ lastv, lastv, lastv, lastv;
+}
Index: sysdeps/gnu/errlist.awk
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/gnu/errlist.awk,v
retrieving revision 1.19
diff -p -u -r1.19 errlist.awk
--- sysdeps/gnu/errlist.awk 14 Mar 2002 00:47:00 -0000 1.19
+++ sysdeps/gnu/errlist.awk 27 Aug 2002 05:57:15 -0000
@@ -42,22 +42,16 @@ BEGIN {
print "#include <errno.h>";
print "#include <libintl.h>";
print "";
- print "#ifndef SYS_ERRLIST";
- print "# define SYS_ERRLIST _sys_errlist";
- print "# define SYS_ERRLIST_ALIAS sys_errlist";
- print "#endif";
- print "#ifndef SYS_NERR";
- print "# define SYS_NERR _sys_nerr";
- print "# define SYS_NERR_ALIAS sys_nerr";
- print "#endif";
print "#ifndef ERR_REMAP";
print "# define ERR_REMAP(n) n";
print "#endif";
print "";
- print "const char *const SYS_ERRLIST[] =";
+
+ print "const char *const _sys_errlist_internal[] =";
print " {";
print " [0] = N_(\"Success\"),"
}
+
$1 == "@comment" && $2 == "errno.h" { errnoh=1; next }
errnoh == 1 && $1 == "@comment" \
{
@@ -86,6 +80,10 @@ errnoh == 4 && $1 == "@end" && $2 == "de
{
printf "/*%s */\n", desc;
printf " [ERR_REMAP (%s)] = N_(\"%s\"),\n", e, etext;
+ printf "# if %s > ERR_MAX\n", e;
+ print "# undef ERR_MAX";
+ printf "# define ERR_MAX %s\n", e;
+ print "# endif";
print "#endif";
errnoh = 0;
next;
@@ -99,13 +97,15 @@ errnoh == 4 \
END {
print " };";
print "";
- print "const int SYS_NERR = sizeof SYS_ERRLIST / sizeof SYS_ERRLIST [0];";
- print "#ifdef SYS_ERRLIST_ALIAS";
- print "weak_alias (_sys_errlist, SYS_ERRLIST_ALIAS)";
+ print "const int _sys_nerr_internal";
+ print " = sizeof _sys_errlist_internal / sizeof _sys_errlist_internal [0];";
+ print "";
+ print "#if !defined NOT_IN_libc && !ERRLIST_NO_COMPAT";
+ print "# include \"errlist-compat.c\"";
print "#endif";
- print "#ifdef SYS_NERR_ALIAS";
- print "weak_alias (_sys_nerr, SYS_NERR_ALIAS)";
+ print "";
+ print "#ifdef EMIT_ERR_MAX";
+ print "void dummy (void)"
+ print "{ asm volatile (\" @@@ %0 @@@ \" : : \"i\" (ERR_REMAP (ERR_MAX))); }"
print "#endif";
- print "INTVARDEF2(SYS_ERRLIST, _sys_errlist)";
- print "INTVARDEF2(SYS_NERR, _sys_nerr)";
- }
+}
Index: sysdeps/gnu/errlist.c
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/gnu/errlist.c,v
retrieving revision 1.25
diff -p -u -r1.25 errlist.c
--- sysdeps/gnu/errlist.c 14 Mar 2002 00:43:59 -0000 1.25
+++ sysdeps/gnu/errlist.c 27 Aug 2002 05:57:16 -0000
@@ -3,19 +3,11 @@
#include <errno.h>
#include <libintl.h>
-#ifndef SYS_ERRLIST
-# define SYS_ERRLIST _sys_errlist
-# define SYS_ERRLIST_ALIAS sys_errlist
-#endif
-#ifndef SYS_NERR
-# define SYS_NERR _sys_nerr
-# define SYS_NERR_ALIAS sys_nerr
-#endif
#ifndef ERR_REMAP
# define ERR_REMAP(n) n
#endif
-const char *const SYS_ERRLIST[] =
+const char *const _sys_errlist_internal[] =
{
[0] = N_("Success"),
#ifdef EPERM
@@ -23,6 +15,10 @@ const char *const SYS_ERRLIST[] =
TRANS Operation not permitted; only the owner of the file (or other resource)
TRANS or processes with special privileges can perform the operation. */
[ERR_REMAP (EPERM)] = N_("Operation not permitted"),
+# if EPERM > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EPERM
+# endif
#endif
#ifdef ENOENT
/*
@@ -30,11 +26,19 @@ TRANS No such file or directory. This i
TRANS for ordinary files that are referenced in contexts where they are
TRANS expected to already exist. */
[ERR_REMAP (ENOENT)] = N_("No such file or directory"),
+# if ENOENT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOENT
+# endif
#endif
#ifdef ESRCH
/*
TRANS No process matches the specified process ID. */
[ERR_REMAP (ESRCH)] = N_("No such process"),
+# if ESRCH > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ESRCH
+# endif
#endif
#ifdef EINTR
/*
@@ -46,11 +50,19 @@ TRANS You can choose to have functions r
TRANS rather than failing with @code{EINTR}; see @ref{Interrupted
TRANS Primitives}. */
[ERR_REMAP (EINTR)] = N_("Interrupted system call"),
+# if EINTR > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EINTR
+# endif
#endif
#ifdef EIO
/*
TRANS Input/output error; usually used for physical read or write errors. */
[ERR_REMAP (EIO)] = N_("Input/output error"),
+# if EIO > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EIO
+# endif
#endif
#ifdef ENXIO
/*
@@ -60,6 +72,10 @@ TRANS This can mean that the device file
TRANS the physical device is missing or not correctly attached to the
TRANS computer. */
[ERR_REMAP (ENXIO)] = N_("No such device or address"),
+# if ENXIO > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENXIO
+# endif
#endif
#ifdef E2BIG
/*
@@ -68,12 +84,20 @@ TRANS being executed with one of the @co
TRANS File}) occupy too much memory space. This condition never arises in the
TRANS GNU system. */
[ERR_REMAP (E2BIG)] = N_("Argument list too long"),
+# if E2BIG > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX E2BIG
+# endif
#endif
#ifdef ENOEXEC
/*
TRANS Invalid executable file format. This condition is detected by the
TRANS @code{exec} functions; see @ref{Executing a File}. */
[ERR_REMAP (ENOEXEC)] = N_("Exec format error"),
+# if ENOEXEC > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOEXEC
+# endif
#endif
#ifdef EBADF
/*
@@ -81,6 +105,10 @@ TRANS Bad file descriptor; for example,
TRANS closed or reading from a descriptor open only for writing (or vice
TRANS versa). */
[ERR_REMAP (EBADF)] = N_("Bad file descriptor"),
+# if EBADF > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EBADF
+# endif
#endif
#ifdef ECHILD
/*
@@ -88,6 +116,10 @@ TRANS There are no child processes. Thi
TRANS supposed to manipulate child processes, when there aren't any processes
TRANS to manipulate. */
[ERR_REMAP (ECHILD)] = N_("No child processes"),
+# if ECHILD > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ECHILD
+# endif
#endif
#ifdef EDEADLK
/*
@@ -96,23 +128,39 @@ TRANS deadlock situation. The system do
TRANS all such situations. This error means you got lucky and the system
TRANS noticed; it might just hang. @xref{File Locks}, for an example. */
[ERR_REMAP (EDEADLK)] = N_("Resource deadlock avoided"),
+# if EDEADLK > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EDEADLK
+# endif
#endif
#ifdef ENOMEM
/*
TRANS No memory available. The system cannot allocate more virtual memory
TRANS because its capacity is full. */
[ERR_REMAP (ENOMEM)] = N_("Cannot allocate memory"),
+# if ENOMEM > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOMEM
+# endif
#endif
#ifdef EACCES
/*
TRANS Permission denied; the file permissions do not allow the attempted operation. */
[ERR_REMAP (EACCES)] = N_("Permission denied"),
+# if EACCES > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EACCES
+# endif
#endif
#ifdef EFAULT
/*
TRANS Bad address; an invalid pointer was detected.
TRANS In the GNU system, this error never happens; you get a signal instead. */
[ERR_REMAP (EFAULT)] = N_("Bad address"),
+# if EFAULT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EFAULT
+# endif
#endif
#ifdef ENOTBLK
/*
@@ -120,6 +168,10 @@ TRANS A file that isn't a block special
TRANS requires one. For example, trying to mount an ordinary file as a file
TRANS system in Unix gives this error. */
[ERR_REMAP (ENOTBLK)] = N_("Block device required"),
+# if ENOTBLK > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOTBLK
+# endif
#endif
#ifdef EBUSY
/*
@@ -127,12 +179,20 @@ TRANS Resource busy; a system resource t
TRANS For example, if you try to delete a file that is the root of a currently
TRANS mounted filesystem, you get this error. */
[ERR_REMAP (EBUSY)] = N_("Device or resource busy"),
+# if EBUSY > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EBUSY
+# endif
#endif
#ifdef EEXIST
/*
TRANS File exists; an existing file was specified in a context where it only
TRANS makes sense to specify a new file. */
[ERR_REMAP (EEXIST)] = N_("File exists"),
+# if EEXIST > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EEXIST
+# endif
#endif
#ifdef EXDEV
/*
@@ -140,29 +200,49 @@ TRANS An attempt to make an improper lin
TRANS This happens not only when you use @code{link} (@pxref{Hard Links}) but
TRANS also when you rename a file with @code{rename} (@pxref{Renaming Files}). */
[ERR_REMAP (EXDEV)] = N_("Invalid cross-device link"),
+# if EXDEV > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EXDEV
+# endif
#endif
#ifdef ENODEV
/*
TRANS The wrong type of device was given to a function that expects a
TRANS particular sort of device. */
[ERR_REMAP (ENODEV)] = N_("No such device"),
+# if ENODEV > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENODEV
+# endif
#endif
#ifdef ENOTDIR
/*
TRANS A file that isn't a directory was specified when a directory is required. */
[ERR_REMAP (ENOTDIR)] = N_("Not a directory"),
+# if ENOTDIR > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOTDIR
+# endif
#endif
#ifdef EISDIR
/*
TRANS File is a directory; you cannot open a directory for writing,
TRANS or create or remove hard links to it. */
[ERR_REMAP (EISDIR)] = N_("Is a directory"),
+# if EISDIR > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EISDIR
+# endif
#endif
#ifdef EINVAL
/*
TRANS Invalid argument. This is used to indicate various kinds of problems
TRANS with passing the wrong argument to a library function. */
[ERR_REMAP (EINVAL)] = N_("Invalid argument"),
+# if EINVAL > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EINVAL
+# endif
#endif
#ifdef EMFILE
/*
@@ -174,6 +254,10 @@ TRANS limit that can usually be increase
TRANS want to increase the @code{RLIMIT_NOFILE} limit or make it unlimited;
TRANS @pxref{Limits on Resources}. */
[ERR_REMAP (EMFILE)] = N_("Too many open files"),
+# if EMFILE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EMFILE
+# endif
#endif
#ifdef ENFILE
/*
@@ -181,12 +265,20 @@ TRANS There are too many distinct file o
TRANS that any number of linked channels count as just one file opening; see
TRANS @ref{Linked Channels}. This error never occurs in the GNU system. */
[ERR_REMAP (ENFILE)] = N_("Too many open files in system"),
+# if ENFILE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENFILE
+# endif
#endif
#ifdef ENOTTY
/*
TRANS Inappropriate I/O control operation, such as trying to set terminal
TRANS modes on an ordinary file. */
[ERR_REMAP (ENOTTY)] = N_("Inappropriate ioctl for device"),
+# if ENOTTY > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOTTY
+# endif
#endif
#ifdef ETXTBSY
/*
@@ -196,27 +288,47 @@ TRANS debugger to run a program is consi
TRANS will cause this error. (The name stands for ``text file busy''.) This
TRANS is not an error in the GNU system; the text is copied as necessary. */
[ERR_REMAP (ETXTBSY)] = N_("Text file busy"),
+# if ETXTBSY > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ETXTBSY
+# endif
#endif
#ifdef EFBIG
/*
TRANS File too big; the size of a file would be larger than allowed by the system. */
[ERR_REMAP (EFBIG)] = N_("File too large"),
+# if EFBIG > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EFBIG
+# endif
#endif
#ifdef ENOSPC
/*
TRANS No space left on device; write operation on a file failed because the
TRANS disk is full. */
[ERR_REMAP (ENOSPC)] = N_("No space left on device"),
+# if ENOSPC > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOSPC
+# endif
#endif
#ifdef ESPIPE
/*
TRANS Invalid seek operation (such as on a pipe). */
[ERR_REMAP (ESPIPE)] = N_("Illegal seek"),
+# if ESPIPE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ESPIPE
+# endif
#endif
#ifdef EROFS
/*
TRANS An attempt was made to modify something on a read-only file system. */
[ERR_REMAP (EROFS)] = N_("Read-only file system"),
+# if EROFS > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EROFS
+# endif
#endif
#ifdef EMLINK
/*
@@ -224,6 +336,10 @@ TRANS Too many links; the link count of
TRANS @code{rename} can cause this error if the file being renamed already has
TRANS as many links as it can take (@pxref{Renaming Files}). */
[ERR_REMAP (EMLINK)] = N_("Too many links"),
+# if EMLINK > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EMLINK
+# endif
#endif
#ifdef EPIPE
/*
@@ -233,18 +349,30 @@ TRANS @code{SIGPIPE} signal; this signal
TRANS or blocked. Thus, your program will never actually see @code{EPIPE}
TRANS unless it has handled or blocked @code{SIGPIPE}. */
[ERR_REMAP (EPIPE)] = N_("Broken pipe"),
+# if EPIPE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EPIPE
+# endif
#endif
#ifdef EDOM
/*
TRANS Domain error; used by mathematical functions when an argument value does
TRANS not fall into the domain over which the function is defined. */
[ERR_REMAP (EDOM)] = N_("Numerical argument out of domain"),
+# if EDOM > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EDOM
+# endif
#endif
#ifdef ERANGE
/*
TRANS Range error; used by mathematical functions when the result value is
TRANS not representable because of overflow or underflow. */
[ERR_REMAP (ERANGE)] = N_("Numerical result out of range"),
+# if ERANGE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ERANGE
+# endif
#endif
#ifdef EAGAIN
/*
@@ -278,6 +406,10 @@ TRANS so usually an interactive program
TRANS and return to its command loop.
TRANS @end itemize */
[ERR_REMAP (EAGAIN)] = N_("Resource temporarily unavailable"),
+# if EAGAIN > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EAGAIN
+# endif
#endif
#if defined (EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
/*
@@ -287,6 +419,10 @@ TRANS
TRANS C libraries in many older Unix systems have @code{EWOULDBLOCK} as a
TRANS separate error code. */
[ERR_REMAP (EWOULDBLOCK)] = N_("Operation would block"),
+# if EWOULDBLOCK > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EWOULDBLOCK
+# endif
#endif
#ifdef EINPROGRESS
/*
@@ -299,34 +435,58 @@ TRANS the object before the call complet
TRANS use the @code{select} function to find out when the pending operation
TRANS has completed; @pxref{Waiting for I/O}. */
[ERR_REMAP (EINPROGRESS)] = N_("Operation now in progress"),
+# if EINPROGRESS > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EINPROGRESS
+# endif
#endif
#ifdef EALREADY
/*
TRANS An operation is already in progress on an object that has non-blocking
TRANS mode selected. */
[ERR_REMAP (EALREADY)] = N_("Operation already in progress"),
+# if EALREADY > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EALREADY
+# endif
#endif
#ifdef ENOTSOCK
/*
TRANS A file that isn't a socket was specified when a socket is required. */
[ERR_REMAP (ENOTSOCK)] = N_("Socket operation on non-socket"),
+# if ENOTSOCK > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOTSOCK
+# endif
#endif
#ifdef EMSGSIZE
/*
TRANS The size of a message sent on a socket was larger than the supported
TRANS maximum size. */
[ERR_REMAP (EMSGSIZE)] = N_("Message too long"),
+# if EMSGSIZE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EMSGSIZE
+# endif
#endif
#ifdef EPROTOTYPE
/*
TRANS The socket type does not support the requested communications protocol. */
[ERR_REMAP (EPROTOTYPE)] = N_("Protocol wrong type for socket"),
+# if EPROTOTYPE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EPROTOTYPE
+# endif
#endif
#ifdef ENOPROTOOPT
/*
TRANS You specified a socket option that doesn't make sense for the
TRANS particular protocol being used by the socket. @xref{Socket Options}. */
[ERR_REMAP (ENOPROTOOPT)] = N_("Protocol not available"),
+# if ENOPROTOOPT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOPROTOOPT
+# endif
#endif
#ifdef EPROTONOSUPPORT
/*
@@ -334,11 +494,19 @@ TRANS The socket domain does not support
TRANS (perhaps because the requested protocol is completely invalid).
TRANS @xref{Creating a Socket}. */
[ERR_REMAP (EPROTONOSUPPORT)] = N_("Protocol not supported"),
+# if EPROTONOSUPPORT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EPROTONOSUPPORT
+# endif
#endif
#ifdef ESOCKTNOSUPPORT
/*
TRANS The socket type is not supported. */
[ERR_REMAP (ESOCKTNOSUPPORT)] = N_("Socket type not supported"),
+# if ESOCKTNOSUPPORT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ESOCKTNOSUPPORT
+# endif
#endif
#ifdef EOPNOTSUPP
/*
@@ -349,22 +517,38 @@ TRANS error can happen for many calls wh
TRANS particular operation; it is a generic indication that the server knows
TRANS nothing to do for that call. */
[ERR_REMAP (EOPNOTSUPP)] = N_("Operation not supported"),
+# if EOPNOTSUPP > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EOPNOTSUPP
+# endif
#endif
#ifdef EPFNOSUPPORT
/*
TRANS The socket communications protocol family you requested is not supported. */
[ERR_REMAP (EPFNOSUPPORT)] = N_("Protocol family not supported"),
+# if EPFNOSUPPORT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EPFNOSUPPORT
+# endif
#endif
#ifdef EAFNOSUPPORT
/*
TRANS The address family specified for a socket is not supported; it is
TRANS inconsistent with the protocol being used on the socket. @xref{Sockets}. */
[ERR_REMAP (EAFNOSUPPORT)] = N_("Address family not supported by protocol"),
+# if EAFNOSUPPORT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EAFNOSUPPORT
+# endif
#endif
#ifdef EADDRINUSE
/*
TRANS The requested socket address is already in use. @xref{Socket Addresses}. */
[ERR_REMAP (EADDRINUSE)] = N_("Address already in use"),
+# if EADDRINUSE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EADDRINUSE
+# endif
#endif
#ifdef EADDRNOTAVAIL
/*
@@ -372,27 +556,47 @@ TRANS The requested socket address is no
TRANS to give a socket a name that doesn't match the local host name.
TRANS @xref{Socket Addresses}. */
[ERR_REMAP (EADDRNOTAVAIL)] = N_("Cannot assign requested address"),
+# if EADDRNOTAVAIL > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EADDRNOTAVAIL
+# endif
#endif
#ifdef ENETDOWN
/*
TRANS A socket operation failed because the network was down. */
[ERR_REMAP (ENETDOWN)] = N_("Network is down"),
+# if ENETDOWN > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENETDOWN
+# endif
#endif
#ifdef ENETUNREACH
/*
TRANS A socket operation failed because the subnet containing the remote host
TRANS was unreachable. */
[ERR_REMAP (ENETUNREACH)] = N_("Network is unreachable"),
+# if ENETUNREACH > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENETUNREACH
+# endif
#endif
#ifdef ENETRESET
/*
TRANS A network connection was reset because the remote host crashed. */
[ERR_REMAP (ENETRESET)] = N_("Network dropped connection on reset"),
+# if ENETRESET > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENETRESET
+# endif
#endif
#ifdef ECONNABORTED
/*
TRANS A network connection was aborted locally. */
[ERR_REMAP (ECONNABORTED)] = N_("Software caused connection abort"),
+# if ECONNABORTED > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ECONNABORTED
+# endif
#endif
#ifdef ECONNRESET
/*
@@ -400,6 +604,10 @@ TRANS A network connection was closed fo
TRANS local host, such as by the remote machine rebooting or an unrecoverable
TRANS protocol violation. */
[ERR_REMAP (ECONNRESET)] = N_("Connection reset by peer"),
+# if ECONNRESET > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ECONNRESET
+# endif
#endif
#ifdef ENOBUFS
/*
@@ -407,12 +615,20 @@ TRANS The kernel's buffers for I/O opera
TRANS error is always synonymous with @code{ENOMEM}; you may get one or the
TRANS other from network operations. */
[ERR_REMAP (ENOBUFS)] = N_("No buffer space available"),
+# if ENOBUFS > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOBUFS
+# endif
#endif
#ifdef EISCONN
/*
TRANS You tried to connect a socket that is already connected.
TRANS @xref{Connecting}. */
[ERR_REMAP (EISCONN)] = N_("Transport endpoint is already connected"),
+# if EISCONN > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EISCONN
+# endif
#endif
#ifdef ENOTCONN
/*
@@ -421,6 +637,10 @@ TRANS try to transmit data over a socket
TRANS destination for the data. For a connectionless socket (for datagram
TRANS protocols, such as UDP), you get @code{EDESTADDRREQ} instead. */
[ERR_REMAP (ENOTCONN)] = N_("Transport endpoint is not connected"),
+# if ENOTCONN > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOTCONN
+# endif
#endif
#ifdef EDESTADDRREQ
/*
@@ -428,34 +648,58 @@ TRANS No default destination address was
TRANS error when you try to transmit data over a connectionless socket,
TRANS without first specifying a destination for the data with @code{connect}. */
[ERR_REMAP (EDESTADDRREQ)] = N_("Destination address required"),
+# if EDESTADDRREQ > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EDESTADDRREQ
+# endif
#endif
#ifdef ESHUTDOWN
/*
TRANS The socket has already been shut down. */
[ERR_REMAP (ESHUTDOWN)] = N_("Cannot send after transport endpoint shutdown"),
+# if ESHUTDOWN > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ESHUTDOWN
+# endif
#endif
#ifdef ETOOMANYREFS
/*
TRANS ??? */
[ERR_REMAP (ETOOMANYREFS)] = N_("Too many references: cannot splice"),
+# if ETOOMANYREFS > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ETOOMANYREFS
+# endif
#endif
#ifdef ETIMEDOUT
/*
TRANS A socket operation with a specified timeout received no response during
TRANS the timeout period. */
[ERR_REMAP (ETIMEDOUT)] = N_("Connection timed out"),
+# if ETIMEDOUT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ETIMEDOUT
+# endif
#endif
#ifdef ECONNREFUSED
/*
TRANS A remote host refused to allow the network connection (typically because
TRANS it is not running the requested service). */
[ERR_REMAP (ECONNREFUSED)] = N_("Connection refused"),
+# if ECONNREFUSED > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ECONNREFUSED
+# endif
#endif
#ifdef ELOOP
/*
TRANS Too many levels of symbolic links were encountered in looking up a file name.
TRANS This often indicates a cycle of symbolic links. */
[ERR_REMAP (ELOOP)] = N_("Too many levels of symbolic links"),
+# if ELOOP > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ELOOP
+# endif
#endif
#ifdef ENAMETOOLONG
/*
@@ -463,22 +707,38 @@ TRANS Filename too long (longer than @co
TRANS Files}) or host name too long (in @code{gethostname} or
TRANS @code{sethostname}; @pxref{Host Identification}). */
[ERR_REMAP (ENAMETOOLONG)] = N_("File name too long"),
+# if ENAMETOOLONG > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENAMETOOLONG
+# endif
#endif
#ifdef EHOSTDOWN
/*
TRANS The remote host for a requested network connection is down. */
[ERR_REMAP (EHOSTDOWN)] = N_("Host is down"),
+# if EHOSTDOWN > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EHOSTDOWN
+# endif
#endif
#ifdef EHOSTUNREACH
/*
TRANS The remote host for a requested network connection is not reachable. */
[ERR_REMAP (EHOSTUNREACH)] = N_("No route to host"),
+# if EHOSTUNREACH > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EHOSTUNREACH
+# endif
#endif
#ifdef ENOTEMPTY
/*
TRANS Directory not empty, where an empty directory was expected. Typically,
TRANS this error occurs when you are trying to delete a directory. */
[ERR_REMAP (ENOTEMPTY)] = N_("Directory not empty"),
+# if ENOTEMPTY > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOTEMPTY
+# endif
#endif
#ifdef EPROCLIM
/*
@@ -486,17 +746,29 @@ TRANS This means that the per-user limit
TRANS an attempted @code{fork}. @xref{Limits on Resources}, for details on
TRANS the @code{RLIMIT_NPROC} limit. */
[ERR_REMAP (EPROCLIM)] = N_("Too many processes"),
+# if EPROCLIM > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EPROCLIM
+# endif
#endif
#ifdef EUSERS
/*
TRANS The file quota system is confused because there are too many users.
TRANS @c This can probably happen in a GNU system when using NFS. */
[ERR_REMAP (EUSERS)] = N_("Too many users"),
+# if EUSERS > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EUSERS
+# endif
#endif
#ifdef EDQUOT
/*
TRANS The user's disk quota was exceeded. */
[ERR_REMAP (EDQUOT)] = N_("Disk quota exceeded"),
+# if EDQUOT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EDQUOT
+# endif
#endif
#ifdef ESTALE
/*
@@ -505,6 +777,10 @@ TRANS system which is due to file system
TRANS Repairing this condition usually requires unmounting and remounting
TRANS the NFS file system on the local host. */
[ERR_REMAP (ESTALE)] = N_("Stale NFS file handle"),
+# if ESTALE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ESTALE
+# endif
#endif
#ifdef EREMOTE
/*
@@ -513,31 +789,55 @@ TRANS already specifies an NFS-mounted f
TRANS (This is an error on some operating systems, but we expect it to work
TRANS properly on the GNU system, making this error code impossible.) */
[ERR_REMAP (EREMOTE)] = N_("Object is remote"),
+# if EREMOTE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EREMOTE
+# endif
#endif
#ifdef EBADRPC
/*
TRANS ??? */
[ERR_REMAP (EBADRPC)] = N_("RPC struct is bad"),
+# if EBADRPC > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EBADRPC
+# endif
#endif
#ifdef ERPCMISMATCH
/*
TRANS ??? */
[ERR_REMAP (ERPCMISMATCH)] = N_("RPC version wrong"),
+# if ERPCMISMATCH > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ERPCMISMATCH
+# endif
#endif
#ifdef EPROGUNAVAIL
/*
TRANS ??? */
[ERR_REMAP (EPROGUNAVAIL)] = N_("RPC program not available"),
+# if EPROGUNAVAIL > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EPROGUNAVAIL
+# endif
#endif
#ifdef EPROGMISMATCH
/*
TRANS ??? */
[ERR_REMAP (EPROGMISMATCH)] = N_("RPC program version wrong"),
+# if EPROGMISMATCH > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EPROGMISMATCH
+# endif
#endif
#ifdef EPROCUNAVAIL
/*
TRANS ??? */
[ERR_REMAP (EPROCUNAVAIL)] = N_("RPC bad procedure for program"),
+# if EPROCUNAVAIL > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EPROCUNAVAIL
+# endif
#endif
#ifdef ENOLCK
/*
@@ -546,6 +846,10 @@ TRANS @ref{File Locks}. This error is n
TRANS it can result from an operation to an NFS server running another
TRANS operating system. */
[ERR_REMAP (ENOLCK)] = N_("No locks available"),
+# if ENOLCK > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOLCK
+# endif
#endif
#ifdef EFTYPE
/*
@@ -555,16 +859,28 @@ TRANS
TRANS On some systems @code{chmod} returns this error if you try to set the
TRANS sticky bit on a non-directory file; @pxref{Setting Permissions}. */
[ERR_REMAP (EFTYPE)] = N_("Inappropriate file type or format"),
+# if EFTYPE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EFTYPE
+# endif
#endif
#ifdef EAUTH
/*
TRANS ??? */
[ERR_REMAP (EAUTH)] = N_("Authentication error"),
+# if EAUTH > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EAUTH
+# endif
#endif
#ifdef ENEEDAUTH
/*
TRANS ??? */
[ERR_REMAP (ENEEDAUTH)] = N_("Need authenticator"),
+# if ENEEDAUTH > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENEEDAUTH
+# endif
#endif
#ifdef ENOSYS
/*
@@ -574,6 +890,10 @@ TRANS operating system. When you get th
TRANS particular function will always fail with @code{ENOSYS} unless you
TRANS install a new version of the C library or the operating system. */
[ERR_REMAP (ENOSYS)] = N_("Function not implemented"),
+# if ENOSYS > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOSYS
+# endif
#endif
#if defined (ENOTSUP) && ENOTSUP != EOPNOTSUPP
/*
@@ -590,12 +910,20 @@ TRANS
TRANS If the entire function is not available at all in the implementation,
TRANS it returns @code{ENOSYS} instead. */
[ERR_REMAP (ENOTSUP)] = N_("Not supported"),
+# if ENOTSUP > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOTSUP
+# endif
#endif
#ifdef EILSEQ
/*
TRANS While decoding a multibyte character the function came along an invalid
TRANS or an incomplete sequence of bytes or the given wide character is invalid. */
[ERR_REMAP (EILSEQ)] = N_("Invalid or incomplete multibyte or wide character"),
+# if EILSEQ > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EILSEQ
+# endif
#endif
#ifdef EBACKGROUND
/*
@@ -606,6 +934,10 @@ TRANS error because functions such as @c
TRANS it into a @code{SIGTTIN} or @code{SIGTTOU} signal. @xref{Job Control},
TRANS for information on process groups and these signals. */
[ERR_REMAP (EBACKGROUND)] = N_("Inappropriate operation for background process"),
+# if EBACKGROUND > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EBACKGROUND
+# endif
#endif
#ifdef EDIED
/*
@@ -613,6 +945,10 @@ TRANS In the GNU system, opening a file
TRANS translated by a program and the translator program dies while starting
TRANS up, before it has connected to the file. */
[ERR_REMAP (EDIED)] = N_("Translator died"),
+# if EDIED > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EDIED
+# endif
#endif
#ifdef ED
/*
@@ -620,230 +956,460 @@ TRANS The experienced user will know wha
TRANS @c This error code is a joke. Its perror text is part of the joke.
TRANS @c Don't change it. */
[ERR_REMAP (ED)] = N_("?"),
+# if ED > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ED
+# endif
#endif
#ifdef EGREGIOUS
/*
TRANS You did @strong{what}? */
[ERR_REMAP (EGREGIOUS)] = N_("You really blew it this time"),
+# if EGREGIOUS > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EGREGIOUS
+# endif
#endif
#ifdef EIEIO
/*
TRANS Go home and have a glass of warm, dairy-fresh milk. */
[ERR_REMAP (EIEIO)] = N_("Computer bought the farm"),
+# if EIEIO > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EIEIO
+# endif
#endif
#ifdef EGRATUITOUS
/*
TRANS This error code has no purpose. */
[ERR_REMAP (EGRATUITOUS)] = N_("Gratuitous error"),
+# if EGRATUITOUS > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EGRATUITOUS
+# endif
#endif
#ifdef EBADMSG
/* */
[ERR_REMAP (EBADMSG)] = N_("Bad message"),
+# if EBADMSG > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EBADMSG
+# endif
#endif
#ifdef EIDRM
/* */
[ERR_REMAP (EIDRM)] = N_("Identifier removed"),
+# if EIDRM > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EIDRM
+# endif
#endif
#ifdef EMULTIHOP
/* */
[ERR_REMAP (EMULTIHOP)] = N_("Multihop attempted"),
+# if EMULTIHOP > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EMULTIHOP
+# endif
#endif
#ifdef ENODATA
/* */
[ERR_REMAP (ENODATA)] = N_("No data available"),
+# if ENODATA > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENODATA
+# endif
#endif
#ifdef ENOLINK
/* */
[ERR_REMAP (ENOLINK)] = N_("Link has been severed"),
+# if ENOLINK > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOLINK
+# endif
#endif
#ifdef ENOMSG
/* */
[ERR_REMAP (ENOMSG)] = N_("No message of desired type"),
+# if ENOMSG > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOMSG
+# endif
#endif
#ifdef ENOSR
/* */
[ERR_REMAP (ENOSR)] = N_("Out of streams resources"),
+# if ENOSR > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOSR
+# endif
#endif
#ifdef ENOSTR
/* */
[ERR_REMAP (ENOSTR)] = N_("Device not a stream"),
+# if ENOSTR > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOSTR
+# endif
#endif
#ifdef EOVERFLOW
/* */
[ERR_REMAP (EOVERFLOW)] = N_("Value too large for defined data type"),
+# if EOVERFLOW > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EOVERFLOW
+# endif
#endif
#ifdef EPROTO
/* */
[ERR_REMAP (EPROTO)] = N_("Protocol error"),
+# if EPROTO > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EPROTO
+# endif
#endif
#ifdef ETIME
/* */
[ERR_REMAP (ETIME)] = N_("Timer expired"),
+# if ETIME > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ETIME
+# endif
+#endif
+#ifdef ECANCELED
+/*
+TRANS Operation canceled; an asynchronous operation was canceled before it
+TRANS completed. @xref{Asynchronous I/O}. When you call @code{aio_cancel},
+TRANS the normal result is for the operations affected to complete with this
+TRANS error; @pxref{Cancel AIO Operations}. */
+ [ERR_REMAP (ECANCELED)] = N_("Operation canceled"),
+# if ECANCELED > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ECANCELED
+# endif
#endif
#ifdef ERESTART
/* */
[ERR_REMAP (ERESTART)] = N_("Interrupted system call should be restarted"),
+# if ERESTART > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ERESTART
+# endif
#endif
#ifdef ECHRNG
/* */
[ERR_REMAP (ECHRNG)] = N_("Channel number out of range"),
+# if ECHRNG > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ECHRNG
+# endif
#endif
#ifdef EL2NSYNC
/* */
[ERR_REMAP (EL2NSYNC)] = N_("Level 2 not synchronized"),
+# if EL2NSYNC > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EL2NSYNC
+# endif
#endif
#ifdef EL3HLT
/* */
[ERR_REMAP (EL3HLT)] = N_("Level 3 halted"),
+# if EL3HLT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EL3HLT
+# endif
#endif
#ifdef EL3RST
/* */
[ERR_REMAP (EL3RST)] = N_("Level 3 reset"),
+# if EL3RST > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EL3RST
+# endif
#endif
#ifdef ELNRNG
/* */
[ERR_REMAP (ELNRNG)] = N_("Link number out of range"),
+# if ELNRNG > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ELNRNG
+# endif
#endif
#ifdef EUNATCH
/* */
[ERR_REMAP (EUNATCH)] = N_("Protocol driver not attached"),
+# if EUNATCH > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EUNATCH
+# endif
#endif
#ifdef ENOCSI
/* */
[ERR_REMAP (ENOCSI)] = N_("No CSI structure available"),
+# if ENOCSI > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOCSI
+# endif
#endif
#ifdef EL2HLT
/* */
[ERR_REMAP (EL2HLT)] = N_("Level 2 halted"),
+# if EL2HLT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EL2HLT
+# endif
#endif
#ifdef EBADE
/* */
[ERR_REMAP (EBADE)] = N_("Invalid exchange"),
+# if EBADE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EBADE
+# endif
#endif
#ifdef EBADR
/* */
[ERR_REMAP (EBADR)] = N_("Invalid request descriptor"),
+# if EBADR > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EBADR
+# endif
#endif
#ifdef EXFULL
/* */
[ERR_REMAP (EXFULL)] = N_("Exchange full"),
+# if EXFULL > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EXFULL
+# endif
#endif
#ifdef ENOANO
/* */
[ERR_REMAP (ENOANO)] = N_("No anode"),
+# if ENOANO > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOANO
+# endif
#endif
#ifdef EBADRQC
/* */
[ERR_REMAP (EBADRQC)] = N_("Invalid request code"),
+# if EBADRQC > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EBADRQC
+# endif
#endif
#ifdef EBADSLT
/* */
[ERR_REMAP (EBADSLT)] = N_("Invalid slot"),
+# if EBADSLT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EBADSLT
+# endif
#endif
#if defined (EDEADLOCK) && EDEADLOCK != EDEADLK
/* */
[ERR_REMAP (EDEADLOCK)] = N_("File locking deadlock error"),
+# if EDEADLOCK > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EDEADLOCK
+# endif
#endif
#ifdef EBFONT
/* */
[ERR_REMAP (EBFONT)] = N_("Bad font file format"),
+# if EBFONT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EBFONT
+# endif
#endif
#ifdef ENONET
/* */
[ERR_REMAP (ENONET)] = N_("Machine is not on the network"),
+# if ENONET > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENONET
+# endif
#endif
#ifdef ENOPKG
/* */
[ERR_REMAP (ENOPKG)] = N_("Package not installed"),
+# if ENOPKG > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOPKG
+# endif
#endif
#ifdef EADV
/* */
[ERR_REMAP (EADV)] = N_("Advertise error"),
+# if EADV > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EADV
+# endif
#endif
#ifdef ESRMNT
/* */
[ERR_REMAP (ESRMNT)] = N_("Srmount error"),
+# if ESRMNT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ESRMNT
+# endif
#endif
#ifdef ECOMM
/* */
[ERR_REMAP (ECOMM)] = N_("Communication error on send"),
+# if ECOMM > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ECOMM
+# endif
#endif
#ifdef EDOTDOT
/* */
[ERR_REMAP (EDOTDOT)] = N_("RFS specific error"),
+# if EDOTDOT > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EDOTDOT
+# endif
#endif
#ifdef ENOTUNIQ
/* */
[ERR_REMAP (ENOTUNIQ)] = N_("Name not unique on network"),
+# if ENOTUNIQ > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOTUNIQ
+# endif
#endif
#ifdef EBADFD
/* */
[ERR_REMAP (EBADFD)] = N_("File descriptor in bad state"),
+# if EBADFD > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EBADFD
+# endif
#endif
#ifdef EREMCHG
/* */
[ERR_REMAP (EREMCHG)] = N_("Remote address changed"),
+# if EREMCHG > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EREMCHG
+# endif
#endif
#ifdef ELIBACC
/* */
[ERR_REMAP (ELIBACC)] = N_("Can not access a needed shared library"),
+# if ELIBACC > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ELIBACC
+# endif
#endif
#ifdef ELIBBAD
/* */
[ERR_REMAP (ELIBBAD)] = N_("Accessing a corrupted shared library"),
+# if ELIBBAD > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ELIBBAD
+# endif
#endif
#ifdef ELIBSCN
/* */
[ERR_REMAP (ELIBSCN)] = N_(".lib section in a.out corrupted"),
+# if ELIBSCN > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ELIBSCN
+# endif
#endif
#ifdef ELIBMAX
/* */
[ERR_REMAP (ELIBMAX)] = N_("Attempting to link in too many shared libraries"),
+# if ELIBMAX > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ELIBMAX
+# endif
#endif
#ifdef ELIBEXEC
/* */
[ERR_REMAP (ELIBEXEC)] = N_("Cannot exec a shared library directly"),
+# if ELIBEXEC > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ELIBEXEC
+# endif
#endif
#ifdef ESTRPIPE
/* */
[ERR_REMAP (ESTRPIPE)] = N_("Streams pipe error"),
+# if ESTRPIPE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ESTRPIPE
+# endif
#endif
#ifdef EUCLEAN
/* */
[ERR_REMAP (EUCLEAN)] = N_("Structure needs cleaning"),
+# if EUCLEAN > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EUCLEAN
+# endif
#endif
#ifdef ENOTNAM
/* */
[ERR_REMAP (ENOTNAM)] = N_("Not a XENIX named type file"),
+# if ENOTNAM > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOTNAM
+# endif
#endif
#ifdef ENAVAIL
/* */
[ERR_REMAP (ENAVAIL)] = N_("No XENIX semaphores available"),
+# if ENAVAIL > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENAVAIL
+# endif
#endif
#ifdef EISNAM
/* */
[ERR_REMAP (EISNAM)] = N_("Is a named type file"),
+# if EISNAM > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EISNAM
+# endif
#endif
#ifdef EREMOTEIO
/* */
[ERR_REMAP (EREMOTEIO)] = N_("Remote I/O error"),
+# if EREMOTEIO > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EREMOTEIO
+# endif
#endif
#ifdef ENOMEDIUM
/* */
[ERR_REMAP (ENOMEDIUM)] = N_("No medium found"),
+# if ENOMEDIUM > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX ENOMEDIUM
+# endif
#endif
#ifdef EMEDIUMTYPE
/* */
[ERR_REMAP (EMEDIUMTYPE)] = N_("Wrong medium type"),
+# if EMEDIUMTYPE > ERR_MAX
+# undef ERR_MAX
+# define ERR_MAX EMEDIUMTYPE
+# endif
#endif
};
-const int SYS_NERR = sizeof SYS_ERRLIST / sizeof SYS_ERRLIST [0];
-#ifdef SYS_ERRLIST_ALIAS
-weak_alias (_sys_errlist, SYS_ERRLIST_ALIAS)
+const int _sys_nerr_internal
+ = sizeof _sys_errlist_internal / sizeof _sys_errlist_internal [0];
+
+#if !defined NOT_IN_libc && !ERRLIST_NO_COMPAT
+# include "errlist-compat.c"
#endif
-#ifdef SYS_NERR_ALIAS
-weak_alias (_sys_nerr, SYS_NERR_ALIAS)
+
+#ifdef EMIT_ERR_MAX
+void dummy (void)
+{ asm volatile (" @@@ %0 @@@ " : : "i" (ERR_REMAP (ERR_MAX))); }
#endif
-INTVARDEF2(SYS_ERRLIST, _sys_errlist)
-INTVARDEF2(SYS_NERR, _sys_nerr)
Index: sysdeps/gnu/errlist-compat.c
===================================================================
RCS file: sysdeps/gnu/errlist-compat.c
diff -N sysdeps/gnu/errlist-compat.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ sysdeps/gnu/errlist-compat.c 27 Aug 2002 05:57:16 -0000
@@ -0,0 +1,42 @@
+/* This file was generated by errlist-compat.awk; DO NOT EDIT! */
+
+#include <shlib-compat.h>
+
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
+extern const char *const __sys_errlist_GLIBC_2_0[];
+const int __sys_nerr_GLIBC_2_0 = 123;
+strong_alias (_sys_errlist_internal, __sys_errlist_GLIBC_2_0)
+declare_symbol (__sys_errlist_GLIBC_2_0, object, __WORDSIZE/8*123)
+compat_symbol (libc, __sys_errlist_GLIBC_2_0, sys_errlist, GLIBC_2_0);
+compat_symbol (libc, __sys_nerr_GLIBC_2_0, sys_nerr, GLIBC_2_0);
+extern const char *const ___sys_errlist_GLIBC_2_0[];
+extern const int __sys_nerr_GLIBC_2_0;
+strong_alias (__sys_errlist_GLIBC_2_0, ___sys_errlist_GLIBC_2_0)
+strong_alias (__sys_nerr_GLIBC_2_0, ___sys_nerr_GLIBC_2_0)
+compat_symbol (libc, ___sys_errlist_GLIBC_2_0, _sys_errlist, GLIBC_2_0);
+compat_symbol (libc, ___sys_nerr_GLIBC_2_0, _sys_nerr, GLIBC_2_0);
+#endif
+
+#if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_3)
+extern const char *const __sys_errlist_GLIBC_2_1[];
+const int __sys_nerr_GLIBC_2_1 = 125;
+strong_alias (_sys_errlist_internal, __sys_errlist_GLIBC_2_1)
+declare_symbol (__sys_errlist_GLIBC_2_1, object, __WORDSIZE/8*125)
+compat_symbol (libc, __sys_errlist_GLIBC_2_1, sys_errlist, GLIBC_2_1);
+compat_symbol (libc, __sys_nerr_GLIBC_2_1, sys_nerr, GLIBC_2_1);
+extern const char *const ___sys_errlist_GLIBC_2_1[];
+extern const int __sys_nerr_GLIBC_2_1;
+strong_alias (__sys_errlist_GLIBC_2_1, ___sys_errlist_GLIBC_2_1)
+strong_alias (__sys_nerr_GLIBC_2_1, ___sys_nerr_GLIBC_2_1)
+compat_symbol (libc, ___sys_errlist_GLIBC_2_1, _sys_errlist, GLIBC_2_1);
+compat_symbol (libc, ___sys_nerr_GLIBC_2_1, _sys_nerr, GLIBC_2_1);
+#endif
+
+extern const char *const __sys_errlist_internal[];
+extern const int __sys_nerr_internal;
+strong_alias (_sys_errlist_internal, __sys_errlist_internal)
+strong_alias (_sys_nerr_internal, __sys_nerr_internal)
+versioned_symbol (libc, _sys_errlist_internal, sys_errlist, GLIBC_2_3);
+versioned_symbol (libc, __sys_errlist_internal, _sys_errlist, GLIBC_2_3);
+versioned_symbol (libc, _sys_nerr_internal, sys_nerr, GLIBC_2_3);
+versioned_symbol (libc, __sys_nerr_internal, _sys_nerr, GLIBC_2_3);