]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Factor out shared definitions from bits/signum.h.
authorZack Weinberg <zackw@panix.com>
Sat, 3 Jun 2017 20:22:24 +0000 (16:22 -0400)
committerZack Weinberg <zackw@panix.com>
Wed, 21 Jun 2017 00:32:50 +0000 (20:32 -0400)
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.

15 files changed:
ChangeLog
NEWS
bits/signum-generic.h [new file with mode: 0644]
bits/signum.h
signal/Makefile
signal/signal.h
sysdeps/generic/siglist.h
sysdeps/unix/bsd/bits/signum.h
sysdeps/unix/sysv/linux/Makefile
sysdeps/unix/sysv/linux/alpha/bits/signum.h
sysdeps/unix/sysv/linux/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
sysdeps/unix/sysv/linux/tst-signal-numbers.sh [new file with mode: 0644]

index efc7c7add2a0fe94c24265c404204d6156eeaaea..b3693a45b826556d057fef618eed03270e279132 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+2017-06-20  Zack Weinberg  <zackw@panix.com>
+
+       * 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.
+
 2017-06-20  Zack Weinberg  <zackw@panix.com>
 
        * locale/xlocale.h: Rename to...
diff --git a/NEWS b/NEWS
index 0736b4b27fabd26d53f67d2a495d2c5c0b783bdc..1af73311a57207fa283394240c041d4c36d223ef 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -78,6 +78,8 @@ Version 2.26
   use <locale.h> instead.  If you have a specific need for the definition
   of locale_t with no other declarations, please talk to us.
 
+* 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 (file)
index 0000000..5a5683e
--- /dev/null
@@ -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.  */
index cfbc7ac8bb0190ff07a814274ed225c3cda63db7..8d6d03c918a40449ae0878b8c82962b44e0ec549 100644 (file)
@@ -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
    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).
-
-   Signals in the 1-15 range are defined with their historical numbers.
-   For other signals, we use the BSD numbers.  */
-
-/* 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
+#include <bits/signum-generic.h>
 
-/* Archaic names for compatibility. */
-#define        SIGIOT          SIGABRT /* IOT instruction, abort() on a PDP-11.  */
-#define        SIGCLD          SIGCHLD /* Old System V name */
+/* 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.  */
 
-#endif /* <signal.h> included.  */
+#endif /* bits/signum.h.  */
index 9ce8232d438fb0615413a7cbc8a1c1aeb4a7dda8..8c9a7d18441f7a7ec2f97d86216cd939329b4814 100644 (file)
@@ -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 \
index ddb79c7d984dd82087933d32b23fdc2f02c1f1f1..c8f6100ac479ef57144598001b0b28df4fc69424 100644 (file)
@@ -363,6 +363,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 */
index dd72929ed56c0b7974e571ded70109ff74876691..022be56059f5f2f08fa83a5a625071dc0bab42cf 100644 (file)
@@ -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"))
   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
-  init_sig (SIGLOST, "LOST", N_("Resource lost"))
+#if defined SIGINFO && (!defined SIGPWR || SIGPWR != SIGINFO)
+  init_sig (SIGINFO, "INFO", N_("Information request"))
 #endif
-#ifdef SIGWINCH
-  init_sig (SIGWINCH, "WINCH", N_("Window changed"))
+#if defined SIGLOST && (!defined SIGPWR || SIGPWR != SIGLOST)
+  init_sig (SIGLOST, "LOST", N_("Resource lost"))
 #endif
index 268c24a70223489c11be5e9fabaeee1643986135..f55edc93a3f28bb2cd924e0f9b6b8103d3656972 100644 (file)
    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.  */
index 1a170c29d65c3a35bd914abc0b35f44d3adc88ca..8b340d49889fc1a659bda9529bd6840a577ab4eb 100644 (file)
@@ -128,6 +128,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 \
index e5cc5218e35c76b25bbd35416f4bd43b5ac1b1e3..8227be91b5fac98b4cc6f1ddd3d24b58848abf82 100644 (file)
    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
-
-#define SIGPOLL        SIGIO
-#define SIGPWR SIGINFO
-#define SIGIOT SIGABRT
+#include <bits/signum-generic.h>
 
-#define        _NSIG           65      /* Biggest signal number + 1.  */
+/* 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 SIGRTMIN       (__libc_current_sigrtmin ())
-#define SIGRTMAX       (__libc_current_sigrtmax ())
+#define SIGEMT          7      /* Emulator trap (4.2 BSD).  */
+#define SIGINFO                29      /* Information request (BSD).  */
+#define SIGPWR         SIGINFO /* Power failure imminent (System V).  */
 
-/* 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.  */
index e30efead0d39a778169ca8b5587929eb3089cad3..1a68255d02407f17622e767b651f8d710c4f7afc 100644 (file)
    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
 
-
-/* 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
-
-#define        _NSIG           65      /* Biggest signal number + 1
-                                  (including real-time signals).  */
-
-#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)
+#include <bits/signum-generic.h>
+
+/* Adjustments and additions to the signal number constants for
+   most Linux systems.  */
+
+#define        SIGSTKFLT       16      /* Stack fault (obsolete).  */
+#define        SIGPWR          30      /* Power failure imminent.  */
+
+#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
+
+#undef __SIGRTMAX
+#define __SIGRTMAX     64
 
 #endif /* <signal.h> included.  */
index 20c0b60c9f79245be2706df0f72d41599942dd0d..5f54d1c8936b6264df27d0e5cfadcca1721ddf05 100644 (file)
    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.  */
index 6c31e01cd777064b2c3c4905f58b48e2c003dc90..1672847212d6b9d9246eb21dd2633c3d9906f9b2 100644 (file)
@@ -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.
 
    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 _NSIG          128     /* Biggest signal number + 1
-                                  (including real-time signals).  */
+#define SIGEMT          7      /* Emulator trap.  */
+#define SIGPWR         19      /* Power failure imminent.  */
 
-#define SIGRTMIN       (__libc_current_sigrtmin ())
-#define SIGRTMAX       (__libc_current_sigrtmax ())
+#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
 
-/* 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.  */
index a0c5be5fa5df7d54711b3b14fd315ca8c39a70e8..25341ee42b90c612c4872b7f4cf346c8715ac798 100644 (file)
    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
-
-/* 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
+#include <bits/signum-generic.h>
 
-#define        _NSIG           65      /* Biggest signal number + 1
-                                  (including real-time signals).  */
+/* Adjustments and additions to the signal number constants for
+   Linux/SPARC systems.  Signal values on this platform were chosen
+   for SunOS binary compatibility.  */
 
-#define SIGRTMIN        (__libc_current_sigrtmin ())
-#define SIGRTMAX        (__libc_current_sigrtmax ())
+#define SIGEMT          7      /* Emulator trap.  */
+#define SIGLOST                29      /* Resource lost (Sun); server died (GNU).  */
+#define SIGPWR         SIGLOST /* Power failure imminent (SysV).  */
 
-/* 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 (file)
index 0000000..bdd75fb
--- /dev/null
@@ -0,0 +1,86 @@
+#! /bin/sh
+# Test that glibc's signal numbers match the kernel's.
+# 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/>.
+
+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